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.
Files changed (255) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +13 -0
  5. data/.travis.yml +4 -1
  6. data/CHANGELOG.md +81 -2
  7. data/CONTRIBUTING.md +2 -17
  8. data/Gemfile +5 -0
  9. data/README.md +92 -47
  10. data/Rakefile +23 -1
  11. data/bin/git/hooks/hook_lib +7 -0
  12. data/bin/git/hooks/pre-commit/check_unstaged_changes +18 -0
  13. data/bin/git/hooks/pre-commit/rubocop +7 -2
  14. data/bin/git/hooks/pre-commit/validate-diffs +18 -4
  15. data/bin/git/hooks/pre-commit/validate-yaml +18 -0
  16. data/bin/git/update-hooks +64 -6
  17. data/cisco_node_utils.gemspec +9 -6
  18. data/docs/README-develop-best-practices.md +149 -50
  19. data/docs/README-develop-node-utils-APIs.md +92 -42
  20. data/docs/README-maintainers.md +7 -4
  21. data/docs/README-test-execution.md +57 -0
  22. data/docs/cisco_node_utils.yaml.example +30 -0
  23. data/docs/template-router.rb +4 -0
  24. data/ext/mkrf_conf.rb +63 -0
  25. data/lib/.rubocop.yml +2 -2
  26. data/lib/cisco_node_utils.rb +5 -0
  27. data/lib/cisco_node_utils/aaa_authentication_login.rb +5 -6
  28. data/lib/cisco_node_utils/aaa_authorization_service.rb +1 -1
  29. data/lib/cisco_node_utils/ace.rb +165 -12
  30. data/lib/cisco_node_utils/acl.rb +2 -1
  31. data/lib/cisco_node_utils/bgp.rb +184 -21
  32. data/lib/cisco_node_utils/bgp_af.rb +94 -249
  33. data/lib/cisco_node_utils/bgp_neighbor.rb +94 -14
  34. data/lib/cisco_node_utils/bgp_neighbor_af.rb +75 -8
  35. data/lib/cisco_node_utils/bridge_domain.rb +183 -0
  36. data/lib/cisco_node_utils/bridge_domain_vni.rb +206 -0
  37. data/lib/cisco_node_utils/cisco_cmn_utils.rb +85 -2
  38. data/lib/cisco_node_utils/client.rb +35 -0
  39. data/lib/cisco_node_utils/client/client.rb +234 -0
  40. data/lib/cisco_node_utils/client/grpc.rb +33 -0
  41. data/lib/cisco_node_utils/client/grpc/client.rb +311 -0
  42. data/lib/cisco_node_utils/client/grpc/ems.proto +148 -0
  43. data/lib/cisco_node_utils/client/grpc/ems.rb +111 -0
  44. data/lib/cisco_node_utils/client/grpc/ems_services.rb +49 -0
  45. data/lib/cisco_node_utils/client/nxapi.rb +31 -0
  46. data/lib/cisco_node_utils/client/nxapi/client.rb +305 -0
  47. data/lib/cisco_node_utils/client/utils.rb +164 -0
  48. data/lib/cisco_node_utils/cmd_ref/README_YAML.md +222 -254
  49. data/lib/cisco_node_utils/cmd_ref/aaa_auth_login_service.yaml +11 -8
  50. data/lib/cisco_node_utils/cmd_ref/aaa_authentication_login.yaml +22 -15
  51. data/lib/cisco_node_utils/cmd_ref/aaa_authorization_service.yaml +11 -8
  52. data/lib/cisco_node_utils/cmd_ref/acl.yaml +21 -16
  53. data/lib/cisco_node_utils/cmd_ref/bgp.yaml +239 -109
  54. data/lib/cisco_node_utils/cmd_ref/bgp_af.yaml +114 -55
  55. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor.yaml +76 -52
  56. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor_af.yaml +106 -62
  57. data/lib/cisco_node_utils/cmd_ref/bridge_domain.yaml +71 -0
  58. data/lib/cisco_node_utils/cmd_ref/bridge_domain_vni.yaml +33 -0
  59. data/lib/cisco_node_utils/cmd_ref/dnsclient.yaml +35 -14
  60. data/lib/cisco_node_utils/cmd_ref/encapsulation.yaml +25 -0
  61. data/lib/cisco_node_utils/cmd_ref/evpn_vni.yaml +23 -17
  62. data/lib/cisco_node_utils/cmd_ref/fabricpath.yaml +94 -83
  63. data/lib/cisco_node_utils/cmd_ref/fabricpath_topology.yaml +22 -17
  64. data/lib/cisco_node_utils/cmd_ref/feature.yaml +76 -26
  65. data/lib/cisco_node_utils/cmd_ref/images.yaml +3 -2
  66. data/lib/cisco_node_utils/cmd_ref/interface.yaml +381 -153
  67. data/lib/cisco_node_utils/cmd_ref/interface_channel_group.yaml +21 -11
  68. data/lib/cisco_node_utils/cmd_ref/interface_ospf.yaml +21 -21
  69. data/lib/cisco_node_utils/cmd_ref/interface_portchannel.yaml +30 -21
  70. data/lib/cisco_node_utils/cmd_ref/interface_service_vni.yaml +18 -13
  71. data/lib/cisco_node_utils/cmd_ref/inventory.yaml +26 -31
  72. data/lib/cisco_node_utils/cmd_ref/itd_device_group.yaml +83 -0
  73. data/lib/cisco_node_utils/cmd_ref/itd_service.yaml +119 -0
  74. data/lib/cisco_node_utils/cmd_ref/memory.yaml +17 -6
  75. data/lib/cisco_node_utils/cmd_ref/ntp_config.yaml +10 -3
  76. data/lib/cisco_node_utils/cmd_ref/ntp_server.yaml +17 -5
  77. data/lib/cisco_node_utils/cmd_ref/ospf.yaml +33 -29
  78. data/lib/cisco_node_utils/cmd_ref/overlay_global.yaml +12 -10
  79. data/lib/cisco_node_utils/cmd_ref/pim.yaml +16 -19
  80. data/lib/cisco_node_utils/cmd_ref/portchannel_global.yaml +40 -25
  81. data/lib/cisco_node_utils/cmd_ref/radius_global.yaml +17 -12
  82. data/lib/cisco_node_utils/cmd_ref/radius_server.yaml +71 -35
  83. data/lib/cisco_node_utils/cmd_ref/radius_server_group.yaml +10 -5
  84. data/lib/cisco_node_utils/cmd_ref/show_system.yaml +6 -2
  85. data/lib/cisco_node_utils/cmd_ref/show_version.yaml +47 -43
  86. data/lib/cisco_node_utils/cmd_ref/snmp_community.yaml +13 -11
  87. data/lib/cisco_node_utils/cmd_ref/snmp_group.yaml +4 -2
  88. data/lib/cisco_node_utils/cmd_ref/snmp_notification_receiver.yaml +23 -21
  89. data/lib/cisco_node_utils/cmd_ref/snmp_server.yaml +26 -22
  90. data/lib/cisco_node_utils/cmd_ref/snmp_user.yaml +19 -17
  91. data/lib/cisco_node_utils/cmd_ref/snmpnotification.yaml +18 -6
  92. data/lib/cisco_node_utils/cmd_ref/stp_global.yaml +234 -0
  93. data/lib/cisco_node_utils/cmd_ref/syslog_server.yaml +24 -9
  94. data/lib/cisco_node_utils/cmd_ref/syslog_settings.yaml +5 -3
  95. data/lib/cisco_node_utils/cmd_ref/system.yaml +4 -3
  96. data/lib/cisco_node_utils/cmd_ref/tacacs_server.yaml +22 -20
  97. data/lib/cisco_node_utils/cmd_ref/tacacs_server_group.yaml +27 -15
  98. data/lib/cisco_node_utils/cmd_ref/tacacs_server_host.yaml +45 -16
  99. data/lib/cisco_node_utils/cmd_ref/vdc.yaml +21 -11
  100. data/lib/cisco_node_utils/cmd_ref/virtual_service.yaml +3 -2
  101. data/lib/cisco_node_utils/cmd_ref/vlan.yaml +60 -32
  102. data/lib/cisco_node_utils/cmd_ref/vpc.yaml +118 -101
  103. data/lib/cisco_node_utils/cmd_ref/vrf.yaml +54 -58
  104. data/lib/cisco_node_utils/cmd_ref/vrf_af.yaml +118 -0
  105. data/lib/cisco_node_utils/cmd_ref/vtp.yaml +19 -25
  106. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep.yaml +28 -18
  107. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep_vni.yaml +34 -17
  108. data/lib/cisco_node_utils/cmd_ref/yum.yaml +6 -4
  109. data/lib/cisco_node_utils/command_reference.rb +261 -142
  110. data/lib/cisco_node_utils/constants.rb +33 -0
  111. data/lib/cisco_node_utils/encapsulation.rb +112 -0
  112. data/lib/cisco_node_utils/environment.rb +102 -0
  113. data/lib/cisco_node_utils/evpn_vni.rb +5 -3
  114. data/lib/cisco_node_utils/exceptions.rb +111 -0
  115. data/lib/cisco_node_utils/fabricpath_global.rb +52 -35
  116. data/lib/cisco_node_utils/fabricpath_topology.rb +44 -57
  117. data/lib/cisco_node_utils/feature.rb +165 -3
  118. data/lib/cisco_node_utils/interface.rb +1051 -260
  119. data/lib/cisco_node_utils/interface_channel_group.rb +11 -10
  120. data/lib/cisco_node_utils/interface_ospf.rb +1 -2
  121. data/lib/cisco_node_utils/interface_portchannel.rb +4 -12
  122. data/lib/cisco_node_utils/interface_service_vni.rb +7 -7
  123. data/lib/cisco_node_utils/itd_device_group.rb +248 -0
  124. data/lib/cisco_node_utils/itd_device_group_node.rb +144 -0
  125. data/lib/cisco_node_utils/itd_service.rb +523 -0
  126. data/lib/cisco_node_utils/logger.rb +75 -0
  127. data/lib/cisco_node_utils/node.rb +62 -192
  128. data/lib/cisco_node_utils/node_util.rb +56 -10
  129. data/lib/cisco_node_utils/overlay_global.rb +2 -2
  130. data/lib/cisco_node_utils/pim.rb +2 -13
  131. data/lib/cisco_node_utils/pim_group_list.rb +1 -1
  132. data/lib/cisco_node_utils/pim_rp_address.rb +1 -1
  133. data/lib/cisco_node_utils/platform.rb +52 -21
  134. data/lib/cisco_node_utils/portchannel_global.rb +89 -19
  135. data/lib/cisco_node_utils/radius_server.rb +168 -37
  136. data/lib/cisco_node_utils/router_ospf.rb +20 -35
  137. data/lib/cisco_node_utils/router_ospf_vrf.rb +4 -4
  138. data/lib/cisco_node_utils/snmpserver.rb +1 -6
  139. data/lib/cisco_node_utils/snmpuser.rb +6 -4
  140. data/lib/cisco_node_utils/stp_global.rb +676 -0
  141. data/lib/cisco_node_utils/syslog_server.rb +77 -18
  142. data/lib/cisco_node_utils/syslog_settings.rb +1 -1
  143. data/lib/cisco_node_utils/tacacs_server_group.rb +8 -4
  144. data/lib/cisco_node_utils/tacacs_server_host.rb +115 -25
  145. data/lib/cisco_node_utils/vdc.rb +12 -0
  146. data/lib/cisco_node_utils/version.rb +1 -1
  147. data/lib/cisco_node_utils/vlan.rb +147 -29
  148. data/lib/cisco_node_utils/vpc.rb +55 -3
  149. data/lib/cisco_node_utils/vrf.rb +72 -11
  150. data/lib/cisco_node_utils/vrf_af.rb +114 -29
  151. data/lib/cisco_node_utils/vtp.rb +34 -52
  152. data/lib/cisco_node_utils/vxlan_vtep.rb +34 -8
  153. data/lib/cisco_node_utils/vxlan_vtep_vni.rb +36 -4
  154. data/lib/minitest/environment_plugin.rb +31 -0
  155. data/lib/minitest/log_level_plugin.rb +41 -0
  156. data/spec/client_spec.rb +7 -0
  157. data/spec/environment_spec.rb +263 -0
  158. data/spec/grpc_client_spec.rb +23 -0
  159. data/spec/isolate/all_clients_spec.rb +9 -0
  160. data/spec/isolate/grpc_only_spec.rb +16 -0
  161. data/spec/isolate/no_clients_spec.rb +26 -0
  162. data/spec/isolate/nxapi_only_spec.rb +16 -0
  163. data/spec/nxapi_client_spec.rb +42 -0
  164. data/spec/schema.yaml +75 -0
  165. data/spec/shared_examples_for_clients.rb +14 -0
  166. data/spec/spec_helper.rb +91 -0
  167. data/spec/whitespace_spec.rb +10 -0
  168. data/spec/yaml_spec.rb +42 -0
  169. data/tests/.rubocop.yml +2 -2
  170. data/tests/CSCuxdublin-1.0.0-7.0.3.I3.1.lib32_n9000.rpm +0 -0
  171. data/tests/basetest.rb +96 -36
  172. data/tests/ciscotest.rb +220 -12
  173. data/tests/cmd_config.yaml +71 -49
  174. data/tests/cmd_config_invalid.yaml +1 -1
  175. data/tests/test_aaa_authentication_login.rb +1 -0
  176. data/tests/test_aaa_authentication_login_service.rb +9 -0
  177. data/tests/test_aaa_authorization_service.rb +173 -367
  178. data/tests/test_ace.rb +171 -100
  179. data/tests/test_acl.rb +10 -1
  180. data/tests/test_bgp_af.rb +395 -728
  181. data/tests/test_bgp_neighbor.rb +274 -115
  182. data/tests/test_bgp_neighbor_af.rb +178 -77
  183. data/tests/test_bridge_domain.rb +191 -0
  184. data/tests/test_bridge_domain_vni.rb +116 -0
  185. data/tests/test_client_utils.rb +111 -0
  186. data/tests/test_command_config.rb +9 -5
  187. data/tests/test_command_reference.rb +380 -102
  188. data/tests/test_dns_domain.rb +13 -3
  189. data/tests/test_domain_name.rb +13 -3
  190. data/tests/test_encapsulation.rb +77 -0
  191. data/tests/test_evpn_vni.rb +25 -7
  192. data/tests/test_fabricpath_global.rb +167 -163
  193. data/tests/test_fabricpath_topology.rb +12 -33
  194. data/tests/test_feature.rb +215 -0
  195. data/tests/test_grpc.rb +166 -0
  196. data/tests/test_interface.rb +585 -344
  197. data/tests/test_interface_bdi.rb +80 -0
  198. data/tests/test_interface_channel_group.rb +6 -3
  199. data/tests/test_interface_ospf.rb +26 -24
  200. data/tests/test_interface_portchannel.rb +1 -0
  201. data/tests/test_interface_private_vlan.rb +724 -0
  202. data/tests/test_interface_service_vni.rb +37 -66
  203. data/tests/test_interface_svi.rb +98 -101
  204. data/tests/test_interface_switchport.rb +419 -549
  205. data/tests/test_itd_device_group.rb +145 -0
  206. data/tests/test_itd_device_group_node.rb +199 -0
  207. data/tests/test_itd_service.rb +298 -0
  208. data/tests/test_logger.rb +43 -0
  209. data/tests/test_name_server.rb +11 -2
  210. data/tests/test_node.rb +16 -75
  211. data/tests/test_node_ext.rb +174 -163
  212. data/tests/test_node_util.rb +119 -0
  213. data/tests/test_ntp_config.rb +5 -1
  214. data/tests/test_ntp_server.rb +2 -2
  215. data/tests/test_nxapi.rb +221 -0
  216. data/tests/test_overlay_global.rb +47 -38
  217. data/tests/test_pim.rb +2 -0
  218. data/tests/test_pim_group_list.rb +2 -0
  219. data/tests/test_pim_rp_address.rb +2 -0
  220. data/tests/test_platform.rb +86 -39
  221. data/tests/test_portchannel_global.rb +211 -135
  222. data/tests/test_radius_global.rb +13 -5
  223. data/tests/test_radius_server.rb +256 -104
  224. data/tests/test_radius_server_group.rb +2 -0
  225. data/tests/test_router_bgp.rb +781 -485
  226. data/tests/test_router_ospf.rb +26 -103
  227. data/tests/test_router_ospf_vrf.rb +52 -57
  228. data/tests/test_snmp_notification_receiver.rb +2 -0
  229. data/tests/test_snmpcommunity.rb +2 -0
  230. data/tests/test_snmpgroup.rb +2 -0
  231. data/tests/test_snmpnotification.rb +40 -21
  232. data/tests/test_snmpserver.rb +2 -0
  233. data/tests/test_snmpuser.rb +2 -0
  234. data/tests/test_stp_global.rb +563 -0
  235. data/tests/test_syslog_server.rb +32 -8
  236. data/tests/test_syslog_settings.rb +22 -9
  237. data/tests/test_tacacs_server.rb +32 -27
  238. data/tests/test_tacacs_server_group.rb +100 -45
  239. data/tests/test_tacacs_server_host.rb +135 -43
  240. data/tests/test_vdc.rb +2 -16
  241. data/tests/test_vlan.rb +106 -54
  242. data/tests/test_vlan_mt_full.rb +11 -21
  243. data/tests/test_vlan_private.rb +669 -0
  244. data/tests/test_vpc.rb +312 -159
  245. data/tests/test_vrf.rb +122 -113
  246. data/tests/test_vrf_af.rb +238 -0
  247. data/tests/test_vtp.rb +58 -102
  248. data/tests/test_vxlan_vtep.rb +38 -17
  249. data/tests/test_vxlan_vtep_vni.rb +61 -9
  250. data/tests/test_yum.rb +49 -25
  251. metadata +122 -36
  252. data/lib/cisco_node_utils/cmd_ref/fex.yaml +0 -9
  253. data/lib/cisco_node_utils/cmd_ref/vni.yaml +0 -76
  254. data/lib/cisco_node_utils/vni.rb +0 -227
  255. 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 - Minitest for switchport config by Interface class.
