cisco_node_utils 1.2.0 → 1.3.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 +2 -0
- data/.rspec +2 -0
- data/.rubocop.yml +13 -0
- data/.travis.yml +4 -1
- data/CHANGELOG.md +81 -2
- data/CONTRIBUTING.md +2 -17
- data/Gemfile +5 -0
- data/README.md +92 -47
- data/Rakefile +23 -1
- data/bin/git/hooks/hook_lib +7 -0
- data/bin/git/hooks/pre-commit/check_unstaged_changes +18 -0
- data/bin/git/hooks/pre-commit/rubocop +7 -2
- data/bin/git/hooks/pre-commit/validate-diffs +18 -4
- data/bin/git/hooks/pre-commit/validate-yaml +18 -0
- data/bin/git/update-hooks +64 -6
- data/cisco_node_utils.gemspec +9 -6
- data/docs/README-develop-best-practices.md +149 -50
- data/docs/README-develop-node-utils-APIs.md +92 -42
- data/docs/README-maintainers.md +7 -4
- data/docs/README-test-execution.md +57 -0
- data/docs/cisco_node_utils.yaml.example +30 -0
- data/docs/template-router.rb +4 -0
- data/ext/mkrf_conf.rb +63 -0
- data/lib/.rubocop.yml +2 -2
- data/lib/cisco_node_utils.rb +5 -0
- data/lib/cisco_node_utils/aaa_authentication_login.rb +5 -6
- data/lib/cisco_node_utils/aaa_authorization_service.rb +1 -1
- data/lib/cisco_node_utils/ace.rb +165 -12
- data/lib/cisco_node_utils/acl.rb +2 -1
- data/lib/cisco_node_utils/bgp.rb +184 -21
- data/lib/cisco_node_utils/bgp_af.rb +94 -249
- data/lib/cisco_node_utils/bgp_neighbor.rb +94 -14
- data/lib/cisco_node_utils/bgp_neighbor_af.rb +75 -8
- data/lib/cisco_node_utils/bridge_domain.rb +183 -0
- data/lib/cisco_node_utils/bridge_domain_vni.rb +206 -0
- data/lib/cisco_node_utils/cisco_cmn_utils.rb +85 -2
- data/lib/cisco_node_utils/client.rb +35 -0
- data/lib/cisco_node_utils/client/client.rb +234 -0
- data/lib/cisco_node_utils/client/grpc.rb +33 -0
- data/lib/cisco_node_utils/client/grpc/client.rb +311 -0
- data/lib/cisco_node_utils/client/grpc/ems.proto +148 -0
- data/lib/cisco_node_utils/client/grpc/ems.rb +111 -0
- data/lib/cisco_node_utils/client/grpc/ems_services.rb +49 -0
- data/lib/cisco_node_utils/client/nxapi.rb +31 -0
- data/lib/cisco_node_utils/client/nxapi/client.rb +305 -0
- data/lib/cisco_node_utils/client/utils.rb +164 -0
- data/lib/cisco_node_utils/cmd_ref/README_YAML.md +222 -254
- data/lib/cisco_node_utils/cmd_ref/aaa_auth_login_service.yaml +11 -8
- data/lib/cisco_node_utils/cmd_ref/aaa_authentication_login.yaml +22 -15
- data/lib/cisco_node_utils/cmd_ref/aaa_authorization_service.yaml +11 -8
- data/lib/cisco_node_utils/cmd_ref/acl.yaml +21 -16
- data/lib/cisco_node_utils/cmd_ref/bgp.yaml +239 -109
- data/lib/cisco_node_utils/cmd_ref/bgp_af.yaml +114 -55
- data/lib/cisco_node_utils/cmd_ref/bgp_neighbor.yaml +76 -52
- data/lib/cisco_node_utils/cmd_ref/bgp_neighbor_af.yaml +106 -62
- data/lib/cisco_node_utils/cmd_ref/bridge_domain.yaml +71 -0
- data/lib/cisco_node_utils/cmd_ref/bridge_domain_vni.yaml +33 -0
- data/lib/cisco_node_utils/cmd_ref/dnsclient.yaml +35 -14
- data/lib/cisco_node_utils/cmd_ref/encapsulation.yaml +25 -0
- data/lib/cisco_node_utils/cmd_ref/evpn_vni.yaml +23 -17
- data/lib/cisco_node_utils/cmd_ref/fabricpath.yaml +94 -83
- data/lib/cisco_node_utils/cmd_ref/fabricpath_topology.yaml +22 -17
- data/lib/cisco_node_utils/cmd_ref/feature.yaml +76 -26
- data/lib/cisco_node_utils/cmd_ref/images.yaml +3 -2
- data/lib/cisco_node_utils/cmd_ref/interface.yaml +381 -153
- data/lib/cisco_node_utils/cmd_ref/interface_channel_group.yaml +21 -11
- data/lib/cisco_node_utils/cmd_ref/interface_ospf.yaml +21 -21
- data/lib/cisco_node_utils/cmd_ref/interface_portchannel.yaml +30 -21
- data/lib/cisco_node_utils/cmd_ref/interface_service_vni.yaml +18 -13
- data/lib/cisco_node_utils/cmd_ref/inventory.yaml +26 -31
- data/lib/cisco_node_utils/cmd_ref/itd_device_group.yaml +83 -0
- data/lib/cisco_node_utils/cmd_ref/itd_service.yaml +119 -0
- data/lib/cisco_node_utils/cmd_ref/memory.yaml +17 -6
- data/lib/cisco_node_utils/cmd_ref/ntp_config.yaml +10 -3
- data/lib/cisco_node_utils/cmd_ref/ntp_server.yaml +17 -5
- data/lib/cisco_node_utils/cmd_ref/ospf.yaml +33 -29
- data/lib/cisco_node_utils/cmd_ref/overlay_global.yaml +12 -10
- data/lib/cisco_node_utils/cmd_ref/pim.yaml +16 -19
- data/lib/cisco_node_utils/cmd_ref/portchannel_global.yaml +40 -25
- data/lib/cisco_node_utils/cmd_ref/radius_global.yaml +17 -12
- data/lib/cisco_node_utils/cmd_ref/radius_server.yaml +71 -35
- data/lib/cisco_node_utils/cmd_ref/radius_server_group.yaml +10 -5
- data/lib/cisco_node_utils/cmd_ref/show_system.yaml +6 -2
- data/lib/cisco_node_utils/cmd_ref/show_version.yaml +47 -43
- data/lib/cisco_node_utils/cmd_ref/snmp_community.yaml +13 -11
- data/lib/cisco_node_utils/cmd_ref/snmp_group.yaml +4 -2
- data/lib/cisco_node_utils/cmd_ref/snmp_notification_receiver.yaml +23 -21
- data/lib/cisco_node_utils/cmd_ref/snmp_server.yaml +26 -22
- data/lib/cisco_node_utils/cmd_ref/snmp_user.yaml +19 -17
- data/lib/cisco_node_utils/cmd_ref/snmpnotification.yaml +18 -6
- data/lib/cisco_node_utils/cmd_ref/stp_global.yaml +234 -0
- data/lib/cisco_node_utils/cmd_ref/syslog_server.yaml +24 -9
- data/lib/cisco_node_utils/cmd_ref/syslog_settings.yaml +5 -3
- data/lib/cisco_node_utils/cmd_ref/system.yaml +4 -3
- data/lib/cisco_node_utils/cmd_ref/tacacs_server.yaml +22 -20
- data/lib/cisco_node_utils/cmd_ref/tacacs_server_group.yaml +27 -15
- data/lib/cisco_node_utils/cmd_ref/tacacs_server_host.yaml +45 -16
- data/lib/cisco_node_utils/cmd_ref/vdc.yaml +21 -11
- data/lib/cisco_node_utils/cmd_ref/virtual_service.yaml +3 -2
- data/lib/cisco_node_utils/cmd_ref/vlan.yaml +60 -32
- data/lib/cisco_node_utils/cmd_ref/vpc.yaml +118 -101
- data/lib/cisco_node_utils/cmd_ref/vrf.yaml +54 -58
- data/lib/cisco_node_utils/cmd_ref/vrf_af.yaml +118 -0
- data/lib/cisco_node_utils/cmd_ref/vtp.yaml +19 -25
- data/lib/cisco_node_utils/cmd_ref/vxlan_vtep.yaml +28 -18
- data/lib/cisco_node_utils/cmd_ref/vxlan_vtep_vni.yaml +34 -17
- data/lib/cisco_node_utils/cmd_ref/yum.yaml +6 -4
- data/lib/cisco_node_utils/command_reference.rb +261 -142
- data/lib/cisco_node_utils/constants.rb +33 -0
- data/lib/cisco_node_utils/encapsulation.rb +112 -0
- data/lib/cisco_node_utils/environment.rb +102 -0
- data/lib/cisco_node_utils/evpn_vni.rb +5 -3
- data/lib/cisco_node_utils/exceptions.rb +111 -0
- data/lib/cisco_node_utils/fabricpath_global.rb +52 -35
- data/lib/cisco_node_utils/fabricpath_topology.rb +44 -57
- data/lib/cisco_node_utils/feature.rb +165 -3
- data/lib/cisco_node_utils/interface.rb +1051 -260
- data/lib/cisco_node_utils/interface_channel_group.rb +11 -10
- data/lib/cisco_node_utils/interface_ospf.rb +1 -2
- data/lib/cisco_node_utils/interface_portchannel.rb +4 -12
- data/lib/cisco_node_utils/interface_service_vni.rb +7 -7
- data/lib/cisco_node_utils/itd_device_group.rb +248 -0
- data/lib/cisco_node_utils/itd_device_group_node.rb +144 -0
- data/lib/cisco_node_utils/itd_service.rb +523 -0
- data/lib/cisco_node_utils/logger.rb +75 -0
- data/lib/cisco_node_utils/node.rb +62 -192
- data/lib/cisco_node_utils/node_util.rb +56 -10
- data/lib/cisco_node_utils/overlay_global.rb +2 -2
- data/lib/cisco_node_utils/pim.rb +2 -13
- data/lib/cisco_node_utils/pim_group_list.rb +1 -1
- data/lib/cisco_node_utils/pim_rp_address.rb +1 -1
- data/lib/cisco_node_utils/platform.rb +52 -21
- data/lib/cisco_node_utils/portchannel_global.rb +89 -19
- data/lib/cisco_node_utils/radius_server.rb +168 -37
- data/lib/cisco_node_utils/router_ospf.rb +20 -35
- data/lib/cisco_node_utils/router_ospf_vrf.rb +4 -4
- data/lib/cisco_node_utils/snmpserver.rb +1 -6
- data/lib/cisco_node_utils/snmpuser.rb +6 -4
- data/lib/cisco_node_utils/stp_global.rb +676 -0
- data/lib/cisco_node_utils/syslog_server.rb +77 -18
- data/lib/cisco_node_utils/syslog_settings.rb +1 -1
- data/lib/cisco_node_utils/tacacs_server_group.rb +8 -4
- data/lib/cisco_node_utils/tacacs_server_host.rb +115 -25
- data/lib/cisco_node_utils/vdc.rb +12 -0
- data/lib/cisco_node_utils/version.rb +1 -1
- data/lib/cisco_node_utils/vlan.rb +147 -29
- data/lib/cisco_node_utils/vpc.rb +55 -3
- data/lib/cisco_node_utils/vrf.rb +72 -11
- data/lib/cisco_node_utils/vrf_af.rb +114 -29
- data/lib/cisco_node_utils/vtp.rb +34 -52
- data/lib/cisco_node_utils/vxlan_vtep.rb +34 -8
- data/lib/cisco_node_utils/vxlan_vtep_vni.rb +36 -4
- data/lib/minitest/environment_plugin.rb +31 -0
- data/lib/minitest/log_level_plugin.rb +41 -0
- data/spec/client_spec.rb +7 -0
- data/spec/environment_spec.rb +263 -0
- data/spec/grpc_client_spec.rb +23 -0
- data/spec/isolate/all_clients_spec.rb +9 -0
- data/spec/isolate/grpc_only_spec.rb +16 -0
- data/spec/isolate/no_clients_spec.rb +26 -0
- data/spec/isolate/nxapi_only_spec.rb +16 -0
- data/spec/nxapi_client_spec.rb +42 -0
- data/spec/schema.yaml +75 -0
- data/spec/shared_examples_for_clients.rb +14 -0
- data/spec/spec_helper.rb +91 -0
- data/spec/whitespace_spec.rb +10 -0
- data/spec/yaml_spec.rb +42 -0
- data/tests/.rubocop.yml +2 -2
- data/tests/CSCuxdublin-1.0.0-7.0.3.I3.1.lib32_n9000.rpm +0 -0
- data/tests/basetest.rb +96 -36
- data/tests/ciscotest.rb +220 -12
- data/tests/cmd_config.yaml +71 -49
- data/tests/cmd_config_invalid.yaml +1 -1
- data/tests/test_aaa_authentication_login.rb +1 -0
- data/tests/test_aaa_authentication_login_service.rb +9 -0
- data/tests/test_aaa_authorization_service.rb +173 -367
- data/tests/test_ace.rb +171 -100
- data/tests/test_acl.rb +10 -1
- data/tests/test_bgp_af.rb +395 -728
- data/tests/test_bgp_neighbor.rb +274 -115
- data/tests/test_bgp_neighbor_af.rb +178 -77
- data/tests/test_bridge_domain.rb +191 -0
- data/tests/test_bridge_domain_vni.rb +116 -0
- data/tests/test_client_utils.rb +111 -0
- data/tests/test_command_config.rb +9 -5
- data/tests/test_command_reference.rb +380 -102
- data/tests/test_dns_domain.rb +13 -3
- data/tests/test_domain_name.rb +13 -3
- data/tests/test_encapsulation.rb +77 -0
- data/tests/test_evpn_vni.rb +25 -7
- data/tests/test_fabricpath_global.rb +167 -163
- data/tests/test_fabricpath_topology.rb +12 -33
- data/tests/test_feature.rb +215 -0
- data/tests/test_grpc.rb +166 -0
- data/tests/test_interface.rb +585 -344
- data/tests/test_interface_bdi.rb +80 -0
- data/tests/test_interface_channel_group.rb +6 -3
- data/tests/test_interface_ospf.rb +26 -24
- data/tests/test_interface_portchannel.rb +1 -0
- data/tests/test_interface_private_vlan.rb +724 -0
- data/tests/test_interface_service_vni.rb +37 -66
- data/tests/test_interface_svi.rb +98 -101
- data/tests/test_interface_switchport.rb +419 -549
- data/tests/test_itd_device_group.rb +145 -0
- data/tests/test_itd_device_group_node.rb +199 -0
- data/tests/test_itd_service.rb +298 -0
- data/tests/test_logger.rb +43 -0
- data/tests/test_name_server.rb +11 -2
- data/tests/test_node.rb +16 -75
- data/tests/test_node_ext.rb +174 -163
- data/tests/test_node_util.rb +119 -0
- data/tests/test_ntp_config.rb +5 -1
- data/tests/test_ntp_server.rb +2 -2
- data/tests/test_nxapi.rb +221 -0
- data/tests/test_overlay_global.rb +47 -38
- data/tests/test_pim.rb +2 -0
- data/tests/test_pim_group_list.rb +2 -0
- data/tests/test_pim_rp_address.rb +2 -0
- data/tests/test_platform.rb +86 -39
- data/tests/test_portchannel_global.rb +211 -135
- data/tests/test_radius_global.rb +13 -5
- data/tests/test_radius_server.rb +256 -104
- data/tests/test_radius_server_group.rb +2 -0
- data/tests/test_router_bgp.rb +781 -485
- data/tests/test_router_ospf.rb +26 -103
- data/tests/test_router_ospf_vrf.rb +52 -57
- data/tests/test_snmp_notification_receiver.rb +2 -0
- data/tests/test_snmpcommunity.rb +2 -0
- data/tests/test_snmpgroup.rb +2 -0
- data/tests/test_snmpnotification.rb +40 -21
- data/tests/test_snmpserver.rb +2 -0
- data/tests/test_snmpuser.rb +2 -0
- data/tests/test_stp_global.rb +563 -0
- data/tests/test_syslog_server.rb +32 -8
- data/tests/test_syslog_settings.rb +22 -9
- data/tests/test_tacacs_server.rb +32 -27
- data/tests/test_tacacs_server_group.rb +100 -45
- data/tests/test_tacacs_server_host.rb +135 -43
- data/tests/test_vdc.rb +2 -16
- data/tests/test_vlan.rb +106 -54
- data/tests/test_vlan_mt_full.rb +11 -21
- data/tests/test_vlan_private.rb +669 -0
- data/tests/test_vpc.rb +312 -159
- data/tests/test_vrf.rb +122 -113
- data/tests/test_vrf_af.rb +238 -0
- data/tests/test_vtp.rb +58 -102
- data/tests/test_vxlan_vtep.rb +38 -17
- data/tests/test_vxlan_vtep_vni.rb +61 -9
- data/tests/test_yum.rb +49 -25
- metadata +122 -36
- data/lib/cisco_node_utils/cmd_ref/fex.yaml +0 -9
- data/lib/cisco_node_utils/cmd_ref/vni.yaml +0 -76
- data/lib/cisco_node_utils/vni.rb +0 -227
- data/tests/test_vni.rb +0 -106
|
@@ -18,41 +18,45 @@ require_relative '../lib/cisco_node_utils/vtp'
|
|
|
18
18
|
|
|
19
19
|
include Cisco
|
|
20
20
|
|
|
21
|
-
# TestInterfaceSwitchport
|
|
21
|
+
# TestInterfaceSwitchport
|
|
22
|
+
# Parent class for specific types of switchport tests (below)
|
|
22
23
|
class TestInterfaceSwitchport < CiscoTestCase
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
attr_reader :interface
|
|
25
|
+
|
|
26
|
+
def platform_supports_vtp_switchport_access?
|
|
27
|
+
skip('Platform does not support VTP when switchport mode is access') if
|
|
28
|
+
node.product_id =~ /N(5|6|7)/
|
|
29
|
+
end
|
|
25
30
|
|
|
26
31
|
def setup
|
|
27
32
|
super
|
|
28
|
-
|
|
33
|
+
config_no_warn('no feature vtp', 'no feature interface-vlan')
|
|
34
|
+
@interface = Interface.new(interfaces[0])
|
|
29
35
|
end
|
|
30
36
|
|
|
31
|
-
def
|
|
32
|
-
|
|
37
|
+
def teardown
|
|
38
|
+
interface_ethernet_default(interfaces[0])
|
|
39
|
+
super
|
|
33
40
|
end
|
|
34
41
|
|
|
35
|
-
def
|
|
36
|
-
|
|
37
|
-
'switchport_autostate_exclude')
|
|
38
|
-
assert(ref, 'Error, reference not found for switchport_autostate_exclude')
|
|
39
|
-
ref
|
|
42
|
+
def interface_ethernet_default(ethernet_intf)
|
|
43
|
+
config("default interface #{ethernet_intf}")
|
|
40
44
|
end
|
|
41
45
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
value = block.call
|
|
48
|
-
assert_equal(expected_result, value, err_msg)
|
|
46
|
+
def mgmt_intf
|
|
47
|
+
if platform == :nexus
|
|
48
|
+
'mgmt0'
|
|
49
|
+
elsif platform == :ios_xr
|
|
50
|
+
'MgmtEth0/RP0/CPU0/0'
|
|
49
51
|
end
|
|
50
52
|
end
|
|
53
|
+
end
|
|
51
54
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
55
|
+
# TestSwitchport - general interface switchport tests.
|
|
56
|
+
class TestSwitchport < TestInterfaceSwitchport
|
|
57
|
+
DEFAULT_IF_ACCESS_VLAN = 1
|
|
58
|
+
DEFAULT_IF_SWITCHPORT_ALLOWED_VLAN = '1-4094'
|
|
59
|
+
DEFAULT_IF_SWITCHPORT_NATIVE_VLAN = 1
|
|
56
60
|
|
|
57
61
|
def system_default_switchport(state='')
|
|
58
62
|
config("#{state} system default switchport")
|
|
@@ -62,257 +66,328 @@ class TestInterfaceSwitchport < CiscoTestCase
|
|
|
62
66
|
config("#{state} system default switchport shutdown")
|
|
63
67
|
end
|
|
64
68
|
|
|
65
|
-
def
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
def test_interface_get_access_vlan
|
|
70
|
+
interface.switchport_mode = :disabled
|
|
71
|
+
if platform == :ios_xr
|
|
72
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
73
|
+
interface.switchport_mode = :access
|
|
74
|
+
end
|
|
75
|
+
assert_nil(interface.access_vlan)
|
|
76
|
+
else
|
|
77
|
+
interface.switchport_mode = :access
|
|
78
|
+
assert_equal(DEFAULT_IF_ACCESS_VLAN, interface.access_vlan)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_interface_get_access_vlan_switchport_disabled
|
|
83
|
+
interface.switchport_mode = :disabled
|
|
84
|
+
if platform == :ios_xr
|
|
85
|
+
assert_nil(interface.access_vlan)
|
|
86
|
+
else
|
|
87
|
+
assert_equal(DEFAULT_IF_ACCESS_VLAN, interface.access_vlan)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def test_interface_get_access_vlan_switchport_trunk
|
|
92
|
+
interface.switchport_mode = :disabled
|
|
93
|
+
if platform == :ios_xr
|
|
94
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
95
|
+
interface.switchport_mode = :trunk
|
|
96
|
+
end
|
|
97
|
+
assert_nil(interface.access_vlan)
|
|
98
|
+
else
|
|
99
|
+
interface.switchport_mode = :trunk
|
|
100
|
+
assert_equal(DEFAULT_IF_ACCESS_VLAN, interface.access_vlan)
|
|
101
|
+
end
|
|
71
102
|
end
|
|
72
103
|
|
|
73
104
|
def test_switchport_vtp_disabled_feature_disabled_eth1_1
|
|
74
|
-
interface = Interface.new(interfaces[0])
|
|
75
105
|
refute(interface.switchport_vtp,
|
|
76
106
|
'Error: interface, access, vtp not disabled')
|
|
77
107
|
end
|
|
78
108
|
|
|
79
|
-
def
|
|
80
|
-
interface = Interface.new(
|
|
109
|
+
def test_switchport_vtp_disabled_feature_disabled_mgmt_intf
|
|
110
|
+
interface = Interface.new(mgmt_intf)
|
|
81
111
|
refute(interface.switchport_vtp,
|
|
82
112
|
'Error: interface, access, vtp not disabled')
|
|
83
113
|
end
|
|
84
114
|
|
|
85
115
|
def test_switchport_vtp_disabled_unsupported_mode_disabled
|
|
86
|
-
interface = Interface.new(interfaces[0])
|
|
87
116
|
interface.switchport_mode = :disabled
|
|
88
117
|
refute(interface.switchport_vtp,
|
|
89
118
|
'Error: interface, access, vtp not disabled')
|
|
90
|
-
interface_ethernet_default(interfaces_id[0])
|
|
91
119
|
end
|
|
92
120
|
|
|
93
121
|
def test_switchport_vtp_disabled_unsupported_mode_fex
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
rescue RuntimeError => e
|
|
100
|
-
msg = "[#{interfaces[0]}] switchport_mode is not supported " \
|
|
101
|
-
'on this interface'
|
|
102
|
-
assert_equal(msg.downcase, e.message)
|
|
122
|
+
if validate_property_excluded?('feature', 'fex')
|
|
123
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
124
|
+
Feature.fex_enable
|
|
125
|
+
end
|
|
126
|
+
return
|
|
103
127
|
end
|
|
104
|
-
|
|
128
|
+
if validate_property_excluded?('interface', 'switchport')
|
|
129
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
130
|
+
interface.switchport_mode = :fex_fabric
|
|
131
|
+
end
|
|
132
|
+
return
|
|
133
|
+
end
|
|
134
|
+
interface.switchport_mode = :fex_fabric
|
|
135
|
+
refute(interface.switchport_vtp,
|
|
136
|
+
'Error: interface, access, vtp not disabled')
|
|
137
|
+
rescue Cisco::CliError => e
|
|
138
|
+
msg = "[#{interfaces[0]}] switchport_mode is not supported " \
|
|
139
|
+
'on this interface'
|
|
140
|
+
assert_equal(msg.downcase, e.message)
|
|
105
141
|
end
|
|
106
142
|
|
|
107
|
-
def
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
interface = Interface.new(interfaces[0])
|
|
111
|
-
interface.switchport_mode = :access
|
|
112
|
-
config("interface ethernet #{interfaces_id[0]}", 'vtp')
|
|
113
|
-
|
|
114
|
-
assert(interface.switchport_vtp,
|
|
115
|
-
'Error: interface, access, vtp not enabled')
|
|
116
|
-
vtp.destroy
|
|
117
|
-
interface_ethernet_default(interfaces_id[0])
|
|
143
|
+
def test_switchport_autostate_disabled_feature_disabled_eth1_1
|
|
144
|
+
refute(interface.switchport_autostate_exclude,
|
|
145
|
+
'Error: interface, access, autostate exclude not disabled')
|
|
118
146
|
end
|
|
119
147
|
|
|
120
|
-
def
|
|
121
|
-
|
|
122
|
-
interface
|
|
123
|
-
|
|
124
|
-
|
|
148
|
+
def test_switchport_autostate_disabled_feature_disabled_mgmt_intf
|
|
149
|
+
interface = Interface.new(mgmt_intf)
|
|
150
|
+
refute(interface.switchport_autostate_exclude,
|
|
151
|
+
'Error: interface, access, autostate exclude not disabled')
|
|
152
|
+
end
|
|
125
153
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
154
|
+
def test_switchport_autostate_disabled_unsupported_mode
|
|
155
|
+
if platform == :ios_xr
|
|
156
|
+
assert_nil(interface.switchport_autostate_exclude)
|
|
157
|
+
else
|
|
158
|
+
interface.switchport_mode = :disabled
|
|
159
|
+
refute(interface.switchport_autostate_exclude,
|
|
160
|
+
'Error: interface, access, autostate exclude not disabled')
|
|
161
|
+
end
|
|
130
162
|
end
|
|
131
163
|
|
|
132
|
-
def
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
164
|
+
def test_raise_error_switchport_not_enabled
|
|
165
|
+
if platform == :ios_xr
|
|
166
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
167
|
+
interface.switchport_autostate_exclude = true
|
|
168
|
+
end
|
|
169
|
+
else
|
|
170
|
+
interface.switchport_enable(false)
|
|
137
171
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
172
|
+
assert_raises(RuntimeError) do
|
|
173
|
+
interface.switchport_autostate_exclude = true
|
|
174
|
+
end
|
|
175
|
+
end
|
|
142
176
|
end
|
|
143
177
|
|
|
144
|
-
def
|
|
145
|
-
|
|
146
|
-
|
|
178
|
+
def test_interface_switchport_mode_invalid
|
|
179
|
+
assert_raises(ArgumentError) { interface.switchport_mode = :unknown }
|
|
180
|
+
end
|
|
147
181
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
182
|
+
def test_interface_switchport_mode_not_supported
|
|
183
|
+
interface = Interface.new(mgmt_intf)
|
|
184
|
+
assert_raises(Cisco::CliError, Cisco::UnsupportedError) do
|
|
185
|
+
interface.switchport_mode = :access
|
|
186
|
+
end
|
|
153
187
|
end
|
|
154
188
|
|
|
155
|
-
def
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
189
|
+
def test_interface_switchport_mode_valid
|
|
190
|
+
if platform == :ios_xr
|
|
191
|
+
# We don't support any switchport modes on IOS XR
|
|
192
|
+
# but we allow the user to set :disabled since that's the default.
|
|
193
|
+
interface.switchport_mode = :disabled
|
|
194
|
+
assert_nil(interface.switchport_mode)
|
|
195
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
196
|
+
interface.switchport_mode = :access
|
|
197
|
+
end
|
|
198
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
199
|
+
interface.switchport_mode = :trunk
|
|
200
|
+
end
|
|
201
|
+
assert_nil(interface.switchport_mode)
|
|
202
|
+
return
|
|
203
|
+
end
|
|
160
204
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
205
|
+
switchport_modes = [
|
|
206
|
+
:unknown,
|
|
207
|
+
:disabled,
|
|
208
|
+
:access,
|
|
209
|
+
:trunk,
|
|
210
|
+
:tunnel,
|
|
211
|
+
]
|
|
164
212
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
213
|
+
switchport_modes.each do |start|
|
|
214
|
+
switchport_modes.each do |finish|
|
|
215
|
+
next if start == :unknown || finish == :unknown
|
|
216
|
+
begin
|
|
217
|
+
# puts "#{start},#{finish}"
|
|
218
|
+
interface.switchport_mode = start
|
|
219
|
+
assert_equal(start, interface.switchport_mode,
|
|
220
|
+
"Error: Switchport mode, #{start}, not as expected")
|
|
221
|
+
# puts "now finish #{finish}"
|
|
222
|
+
interface.switchport_mode = finish
|
|
223
|
+
assert_equal(finish, interface.switchport_mode,
|
|
224
|
+
"Error: Switchport mode, #{finish}, not as expected")
|
|
225
|
+
rescue Cisco::CliError
|
|
226
|
+
next
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
end
|
|
168
231
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
232
|
+
def test_interface_switchport_mode_valid_fex
|
|
233
|
+
if validate_property_excluded?('feature', 'fex')
|
|
234
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
235
|
+
Feature.fex_enable
|
|
236
|
+
end
|
|
237
|
+
return
|
|
238
|
+
end
|
|
239
|
+
if validate_property_excluded?('interface', 'switchport')
|
|
240
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
241
|
+
interface.switchport_mode = :fex_fabric
|
|
242
|
+
end
|
|
243
|
+
return
|
|
244
|
+
end
|
|
172
245
|
|
|
173
|
-
|
|
174
|
-
|
|
246
|
+
interface.switchport_mode = :fex_fabric
|
|
247
|
+
assert_equal(interface.switchport_mode, :fex_fabric)
|
|
175
248
|
end
|
|
176
249
|
|
|
177
|
-
def
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
250
|
+
def test_interface_switchport_trunk_allowed_vlan
|
|
251
|
+
if platform == :ios_xr
|
|
252
|
+
assert_nil(interface.default_switchport_trunk_allowed_vlan)
|
|
253
|
+
assert_nil(interface.switchport_trunk_allowed_vlan)
|
|
254
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
255
|
+
interface.switchport_trunk_allowed_vlan = 'all'
|
|
256
|
+
end
|
|
257
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
258
|
+
interface.switchport_trunk_allowed_vlan = '20'
|
|
259
|
+
end
|
|
260
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
261
|
+
interface.switchport_trunk_allowed_vlan = 'none'
|
|
262
|
+
end
|
|
263
|
+
else
|
|
264
|
+
interface.switchport_enable
|
|
265
|
+
interface.switchport_trunk_allowed_vlan = 'all'
|
|
266
|
+
assert_equal(DEFAULT_IF_SWITCHPORT_ALLOWED_VLAN,
|
|
267
|
+
interface.switchport_trunk_allowed_vlan)
|
|
185
268
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
'Error:(2) mode :trunk, vtp should be true')
|
|
269
|
+
interface.switchport_trunk_allowed_vlan = '20'
|
|
270
|
+
assert_equal('20', interface.switchport_trunk_allowed_vlan)
|
|
189
271
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
'Error:(3) mode :trunk, vtp should be default (false)')
|
|
193
|
-
vtp.destroy
|
|
194
|
-
interface_ethernet_default(interfaces_id[0])
|
|
195
|
-
end
|
|
272
|
+
interface.switchport_trunk_allowed_vlan = '30'
|
|
273
|
+
assert_equal('30', interface.switchport_trunk_allowed_vlan)
|
|
196
274
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
275
|
+
interface.switchport_trunk_allowed_vlan =
|
|
276
|
+
interface.default_switchport_trunk_allowed_vlan
|
|
277
|
+
assert_equal(DEFAULT_IF_SWITCHPORT_ALLOWED_VLAN,
|
|
278
|
+
interface.switchport_trunk_allowed_vlan)
|
|
201
279
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
'Error: interface, access, vtp not enabled')
|
|
206
|
-
vtp.destroy
|
|
207
|
-
interface_ethernet_default(interfaces_id[0])
|
|
208
|
-
end
|
|
280
|
+
assert_raises(RuntimeError) do
|
|
281
|
+
interface.switchport_trunk_allowed_vlan = 'hello'
|
|
282
|
+
end
|
|
209
283
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
interface = Interface.new(interfaces[0])
|
|
284
|
+
interface.switchport_trunk_allowed_vlan = 'none'
|
|
285
|
+
assert_equal('none', interface.switchport_trunk_allowed_vlan)
|
|
213
286
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
'Error: interface, access, vtp not enabled')
|
|
218
|
-
vtp.destroy
|
|
219
|
-
interface_ethernet_default(interfaces_id[0])
|
|
287
|
+
interface.switchport_trunk_allowed_vlan = '20, 30'
|
|
288
|
+
assert_equal('20,30', interface.switchport_trunk_allowed_vlan)
|
|
289
|
+
end
|
|
220
290
|
end
|
|
221
291
|
|
|
222
|
-
def
|
|
223
|
-
|
|
224
|
-
|
|
292
|
+
def test_interface_switchport_trunk_native_vlan
|
|
293
|
+
if platform == :ios_xr
|
|
294
|
+
assert_nil(interface.switchport_trunk_native_vlan)
|
|
295
|
+
assert_nil(interface.default_switchport_trunk_native_vlan)
|
|
296
|
+
assert_raises(Cisco::UnsupportedError) do
|
|
297
|
+
interface.switchport_trunk_native_vlan = 20
|
|
298
|
+
end
|
|
299
|
+
else
|
|
300
|
+
interface.switchport_enable
|
|
225
301
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
'Error: interface, access, vtp is enabled')
|
|
229
|
-
vtp.destroy
|
|
230
|
-
interface_ethernet_default(interfaces_id[0])
|
|
231
|
-
end
|
|
302
|
+
interface.switchport_trunk_native_vlan = 20
|
|
303
|
+
assert_equal(20, interface.switchport_trunk_native_vlan)
|
|
232
304
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
interface = Interface.new('mgmt0')
|
|
305
|
+
interface.switchport_trunk_native_vlan = 30
|
|
306
|
+
assert_equal(30, interface.switchport_trunk_native_vlan)
|
|
236
307
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
308
|
+
interface.switchport_trunk_native_vlan =
|
|
309
|
+
interface.default_switchport_trunk_native_vlan
|
|
310
|
+
assert_equal(DEFAULT_IF_SWITCHPORT_NATIVE_VLAN,
|
|
311
|
+
interface.switchport_trunk_native_vlan)
|
|
312
|
+
|
|
313
|
+
assert_raises(RuntimeError) do
|
|
314
|
+
interface.switchport_trunk_native_vlan = '20, 30'
|
|
315
|
+
end
|
|
316
|
+
end
|
|
241
317
|
end
|
|
242
318
|
|
|
243
|
-
def
|
|
244
|
-
|
|
245
|
-
|
|
319
|
+
def test_system_default_switchport_on_off
|
|
320
|
+
if platform == :nexus
|
|
321
|
+
system_default_switchport('')
|
|
322
|
+
assert(interface.system_default_switchport,
|
|
323
|
+
'Test for enabled - failed')
|
|
246
324
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
325
|
+
# common default is "no switch"
|
|
326
|
+
system_default_switchport('no ')
|
|
327
|
+
end
|
|
328
|
+
refute(interface.system_default_switchport,
|
|
329
|
+
'Test for disabled - failed')
|
|
330
|
+
rescue RuntimeError => e
|
|
331
|
+
skip('NX-OS defect: system default switchport nvgens twice') if
|
|
332
|
+
e.message[/Expected zero.one value/]
|
|
333
|
+
flunk(e.message)
|
|
253
334
|
end
|
|
254
335
|
|
|
255
|
-
def
|
|
256
|
-
|
|
257
|
-
|
|
336
|
+
def test_system_default_switchport_shutdown_on_off
|
|
337
|
+
if platform == :nexus
|
|
338
|
+
system_default_switchport_shutdown('no ')
|
|
339
|
+
refute(interface.system_default_switchport_shutdown,
|
|
340
|
+
'Test for disabled - failed')
|
|
258
341
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
interface_ethernet_default(interfaces_id[0])
|
|
342
|
+
# common default is "shutdown"
|
|
343
|
+
system_default_switchport_shutdown('')
|
|
344
|
+
end
|
|
345
|
+
assert(interface.system_default_switchport_shutdown,
|
|
346
|
+
'Test for enabled - failed')
|
|
265
347
|
end
|
|
266
348
|
|
|
267
|
-
def
|
|
268
|
-
|
|
269
|
-
interface =
|
|
270
|
-
|
|
271
|
-
interface.switchport_mode = :disabled
|
|
272
|
-
interface.switchport_vtp = false
|
|
273
|
-
refute(interface.switchport_vtp,
|
|
274
|
-
'Error: mode :disabled, vtp should be false')
|
|
275
|
-
vtp.destroy
|
|
276
|
-
interface_ethernet_default(interfaces_id[0])
|
|
349
|
+
def test_interface_svi_command_on_non_vlan
|
|
350
|
+
assert_raises(RuntimeError) { interface.svi_autostate = true }
|
|
351
|
+
assert_raises(RuntimeError) { interface.svi_management = true }
|
|
277
352
|
end
|
|
353
|
+
end
|
|
278
354
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
355
|
+
# TestInterfaceSwitchportSvi
|
|
356
|
+
# Minitest for Interface switchport configuration in combo with interface-vlan
|
|
357
|
+
# Not applicable to IOS XR
|
|
358
|
+
class TestInterfaceSwitchportSvi < TestInterfaceSwitchport
|
|
359
|
+
attr_reader :svi
|
|
360
|
+
|
|
361
|
+
def setup
|
|
362
|
+
super
|
|
363
|
+
skip('VLAN interfaces are not supported on IOS XR') if platform == :ios_xr
|
|
364
|
+
@svi = Interface.new('Vlan23')
|
|
285
365
|
end
|
|
286
366
|
|
|
287
|
-
def
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
'Error: interface, access, autostate exclude not disabled')
|
|
367
|
+
def teardown
|
|
368
|
+
svi.destroy unless platform == :ios_xr
|
|
369
|
+
super
|
|
291
370
|
end
|
|
292
371
|
|
|
293
|
-
def
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
372
|
+
def cmd_ref_switchport_autostate_exclude
|
|
373
|
+
ref = cmd_ref.lookup('interface',
|
|
374
|
+
'switchport_autostate_exclude')
|
|
375
|
+
assert(ref, 'Error, reference not found for switchport_autostate_exclude')
|
|
376
|
+
ref
|
|
297
377
|
end
|
|
298
378
|
|
|
299
|
-
def
|
|
300
|
-
interface = Interface.new(interfaces[0])
|
|
301
|
-
interface.switchport_mode = :disabled
|
|
379
|
+
def test_switchport_autostate_disabled_feature_enabled
|
|
302
380
|
refute(interface.switchport_autostate_exclude,
|
|
303
381
|
'Error: interface, access, autostate exclude not disabled')
|
|
304
|
-
interface_ethernet_default(interfaces_id[0])
|
|
305
382
|
end
|
|
306
383
|
|
|
307
384
|
def test_switchport_autostate_enabled_access
|
|
308
|
-
svi = Interface.new('Vlan23')
|
|
309
|
-
interface = Interface.new(interfaces[0])
|
|
310
385
|
config("interface ethernet #{interfaces_id[0]}",
|
|
311
386
|
'switchport',
|
|
312
387
|
'switchport autostate exclude')
|
|
313
388
|
|
|
314
389
|
cmd_ref = cmd_ref_switchport_autostate_exclude
|
|
315
|
-
if cmd_ref.
|
|
390
|
+
if cmd_ref.setter?
|
|
316
391
|
assert(interface.switchport_autostate_exclude,
|
|
317
392
|
'Error: interface, access, autostate exclude not enabled')
|
|
318
393
|
else
|
|
@@ -320,28 +395,20 @@ class TestInterfaceSwitchport < CiscoTestCase
|
|
|
320
395
|
interface.switchport_autostate_exclude,
|
|
321
396
|
'Error: interface, access, autostate exclude not disabled')
|
|
322
397
|
end
|
|
323
|
-
|
|
324
|
-
svi.destroy
|
|
325
|
-
interface_ethernet_default(interfaces_id[0])
|
|
326
398
|
end
|
|
327
399
|
|
|
328
400
|
def test_switchport_autostate_disabled_access
|
|
329
|
-
svi = Interface.new('Vlan23')
|
|
330
|
-
interface = Interface.new(interfaces[0])
|
|
331
401
|
refute(interface.switchport_autostate_exclude,
|
|
332
402
|
'Error: interface, access, autostate exclude not disabled')
|
|
333
|
-
svi.destroy
|
|
334
403
|
end
|
|
335
404
|
|
|
336
405
|
def test_switchport_autostate_enabled_trunk
|
|
337
|
-
svi = Interface.new('Vlan23')
|
|
338
|
-
interface = Interface.new(interfaces[0])
|
|
339
406
|
interface.switchport_mode = :trunk
|
|
340
407
|
config("interface ethernet #{interfaces_id[0]}",
|
|
341
408
|
'switchport autostate exclude')
|
|
342
409
|
|
|
343
410
|
cmd_ref = cmd_ref_switchport_autostate_exclude
|
|
344
|
-
if cmd_ref.
|
|
411
|
+
if cmd_ref.setter?
|
|
345
412
|
assert(interface.switchport_autostate_exclude,
|
|
346
413
|
'Error: interface, access, autostate exclude not enabled')
|
|
347
414
|
else
|
|
@@ -349,413 +416,216 @@ class TestInterfaceSwitchport < CiscoTestCase
|
|
|
349
416
|
interface.switchport_autostate_exclude,
|
|
350
417
|
'Error: interface, access, autostate exclude not disabled')
|
|
351
418
|
end
|
|
352
|
-
|
|
353
|
-
svi.destroy
|
|
354
|
-
interface_ethernet_default(interfaces_id[0])
|
|
355
419
|
end
|
|
356
420
|
|
|
357
421
|
def test_switchport_autostate_disabled_trunk
|
|
358
|
-
svi = Interface.new('Vlan23')
|
|
359
|
-
interface = Interface.new(interfaces[0])
|
|
360
422
|
interface.switchport_mode = :trunk
|
|
361
423
|
config("interface ethernet #{interfaces_id[0]}",
|
|
362
424
|
'no switchport autostate exclude')
|
|
363
425
|
|
|
364
426
|
refute(interface.switchport_autostate_exclude,
|
|
365
427
|
'Error: interface, access, autostate exclude not disabled')
|
|
366
|
-
svi.destroy
|
|
367
|
-
interface_ethernet_default(interfaces_id[0])
|
|
368
428
|
end
|
|
369
429
|
|
|
370
|
-
def
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
config("interface #{interfaces[0]}", 'no switchport')
|
|
374
|
-
|
|
375
|
-
assert_raises(RuntimeError) do
|
|
376
|
-
interface.switchport_autostate_exclude = true
|
|
377
|
-
end
|
|
378
|
-
end
|
|
430
|
+
def test_switchport_autostate_access
|
|
431
|
+
# switchport must be enabled to configure autostate
|
|
432
|
+
interface.switchport_enable(true)
|
|
379
433
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
434
|
+
interface.switchport_autostate_exclude = true
|
|
435
|
+
assert(interface.switchport_autostate_exclude,
|
|
436
|
+
'Error: interface, access, autostate exclude not enabled')
|
|
383
437
|
|
|
384
|
-
|
|
385
|
-
|
|
438
|
+
interface.switchport_autostate_exclude = false
|
|
439
|
+
refute(interface.switchport_autostate_exclude,
|
|
440
|
+
'Error: interface, access, autostate exclude not disabled')
|
|
386
441
|
|
|
387
442
|
result = interface.default_switchport_autostate_exclude
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
end
|
|
392
|
-
svi.destroy
|
|
393
|
-
interface_ethernet_default(interfaces_id[0])
|
|
443
|
+
interface.switchport_autostate_exclude = result
|
|
444
|
+
assert_equal(result, interface.switchport_autostate_exclude,
|
|
445
|
+
'Error: interface, access, autostate exclude not disabled')
|
|
394
446
|
end
|
|
395
447
|
|
|
396
|
-
def
|
|
397
|
-
svi = Interface.new('Vlan23')
|
|
398
|
-
interface = Interface.new(interfaces[0])
|
|
448
|
+
def test_switchport_autostate_trunk
|
|
399
449
|
interface.switchport_mode = :trunk
|
|
400
450
|
|
|
401
451
|
# switchport must be enabled to configure autostate
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
result = false
|
|
405
|
-
assert_result(result,
|
|
406
|
-
'Error: interface, access, autostate exclude not disabled') do
|
|
407
|
-
interface.switchport_autostate_exclude = result
|
|
408
|
-
end
|
|
409
|
-
svi.destroy
|
|
410
|
-
interface_ethernet_default(interfaces_id[0])
|
|
411
|
-
end
|
|
412
|
-
|
|
413
|
-
def test_set_switchport_autostate_true_access
|
|
414
|
-
svi = Interface.new('Vlan23')
|
|
415
|
-
interface = Interface.new(interfaces[0])
|
|
416
|
-
|
|
417
|
-
# switchport must be enabled to configure autostate
|
|
418
|
-
config("interface #{interfaces[0]}", 'switchport')
|
|
419
|
-
|
|
420
|
-
result = true
|
|
421
|
-
assert_result(result,
|
|
422
|
-
'Error: interface, access, autostate exclude not disabled') do
|
|
423
|
-
interface.switchport_autostate_exclude = result
|
|
424
|
-
end
|
|
425
|
-
svi.destroy
|
|
426
|
-
interface_ethernet_default(interfaces_id[0])
|
|
427
|
-
end
|
|
452
|
+
interface.switchport_enable(true)
|
|
428
453
|
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
interface.switchport_mode = :trunk
|
|
454
|
+
interface.switchport_autostate_exclude = true
|
|
455
|
+
assert(interface.switchport_autostate_exclude,
|
|
456
|
+
'Error: interface, access, autostate exclude not enabled')
|
|
433
457
|
|
|
434
|
-
|
|
435
|
-
|
|
458
|
+
interface.switchport_autostate_exclude = false
|
|
459
|
+
refute(interface.switchport_autostate_exclude,
|
|
460
|
+
'Error: interface, access, autostate exclude not disabled')
|
|
436
461
|
|
|
437
|
-
result =
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
end
|
|
442
|
-
svi.destroy
|
|
443
|
-
interface_ethernet_default(interfaces_id[0])
|
|
462
|
+
result = interface.default_switchport_autostate_exclude
|
|
463
|
+
interface.switchport_autostate_exclude = result
|
|
464
|
+
assert_equal(result, interface.switchport_autostate_exclude,
|
|
465
|
+
'Error: interface, access, autostate exclude not disabled')
|
|
444
466
|
end
|
|
445
467
|
|
|
446
|
-
def
|
|
447
|
-
svi = Interface.new('Vlan23')
|
|
448
|
-
interface = Interface.new(interfaces[0])
|
|
468
|
+
def test_switchport_autostate_unsupported_mode_disabled
|
|
449
469
|
interface.switchport_mode = :disabled
|
|
450
470
|
|
|
451
471
|
assert_raises RuntimeError do
|
|
452
472
|
interface.switchport_autostate_exclude = true
|
|
453
473
|
end
|
|
454
|
-
|
|
455
|
-
|
|
474
|
+
assert_raises RuntimeError do
|
|
475
|
+
interface.switchport_autostate_exclude = false
|
|
476
|
+
end
|
|
456
477
|
end
|
|
457
478
|
|
|
458
|
-
def
|
|
459
|
-
|
|
460
|
-
interface = Interface.new('mgmt0')
|
|
479
|
+
def test_set_switchport_autostate_true_unsupported_mgmt_intf
|
|
480
|
+
interface = Interface.new(mgmt_intf)
|
|
461
481
|
assert_raises RuntimeError do
|
|
462
482
|
interface.switchport_autostate_exclude = true
|
|
463
483
|
end
|
|
464
|
-
svi.destroy
|
|
465
484
|
end
|
|
485
|
+
end
|
|
466
486
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
487
|
+
# TestInterfaceSwitchportVtp
|
|
488
|
+
# Minitest for Interface switchport configuration in combo with Vtp class
|
|
489
|
+
# Not applicable to IOS XR
|
|
490
|
+
class TestInterfaceSwitchportVtp < TestInterfaceSwitchport
|
|
491
|
+
attr_reader :vtp
|
|
470
492
|
|
|
471
|
-
|
|
472
|
-
|
|
493
|
+
def setup
|
|
494
|
+
super
|
|
495
|
+
skip('VTP is not supported on IOS XR') if platform == :ios_xr
|
|
496
|
+
@vtp = Vtp.new(true)
|
|
497
|
+
end
|
|
473
498
|
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
interface.switchport_autostate_exclude = result
|
|
478
|
-
end
|
|
479
|
-
svi.destroy
|
|
480
|
-
interface_ethernet_default(interfaces_id[0])
|
|
499
|
+
def teardown
|
|
500
|
+
vtp.destroy unless platform == :ios_xr
|
|
501
|
+
super
|
|
481
502
|
end
|
|
482
503
|
|
|
483
|
-
def
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
504
|
+
def test_switchport_vtp_disabled_feature_enabled
|
|
505
|
+
refute(interface.switchport_vtp,
|
|
506
|
+
'Error: interface, access, vtp not disabled')
|
|
507
|
+
end
|
|
487
508
|
|
|
488
|
-
|
|
489
|
-
|
|
509
|
+
def test_switchport_vtp_enabled_access
|
|
510
|
+
platform_supports_vtp_switchport_access?
|
|
511
|
+
interface.switchport_mode = :access
|
|
512
|
+
config("interface ethernet #{interfaces_id[0]}", 'vtp')
|
|
490
513
|
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
'Error: interface, access, autostate exclude not disabled') do
|
|
494
|
-
interface.switchport_autostate_exclude = result
|
|
495
|
-
end
|
|
496
|
-
svi.destroy
|
|
497
|
-
interface_ethernet_default(interfaces_id[0])
|
|
514
|
+
assert(interface.switchport_vtp,
|
|
515
|
+
'Error: interface, access, vtp not enabled')
|
|
498
516
|
end
|
|
499
517
|
|
|
500
|
-
def
|
|
501
|
-
|
|
502
|
-
interface
|
|
503
|
-
interface.switchport_mode = :disabled
|
|
518
|
+
def test_switchport_vtp_disabled_access
|
|
519
|
+
interface.switchport_mode = :access
|
|
520
|
+
config("interface ethernet #{interfaces_id[0]}", 'no vtp')
|
|
504
521
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
end
|
|
508
|
-
svi.destroy
|
|
509
|
-
interface_ethernet_default(interfaces_id[0])
|
|
522
|
+
refute(interface.switchport_vtp,
|
|
523
|
+
'Error: interface, access, vtp not disabled')
|
|
510
524
|
end
|
|
511
525
|
|
|
512
|
-
def
|
|
513
|
-
interface =
|
|
514
|
-
|
|
515
|
-
|
|
526
|
+
def test_switchport_vtp_enabled_trunk
|
|
527
|
+
interface.switchport_mode = :trunk
|
|
528
|
+
config("interface ethernet #{interfaces_id[0]}", 'vtp')
|
|
529
|
+
|
|
530
|
+
assert(interface.switchport_vtp,
|
|
531
|
+
'Error: interface, trunk, vtp not enabled')
|
|
516
532
|
end
|
|
517
533
|
|
|
518
|
-
def
|
|
519
|
-
interface =
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
interface.switchport_mode = :access
|
|
523
|
-
rescue RuntimeError => e
|
|
524
|
-
msg = '[mgmt0] switchport_mode is not supported on this interface'
|
|
525
|
-
assert_equal(msg, e.message)
|
|
526
|
-
end
|
|
534
|
+
def test_switchport_vtp_disabled_trunk
|
|
535
|
+
interface.switchport_mode = :trunk
|
|
536
|
+
refute(interface.switchport_vtp,
|
|
537
|
+
'Error: interface, trunk, vtp not disabled')
|
|
527
538
|
end
|
|
528
539
|
|
|
529
|
-
def
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
:disabled,
|
|
533
|
-
:access,
|
|
534
|
-
:trunk,
|
|
535
|
-
#:fex_fabric, (fex is tested by test_interface_switchport_mode_valid_fex)
|
|
536
|
-
:tunnel,
|
|
537
|
-
]
|
|
540
|
+
def test_set_switchport_vtp_default_access
|
|
541
|
+
platform_supports_vtp_switchport_access?
|
|
542
|
+
interface.switchport_mode = :access
|
|
538
543
|
|
|
539
|
-
interface =
|
|
544
|
+
interface.switchport_vtp = interface.default_switchport_vtp
|
|
545
|
+
refute(interface.switchport_vtp,
|
|
546
|
+
'Error:(1) mode :access, vtp should be default (false)')
|
|
540
547
|
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
"Error: Switchport mode, #{start}, not as expected")
|
|
549
|
-
# puts "now finish #{finish}"
|
|
550
|
-
interface.switchport_mode = finish
|
|
551
|
-
assert_equal(finish, interface.switchport_mode,
|
|
552
|
-
"Error: Switchport mode, #{finish}, not as expected")
|
|
553
|
-
rescue RuntimeError => e
|
|
554
|
-
msg = "[#{interfaces[0]}] switchport_mode is not supported " \
|
|
555
|
-
'on this interface'
|
|
556
|
-
assert_equal(msg.downcase, e.message)
|
|
557
|
-
end
|
|
558
|
-
end
|
|
559
|
-
end
|
|
560
|
-
interface_ethernet_default(interfaces_id[0])
|
|
548
|
+
interface.switchport_vtp = true
|
|
549
|
+
assert(interface.switchport_vtp,
|
|
550
|
+
'Error:(2) mode :access, vtp should be true')
|
|
551
|
+
|
|
552
|
+
interface.switchport_vtp = interface.default_switchport_vtp
|
|
553
|
+
refute(interface.switchport_vtp,
|
|
554
|
+
'Error:(3) mode :access, vtp should be default (false)')
|
|
561
555
|
end
|
|
562
556
|
|
|
563
|
-
def
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
557
|
+
def test_set_switchport_vtp_default_trunk
|
|
558
|
+
interface.switchport_mode = :trunk
|
|
559
|
+
interface.switchport_vtp = interface.default_switchport_vtp
|
|
560
|
+
refute(interface.switchport_vtp,
|
|
561
|
+
'Error:(1) mode :trunk, vtp should be default (false)')
|
|
568
562
|
|
|
569
|
-
interface =
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
next if start == :unknown || finish == :unknown
|
|
573
|
-
begin
|
|
574
|
-
# puts "#{start},#{finish}"
|
|
575
|
-
interface.switchport_mode = start
|
|
576
|
-
assert_equal(start, interface.switchport_mode,
|
|
577
|
-
"Error: Switchport mode, #{start}, not as expected")
|
|
578
|
-
interface.switchport_mode = finish
|
|
579
|
-
assert_equal(finish, interface.switchport_mode,
|
|
580
|
-
"Error: Switchport mode, #{finish}, not as expected")
|
|
581
|
-
rescue RuntimeError => e
|
|
582
|
-
msg = "[#{interfaces[0]}] switchport_mode is not supported " \
|
|
583
|
-
'on this interface'
|
|
584
|
-
assert_equal(msg.downcase, e.message)
|
|
585
|
-
end
|
|
586
|
-
end
|
|
587
|
-
end
|
|
588
|
-
interface_ethernet_default(interfaces_id[0])
|
|
589
|
-
end
|
|
590
|
-
|
|
591
|
-
def test_interface_switchport_trunk_allowed_vlan_all
|
|
592
|
-
interface = Interface.new(interfaces[0])
|
|
593
|
-
interface.switchport_enable
|
|
594
|
-
interface.switchport_trunk_allowed_vlan = 'all'
|
|
595
|
-
assert_equal(
|
|
596
|
-
DEFAULT_IF_SWITCHPORT_ALLOWED_VLAN,
|
|
597
|
-
interface.switchport_trunk_allowed_vlan)
|
|
598
|
-
interface_ethernet_default(interfaces_id[0])
|
|
599
|
-
end
|
|
600
|
-
|
|
601
|
-
def test_interface_switchport_trunk_allowed_vlan_change
|
|
602
|
-
interface = Interface.new(interfaces[0])
|
|
603
|
-
interface.switchport_enable
|
|
604
|
-
interface.switchport_trunk_allowed_vlan = '20'
|
|
605
|
-
assert_equal('20', interface.switchport_trunk_allowed_vlan)
|
|
606
|
-
interface.switchport_trunk_allowed_vlan = '30'
|
|
607
|
-
assert_equal('30', interface.switchport_trunk_allowed_vlan)
|
|
608
|
-
interface_ethernet_default(interfaces_id[0])
|
|
609
|
-
end
|
|
610
|
-
|
|
611
|
-
def test_interface_switchport_trunk_allowed_vlan_default
|
|
612
|
-
interface = Interface.new(interfaces[0])
|
|
613
|
-
interface.switchport_enable
|
|
614
|
-
interface.switchport_trunk_allowed_vlan =
|
|
615
|
-
interface.default_switchport_trunk_allowed_vlan
|
|
616
|
-
assert_equal(
|
|
617
|
-
DEFAULT_IF_SWITCHPORT_ALLOWED_VLAN,
|
|
618
|
-
interface.switchport_trunk_allowed_vlan)
|
|
619
|
-
interface_ethernet_default(interfaces_id[0])
|
|
620
|
-
end
|
|
621
|
-
|
|
622
|
-
def test_interface_switchport_trunk_allowed_vlan_invalid
|
|
623
|
-
interface = Interface.new(interfaces[0])
|
|
624
|
-
interface.switchport_enable
|
|
625
|
-
assert_raises(RuntimeError) do
|
|
626
|
-
interface.switchport_trunk_allowed_vlan = 'hello'
|
|
627
|
-
end
|
|
628
|
-
interface_ethernet_default(interfaces_id[0])
|
|
629
|
-
end
|
|
630
|
-
|
|
631
|
-
def test_interface_switchport_trunk_allowed_vlan_none
|
|
632
|
-
interface = Interface.new(interfaces[0])
|
|
633
|
-
interface.switchport_enable
|
|
634
|
-
interface.switchport_trunk_allowed_vlan = 'none'
|
|
635
|
-
assert_equal('none', interface.switchport_trunk_allowed_vlan)
|
|
636
|
-
interface_ethernet_default(interfaces_id[0])
|
|
637
|
-
end
|
|
638
|
-
|
|
639
|
-
def test_interface_switchport_trunk_allowed_vlan_valid
|
|
640
|
-
interface = Interface.new(interfaces[0])
|
|
641
|
-
interface.switchport_enable
|
|
642
|
-
interface.switchport_trunk_allowed_vlan = '20, 30'
|
|
643
|
-
assert_equal('20,30', interface.switchport_trunk_allowed_vlan)
|
|
644
|
-
interface_ethernet_default(interfaces_id[0])
|
|
645
|
-
end
|
|
646
|
-
|
|
647
|
-
def test_interface_switchport_trunk_native_vlan_change
|
|
648
|
-
interface = Interface.new(interfaces[0])
|
|
649
|
-
interface.switchport_enable
|
|
650
|
-
interface.switchport_trunk_native_vlan = 20
|
|
651
|
-
assert_equal(20, interface.switchport_trunk_native_vlan)
|
|
652
|
-
interface.switchport_trunk_native_vlan = 30
|
|
653
|
-
assert_equal(30, interface.switchport_trunk_native_vlan)
|
|
654
|
-
interface_ethernet_default(interfaces_id[0])
|
|
655
|
-
end
|
|
656
|
-
|
|
657
|
-
def test_interface_switchport_trunk_native_vlan_default
|
|
658
|
-
interface = Interface.new(interfaces[0])
|
|
659
|
-
interface.switchport_enable
|
|
660
|
-
interface.switchport_trunk_native_vlan =
|
|
661
|
-
interface.default_switchport_trunk_native_vlan
|
|
662
|
-
assert_equal(
|
|
663
|
-
DEFAULT_IF_SWITCHPORT_NATIVE_VLAN,
|
|
664
|
-
interface.switchport_trunk_native_vlan)
|
|
665
|
-
interface_ethernet_default(interfaces_id[0])
|
|
666
|
-
end
|
|
667
|
-
|
|
668
|
-
def test_interface_switchport_trunk_native_vlan_invalid
|
|
669
|
-
interface = Interface.new(interfaces[0])
|
|
670
|
-
interface.switchport_enable
|
|
671
|
-
assert_raises(RuntimeError) do
|
|
672
|
-
interface.switchport_trunk_native_vlan = '20, 30'
|
|
673
|
-
end
|
|
674
|
-
interface_ethernet_default(interfaces_id[0])
|
|
675
|
-
end
|
|
676
|
-
|
|
677
|
-
def test_interface_switchport_trunk_native_vlan_valid
|
|
678
|
-
interface = Interface.new(interfaces[0])
|
|
679
|
-
interface.switchport_enable
|
|
680
|
-
interface.switchport_trunk_native_vlan = 20
|
|
681
|
-
assert_equal(20, interface.switchport_trunk_native_vlan)
|
|
682
|
-
interface_ethernet_default(interfaces_id[0])
|
|
683
|
-
end
|
|
684
|
-
|
|
685
|
-
# TODO: Run this test at your peril as it can cause timeouts for this test and
|
|
686
|
-
# others - 'no feature-set fex' states:
|
|
687
|
-
# "Feature-set Operation may take up to 30 minutes depending on the
|
|
688
|
-
# size of configuration."
|
|
689
|
-
#
|
|
690
|
-
# def test_interface_switchport_fex_feature
|
|
691
|
-
# test_matrix = {
|
|
692
|
-
# # [ <set_state>, <expected> ]
|
|
693
|
-
# 1 => [:uninstalled, :uninstalled], # noop
|
|
694
|
-
# 2 => [:installed, :installed],
|
|
695
|
-
# 3 => [:uninstalled, :uninstalled],
|
|
696
|
-
# 4 => [:enabled, :enabled],
|
|
697
|
-
# 5 => [:enabled, :enabled], # noop
|
|
698
|
-
# 6 => [:installed, :enabled], # noop
|
|
699
|
-
# 7 => [:uninstalled, :uninstalled],
|
|
700
|
-
# 8 => [:disabled, :uninstalled], # noop
|
|
701
|
-
# 9 => [:installed, :installed],
|
|
702
|
-
# 10 => [:installed, :installed], # noop
|
|
703
|
-
# 11 => [:enabled, :enabled],
|
|
704
|
-
# 12 => [:disabled, :disabled],
|
|
705
|
-
# 13 => [:uninstalled, :uninstalled],
|
|
706
|
-
# 14 => [:installed, :installed],
|
|
707
|
-
# 15 => [:disabled, :installed], # noop
|
|
708
|
-
# 16 => [:uninstalled, :uninstalled],
|
|
709
|
-
# }
|
|
710
|
-
# interface = Interface.new(interfaces[0])
|
|
711
|
-
# # start test from :uninstalled state
|
|
712
|
-
# interface.fex_feature_set(:uninstalled)
|
|
713
|
-
# from = interface.fex_feature
|
|
714
|
-
# test_matrix.each do |id,test|
|
|
715
|
-
# #puts "Test #{id}: #{test}, (from: #{from}"
|
|
716
|
-
# set_state, expected = test
|
|
717
|
-
# interface.fex_feature_set(set_state)
|
|
718
|
-
# curr = interface.fex_feature
|
|
719
|
-
# assert_equal(expected, curr,
|
|
720
|
-
# "Error: fex test #{id}: from #{from} to #{set_state}")
|
|
721
|
-
# from = curr
|
|
722
|
-
# end
|
|
723
|
-
# end
|
|
563
|
+
interface.switchport_vtp = true
|
|
564
|
+
assert(interface.switchport_vtp,
|
|
565
|
+
'Error:(2) mode :trunk, vtp should be true')
|
|
724
566
|
|
|
725
|
-
|
|
726
|
-
interface
|
|
567
|
+
interface.switchport_vtp = interface.default_switchport_vtp
|
|
568
|
+
refute(interface.switchport_vtp,
|
|
569
|
+
'Error:(3) mode :trunk, vtp should be default (false)')
|
|
570
|
+
end
|
|
727
571
|
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
572
|
+
def test_set_switchport_vtp_true_access
|
|
573
|
+
platform_supports_vtp_switchport_access?
|
|
574
|
+
interface.switchport_mode = :access
|
|
575
|
+
interface.switchport_vtp = true
|
|
576
|
+
assert(interface.switchport_vtp,
|
|
577
|
+
'Error: interface, access, vtp not enabled')
|
|
578
|
+
end
|
|
731
579
|
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
skip('NX-OS defect: system default switchport nvgens twice') if
|
|
738
|
-
e.message[/Expected zero.one value/]
|
|
739
|
-
flunk(e.message)
|
|
580
|
+
def test_set_switchport_vtp_true_trunk
|
|
581
|
+
interface.switchport_mode = :trunk
|
|
582
|
+
interface.switchport_vtp = true
|
|
583
|
+
assert(interface.switchport_vtp,
|
|
584
|
+
'Error: interface, access, vtp not enabled')
|
|
740
585
|
end
|
|
741
586
|
|
|
742
|
-
def
|
|
743
|
-
interface =
|
|
587
|
+
def test_set_switchport_vtp_true_unsupported_mode_disabled
|
|
588
|
+
interface.switchport_mode = :disabled
|
|
589
|
+
refute(interface.switchport_vtp,
|
|
590
|
+
'Error: interface, access, vtp is enabled')
|
|
591
|
+
end
|
|
744
592
|
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
'Test for disabled - failed')
|
|
593
|
+
def test_set_switchport_vtp_true_unsupported_mgmt_intf
|
|
594
|
+
interface = Interface.new(mgmt_intf)
|
|
748
595
|
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
'Test for enabled - failed')
|
|
596
|
+
interface.switchport_vtp = true
|
|
597
|
+
refute(interface.switchport_vtp,
|
|
598
|
+
'Error: interface, access, vtp is enabled')
|
|
753
599
|
end
|
|
754
600
|
|
|
755
|
-
def
|
|
756
|
-
interface =
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
601
|
+
def test_set_switchport_vtp_false_access
|
|
602
|
+
interface.switchport_mode = :access
|
|
603
|
+
interface.switchport_vtp = false
|
|
604
|
+
refute(interface.switchport_vtp,
|
|
605
|
+
'Error: interface, access, vtp not disabled')
|
|
606
|
+
end
|
|
607
|
+
|
|
608
|
+
def test_set_switchport_vtp_false_trunk
|
|
609
|
+
interface.switchport_mode = :trunk
|
|
610
|
+
interface.switchport_vtp = false
|
|
611
|
+
refute(interface.switchport_vtp,
|
|
612
|
+
'Error: interface, access, vtp not disabled')
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
def test_set_switchport_vtp_false_unsupported_mode_disabled
|
|
616
|
+
interface.switchport_mode = :disabled
|
|
617
|
+
interface.switchport_vtp = false
|
|
618
|
+
refute(interface.switchport_vtp,
|
|
619
|
+
'Error: mode :disabled, vtp should be false')
|
|
620
|
+
end
|
|
621
|
+
|
|
622
|
+
def test_default_switchport_vtp
|
|
623
|
+
[:access, :disabled].each do |mode|
|
|
624
|
+
interface.switchport_mode = mode
|
|
625
|
+
interface.switchport_vtp = interface.default_switchport_vtp
|
|
626
|
+
assert_equal(interface.switchport_vtp, interface.default_switchport_vtp,
|
|
627
|
+
"Error: mode :#{mode}, "\
|
|
628
|
+
'switchport_vtp should equal default_switchport_vtp')
|
|
629
|
+
end
|
|
760
630
|
end
|
|
761
631
|
end
|