From 171ee07b67245f905526bf02f565b505af3f49b6 Mon Sep 17 00:00:00 2001 From: "smigopal@cisco.com" Date: Fri, 5 Feb 2016 14:16:39 -0500 Subject: [PATCH 1/3] Supporting property fabric forwarding mode anycast-gateway under Interface --- lib/cisco_node_utils/cmd_ref/interface.yaml | 6 ++++ lib/cisco_node_utils/interface.rb | 27 ++++++++++++++++ tests/test_interface.rb | 34 +++++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/lib/cisco_node_utils/cmd_ref/interface.yaml b/lib/cisco_node_utils/cmd_ref/interface.yaml index 04fd4c0e..a83ed217 100644 --- a/lib/cisco_node_utils/cmd_ref/interface.yaml +++ b/lib/cisco_node_utils/cmd_ref/interface.yaml @@ -46,6 +46,12 @@ encapsulation_dot1q: config_set_append: "%s encapsulation dot1q %s" default_value: "" +fabric_frwd_anycast: + kind: boolean + config_get_token_append: '/^fabric forwarding mode anycast-gateway$/' + config_set_append: "%s fabric forwarding mode anycast-gateway" + default_value: false + feature_lacp: kind: boolean config_get: "show running | i ^feature" diff --git a/lib/cisco_node_utils/interface.rb b/lib/cisco_node_utils/interface.rb index 58072ab8..bb7aa79a 100644 --- a/lib/cisco_node_utils/interface.rb +++ b/lib/cisco_node_utils/interface.rb @@ -19,6 +19,7 @@ require_relative 'pim' require_relative 'vrf' require_relative 'vni' +require_relative 'vxlan_global' # Add some interface-specific constants to the Cisco namespace module Cisco @@ -205,6 +206,32 @@ def fabricpath_feature_set(fabricpath_set) FabricpathGlobal.fabricpath_feature_set(fabricpath_set) end + def fabric_frwd_anycast + config_get('interface', 'fabric_frwd_anycast', @name) + end + + def fabric_frwd_anycast=(state) + begin + Feature.fabric_forwarding_enable + no_cmd = (state ? '' : 'no') + config_set('interface', + 'fabric_frwd_anycast', @name, no_cmd) + expected_state = state + fail if fabric_frwd_anycast.to_s != expected_state.to_s + end + rescue Cisco::CliError => e + vxlan_global = VxlanGlobal.new + if vxlan_global.anycast_gateway_mac == '' + raise "[#{@name}] '#{e.command}' : #{e.clierror} + Anycast gateway mac needs to be configured + before configuring forwarding mode under interface" + end + end + + def default_fabric_frwd_anycast + config_get_default('interface', 'fabric_frwd_anycast') + end + def fex_feature fex = config_get('fex', 'feature') fail 'fex_feature not found' if fex.nil? diff --git a/tests/test_interface.rb b/tests/test_interface.rb index f7d50ca2..d8f5e939 100755 --- a/tests/test_interface.rb +++ b/tests/test_interface.rb @@ -15,6 +15,7 @@ require_relative 'ciscotest' require_relative '../lib/cisco_node_utils/acl' require_relative '../lib/cisco_node_utils/interface' +require_relative '../lib/cisco_node_utils/vxlan_global' include Cisco @@ -958,6 +959,39 @@ def test_interface_ipv4_arp_timeout assert_raises(RuntimeError) { nonvlanint.ipv4_arp_timeout = 300 } end + def test_interface_fabric_frwd_anycast + # Setup + config('no interface vlan11') + int = Interface.new('vlan11') + config('feature fabric forwarding') + foo = VxlanGlobal.new + foo.anycast_gateway_mac = '1223.3445.5668' + + # 1. Testing default + int.fabric_frwd_anycast = false + assert_equal(int.default_fabric_frwd_anycast, int.fabric_frwd_anycast) + + # 2. Testing non-default + int.fabric_frwd_anycast = true + assert_equal(true, int.fabric_frwd_anycast) + + # 3. Setting back to default + int.fabric_frwd_anycast = int.default_fabric_frwd_anycast + assert_equal(int.default_fabric_frwd_anycast, int.fabric_frwd_anycast) + + # 4. Removing fabric forwarding anycast gateway mac + foo.anycast_gateway_mac = foo.default_anycast_gateway_mac + assert_raises(RuntimeError) { int.fabric_frwd_anycast = true } + + # 5. Removing feature fabric forwarding + config('no feature fabric forwarding') + assert_raises(RuntimeError) { int.fabric_frwd_anycast = true } + + # 6. Attempting to configure on a non-vlan interface + nonvlanint = create_interface + assert_raises(RuntimeError) { nonvlanint.fabric_frwd_anycast = true } + end + def test_interface_ipv4_proxy_arp interface = create_interface interface.switchport_mode = :disabled From 1136f440e122d7911cf844ffca3d93adfbc73202 Mon Sep 17 00:00:00 2001 From: "smigopal@cisco.com" Date: Mon, 8 Feb 2016 13:46:46 -0500 Subject: [PATCH 2/3] Adding property - fabric forwarding mode anycast-gateway, to Cisco_interface --- lib/cisco_node_utils/cmd_ref/interface.yaml | 2 +- lib/cisco_node_utils/interface.rb | 14 ++++++------ tests/test_interface.rb | 25 ++++++++++++--------- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/lib/cisco_node_utils/cmd_ref/interface.yaml b/lib/cisco_node_utils/cmd_ref/interface.yaml index a83ed217..2c34233c 100644 --- a/lib/cisco_node_utils/cmd_ref/interface.yaml +++ b/lib/cisco_node_utils/cmd_ref/interface.yaml @@ -46,7 +46,7 @@ encapsulation_dot1q: config_set_append: "%s encapsulation dot1q %s" default_value: "" -fabric_frwd_anycast: +fabric_forwarding_anycast_gateway: kind: boolean config_get_token_append: '/^fabric forwarding mode anycast-gateway$/' config_set_append: "%s fabric forwarding mode anycast-gateway" diff --git a/lib/cisco_node_utils/interface.rb b/lib/cisco_node_utils/interface.rb index bb7aa79a..17bd9bb4 100644 --- a/lib/cisco_node_utils/interface.rb +++ b/lib/cisco_node_utils/interface.rb @@ -206,18 +206,18 @@ def fabricpath_feature_set(fabricpath_set) FabricpathGlobal.fabricpath_feature_set(fabricpath_set) end - def fabric_frwd_anycast - config_get('interface', 'fabric_frwd_anycast', @name) + def fabric_forwarding_anycast_gateway + config_get('interface', 'fabric_forwarding_anycast_gateway', @name) end - def fabric_frwd_anycast=(state) + def fabric_forwarding_anycast_gateway=(state) begin Feature.fabric_forwarding_enable no_cmd = (state ? '' : 'no') config_set('interface', - 'fabric_frwd_anycast', @name, no_cmd) + 'fabric_forwarding_anycast_gateway', @name, no_cmd) expected_state = state - fail if fabric_frwd_anycast.to_s != expected_state.to_s + fail if fabric_forwarding_anycast_gateway.to_s != expected_state.to_s end rescue Cisco::CliError => e vxlan_global = VxlanGlobal.new @@ -228,8 +228,8 @@ def fabric_frwd_anycast=(state) end end - def default_fabric_frwd_anycast - config_get_default('interface', 'fabric_frwd_anycast') + def default_fabric_forwarding_anycast_gateway + config_get_default('interface', 'fabric_forwarding_anycast_gateway') end def fex_feature diff --git a/tests/test_interface.rb b/tests/test_interface.rb index d8f5e939..f0d68837 100755 --- a/tests/test_interface.rb +++ b/tests/test_interface.rb @@ -959,7 +959,7 @@ def test_interface_ipv4_arp_timeout assert_raises(RuntimeError) { nonvlanint.ipv4_arp_timeout = 300 } end - def test_interface_fabric_frwd_anycast + def test_interface_fabric_forwarding_anycast_gateway # Setup config('no interface vlan11') int = Interface.new('vlan11') @@ -968,28 +968,33 @@ def test_interface_fabric_frwd_anycast foo.anycast_gateway_mac = '1223.3445.5668' # 1. Testing default - int.fabric_frwd_anycast = false - assert_equal(int.default_fabric_frwd_anycast, int.fabric_frwd_anycast) + int.fabric_forwarding_anycast_gateway = false + assert_equal(int.default_fabric_forwarding_anycast_gateway, + int.fabric_forwarding_anycast_gateway) # 2. Testing non-default - int.fabric_frwd_anycast = true - assert_equal(true, int.fabric_frwd_anycast) + int.fabric_forwarding_anycast_gateway = true + assert_equal(true, int.fabric_forwarding_anycast_gateway) # 3. Setting back to default - int.fabric_frwd_anycast = int.default_fabric_frwd_anycast - assert_equal(int.default_fabric_frwd_anycast, int.fabric_frwd_anycast) + int.fabric_forwarding_anycast_gateway = + int.default_fabric_forwarding_anycast_gateway + assert_equal(int.default_fabric_forwarding_anycast_gateway, + int.fabric_forwarding_anycast_gateway) # 4. Removing fabric forwarding anycast gateway mac foo.anycast_gateway_mac = foo.default_anycast_gateway_mac - assert_raises(RuntimeError) { int.fabric_frwd_anycast = true } + assert_raises(RuntimeError) { int.fabric_forwarding_anycast_gateway = true } # 5. Removing feature fabric forwarding config('no feature fabric forwarding') - assert_raises(RuntimeError) { int.fabric_frwd_anycast = true } + assert_raises(RuntimeError) { int.fabric_forwarding_anycast_gateway = true } # 6. Attempting to configure on a non-vlan interface nonvlanint = create_interface - assert_raises(RuntimeError) { nonvlanint.fabric_frwd_anycast = true } + assert_raises(RuntimeError) do + nonvlanint.fabric_forwarding_anycast_gateway = true + end end def test_interface_ipv4_proxy_arp From 63429000a0eb4e6d5e672590002bd80ae651e87f Mon Sep 17 00:00:00 2001 From: "smigopal@cisco.com" Date: Thu, 11 Feb 2016 06:33:23 -0500 Subject: [PATCH 3/3] Addressing review comments --- CHANGELOG.md | 1 + lib/cisco_node_utils/interface.rb | 18 +++++++----------- lib/cisco_node_utils/overlay_global.rb | 2 +- tests/test_interface.rb | 20 +++++++++----------- 4 files changed, 18 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2962aed3..2830124b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -103,6 +103,7 @@ Changelog * `suppress_inactive` * `table_map` * Extend interface with attributes: + * `fabric_forwarding_anycast_gateway` * `ipv4_acl_in`, `ipv4_acl_out`, `ipv6_acl_in`, `ipv6_acl_out` * `ipv4_address_secondary`, `ipv4_arp_timeout` * `vlan_mapping` diff --git a/lib/cisco_node_utils/interface.rb b/lib/cisco_node_utils/interface.rb index 79d30c39..f895ea6d 100644 --- a/lib/cisco_node_utils/interface.rb +++ b/lib/cisco_node_utils/interface.rb @@ -19,7 +19,7 @@ require_relative 'pim' require_relative 'vrf' require_relative 'vni' -require_relative 'vxlan_global' +require_relative 'overlay_global' # Add some interface-specific constants to the Cisco namespace module Cisco @@ -211,17 +211,13 @@ def fabric_forwarding_anycast_gateway end def fabric_forwarding_anycast_gateway=(state) - begin - Feature.fabric_forwarding_enable - no_cmd = (state ? '' : 'no') - config_set('interface', - 'fabric_forwarding_anycast_gateway', @name, no_cmd) - expected_state = state - fail if fabric_forwarding_anycast_gateway.to_s != expected_state.to_s - end + no_cmd = (state ? '' : 'no') + config_set('interface', + 'fabric_forwarding_anycast_gateway', @name, no_cmd) + fail if fabric_forwarding_anycast_gateway.to_s != state.to_s rescue Cisco::CliError => e - vxlan_global = VxlanGlobal.new - if vxlan_global.anycast_gateway_mac == '' + anycast_gateway_mac = OverlayGlobal.new.anycast_gateway_mac + if anycast_gateway_mac.nil? || anycast_gateway_mac.empty? raise "[#{@name}] '#{e.command}' : #{e.clierror} Anycast gateway mac needs to be configured before configuring forwarding mode under interface" diff --git a/lib/cisco_node_utils/overlay_global.rb b/lib/cisco_node_utils/overlay_global.rb index 74724b34..dcd4412e 100644 --- a/lib/cisco_node_utils/overlay_global.rb +++ b/lib/cisco_node_utils/overlay_global.rb @@ -131,7 +131,7 @@ def anycast_gateway_mac def anycast_gateway_mac=(mac_addr) fail TypeError unless mac_addr.is_a?(String) - Feature.nv_overlay_evpn_enable unless Feature.nv_overlay_evpn_enabled? + Feature.nv_overlay_evpn_enable if mac_addr == default_anycast_gateway_mac state = 'no' mac_addr = '' diff --git a/tests/test_interface.rb b/tests/test_interface.rb index 9c0ebcfd..cf0380d9 100755 --- a/tests/test_interface.rb +++ b/tests/test_interface.rb @@ -15,7 +15,7 @@ require_relative 'ciscotest' require_relative '../lib/cisco_node_utils/acl' require_relative '../lib/cisco_node_utils/interface' -require_relative '../lib/cisco_node_utils/vxlan_global' +require_relative '../lib/cisco_node_utils/overlay_global' include Cisco @@ -963,24 +963,22 @@ def test_interface_fabric_forwarding_anycast_gateway # Setup config('no interface vlan11') int = Interface.new('vlan11') - config('feature fabric forwarding') - foo = VxlanGlobal.new + foo = OverlayGlobal.new foo.anycast_gateway_mac = '1223.3445.5668' # 1. Testing default - int.fabric_forwarding_anycast_gateway = false + int.fabric_forwarding_anycast_gateway = + int.default_fabric_forwarding_anycast_gateway assert_equal(int.default_fabric_forwarding_anycast_gateway, int.fabric_forwarding_anycast_gateway) - # 2. Testing non-default + # 2. Testing non-default:true int.fabric_forwarding_anycast_gateway = true - assert_equal(true, int.fabric_forwarding_anycast_gateway) + assert(int.fabric_forwarding_anycast_gateway) - # 3. Setting back to default - int.fabric_forwarding_anycast_gateway = - int.default_fabric_forwarding_anycast_gateway - assert_equal(int.default_fabric_forwarding_anycast_gateway, - int.fabric_forwarding_anycast_gateway) + # 3. Setting back to false + int.fabric_forwarding_anycast_gateway = false + refute(int.fabric_forwarding_anycast_gateway) # 4. Removing fabric forwarding anycast gateway mac foo.anycast_gateway_mac = foo.default_anycast_gateway_mac