cisco_node_utils 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +66 -0
- data/Gemfile +1 -0
- data/README.md +44 -43
- data/bin/.rubocop.yml +18 -0
- data/bin/show_running_yang.rb +233 -0
- data/cisco_node_utils.gemspec +1 -1
- data/docs/README-maintainers.md +1 -0
- data/docs/README-utilities.md +14 -0
- data/lib/.rubocop.yml +1 -1
- data/lib/cisco_node_utils/aaa_authentication_login_service.rb +8 -3
- data/lib/cisco_node_utils/aaa_authorization_service.rb +6 -0
- data/lib/cisco_node_utils/bfd_global.rb +300 -0
- data/lib/cisco_node_utils/bgp.rb +6 -4
- data/lib/cisco_node_utils/bgp_af.rb +2 -0
- data/lib/cisco_node_utils/bgp_neighbor.rb +14 -0
- data/lib/cisco_node_utils/bgp_neighbor_af.rb +4 -1
- data/lib/cisco_node_utils/cisco_cmn_utils.rb +126 -0
- data/lib/cisco_node_utils/client/client.rb +6 -2
- data/lib/cisco_node_utils/client/grpc/client.rb +120 -36
- data/lib/cisco_node_utils/client/nxapi/client.rb +6 -2
- data/lib/cisco_node_utils/cmd_ref/DEPRECATED.yaml +118 -0
- data/lib/cisco_node_utils/cmd_ref/aaa_authorization_service.yaml +14 -0
- data/lib/cisco_node_utils/cmd_ref/bfd_global.yaml +117 -0
- data/lib/cisco_node_utils/cmd_ref/bgp.yaml +7 -7
- data/lib/cisco_node_utils/cmd_ref/bgp_neighbor.yaml +7 -0
- data/lib/cisco_node_utils/cmd_ref/dhcp_relay_global.yaml +125 -0
- data/lib/cisco_node_utils/cmd_ref/feature.yaml +10 -0
- data/lib/cisco_node_utils/cmd_ref/interface.yaml +141 -49
- data/lib/cisco_node_utils/cmd_ref/interface_ospf.yaml +44 -0
- data/lib/cisco_node_utils/cmd_ref/interface_portchannel.yaml +6 -0
- data/lib/cisco_node_utils/cmd_ref/ospf.yaml +6 -0
- data/lib/cisco_node_utils/cmd_ref/ospf_area.yaml +91 -0
- data/lib/cisco_node_utils/cmd_ref/ospf_area_vlink.yaml +88 -0
- data/lib/cisco_node_utils/cmd_ref/overlay_global.yaml +0 -3
- data/lib/cisco_node_utils/cmd_ref/show_version.yaml +3 -3
- data/lib/cisco_node_utils/cmd_ref/snmp_community.yaml +39 -15
- data/lib/cisco_node_utils/cmd_ref/snmp_notification_receiver.yaml +43 -21
- data/lib/cisco_node_utils/cmd_ref/snmp_server.yaml +48 -19
- data/lib/cisco_node_utils/cmd_ref/snmp_user.yaml +0 -0
- data/lib/cisco_node_utils/cmd_ref/tacacs_global.yaml +30 -0
- data/lib/cisco_node_utils/cmd_ref/tacacs_server.yaml +18 -6
- data/lib/cisco_node_utils/cmd_ref/vdc.yaml +4 -0
- data/lib/cisco_node_utils/cmd_ref/virtual_service.yaml +1 -0
- data/lib/cisco_node_utils/cmd_ref/vlan.yaml +23 -10
- data/lib/cisco_node_utils/cmd_ref/vxlan_vtep.yaml +8 -2
- data/lib/cisco_node_utils/cmd_ref/yang.yaml +7 -0
- data/lib/cisco_node_utils/cmd_ref/yum.yaml +10 -1
- data/lib/cisco_node_utils/constants.rb +8 -1
- data/lib/cisco_node_utils/dhcp_relay_global.rb +302 -0
- data/lib/cisco_node_utils/exceptions.rb +29 -0
- data/lib/cisco_node_utils/feature.rb +28 -0
- data/lib/cisco_node_utils/interface.rb +493 -402
- data/lib/cisco_node_utils/interface_DEPRECATED.rb +513 -0
- data/lib/cisco_node_utils/interface_ospf.rb +126 -0
- data/lib/cisco_node_utils/interface_portchannel.rb +16 -0
- data/lib/cisco_node_utils/logger.rb +3 -0
- data/lib/cisco_node_utils/node.rb +29 -1
- data/lib/cisco_node_utils/overlay_global.rb +1 -12
- data/lib/cisco_node_utils/pim.rb +1 -0
- data/lib/cisco_node_utils/pim_group_list.rb +1 -0
- data/lib/cisco_node_utils/pim_rp_address.rb +1 -0
- data/lib/cisco_node_utils/platform.rb +9 -2
- data/lib/cisco_node_utils/router_ospf.rb +1 -1
- data/lib/cisco_node_utils/router_ospf_area.rb +416 -0
- data/lib/cisco_node_utils/router_ospf_area_vlink.rb +313 -0
- data/lib/cisco_node_utils/router_ospf_vrf.rb +17 -0
- data/lib/cisco_node_utils/snmp_notification_receiver.rb +27 -9
- data/lib/cisco_node_utils/snmpcommunity.rb +34 -8
- data/lib/cisco_node_utils/snmpserver.rb +4 -4
- data/lib/cisco_node_utils/snmpuser.rb +0 -0
- data/lib/cisco_node_utils/tacacs_global.rb +102 -0
- data/lib/cisco_node_utils/tacacs_server.rb +8 -7
- data/lib/cisco_node_utils/vdc.rb +25 -7
- data/lib/cisco_node_utils/version.rb +1 -1
- data/lib/cisco_node_utils/vlan.rb +30 -56
- data/lib/cisco_node_utils/vlan_DEPRECATED.rb +108 -0
- data/lib/cisco_node_utils/yang.rb +160 -0
- data/lib/cisco_node_utils/yum.rb +25 -32
- data/tests/.rubocop.yml +3 -0
- data/tests/ciscotest.rb +136 -19
- data/tests/cmd_config_invalid.yaml +1 -1
- data/tests/noop.rb +7 -0
- data/tests/tacacs_server.yaml.example +6 -0
- data/tests/test_aaa_authentication_login.rb +24 -1
- data/tests/test_aaa_authentication_login_service.rb +9 -16
- data/tests/test_aaa_authorization_service.rb +111 -84
- data/tests/test_bfd_global.rb +278 -0
- data/tests/test_bgp_neighbor.rb +20 -0
- data/tests/test_bridge_domain_vni.rb +2 -9
- data/tests/test_cmn_utils.rb +76 -0
- data/tests/test_dhcp_relay_global.rb +284 -0
- data/tests/test_dns_domain.rb +4 -4
- data/tests/test_domain_name.rb +2 -2
- data/tests/test_encapsulation.rb +2 -4
- data/tests/test_evpn_vni.rb +14 -7
- data/tests/test_fabricpath_global.rb +12 -13
- data/tests/test_feature.rb +35 -17
- data/tests/test_interface.rb +352 -127
- data/tests/test_interface_bdi.rb +2 -2
- data/tests/test_interface_channel_group.rb +1 -1
- data/tests/test_interface_ospf.rb +153 -23
- data/tests/test_interface_portchannel.rb +15 -6
- data/tests/test_interface_private_vlan.rb +200 -576
- data/tests/test_interface_svi.rb +5 -52
- data/tests/test_interface_switchport.rb +80 -240
- data/tests/test_itd_device_group.rb +2 -2
- data/tests/test_itd_device_group_node.rb +2 -2
- data/tests/test_itd_service.rb +1 -1
- data/tests/test_name_server.rb +3 -3
- data/tests/test_node_ext.rb +15 -17
- data/tests/test_ntp_config.rb +1 -1
- data/tests/test_ntp_server.rb +3 -3
- data/tests/test_nxapi.rb +1 -0
- data/tests/test_overlay_global.rb +15 -19
- data/tests/test_pim.rb +5 -5
- data/tests/test_pim_group_list.rb +1 -37
- data/tests/test_pim_rp_address.rb +1 -1
- data/tests/test_platform.rb +9 -11
- data/tests/test_portchannel_global.rb +43 -3
- data/tests/test_radius_server.rb +1 -1
- data/tests/test_radius_server_group.rb +1 -1
- data/tests/test_router_bgp.rb +17 -30
- data/tests/test_router_ospf_area.rb +433 -0
- data/tests/test_router_ospf_area_vlink.rb +298 -0
- data/tests/test_router_ospf_vrf.rb +17 -0
- data/tests/test_snmp_notification_receiver.rb +11 -11
- data/tests/test_snmpcommunity.rb +177 -69
- data/tests/test_snmpgroup.rb +7 -7
- data/tests/test_snmpserver.rb +164 -253
- data/tests/test_snmpuser.rb +73 -69
- data/tests/test_stp_global.rb +15 -15
- data/tests/test_syslog_settings.rb +1 -1
- data/tests/test_tacacs_global.rb +80 -0
- data/tests/test_tacacs_server.rb +129 -51
- data/tests/test_tacacs_server_group.rb +3 -29
- data/tests/test_tacacs_server_host.rb +24 -27
- data/tests/test_vlan.rb +57 -59
- data/tests/test_vlan_private.rb +271 -284
- data/tests/test_vpc.rb +10 -4
- data/tests/test_vrf.rb +2 -0
- data/tests/test_vrf_af.rb +2 -5
- data/tests/test_vtp.rb +5 -2
- data/tests/test_vxlan_vtep.rb +20 -44
- data/tests/test_vxlan_vtep_vni.rb +23 -16
- data/tests/test_yang.rb +369 -0
- data/tests/test_yum.rb +34 -42
- data/tests/yum_package.yaml +35 -0
- metadata +31 -4
- data/tests/test_vlan_mt_full.rb +0 -85
data/tests/test_dns_domain.rb
CHANGED
|
@@ -51,7 +51,7 @@ class TestDnsDomain < CiscoTestCase
|
|
|
51
51
|
|
|
52
52
|
# TESTS
|
|
53
53
|
|
|
54
|
-
def
|
|
54
|
+
def test_create_destroy_single
|
|
55
55
|
id = 'aoeu.com'
|
|
56
56
|
refute_includes(Cisco::DnsDomain.dnsdomains, id)
|
|
57
57
|
|
|
@@ -63,7 +63,7 @@ class TestDnsDomain < CiscoTestCase
|
|
|
63
63
|
refute_includes(Cisco::DnsDomain.dnsdomains, id)
|
|
64
64
|
end
|
|
65
65
|
|
|
66
|
-
def
|
|
66
|
+
def test_create_destroy_multiple
|
|
67
67
|
id1 = 'aoeu.com'
|
|
68
68
|
id2 = 'asdf.com'
|
|
69
69
|
refute_includes(Cisco::DnsDomain.dnsdomains, id1)
|
|
@@ -83,7 +83,7 @@ class TestDnsDomain < CiscoTestCase
|
|
|
83
83
|
refute_includes(Cisco::DnsDomain.dnsdomains, id2)
|
|
84
84
|
end
|
|
85
85
|
|
|
86
|
-
def
|
|
86
|
+
def test_create_destroy_single_vrf
|
|
87
87
|
id = 'aoeu.com'
|
|
88
88
|
vrf = 'test'
|
|
89
89
|
non_vrf = Cisco::DnsDomain.new(id)
|
|
@@ -100,7 +100,7 @@ class TestDnsDomain < CiscoTestCase
|
|
|
100
100
|
non_vrf.destroy
|
|
101
101
|
end
|
|
102
102
|
|
|
103
|
-
def
|
|
103
|
+
def test_create_destroy_multiple_vrf
|
|
104
104
|
id1 = 'aoeu.com'
|
|
105
105
|
id2 = 'asdf.com'
|
|
106
106
|
vrf = 'test'
|
data/tests/test_domain_name.rb
CHANGED
|
@@ -51,7 +51,7 @@ class TestDomainName < CiscoTestCase
|
|
|
51
51
|
|
|
52
52
|
# TESTS
|
|
53
53
|
|
|
54
|
-
def
|
|
54
|
+
def test_create_replace_destroy
|
|
55
55
|
name1 = 'test.abc'
|
|
56
56
|
name2 = 'test.xyz'
|
|
57
57
|
refute_includes(Cisco::DomainName.domainnames, name1)
|
|
@@ -72,7 +72,7 @@ class TestDomainName < CiscoTestCase
|
|
|
72
72
|
refute_includes(Cisco::DomainName.domainnames, name2)
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
-
def
|
|
75
|
+
def test_create_replace_destroy_vrf
|
|
76
76
|
name1 = 'test.abc'
|
|
77
77
|
name2 = 'test.xyz'
|
|
78
78
|
vrf = 'test'
|
data/tests/test_encapsulation.rb
CHANGED
|
@@ -23,16 +23,14 @@ class TestEncapsulation < CiscoTestCase
|
|
|
23
23
|
|
|
24
24
|
def setup
|
|
25
25
|
super
|
|
26
|
+
vdc_limit_f3_no_intf_needed(:set)
|
|
26
27
|
return unless @@pre_clean_needed
|
|
27
|
-
|
|
28
|
-
# This provider requires MT-Full and a compatible linecard
|
|
29
|
-
mt_full_interface?
|
|
30
|
-
Vdc.new('default').limit_resource_module_type = 'f3'
|
|
31
28
|
cleanup
|
|
32
29
|
@@pre_clean_needed = false # rubocop:disable Style/ClassVars
|
|
33
30
|
end
|
|
34
31
|
|
|
35
32
|
def teardown
|
|
33
|
+
vdc_limit_f3_no_intf_needed(:clear) if first_or_last_teardown
|
|
36
34
|
cleanup
|
|
37
35
|
super
|
|
38
36
|
end
|
data/tests/test_evpn_vni.rb
CHANGED
|
@@ -73,13 +73,20 @@ class TestEvpnVni < CiscoTestCase
|
|
|
73
73
|
# test route_target
|
|
74
74
|
def test_route_target
|
|
75
75
|
vni = EvpnVni.new(4096)
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
76
|
+
opts = [:both, :import, :export]
|
|
77
|
+
|
|
78
|
+
# 'route_target_both' has limited support with I3 and later images.
|
|
79
|
+
# The Puppet README states:
|
|
80
|
+
# Caveat: The route_target_both property is discouraged due to the
|
|
81
|
+
# inconsistent behavior of the property across Nexus platforms and image
|
|
82
|
+
# versions. The 'both' keyword has a transformative behavior on some
|
|
83
|
+
# platforms/versions in which it creates two cli configurations: one for
|
|
84
|
+
# import targets, a second for export targets, while the 'both' command
|
|
85
|
+
# itself may not appear at all. When the 'both' keyword does not appear
|
|
86
|
+
# in the configuration it causes an idempotency problem for puppet. For
|
|
87
|
+
# this reason it is recommended to use explicit 'route_target_export' and
|
|
88
|
+
# 'route_target_import' properties instead of route_target_both.
|
|
89
|
+
opts.delete(:both) unless Utils.nexus_i2_image
|
|
83
90
|
|
|
84
91
|
# Master list of communities to test against
|
|
85
92
|
master = ['1.2.3.4:55', '2:2', '55:33', 'auto']
|
|
@@ -23,32 +23,31 @@ include Cisco
|
|
|
23
23
|
# TestFabricpathGlobal - Minitest for Fabricpath Global node utils
|
|
24
24
|
class TestFabricpathGlobal < CiscoTestCase
|
|
25
25
|
@skip_unless_supported = 'fabricpath'
|
|
26
|
+
@@pre_clean_needed = true # rubocop:disable Style/ClassVars
|
|
26
27
|
|
|
27
28
|
def setup
|
|
28
|
-
# setup runs at the beginning of each test
|
|
29
29
|
super
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
vdc_limit_f3_no_intf_needed(:set)
|
|
31
|
+
return unless @@pre_clean_needed
|
|
32
|
+
config_no_warn('no nv overlay evpn ; no feature nv overlay')
|
|
33
|
+
remove_fabricpath_globals
|
|
34
|
+
@@pre_clean_needed = false # rubocop:disable Style/ClassVars
|
|
32
35
|
end
|
|
33
36
|
|
|
34
37
|
def teardown
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
remove_fabricpath_globals
|
|
39
|
+
if first_or_last_teardown
|
|
40
|
+
vdc_limit_f3_no_intf_needed(:clear)
|
|
41
|
+
config_no_warn('no feature-set fabricpath')
|
|
42
|
+
end
|
|
37
43
|
super
|
|
38
44
|
end
|
|
39
45
|
|
|
40
|
-
def
|
|
46
|
+
def remove_fabricpath_globals
|
|
41
47
|
fg = FabricpathGlobal.globals
|
|
42
48
|
fg.each { |_key, elem| elem.destroy } unless fg.empty?
|
|
43
49
|
end
|
|
44
50
|
|
|
45
|
-
# def no_feature_fabricpath
|
|
46
|
-
# # Turn the feature off for a clean test.
|
|
47
|
-
# config('no feature-set fabricpath')
|
|
48
|
-
# end
|
|
49
|
-
|
|
50
|
-
# TESTS
|
|
51
|
-
|
|
52
51
|
def test_create_destroy
|
|
53
52
|
assert_empty(FabricpathGlobal.globals)
|
|
54
53
|
|
data/tests/test_feature.rb
CHANGED
|
@@ -22,6 +22,27 @@ include Cisco
|
|
|
22
22
|
class TestFeature < CiscoTestCase
|
|
23
23
|
@skip_unless_supported = 'feature'
|
|
24
24
|
|
|
25
|
+
def teardown
|
|
26
|
+
# f3 cleanup for non-f3 N7k's
|
|
27
|
+
vdc_limit_f3_no_intf_needed(:clear) if first_or_last_teardown
|
|
28
|
+
|
|
29
|
+
['no nv overlay evpn',
|
|
30
|
+
'no feature bfd',
|
|
31
|
+
'no feature bgp',
|
|
32
|
+
'no feature dhcp',
|
|
33
|
+
'no feature fabric forwarding',
|
|
34
|
+
'no feature-set fex',
|
|
35
|
+
'no feature itd',
|
|
36
|
+
'no feature nv overlay',
|
|
37
|
+
'no feature ospf',
|
|
38
|
+
'no feature pim',
|
|
39
|
+
'no feature private-vlan',
|
|
40
|
+
'no feature tacacs',
|
|
41
|
+
'no feature vn-segment-vlan-based',
|
|
42
|
+
'no feature vni',
|
|
43
|
+
'no feature vtp'].each { |f| config_no_warn(f) }
|
|
44
|
+
end
|
|
45
|
+
|
|
25
46
|
###########
|
|
26
47
|
# Helpers #
|
|
27
48
|
###########
|
|
@@ -33,6 +54,7 @@ class TestFeature < CiscoTestCase
|
|
|
33
54
|
|
|
34
55
|
if ref
|
|
35
56
|
feat_str = Regexp.last_match[1]
|
|
57
|
+
refute_nil(feat_str)
|
|
36
58
|
else
|
|
37
59
|
skip("'feature','#{feat}' is unsupported on this node")
|
|
38
60
|
end
|
|
@@ -62,10 +84,19 @@ class TestFeature < CiscoTestCase
|
|
|
62
84
|
###################
|
|
63
85
|
# Feature tests #
|
|
64
86
|
###################
|
|
87
|
+
|
|
88
|
+
def test_bfd
|
|
89
|
+
feature('bfd')
|
|
90
|
+
end
|
|
91
|
+
|
|
65
92
|
def test_bgp
|
|
66
93
|
feature('bgp')
|
|
67
94
|
end
|
|
68
95
|
|
|
96
|
+
def test_dhcp
|
|
97
|
+
feature('dhcp')
|
|
98
|
+
end
|
|
99
|
+
|
|
69
100
|
def test_fabric_forwarding
|
|
70
101
|
if node.product_id[/N(3)/]
|
|
71
102
|
assert_nil(Feature.fabric_forwarding_enabled?)
|
|
@@ -85,12 +116,7 @@ class TestFeature < CiscoTestCase
|
|
|
85
116
|
assert_raises(Cisco::UnsupportedError) { Feature.nv_overlay_enable }
|
|
86
117
|
return
|
|
87
118
|
end
|
|
88
|
-
|
|
89
|
-
# Dependency setup
|
|
90
|
-
vxlan_linecard?
|
|
91
|
-
vdc_lc_state('f3')
|
|
92
|
-
config_no_warn('no feature-set fabricpath')
|
|
93
|
-
|
|
119
|
+
vdc_limit_f3_no_intf_needed(:set)
|
|
94
120
|
feature('nv_overlay')
|
|
95
121
|
end
|
|
96
122
|
|
|
@@ -100,9 +126,8 @@ class TestFeature < CiscoTestCase
|
|
|
100
126
|
assert_raises(Cisco::UnsupportedError) { Feature.nv_overlay_evpn_enable }
|
|
101
127
|
return
|
|
102
128
|
end
|
|
103
|
-
vxlan_linecard?
|
|
104
|
-
vdc_lc_state('f3')
|
|
105
129
|
|
|
130
|
+
vdc_limit_f3_no_intf_needed(:set)
|
|
106
131
|
# nv_overlay_evpn can't use the 'feature' helper so test it explicitly here
|
|
107
132
|
# Get current state of feature, then disable it
|
|
108
133
|
pre_clean_enabled = Feature.nv_overlay_evpn_enabled?
|
|
@@ -144,15 +169,12 @@ class TestFeature < CiscoTestCase
|
|
|
144
169
|
end
|
|
145
170
|
|
|
146
171
|
def test_vni
|
|
147
|
-
# Dependency setup
|
|
148
|
-
vxlan_linecard?
|
|
149
|
-
vdc_lc_state('f3')
|
|
150
|
-
|
|
151
172
|
if node.product_id[/N(5|6)/]
|
|
152
173
|
Feature.nv_overlay_enable
|
|
153
174
|
else
|
|
154
175
|
# vni can't be removed if nv overlay is present
|
|
155
176
|
config_no_warn('no feature nv overlay')
|
|
177
|
+
vdc_limit_f3_no_intf_needed(:set)
|
|
156
178
|
end
|
|
157
179
|
feature('vni')
|
|
158
180
|
rescue RuntimeError => e
|
|
@@ -173,10 +195,10 @@ class TestFeature < CiscoTestCase
|
|
|
173
195
|
assert_raises(Cisco::UnsupportedError) { Feature.fabric_enable }
|
|
174
196
|
return
|
|
175
197
|
end
|
|
198
|
+
vdc_limit_f3_no_intf_needed(:set)
|
|
176
199
|
fs = 'feature-set fabric'
|
|
177
200
|
# Get current state of the feature-set
|
|
178
201
|
feature_set_installed = Feature.fabric_installed?
|
|
179
|
-
feature_enabled = Feature.fabric_enabled?
|
|
180
202
|
|
|
181
203
|
config("no #{fs} ; no install #{fs}") if feature_set_installed
|
|
182
204
|
refute_show_match(
|
|
@@ -187,10 +209,6 @@ class TestFeature < CiscoTestCase
|
|
|
187
209
|
|
|
188
210
|
Feature.fabric_enable
|
|
189
211
|
assert(Feature.fabric_enabled?, "(#{fs}) is not enabled")
|
|
190
|
-
|
|
191
|
-
# Return testbed to pre-clean state
|
|
192
|
-
config("no #{fs}") unless feature_enabled
|
|
193
|
-
config("no install #{fs}") unless feature_set_installed
|
|
194
212
|
end
|
|
195
213
|
|
|
196
214
|
def test_feature_set_fex
|
data/tests/test_interface.rb
CHANGED
|
@@ -64,6 +64,14 @@ class TestInterface < CiscoTestCase
|
|
|
64
64
|
|
|
65
65
|
def teardown
|
|
66
66
|
interface_ethernet_default(interfaces[0])
|
|
67
|
+
if first_or_last_teardown
|
|
68
|
+
config_no_warn('no feature pim')
|
|
69
|
+
config_no_warn('no feature dhcp')
|
|
70
|
+
config_no_warn('no feature bfd')
|
|
71
|
+
config_no_warn('no feature interface-vlan')
|
|
72
|
+
config_no_warn('no feature-set fabric')
|
|
73
|
+
config_no_warn('no install feature-set fabric')
|
|
74
|
+
end
|
|
67
75
|
super
|
|
68
76
|
end
|
|
69
77
|
|
|
@@ -184,12 +192,10 @@ class TestInterface < CiscoTestCase
|
|
|
184
192
|
flunk(message)
|
|
185
193
|
end
|
|
186
194
|
|
|
187
|
-
# Helper to find
|
|
188
|
-
def
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
speeds.each do |value|
|
|
192
|
-
next if value == 'auto'
|
|
195
|
+
# Helper to find all configurable speeds for an interface
|
|
196
|
+
def valid_speeds(interface)
|
|
197
|
+
speeds = []
|
|
198
|
+
capable_speed_values(interface).each do |value|
|
|
193
199
|
begin
|
|
194
200
|
interface.speed = value
|
|
195
201
|
assert_equal(value, interface.speed)
|
|
@@ -197,11 +203,9 @@ class TestInterface < CiscoTestCase
|
|
|
197
203
|
next if speed_change_disallowed?(e.message)
|
|
198
204
|
raise
|
|
199
205
|
end
|
|
200
|
-
|
|
201
|
-
valid_speed = value
|
|
202
|
-
break
|
|
206
|
+
speeds << value
|
|
203
207
|
end
|
|
204
|
-
|
|
208
|
+
speeds
|
|
205
209
|
end
|
|
206
210
|
|
|
207
211
|
# Helper to check for misc speed change disallowed error messages.
|
|
@@ -211,7 +215,8 @@ class TestInterface < CiscoTestCase
|
|
|
211
215
|
'requested config change not allowed',
|
|
212
216
|
/does not match the (transceiver speed|port capability)/,
|
|
213
217
|
'but the transceiver doesn t support this speed',
|
|
214
|
-
'% Ambiguous parameter'
|
|
218
|
+
'% Ambiguous parameter',
|
|
219
|
+
'% Invalid parameter']
|
|
215
220
|
message[Regexp.union(patterns)]
|
|
216
221
|
end
|
|
217
222
|
|
|
@@ -254,8 +259,21 @@ class TestInterface < CiscoTestCase
|
|
|
254
259
|
"Error: #{interface.name} shutdown is not false")
|
|
255
260
|
|
|
256
261
|
interface.shutdown = true
|
|
257
|
-
|
|
258
|
-
|
|
262
|
+
# On some platforms, a small delay is needed after setting the
|
|
263
|
+
# shutdown property before the new state can be retrieved by
|
|
264
|
+
# the getter.
|
|
265
|
+
# TBD: Likely a bug in nxapi, but it's not reproducible using
|
|
266
|
+
# the nxapi sandbox.
|
|
267
|
+
begin
|
|
268
|
+
assert(interface.shutdown,
|
|
269
|
+
"Error: #{interface.name} shutdown is not true")
|
|
270
|
+
rescue Minitest::Assertion
|
|
271
|
+
sleep 1
|
|
272
|
+
node.cache_flush
|
|
273
|
+
tries ||= 1
|
|
274
|
+
retry unless (tries += 1) > 5
|
|
275
|
+
raise
|
|
276
|
+
end
|
|
259
277
|
|
|
260
278
|
# Test default shutdown state
|
|
261
279
|
if k.downcase.include?('ethernet') # Ethernet interfaces
|
|
@@ -486,43 +504,43 @@ class TestInterface < CiscoTestCase
|
|
|
486
504
|
end
|
|
487
505
|
end
|
|
488
506
|
|
|
489
|
-
def
|
|
507
|
+
def test_create_name_nil
|
|
490
508
|
assert_raises(TypeError) do
|
|
491
509
|
Interface.new(nil)
|
|
492
510
|
end
|
|
493
511
|
end
|
|
494
512
|
|
|
495
|
-
def
|
|
513
|
+
def test_create_name_invalid
|
|
496
514
|
assert_raises(TypeError) do
|
|
497
515
|
Interface.new(node)
|
|
498
516
|
end
|
|
499
517
|
end
|
|
500
518
|
|
|
501
|
-
def
|
|
519
|
+
def test_create_does_not_exist
|
|
502
520
|
assert_raises(CliError) do
|
|
503
521
|
Interface.new('bogus')
|
|
504
522
|
end
|
|
505
523
|
end
|
|
506
524
|
|
|
507
|
-
def
|
|
525
|
+
def test_create_valid
|
|
508
526
|
interface = Interface.new(interfaces[0])
|
|
509
527
|
assert_equal(interfaces[0].downcase, interface.name)
|
|
510
528
|
end
|
|
511
529
|
|
|
512
|
-
def
|
|
530
|
+
def test_description_nil
|
|
513
531
|
interface = Interface.new(interfaces[0])
|
|
514
532
|
assert_raises(TypeError) do
|
|
515
533
|
interface.description = nil
|
|
516
534
|
end
|
|
517
535
|
end
|
|
518
536
|
|
|
519
|
-
def
|
|
537
|
+
def test_description_zero_length
|
|
520
538
|
interface = Interface.new(interfaces[0])
|
|
521
539
|
interface.description = ''
|
|
522
540
|
assert_equal('', interface.description)
|
|
523
541
|
end
|
|
524
542
|
|
|
525
|
-
def
|
|
543
|
+
def test_description_valid
|
|
526
544
|
interface = Interface.new(interfaces[0])
|
|
527
545
|
description = 'This is a test description ! '
|
|
528
546
|
interface.description = description
|
|
@@ -541,7 +559,35 @@ class TestInterface < CiscoTestCase
|
|
|
541
559
|
subif.destroy
|
|
542
560
|
end
|
|
543
561
|
|
|
544
|
-
def
|
|
562
|
+
def test_bfd_echo
|
|
563
|
+
interface = Interface.new(interfaces[0])
|
|
564
|
+
if validate_property_excluded?('interface', 'bfd_echo')
|
|
565
|
+
assert_nil(interface.bfd_echo)
|
|
566
|
+
assert_raises(Cisco::UnsupportedError) { interface.bfd_echo = false }
|
|
567
|
+
return
|
|
568
|
+
end
|
|
569
|
+
assert_equal(interface.default_bfd_echo,
|
|
570
|
+
interface.bfd_echo)
|
|
571
|
+
interface.bfd_echo = false
|
|
572
|
+
assert_equal(false, interface.bfd_echo)
|
|
573
|
+
interface.bfd_echo = interface.default_bfd_echo
|
|
574
|
+
assert_equal(interface.default_bfd_echo,
|
|
575
|
+
interface.bfd_echo)
|
|
576
|
+
# Clean up any stale config first
|
|
577
|
+
inf_name = "#{@port_channel}10"
|
|
578
|
+
Interface.new(inf_name).destroy
|
|
579
|
+
|
|
580
|
+
interface = Interface.new(inf_name)
|
|
581
|
+
assert_equal(interface.default_bfd_echo,
|
|
582
|
+
interface.bfd_echo)
|
|
583
|
+
interface.bfd_echo = false
|
|
584
|
+
assert_equal(false, interface.bfd_echo)
|
|
585
|
+
interface.bfd_echo = interface.default_bfd_echo
|
|
586
|
+
assert_equal(interface.default_bfd_echo,
|
|
587
|
+
interface.bfd_echo)
|
|
588
|
+
end
|
|
589
|
+
|
|
590
|
+
def test_mtu_change
|
|
545
591
|
interface = Interface.new(interfaces[0])
|
|
546
592
|
interface.switchport_mode = :disabled
|
|
547
593
|
interface.mtu = 1520
|
|
@@ -552,13 +598,13 @@ class TestInterface < CiscoTestCase
|
|
|
552
598
|
assert_equal(interface.default_mtu, interface.mtu)
|
|
553
599
|
end
|
|
554
600
|
|
|
555
|
-
def
|
|
601
|
+
def test_mtu_invalid
|
|
556
602
|
interface = Interface.new(interfaces[0])
|
|
557
603
|
interface.switchport_mode = :disabled
|
|
558
604
|
assert_raises(Cisco::CliError) { interface.mtu = 'hello' }
|
|
559
605
|
end
|
|
560
606
|
|
|
561
|
-
def
|
|
607
|
+
def test_mtu_valid
|
|
562
608
|
interface = Interface.new(interfaces[0])
|
|
563
609
|
interface.switchport_mode = :disabled
|
|
564
610
|
interface.mtu = 1550
|
|
@@ -625,8 +671,9 @@ class TestInterface < CiscoTestCase
|
|
|
625
671
|
|
|
626
672
|
# Ensure speed is non-auto value
|
|
627
673
|
if interface.default_speed == 'auto'
|
|
628
|
-
valid_speed =
|
|
674
|
+
valid_speed = valid_speeds(interface).select { |v| v != 'auto' }.shift
|
|
629
675
|
skip('Cannot configure non-auto speed') if valid_speed.nil?
|
|
676
|
+
interface.speed = valid_speed
|
|
630
677
|
end
|
|
631
678
|
|
|
632
679
|
# Test non-default values
|
|
@@ -642,7 +689,7 @@ class TestInterface < CiscoTestCase
|
|
|
642
689
|
assert_equal(interface.duplex, interface.default_duplex)
|
|
643
690
|
end
|
|
644
691
|
|
|
645
|
-
def
|
|
692
|
+
def test_shutdown_valid
|
|
646
693
|
interface = Interface.new(interfaces[0])
|
|
647
694
|
interface.shutdown = true
|
|
648
695
|
assert(interface.shutdown, 'Error: shutdown state is not true')
|
|
@@ -659,14 +706,14 @@ class TestInterface < CiscoTestCase
|
|
|
659
706
|
'Error: svi_management should be nil when interface is ethernet')
|
|
660
707
|
end
|
|
661
708
|
|
|
662
|
-
# def
|
|
709
|
+
# def test_prefix_list_when_switchport
|
|
663
710
|
# interface = Interface.new(interfaces[0])
|
|
664
711
|
# interface.switchport_mode = :access
|
|
665
712
|
# addresses = interface.prefixes
|
|
666
713
|
# assert_empty(addresses)
|
|
667
714
|
# end
|
|
668
715
|
#
|
|
669
|
-
# def
|
|
716
|
+
# def test_prefix_list_with_ipv4
|
|
670
717
|
# interface = Interface.new(interfaces[0])
|
|
671
718
|
# interface.switchport_mode = :access
|
|
672
719
|
# interface.switchport_mode = :disabled if platform == :nexus
|
|
@@ -679,7 +726,7 @@ class TestInterface < CiscoTestCase
|
|
|
679
726
|
# prefixes = nil
|
|
680
727
|
# end
|
|
681
728
|
#
|
|
682
|
-
# def
|
|
729
|
+
# def test_prefix_list_with_ipv6
|
|
683
730
|
# interface = Interface.new(interfaces[0] )
|
|
684
731
|
# interface.switchport_mode = :access
|
|
685
732
|
# interface.switchport_mode = :disabled if platform == :nexus
|
|
@@ -692,7 +739,7 @@ class TestInterface < CiscoTestCase
|
|
|
692
739
|
# prefixes = nil
|
|
693
740
|
# end
|
|
694
741
|
#
|
|
695
|
-
# def
|
|
742
|
+
# def test_prefix_list_with_ipv4_ipv6
|
|
696
743
|
# interface = Interface.new(interfaces[0])
|
|
697
744
|
# interface.switchport_mode = :access
|
|
698
745
|
# interface.switchport_mode = :disabled if platform == :nexus
|
|
@@ -707,68 +754,35 @@ class TestInterface < CiscoTestCase
|
|
|
707
754
|
# prefixes = nil
|
|
708
755
|
# end
|
|
709
756
|
|
|
710
|
-
def negotiate_auto_helper(interface,
|
|
757
|
+
def negotiate_auto_helper(interface, speed)
|
|
711
758
|
if validate_property_excluded?('interface',
|
|
712
759
|
interface.negotiate_auto_lookup_string)
|
|
713
760
|
assert_raises(Cisco::UnsupportedError) { interface.negotiate_auto = true }
|
|
714
761
|
return
|
|
715
762
|
end
|
|
716
|
-
# Check current default state before any other changes
|
|
717
|
-
inf_name = interface.name
|
|
718
|
-
assert_equal(default, interface.default_negotiate_auto,
|
|
719
|
-
"Error: #{inf_name} negotiate auto default value mismatch")
|
|
720
|
-
|
|
721
|
-
# Test non-defaults: Note that 'speed' and 'negotiate' are tightly coupled
|
|
722
|
-
# on some platforms. Some platforms need the speed command to be toggled
|
|
723
|
-
# before negotiate will work without raising an error; while others just
|
|
724
|
-
# need a non-'auto' speed value or may not support 'auto' at all; therefore
|
|
725
|
-
# just set a static speed value before setting any negotiate settings.
|
|
726
|
-
if default == true
|
|
727
|
-
negotiate_false(interface, speed)
|
|
728
|
-
negotiate_true(interface, speed)
|
|
729
|
-
else
|
|
730
|
-
negotiate_true(interface, speed)
|
|
731
|
-
negotiate_false(interface, speed)
|
|
732
|
-
end
|
|
733
|
-
end
|
|
734
763
|
|
|
735
|
-
|
|
736
|
-
#
|
|
737
|
-
|
|
764
|
+
# Note that 'speed' and 'negotiate auto' are tightly coupled
|
|
765
|
+
# When speed is 'auto', set negotiate auto to 'true'
|
|
766
|
+
# When speed is static value, turn off negotiate auto
|
|
738
767
|
interface.speed = speed
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
# Yes, this method is nearly identical to negotiate_true.
|
|
749
|
-
# The negotiate property is evil to troubleshoot. Keep them separate.
|
|
750
|
-
def negotiate_false(interface, speed)
|
|
751
|
-
# puts "false: 'speed #{speed}', 'no negotiate auto'"
|
|
752
|
-
intf = interface.name
|
|
753
|
-
interface.speed = speed
|
|
754
|
-
interface.negotiate_auto = false
|
|
755
|
-
refute(interface.negotiate_auto,
|
|
756
|
-
"#{intf} negotiate auto value should be false")
|
|
757
|
-
assert_show_match(pattern: /^\s+no negotiate auto/)
|
|
758
|
-
rescue Cisco::CliError => e
|
|
759
|
-
# 10G+ interfaces do not support negotiation
|
|
760
|
-
interface_supports_property?(intf, e.message)
|
|
768
|
+
if speed == 'auto'
|
|
769
|
+
interface.negotiate_auto = true
|
|
770
|
+
assert(interface.negotiate_auto,
|
|
771
|
+
"#{interface.name} negotiate auto value should be true")
|
|
772
|
+
else
|
|
773
|
+
interface.negotiate_auto = false
|
|
774
|
+
refute(interface.negotiate_auto,
|
|
775
|
+
"#{interface.name} negotiate auto value should be false")
|
|
776
|
+
end
|
|
761
777
|
end
|
|
762
778
|
|
|
763
779
|
def test_negotiate_auto_portchannel
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
skip('bundle id config not supported on this node') if platform == :ios_xr
|
|
771
|
-
raise
|
|
780
|
+
if validate_property_excluded?('interface_channel_group', 'channel_group')
|
|
781
|
+
member = InterfaceChannelGroup.new(interfaces[0])
|
|
782
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
783
|
+
member.channel_group = 10
|
|
784
|
+
end
|
|
785
|
+
return
|
|
772
786
|
end
|
|
773
787
|
|
|
774
788
|
# Clean up any stale config first
|
|
@@ -783,20 +797,14 @@ class TestInterface < CiscoTestCase
|
|
|
783
797
|
interface.negotiate_auto = false
|
|
784
798
|
end
|
|
785
799
|
else
|
|
786
|
-
default = interface.default_negotiate_auto
|
|
787
800
|
@default_show_command = show_cmd(inf_name)
|
|
788
801
|
|
|
789
|
-
#
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
# Test with switchport
|
|
794
|
-
interface.switchport_mode = :access
|
|
795
|
-
negotiate_auto_helper(interface, default, speed)
|
|
802
|
+
# Platforms raise error unless speed is properly configured first
|
|
803
|
+
speeds = valid_speeds(interface)
|
|
804
|
+
negotiate_auto_helper(interface, 'auto') if speeds.delete('auto')
|
|
796
805
|
|
|
797
|
-
|
|
798
|
-
interface
|
|
799
|
-
negotiate_auto_helper(interface, default, speed)
|
|
806
|
+
non_auto = speeds.shift
|
|
807
|
+
negotiate_auto_helper(interface, non_auto) unless non_auto.nil?
|
|
800
808
|
end
|
|
801
809
|
|
|
802
810
|
# Cleanup
|
|
@@ -816,20 +824,14 @@ class TestInterface < CiscoTestCase
|
|
|
816
824
|
return
|
|
817
825
|
end
|
|
818
826
|
|
|
819
|
-
# Find a static speed. Some platforms will raise an error unless
|
|
820
|
-
# speed is configured before setting negotiate auto.
|
|
821
|
-
speed = valid_speed_set(interface)
|
|
822
|
-
|
|
823
|
-
default = interface.default_negotiate_auto
|
|
824
827
|
@default_show_command = show_cmd(inf_name)
|
|
825
828
|
|
|
826
|
-
#
|
|
827
|
-
|
|
828
|
-
negotiate_auto_helper(interface,
|
|
829
|
+
# Platforms raise error unless speed is properly configured first
|
|
830
|
+
speeds = valid_speeds(interface)
|
|
831
|
+
negotiate_auto_helper(interface, 'auto') if speeds.delete('auto')
|
|
829
832
|
|
|
830
|
-
|
|
831
|
-
interface
|
|
832
|
-
negotiate_auto_helper(interface, default, speed)
|
|
833
|
+
non_auto = speeds.shift
|
|
834
|
+
negotiate_auto_helper(interface, non_auto) unless non_auto.nil?
|
|
833
835
|
end
|
|
834
836
|
|
|
835
837
|
def test_negotiate_auto_loopback
|
|
@@ -859,7 +861,7 @@ class TestInterface < CiscoTestCase
|
|
|
859
861
|
refute_empty(Interface.interfaces, 'Error: interfaces collection empty')
|
|
860
862
|
end
|
|
861
863
|
|
|
862
|
-
def
|
|
864
|
+
def test_ipv4_addr_mask_set_inv
|
|
863
865
|
interface = create_interface
|
|
864
866
|
interface.switchport_mode = :disabled if platform == :nexus
|
|
865
867
|
assert_raises(Cisco::CliError) do
|
|
@@ -867,7 +869,7 @@ class TestInterface < CiscoTestCase
|
|
|
867
869
|
end
|
|
868
870
|
end
|
|
869
871
|
|
|
870
|
-
def
|
|
872
|
+
def test_ipv4_addr_mask_set_inv_mask
|
|
871
873
|
interface = create_interface
|
|
872
874
|
interface.switchport_mode = :disabled if platform == :nexus
|
|
873
875
|
assert_raises(Cisco::CliError) do
|
|
@@ -955,7 +957,7 @@ class TestInterface < CiscoTestCase
|
|
|
955
957
|
end
|
|
956
958
|
end
|
|
957
959
|
|
|
958
|
-
def
|
|
960
|
+
def test_ipv4_address
|
|
959
961
|
interface = create_interface
|
|
960
962
|
interface.switchport_mode = :disabled if platform == :nexus
|
|
961
963
|
address = '8.7.1.1'
|
|
@@ -1010,7 +1012,7 @@ class TestInterface < CiscoTestCase
|
|
|
1010
1012
|
'Error: ipv4 netmask length default get value mismatch')
|
|
1011
1013
|
end
|
|
1012
1014
|
|
|
1013
|
-
def
|
|
1015
|
+
def test_ipv4_addr_preconfig
|
|
1014
1016
|
address = '8.7.1.1'
|
|
1015
1017
|
length = 15
|
|
1016
1018
|
ifname = interfaces[0]
|
|
@@ -1027,7 +1029,7 @@ class TestInterface < CiscoTestCase
|
|
|
1027
1029
|
interface_ipv4_config(ifname, address, length, false)
|
|
1028
1030
|
end
|
|
1029
1031
|
|
|
1030
|
-
def
|
|
1032
|
+
def test_ipv4_addr_preconfig_sec
|
|
1031
1033
|
address = '8.7.1.1'
|
|
1032
1034
|
length = 15
|
|
1033
1035
|
sec_address = '1.1.2.5'
|
|
@@ -1048,27 +1050,27 @@ class TestInterface < CiscoTestCase
|
|
|
1048
1050
|
interface_ipv4_config(ifname, address, length, false, false)
|
|
1049
1051
|
end
|
|
1050
1052
|
|
|
1051
|
-
def
|
|
1053
|
+
def test_ipv4_arp_timeout
|
|
1052
1054
|
unless platform == :ios_xr
|
|
1053
1055
|
# Setup
|
|
1054
1056
|
config_no_warn('no interface vlan11')
|
|
1055
|
-
|
|
1057
|
+
svi = Interface.new('vlan11')
|
|
1056
1058
|
|
|
1057
1059
|
# Test default
|
|
1058
|
-
assert_equal(
|
|
1060
|
+
assert_equal(svi.default_ipv4_arp_timeout, svi.ipv4_arp_timeout)
|
|
1059
1061
|
# Test non-default
|
|
1060
|
-
|
|
1061
|
-
assert_equal(300,
|
|
1062
|
+
svi.ipv4_arp_timeout = 300
|
|
1063
|
+
assert_equal(300, svi.ipv4_arp_timeout)
|
|
1062
1064
|
# Set back to default
|
|
1063
|
-
|
|
1064
|
-
assert_equal(
|
|
1065
|
+
svi.ipv4_arp_timeout = svi.default_ipv4_arp_timeout
|
|
1066
|
+
assert_equal(svi.default_ipv4_arp_timeout, svi.ipv4_arp_timeout)
|
|
1065
1067
|
end
|
|
1066
1068
|
# Attempt to configure on a non-vlan interface
|
|
1067
|
-
|
|
1068
|
-
assert_raises(RuntimeError) {
|
|
1069
|
+
nonsvi = create_interface
|
|
1070
|
+
assert_raises(RuntimeError) { nonsvi.ipv4_arp_timeout = 300 }
|
|
1069
1071
|
end
|
|
1070
1072
|
|
|
1071
|
-
def
|
|
1073
|
+
def test_ipv4_forwarding
|
|
1072
1074
|
intf = interfaces[0]
|
|
1073
1075
|
i = Interface.new(intf)
|
|
1074
1076
|
|
|
@@ -1099,7 +1101,7 @@ class TestInterface < CiscoTestCase
|
|
|
1099
1101
|
assert_equal(i.default_ipv4_forwarding, i.ipv4_forwarding)
|
|
1100
1102
|
end
|
|
1101
1103
|
|
|
1102
|
-
def
|
|
1104
|
+
def test_ff_anycast_gateway_mac
|
|
1103
1105
|
# Ensure N7k has compatible interface
|
|
1104
1106
|
mt_full_interface? if node.product_id[/N7/]
|
|
1105
1107
|
|
|
@@ -1154,7 +1156,7 @@ class TestInterface < CiscoTestCase
|
|
|
1154
1156
|
end
|
|
1155
1157
|
end
|
|
1156
1158
|
|
|
1157
|
-
def
|
|
1159
|
+
def test_ipv4_proxy_arp
|
|
1158
1160
|
interface = create_interface
|
|
1159
1161
|
interface.switchport_mode = :disabled if platform == :nexus
|
|
1160
1162
|
|
|
@@ -1191,7 +1193,7 @@ class TestInterface < CiscoTestCase
|
|
|
1191
1193
|
'Error: ip proxy-arp default get value mismatch')
|
|
1192
1194
|
end
|
|
1193
1195
|
|
|
1194
|
-
def
|
|
1196
|
+
def test_ipv4_redirects
|
|
1195
1197
|
interface = create_interface
|
|
1196
1198
|
interface.switchport_mode = :disabled if platform == :nexus
|
|
1197
1199
|
|
|
@@ -1338,7 +1340,7 @@ class TestInterface < CiscoTestCase
|
|
|
1338
1340
|
|
|
1339
1341
|
# NOTE - Changes to this method may require new validation methods
|
|
1340
1342
|
# to be created or existing ones to be modified.
|
|
1341
|
-
def
|
|
1343
|
+
def test_ipv4_all_interfaces
|
|
1342
1344
|
inttype_h = interface_test_data
|
|
1343
1345
|
|
|
1344
1346
|
# Set system defaults to "factory" values prior to initial test.
|
|
@@ -1391,7 +1393,7 @@ class TestInterface < CiscoTestCase
|
|
|
1391
1393
|
end
|
|
1392
1394
|
end
|
|
1393
1395
|
|
|
1394
|
-
def
|
|
1396
|
+
def test_vrf_default
|
|
1395
1397
|
interface = Interface.new('loopback1')
|
|
1396
1398
|
assert_empty(interface.vrf)
|
|
1397
1399
|
interface.vrf = 'foo'
|
|
@@ -1400,18 +1402,18 @@ class TestInterface < CiscoTestCase
|
|
|
1400
1402
|
assert_equal(interface.vrf, interface.default_vrf)
|
|
1401
1403
|
end
|
|
1402
1404
|
|
|
1403
|
-
def
|
|
1405
|
+
def test_vrf_invalid_type
|
|
1404
1406
|
interface = Interface.new('loopback1')
|
|
1405
1407
|
assert_raises(TypeError) { interface.vrf = 1 }
|
|
1406
1408
|
end
|
|
1407
1409
|
|
|
1408
|
-
def
|
|
1410
|
+
def test_vrf_exceeds_max_length
|
|
1409
1411
|
interface = Interface.new('loopback1')
|
|
1410
1412
|
long_string = 'a' * (IF_VRF_MAX_LENGTH + 1)
|
|
1411
1413
|
assert_raises(Cisco::CliError) { interface.vrf = long_string }
|
|
1412
1414
|
end
|
|
1413
1415
|
|
|
1414
|
-
def
|
|
1416
|
+
def test_vrf_override
|
|
1415
1417
|
interface = Interface.new('loopback1')
|
|
1416
1418
|
vrf1 = 'test1'
|
|
1417
1419
|
vrf2 = 'test2'
|
|
@@ -1421,7 +1423,7 @@ class TestInterface < CiscoTestCase
|
|
|
1421
1423
|
interface.destroy
|
|
1422
1424
|
end
|
|
1423
1425
|
|
|
1424
|
-
def
|
|
1426
|
+
def test_vrf_valid
|
|
1425
1427
|
interface = Interface.new('loopback1')
|
|
1426
1428
|
vrf = 'test'
|
|
1427
1429
|
interface.vrf = vrf
|
|
@@ -1491,4 +1493,227 @@ class TestInterface < CiscoTestCase
|
|
|
1491
1493
|
i.ipv4_pim_sparse_mode = i.default_ipv4_pim_sparse_mode
|
|
1492
1494
|
assert_equal(i.default_ipv4_pim_sparse_mode, i.ipv4_pim_sparse_mode)
|
|
1493
1495
|
end
|
|
1496
|
+
|
|
1497
|
+
def test_storm_control_broadcast
|
|
1498
|
+
interface = Interface.new(interfaces[0])
|
|
1499
|
+
interface.switchport_enable(true)
|
|
1500
|
+
if validate_property_excluded?('interface', 'storm_control_broadcast')
|
|
1501
|
+
assert_nil(interface.storm_control_broadcast)
|
|
1502
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
1503
|
+
interface.storm_control_broadcast = '20.12'
|
|
1504
|
+
end
|
|
1505
|
+
return
|
|
1506
|
+
end
|
|
1507
|
+
assert_equal(interface.default_storm_control_broadcast,
|
|
1508
|
+
interface.storm_control_broadcast)
|
|
1509
|
+
interface.storm_control_broadcast = '20.12'
|
|
1510
|
+
assert_equal('20.12', interface.storm_control_broadcast)
|
|
1511
|
+
interface.storm_control_broadcast =
|
|
1512
|
+
interface.default_storm_control_broadcast
|
|
1513
|
+
assert_equal(interface.default_storm_control_broadcast,
|
|
1514
|
+
interface.storm_control_broadcast)
|
|
1515
|
+
end
|
|
1516
|
+
|
|
1517
|
+
def test_storm_control_multicast
|
|
1518
|
+
interface = Interface.new(interfaces[0])
|
|
1519
|
+
interface.switchport_enable(true)
|
|
1520
|
+
if validate_property_excluded?('interface', 'storm_control_multicast')
|
|
1521
|
+
assert_nil(interface.storm_control_multicast)
|
|
1522
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
1523
|
+
interface.storm_control_multicast = '33.33'
|
|
1524
|
+
end
|
|
1525
|
+
return
|
|
1526
|
+
end
|
|
1527
|
+
assert_equal(interface.default_storm_control_multicast,
|
|
1528
|
+
interface.storm_control_multicast)
|
|
1529
|
+
interface.storm_control_multicast = '33.33'
|
|
1530
|
+
assert_equal('33.33', interface.storm_control_multicast)
|
|
1531
|
+
interface.storm_control_multicast =
|
|
1532
|
+
interface.default_storm_control_multicast
|
|
1533
|
+
assert_equal(interface.default_storm_control_multicast,
|
|
1534
|
+
interface.storm_control_multicast)
|
|
1535
|
+
end
|
|
1536
|
+
|
|
1537
|
+
def test_storm_control_unicast
|
|
1538
|
+
interface = Interface.new(interfaces[0])
|
|
1539
|
+
interface.switchport_enable(true)
|
|
1540
|
+
if validate_property_excluded?('interface', 'storm_control_unicast')
|
|
1541
|
+
assert_nil(interface.storm_control_unicast)
|
|
1542
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
1543
|
+
interface.storm_control_unicast = '44.44'
|
|
1544
|
+
end
|
|
1545
|
+
return
|
|
1546
|
+
end
|
|
1547
|
+
assert_equal(interface.default_storm_control_unicast,
|
|
1548
|
+
interface.storm_control_unicast)
|
|
1549
|
+
interface.storm_control_unicast = '44.44'
|
|
1550
|
+
assert_equal('44.44', interface.storm_control_unicast)
|
|
1551
|
+
interface.storm_control_unicast =
|
|
1552
|
+
interface.default_storm_control_unicast
|
|
1553
|
+
assert_equal(interface.default_storm_control_unicast,
|
|
1554
|
+
interface.storm_control_unicast)
|
|
1555
|
+
end
|
|
1556
|
+
|
|
1557
|
+
def test_ipv4_dhcp_relay_addr
|
|
1558
|
+
interface = Interface.new(interfaces[0])
|
|
1559
|
+
interface.switchport_enable(false)
|
|
1560
|
+
list = ['1.1.1.1', '2.2.2.2']
|
|
1561
|
+
if validate_property_excluded?('interface', 'ipv4_dhcp_relay_addr')
|
|
1562
|
+
assert_nil(interface.ipv4_dhcp_relay_addr)
|
|
1563
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
1564
|
+
interface.ipv4_dhcp_relay_addr = list
|
|
1565
|
+
end
|
|
1566
|
+
return
|
|
1567
|
+
end
|
|
1568
|
+
assert_equal(interface.default_ipv4_dhcp_relay_addr,
|
|
1569
|
+
interface.ipv4_dhcp_relay_addr)
|
|
1570
|
+
interface.ipv4_dhcp_relay_addr = list
|
|
1571
|
+
assert_equal(list, interface.ipv4_dhcp_relay_addr)
|
|
1572
|
+
interface.ipv4_dhcp_relay_addr =
|
|
1573
|
+
interface.default_ipv4_dhcp_relay_addr
|
|
1574
|
+
assert_equal(interface.default_ipv4_dhcp_relay_addr,
|
|
1575
|
+
interface.ipv4_dhcp_relay_addr)
|
|
1576
|
+
end
|
|
1577
|
+
|
|
1578
|
+
def test_ipv4_dhcp_relay_info_trust
|
|
1579
|
+
interface = Interface.new(interfaces[0])
|
|
1580
|
+
interface.switchport_enable(false)
|
|
1581
|
+
if validate_property_excluded?('interface', 'ipv4_dhcp_relay_info_trust')
|
|
1582
|
+
assert_nil(interface.ipv4_dhcp_relay_info_trust)
|
|
1583
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
1584
|
+
interface.ipv4_dhcp_relay_info_trust = true
|
|
1585
|
+
end
|
|
1586
|
+
return
|
|
1587
|
+
end
|
|
1588
|
+
assert_equal(interface.default_ipv4_dhcp_relay_info_trust,
|
|
1589
|
+
interface.ipv4_dhcp_relay_info_trust)
|
|
1590
|
+
interface.ipv4_dhcp_relay_info_trust = true
|
|
1591
|
+
assert_equal(true, interface.ipv4_dhcp_relay_info_trust)
|
|
1592
|
+
interface.ipv4_dhcp_relay_info_trust =
|
|
1593
|
+
interface.default_ipv4_dhcp_relay_info_trust
|
|
1594
|
+
assert_equal(interface.default_ipv4_dhcp_relay_info_trust,
|
|
1595
|
+
interface.ipv4_dhcp_relay_info_trust)
|
|
1596
|
+
end
|
|
1597
|
+
|
|
1598
|
+
def test_ipv4_dhcp_relay_src_addr_hsrp
|
|
1599
|
+
interface = Interface.new(interfaces[0])
|
|
1600
|
+
interface.switchport_enable(false)
|
|
1601
|
+
if validate_property_excluded?('interface', 'ipv4_dhcp_relay_src_addr_hsrp')
|
|
1602
|
+
assert_nil(interface.ipv4_dhcp_relay_src_addr_hsrp)
|
|
1603
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
1604
|
+
interface.ipv4_dhcp_relay_src_addr_hsrp = true
|
|
1605
|
+
end
|
|
1606
|
+
return
|
|
1607
|
+
end
|
|
1608
|
+
assert_equal(interface.default_ipv4_dhcp_relay_src_addr_hsrp,
|
|
1609
|
+
interface.ipv4_dhcp_relay_src_addr_hsrp)
|
|
1610
|
+
interface.ipv4_dhcp_relay_src_addr_hsrp = true
|
|
1611
|
+
assert_equal(true, interface.ipv4_dhcp_relay_src_addr_hsrp)
|
|
1612
|
+
interface.ipv4_dhcp_relay_src_addr_hsrp =
|
|
1613
|
+
interface.default_ipv4_dhcp_relay_src_addr_hsrp
|
|
1614
|
+
assert_equal(interface.default_ipv4_dhcp_relay_src_addr_hsrp,
|
|
1615
|
+
interface.ipv4_dhcp_relay_src_addr_hsrp)
|
|
1616
|
+
end
|
|
1617
|
+
|
|
1618
|
+
def test_ipv4_dhcp_relay_src_intf
|
|
1619
|
+
interface = Interface.new(interfaces[0])
|
|
1620
|
+
interface.switchport_enable(false)
|
|
1621
|
+
if validate_property_excluded?('interface', 'ipv4_dhcp_relay_src_intf')
|
|
1622
|
+
assert_nil(interface.ipv4_dhcp_relay_src_intf)
|
|
1623
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
1624
|
+
interface.ipv4_dhcp_relay_src_intf = 'port-channel200'
|
|
1625
|
+
end
|
|
1626
|
+
return
|
|
1627
|
+
end
|
|
1628
|
+
assert_equal(interface.default_ipv4_dhcp_relay_src_intf,
|
|
1629
|
+
interface.ipv4_dhcp_relay_src_intf)
|
|
1630
|
+
interface.ipv4_dhcp_relay_src_intf = 'port-channel200'
|
|
1631
|
+
assert_equal('port-channel200', interface.ipv4_dhcp_relay_src_intf)
|
|
1632
|
+
interface.ipv4_dhcp_relay_src_intf =
|
|
1633
|
+
interface.default_ipv4_dhcp_relay_src_intf
|
|
1634
|
+
assert_equal(interface.default_ipv4_dhcp_relay_src_intf,
|
|
1635
|
+
interface.ipv4_dhcp_relay_src_intf)
|
|
1636
|
+
end
|
|
1637
|
+
|
|
1638
|
+
def test_ipv4_dhcp_relay_subnet_broadcast
|
|
1639
|
+
interface = Interface.new(interfaces[0])
|
|
1640
|
+
interface.switchport_enable(false)
|
|
1641
|
+
if validate_property_excluded?('interface', 'ipv4_dhcp_relay_subnet_broadcast')
|
|
1642
|
+
assert_nil(interface.ipv4_dhcp_relay_subnet_broadcast)
|
|
1643
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
1644
|
+
interface.ipv4_dhcp_relay_subnet_broadcast = true
|
|
1645
|
+
end
|
|
1646
|
+
return
|
|
1647
|
+
end
|
|
1648
|
+
assert_equal(interface.default_ipv4_dhcp_relay_subnet_broadcast,
|
|
1649
|
+
interface.ipv4_dhcp_relay_subnet_broadcast)
|
|
1650
|
+
interface.ipv4_dhcp_relay_subnet_broadcast = true
|
|
1651
|
+
assert_equal(true, interface.ipv4_dhcp_relay_subnet_broadcast)
|
|
1652
|
+
interface.ipv4_dhcp_relay_subnet_broadcast =
|
|
1653
|
+
interface.default_ipv4_dhcp_relay_subnet_broadcast
|
|
1654
|
+
assert_equal(interface.default_ipv4_dhcp_relay_subnet_broadcast,
|
|
1655
|
+
interface.ipv4_dhcp_relay_subnet_broadcast)
|
|
1656
|
+
end
|
|
1657
|
+
|
|
1658
|
+
def test_ipv4_dhcp_smart_relay
|
|
1659
|
+
interface = Interface.new(interfaces[0])
|
|
1660
|
+
interface.switchport_enable(false)
|
|
1661
|
+
if validate_property_excluded?('interface', 'ipv4_dhcp_smart_relay')
|
|
1662
|
+
assert_nil(interface.ipv4_dhcp_smart_relay)
|
|
1663
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
1664
|
+
interface.ipv4_dhcp_smart_relay = true
|
|
1665
|
+
end
|
|
1666
|
+
return
|
|
1667
|
+
end
|
|
1668
|
+
assert_equal(interface.default_ipv4_dhcp_smart_relay,
|
|
1669
|
+
interface.ipv4_dhcp_smart_relay)
|
|
1670
|
+
interface.ipv4_dhcp_smart_relay = true
|
|
1671
|
+
assert_equal(true, interface.ipv4_dhcp_smart_relay)
|
|
1672
|
+
interface.ipv4_dhcp_smart_relay =
|
|
1673
|
+
interface.default_ipv4_dhcp_smart_relay
|
|
1674
|
+
assert_equal(interface.default_ipv4_dhcp_smart_relay,
|
|
1675
|
+
interface.ipv4_dhcp_smart_relay)
|
|
1676
|
+
end
|
|
1677
|
+
|
|
1678
|
+
def test_ipv6_dhcp_relay_addr
|
|
1679
|
+
interface = Interface.new(interfaces[0])
|
|
1680
|
+
interface.switchport_enable(false)
|
|
1681
|
+
list = ['2000::11', '2000::12']
|
|
1682
|
+
if validate_property_excluded?('interface', 'ipv6_dhcp_relay_addr')
|
|
1683
|
+
assert_nil(interface.ipv6_dhcp_relay_addr)
|
|
1684
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
1685
|
+
interface.ipv6_dhcp_relay_addr = list
|
|
1686
|
+
end
|
|
1687
|
+
return
|
|
1688
|
+
end
|
|
1689
|
+
assert_equal(interface.default_ipv6_dhcp_relay_addr,
|
|
1690
|
+
interface.ipv6_dhcp_relay_addr)
|
|
1691
|
+
interface.ipv6_dhcp_relay_addr = list
|
|
1692
|
+
assert_equal(list, interface.ipv6_dhcp_relay_addr)
|
|
1693
|
+
interface.ipv6_dhcp_relay_addr =
|
|
1694
|
+
interface.default_ipv6_dhcp_relay_addr
|
|
1695
|
+
assert_equal(interface.default_ipv6_dhcp_relay_addr,
|
|
1696
|
+
interface.ipv6_dhcp_relay_addr)
|
|
1697
|
+
end
|
|
1698
|
+
|
|
1699
|
+
def test_ipv6_dhcp_relay_src_intf
|
|
1700
|
+
inf_name = interfaces[0]
|
|
1701
|
+
interface = Interface.new(inf_name)
|
|
1702
|
+
interface.switchport_enable(false)
|
|
1703
|
+
if validate_property_excluded?('interface', 'ipv6_dhcp_relay_src_intf')
|
|
1704
|
+
assert_nil(interface.ipv6_dhcp_relay_src_intf)
|
|
1705
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
1706
|
+
interface.ipv6_dhcp_relay_src_intf = inf_name
|
|
1707
|
+
end
|
|
1708
|
+
return
|
|
1709
|
+
end
|
|
1710
|
+
assert_equal(interface.default_ipv6_dhcp_relay_src_intf,
|
|
1711
|
+
interface.ipv6_dhcp_relay_src_intf)
|
|
1712
|
+
interface.ipv6_dhcp_relay_src_intf = inf_name
|
|
1713
|
+
assert_equal(inf_name, interface.ipv6_dhcp_relay_src_intf)
|
|
1714
|
+
interface.ipv6_dhcp_relay_src_intf =
|
|
1715
|
+
interface.default_ipv6_dhcp_relay_src_intf
|
|
1716
|
+
assert_equal(interface.default_ipv6_dhcp_relay_src_intf,
|
|
1717
|
+
interface.ipv6_dhcp_relay_src_intf)
|
|
1718
|
+
end
|
|
1494
1719
|
end
|