21
+ # TestInterfaceSwitchport
22
+ # Parent class for specific types of switchport tests (below)
22
23
  class TestInterfaceSwitchport < CiscoTestCase
23
- DEFAULT_IF_SWITCHPORT_ALLOWED_VLAN = '1-4094'
24
- DEFAULT_IF_SWITCHPORT_NATIVE_VLAN = 1
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
- config('no feature vtp', 'no feature interface-vlan')
33
+ config_no_warn('no feature vtp', 'no feature interface-vlan')
34
+ @interface = Interface.new(interfaces[0])
29
35
  end
30
36
 
31
- def interface_ethernet_default(ethernet_id)
32
- config("default interface ethernet #{ethernet_id}")
37
+ def teardown
38
+ interface_ethernet_default(interfaces[0])
39
+ super
33
40
  end
34
41
 
35
- def cmd_ref_switchport_autostate_exclude
36
- ref = cmd_ref.lookup('interface',
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
- # Decides whether to check for a raised Exception or an equal value.
43
- def assert_result(expected_result, err_msg, &block)
44
- if expected_result.is_a? Class
45
- assert_raises(expected_result, &block)
46
- else
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
- def platform_supports_vtp_switchport_access?
53
- skip('Platform does not support VTP when switchport mode is access') if
54
- node.product_id =~ /N(5|6|7)/
55
- end
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 test_switchport_vtp_disabled_feature_enabled
66
- vtp = Vtp.new(true)
67
- interface = Interface.new(interfaces[0])
68
- refute(interface.switchport_vtp,
69
- 'Error: interface, access, vtp not disabled')
70
- vtp.destroy
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 test_switchport_vtp_disabled_feature_disabled_mgmt0
80
- interface = Interface.new('mgmt0')
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
- begin
95
- interface = Interface.new(interfaces[0])
96
- interface.switchport_mode = :fex_fabric
97
- refute(interface.switchport_vtp,
98
- 'Error: interface, access, vtp not disabled')
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
- interface_ethernet_default(interfaces_id[0])
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 test_switchport_vtp_enabled_access
108
- platform_supports_vtp_switchport_access?
109
- vtp = Vtp.new(true)
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 test_switchport_vtp_disabled_access
121
- vtp = Vtp.new(true)
122
- interface = Interface.new(interfaces[0])
123
- interface.switchport_mode = :access
124
- config("interface ethernet #{interfaces_id[0]}", 'no vtp')
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
- refute(interface.switchport_vtp,
127
- 'Error: interface, access, vtp not disabled')
128
- vtp.destroy
129
- interface_ethernet_default(interfaces_id[0])
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 test_switchport_vtp_enabled_trunk
133
- vtp = Vtp.new(true)
134
- interface = Interface.new(interfaces[0])
135
- interface.switchport_mode = :trunk
136
- config("interface ethernet #{interfaces_id[0]}", 'vtp')
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
- assert(interface.switchport_vtp,
139
- 'Error: interface, trunk, vtp not enabled')
140
- vtp.destroy
141
- interface_ethernet_default(interfaces_id[0])
172
+ assert_raises(RuntimeError) do
173
+ interface.switchport_autostate_exclude = true
174
+ end
175
+ end
142
176
  end
143
177
 
144
- def test_switchport_vtp_disabled_trunk
145
- vtp = Vtp.new(true)
146
- interface = Interface.new(interfaces[0])
178
+ def test_interface_switchport_mode_invalid
179
+ assert_raises(ArgumentError) { interface.switchport_mode = :unknown }
180
+ end
147
181
 
148
- interface.switchport_mode = :trunk
149
- refute(interface.switchport_vtp,
150
- 'Error: interface, trunk, vtp not disabled')
151
- vtp.destroy
152
- interface_ethernet_default(interfaces_id[0])
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 test_set_switchport_vtp_default_access
156
- platform_supports_vtp_switchport_access?
157
- vtp = Vtp.new(true)
158
- interface = Interface.new(interfaces[0])
159
- interface.switchport_mode = :access
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
- interface.switchport_vtp = interface.default_switchport_vtp
162
- refute(interface.switchport_vtp,
163
- 'Error:(1) mode :access, vtp should be default (false)')
205
+ switchport_modes = [
206
+ :unknown,
207
+ :disabled,
208
+ :access,
209
+ :trunk,
210
+ :tunnel,
211
+ ]
164
212
 
165
- interface.switchport_vtp = true
166
- assert(interface.switchport_vtp,
167
- 'Error:(2) mode :access, vtp should be true')
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
- interface.switchport_vtp = interface.default_switchport_vtp
170
- refute(interface.switchport_vtp,
171
- 'Error:(3) mode :access, vtp should be default (false)')
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
- vtp.destroy
174
- interface_ethernet_default(interfaces_id[0])
246
+ interface.switchport_mode = :fex_fabric
247
+ assert_equal(interface.switchport_mode, :fex_fabric)
175
248
  end
176
249
 
177
- def test_set_switchport_vtp_default_trunk
178
- vtp = Vtp.new(true)
179
- interface = Interface.new(interfaces[0])
180
-
181
- interface.switchport_mode = :trunk
182
- interface.switchport_vtp = interface.default_switchport_vtp
183
- refute(interface.switchport_vtp,
184
- 'Error:(1) mode :trunk, vtp should be default (false)')
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
- interface.switchport_vtp = true
187
- assert(interface.switchport_vtp,
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
- interface.switchport_vtp = interface.default_switchport_vtp
191
- refute(interface.switchport_vtp,
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
- def test_set_switchport_vtp_true_access
198
- platform_supports_vtp_switchport_access?
199
- vtp = Vtp.new(true)
200
- interface = Interface.new(interfaces[0])
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
- interface.switchport_mode = :access
203
- interface.switchport_vtp = true
204
- assert(interface.switchport_vtp,
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
- def test_set_switchport_vtp_true_trunk
211
- vtp = Vtp.new(true)
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
- interface.switchport_mode = :trunk
215
- interface.switchport_vtp = true
216
- assert(interface.switchport_vtp,
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 test_set_switchport_vtp_true_unsupported_mode_disabled
223
- vtp = Vtp.new(true)
224
- interface = Interface.new(interfaces[0])
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
- interface.switchport_mode = :disabled
227
- refute(interface.switchport_vtp,
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
- def test_set_switchport_vtp_true_unsupported_mgmt0
234
- vtp = Vtp.new(true)
235
- interface = Interface.new('mgmt0')
305
+ interface.switchport_trunk_native_vlan = 30
306
+ assert_equal(30, interface.switchport_trunk_native_vlan)
236
307
 
237
- interface.switchport_vtp = true
238
- refute(interface.switchport_vtp,
239
- 'Error: interface, access, vtp is enabled')
240
- vtp.destroy
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 test_set_switchport_vtp_false_access
244
- vtp = Vtp.new(true)
245
- interface = Interface.new(interfaces[0])
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
- interface.switchport_mode = :access
248
- interface.switchport_vtp = false
249
- refute(interface.switchport_vtp,
250
- 'Error: interface, access, vtp not disabled')
251
- vtp.destroy
252
- interface_ethernet_default(interfaces_id[0])
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 test_set_switchport_vtp_false_trunk
256
- vtp = Vtp.new(true)
257
- interface = Interface.new(interfaces[0])
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
- interface.switchport_mode = :trunk
260
- interface.switchport_vtp = false
261
- refute(interface.switchport_vtp,
262
- 'Error: interface, access, vtp not disabled')
263
- vtp.destroy
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 test_set_switchport_vtp_false_unsupported_mode_disabled
268
- vtp = Vtp.new(true)
269
- interface = Interface.new(interfaces[0])
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
- def test_switchport_autostate_disabled_feature_enabled
280
- svi = Interface.new('Vlan23')
281
- interface = Interface.new(interfaces[0])
282
- refute(interface.switchport_autostate_exclude,
283
- 'Error: interface, access, autostate exclude not disabled')
284
- svi.destroy
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 test_switchport_autostate_disabled_feature_disabled_eth1_1
288
- interface = Interface.new(interfaces[0])
289
- refute(interface.switchport_autostate_exclude,
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 test_switchport_autostate_disabled_feature_disabled_mgmt0
294
- interface = Interface.new('mgmt0')
295
- refute(interface.switchport_autostate_exclude,
296
- 'Error: interface, access, autostate exclude not disabled')
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 test_switchport_autostate_disabled_unsupported_mode
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.config_set?
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.config_set?
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 test_raise_error_switchport_not_enabled
371
- interface = Interface.new(interfaces[0])
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
- def test_set_switchport_autostate_default_access
381
- svi = Interface.new('Vlan23')
382
- interface = Interface.new(interfaces[0])
434
+ interface.switchport_autostate_exclude = true
435
+ assert(interface.switchport_autostate_exclude,
436
+ 'Error: interface, access, autostate exclude not enabled')
383
437
 
384
- # switchport must be enabled to configure autostate
385
- config("interface #{interfaces[0]}", 'switchport')
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
- assert_result(result,
389
- 'Error: interface, access, autostate exclude not disabled') do
390
- interface.switchport_autostate_exclude = result
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 test_set_switchport_autostate_default_trunk
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
- config("interface #{interfaces[0]}", 'switchport')
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
- def test_set_switchport_autostate_true_trunk
430
- svi = Interface.new('Vlan23')
431
- interface = Interface.new(interfaces[0])
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
- # switchport must be enabled to configure autostate
435
- config("interface #{interfaces[0]}", 'switchport')
458
+ interface.switchport_autostate_exclude = false
459
+ refute(interface.switchport_autostate_exclude,
460
+ 'Error: interface, access, autostate exclude not disabled')
436
461
 
437
- result = true
438
- assert_result(result,
439
- 'Error: interface, access, autostate exclude not disabled') do
440
- interface.switchport_autostate_exclude = result
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 test_set_switchport_autostate_true_unsupported_mode_disabled
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
- svi.destroy
455
- interface_ethernet_default(interfaces_id[0])
474
+ assert_raises RuntimeError do
475
+ interface.switchport_autostate_exclude = false
476
+ end
456
477
  end
457
478
 
458
- def test_set_switchport_autostate_true_unsupported_mgmt0
459
- svi = Interface.new('Vlan23')
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
- def test_set_switchport_autostate_false_access
468
- svi = Interface.new('Vlan23')
469
- interface = Interface.new(interfaces[0])
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
- # switchport must be enabled to configure autostate
472
- config("interface #{interfaces[0]}", 'switchport')
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
- result = false
475
- assert_result(result,
476
- 'Error: interface, access, autostate exclude not disabled') do
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 test_set_switchport_autostate_false_trunk
484
- svi = Interface.new('Vlan23')
485
- interface = Interface.new(interfaces[0])
486
- interface.switchport_mode = :trunk
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
- # switchport must be enabled to configure autostate
489
- config("interface #{interfaces[0]}", 'switchport')
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
- result = false
492
- assert_result(result,
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 test_set_switchport_autostate_false_unsupported_mode_disabled
501
- svi = Interface.new('Vlan23')
502
- interface = Interface.new(interfaces[0])
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
- assert_raises RuntimeError do
506
- interface.switchport_autostate_exclude = false
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 test_interface_switchport_mode_invalid
513
- interface = Interface.new(interfaces[0])
514
- assert_raises(ArgumentError) { interface.switchport_mode = :unknown }
515
- interface_ethernet_default(interfaces_id[0])
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 test_interface_switchport_mode_not_supported
519
- interface = Interface.new('mgmt0')
520
- assert_raises(RuntimeError) { interface.switchport_mode = :access }
521
- begin
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 test_interface_switchport_mode_valid
530
- switchport_modes = [
531
- :unknown,
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 = Interface.new(interfaces[0])
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
- switchport_modes.each do |start|
542
- switchport_modes.each do |finish|
543
- next if start == :unknown || finish == :unknown
544
- begin
545
- # puts "#{start},#{finish}"
546
- interface.switchport_mode = start
547
- assert_equal(start, interface.switchport_mode,
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 test_interface_switchport_mode_valid_fex
564
- switchport_modes = [
565
- :unknown,
566
- :fex_fabric,
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 = Interface.new(interfaces[0])
570
- switchport_modes.each do |start|
571
- switchport_modes.each do |finish|
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
- def test_system_default_switchport_on_off
726
- interface = Interface.new(interfaces[0])
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
- system_default_switchport('')
729
- assert(interface.system_default_switchport,
730
- 'Test for enabled - failed')
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
- # common default is "no switch"
733
- system_default_switchport('no ')
734
- refute(interface.system_default_switchport,
735
- 'Test for disabled - failed')
736
- rescue RuntimeError => e
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 test_system_default_switchport_shutdown_on_off
743
- interface = Interface.new(interfaces[0])
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
- system_default_switchport_shutdown('no ')
746
- refute(interface.system_default_switchport_shutdown,
747
- 'Test for disabled - failed')
593
+ def test_set_switchport_vtp_true_unsupported_mgmt_intf
594
+ interface = Interface.new(mgmt_intf)
748
595
 
749
- # common default is "shutdown"
750
- system_default_switchport_shutdown('')
751
- assert(interface.system_default_switchport_shutdown,
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 test_interface_svi_command_on_non_vlan
756
- interface = Interface.new(interfaces[0])
757
- assert_raises(RuntimeError) { interface.svi_autostate = true }
758
- assert_raises(RuntimeError) { interface.svi_management = true }
759
- interface_ethernet_default(interfaces_id[0])
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