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/cmd_ref/interface.yaml b/lib/cisco_node_utils/cmd_ref/interface.yaml index b15535f2..d6086f0d 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_forwarding_anycast_gateway: + 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 001b590f..f895ea6d 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 'overlay_global' # Add some interface-specific constants to the Cisco namespace module Cisco @@ -205,6 +206,28 @@ def fabricpath_feature_set(fabricpath_set) FabricpathGlobal.fabricpath_feature_set(fabricpath_set) end + def fabric_forwarding_anycast_gateway + config_get('interface', 'fabric_forwarding_anycast_gateway', @name) + end + + def fabric_forwarding_anycast_gateway=(state) + 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 + 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" + end + end + + def default_fabric_forwarding_anycast_gateway + config_get_default('interface', 'fabric_forwarding_anycast_gateway') + end + def fex_feature fex = config_get('fex', 'feature') fail 'fex_feature not found' if fex.nil? 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 d7f4e187..cf0380d9 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/overlay_global' include Cisco @@ -958,6 +959,42 @@ def test_interface_ipv4_arp_timeout assert_raises(RuntimeError) { nonvlanint.ipv4_arp_timeout = 300 } end + def test_interface_fabric_forwarding_anycast_gateway + # Setup + config('no interface vlan11') + int = Interface.new('vlan11') + foo = OverlayGlobal.new + foo.anycast_gateway_mac = '1223.3445.5668' + + # 1. Testing 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) + + # 2. Testing non-default:true + int.fabric_forwarding_anycast_gateway = true + assert(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 + assert_raises(RuntimeError) { int.fabric_forwarding_anycast_gateway = true } + + # 5. Removing feature fabric forwarding + config('no feature fabric forwarding') + assert_raises(RuntimeError) { int.fabric_forwarding_anycast_gateway = true } + + # 6. Attempting to configure on a non-vlan interface + nonvlanint = create_interface + assert_raises(RuntimeError) do + nonvlanint.fabric_forwarding_anycast_gateway = true + end + end + def test_interface_ipv4_proxy_arp interface = create_interface interface.switchport_mode = :disabled