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
@@ -13,6 +13,8 @@
13
13
  # limitations under the License.
14
14
 
15
15
  require_relative 'ciscotest'
16
+ require_relative '../lib/cisco_node_utils/bridge_domain'
17
+ require_relative '../lib/cisco_node_utils/encapsulation'
16
18
  require_relative '../lib/cisco_node_utils/interface'
17
19
  require_relative '../lib/cisco_node_utils/interface_service_vni'
18
20
  require_relative '../lib/cisco_node_utils/vdc'
@@ -33,96 +35,73 @@ include Cisco
33
35
  # encapsulation profile vni_600_6000 default
34
36
  #
35
37
  class TestInterfaceServiceVni < CiscoTestCase
38
+ # rubocop:disable Style/ClassVars
39
+ @skip_unless_supported = 'interface_service_vni'
40
+ @@pre_clean_needed = true
41
+ @@intf = nil
42
+
36
43
  def setup
37
44
  super
38
- end
45
+ return unless @@pre_clean_needed
39
46
 
40
- def teardown
41
- # Reset the vdc module type back to default
42
- v = Vdc.new('default')
43
- v.limit_resource_module_type = '' if v.limit_resource_module_type == 'f3'
47
+ mt_full_env_setup
48
+ @@pre_clean_needed = false
44
49
  end
45
50
 
46
- def compatible_interface?
47
- # MT-full tests require a specific linecard; either because they need a
48
- # compatible interface or simply to enable the features. Either way
49
- # we will provide an appropriate interface name if the linecard is present.
50
- # Example 'show mod' output to match against:
51
- # '9 12 10/40 Gbps Ethernet Module N7K-F312FQ-25 ok'
52
- sh_mod = @device.cmd("sh mod | i '^[0-9]+.*N7K-F3'")[/^(\d+)\s.*N7K-F3/]
53
- slot = sh_mod.nil? ? nil : Regexp.last_match[1]
54
- skip('Unable to find compatible interface in chassis') if slot.nil?
55
-
56
- "ethernet#{slot}/1"
51
+ def teardown
52
+ config_no_warn("default interface #{@@intf}")
53
+ super
57
54
  end
58
55
 
59
56
  def mt_full_env_setup
60
- skip('Platform does not support MT-full') unless Vni.mt_full_support
61
- intf = compatible_interface?
62
- v = Vdc.new('default')
63
- v.limit_resource_module_type = 'f3' unless
64
- v.limit_resource_module_type == 'f3'
65
- config("default int #{intf}")
66
- intf
57
+ @@intf = mt_full_interface?
58
+ Vdc.new('default').limit_resource_module_type = 'f3'
59
+ config_no_warn("default interface #{@@intf}")
60
+ global_setup
67
61
  end
68
62
 
69
63
  def global_setup
70
64
  # Reset feature to clean up switch
71
65
  config('no feature vni', 'feature vni')
72
66
 
73
- # Create a global encap config
74
- config('encapsulation profile vni vni_500_5000', 'dot1q 500 vni 5000',
75
- 'encapsulation profile vni vni_600_6000', 'dot1q 600 vni 6000',
76
- 'encapsulation profile vni vni_700_7000', 'dot1q 700 vni 7000',
77
- 'encapsulation profile vni vni_800_8000', 'dot1q 800 vni 8000')
67
+ # Create global encap profiles
68
+ Encapsulation.new('vni_500_5000').dot1q_map = %w(500 5000)
69
+ Encapsulation.new('vni_600_6000').dot1q_map = %w(600 6000)
70
+ Encapsulation.new('vni_700_7000').dot1q_map = %w(700 7000)
71
+ Encapsulation.new('vni_800_8000').dot1q_map = %w(800 8000)
78
72
 
79
- # Configure a bridge-domain
80
- config('system bridge-domain 100-113', 'bridge-domain 100')
73
+ # Create global bridge domains
74
+ remove_all_bridge_domains
75
+ BridgeDomain.new('100-113')
81
76
  end
82
77
 
83
78
  def test_create_destroy
84
- # This property has several dependencies:
85
- # - VDC support
86
- # - Specific linecard (F3 or newer)
87
- # - Bridge Domain Configuration
88
- # - Feature vni
89
-
90
- intf = mt_full_env_setup
91
- global_setup
92
-
93
79
  # TEST Create / Destroy and svc_vni_ids hash builder
94
- i5 = InterfaceServiceVni.new(intf, 5)
95
- assert_equal(1, InterfaceServiceVni.svc_vni_ids[intf].count)
96
- i6 = InterfaceServiceVni.new(intf, 6)
97
- i7 = InterfaceServiceVni.new(intf, 7)
98
- assert_equal(3, InterfaceServiceVni.svc_vni_ids[intf].count)
80
+ i5 = InterfaceServiceVni.new(@@intf, 5)
81
+ assert_equal(1, InterfaceServiceVni.svc_vni_ids[@@intf].count)
82
+ i6 = InterfaceServiceVni.new(@@intf, 6)
83
+ i7 = InterfaceServiceVni.new(@@intf, 7)
84
+ assert_equal(3, InterfaceServiceVni.svc_vni_ids[@@intf].count)
99
85
  i6.destroy
100
- assert_equal(2, InterfaceServiceVni.svc_vni_ids[intf].count)
86
+ assert_equal(2, InterfaceServiceVni.svc_vni_ids[@@intf].count)
101
87
  i5.destroy
102
88
  i7.destroy
103
89
  end
104
90
 
105
91
  def test_shutdown
106
- intf = mt_full_env_setup
107
- global_setup
92
+ i5 = InterfaceServiceVni.new(@@intf, 5)
93
+ assert_equal(i5.default_shutdown, i5.shutdown)
108
94
 
109
- i5 = InterfaceServiceVni.new(intf, 5)
110
- # Test shutdown
111
95
  i5.shutdown = false
112
96
  refute(i5.shutdown)
113
97
  i5.shutdown = true
114
98
  assert(i5.shutdown)
115
- i5.shutdown = false
116
- refute(i5.shutdown)
117
- i5.shutdown = i5.default_shutdown
118
- assert(i5.shutdown)
119
99
  end
120
100
 
121
101
  def test_encapsulation_profile_vni
122
- intf = mt_full_env_setup
123
- global_setup
124
-
125
- i5 = InterfaceServiceVni.new(intf, 5)
102
+ i5 = InterfaceServiceVni.new(@@intf, 5)
103
+ assert_equal(i5.default_encapsulation_profile_vni,
104
+ i5.encapsulation_profile_vni)
126
105
 
127
106
  # Test removal when profile not present
128
107
  i5.encapsulation_profile_vni = ''
@@ -149,16 +128,8 @@ class TestInterfaceServiceVni < CiscoTestCase
149
128
  def test_vlan_mapping
150
129
  # This test covers two properties:
151
130
  # vlan_mapping & vlan_mapping_enabled
152
- #
153
- # This property has several dependencies:
154
- # - VDC support
155
- # - Specific linecard (F3)
156
- # - Bridge Domain Configuration
157
- # - Feature vni
158
- intf = mt_full_env_setup
159
- global_setup
160
131
 
161
- i = Interface.new(intf)
132
+ i = Interface.new(@@intf)
162
133
  i.switchport_mode = :trunk
163
134
  i.vlan_mapping = []
164
135
  assert_equal([], i.vlan_mapping, 'Initial cleanup failed')
@@ -20,49 +20,100 @@ include Cisco
20
20
  # TestSvi - Minitest for Interface configuration of SVI interfaces.
21
21
  class TestSvi < CiscoTestCase
22
22
  @@pre_clean_needed = true # rubocop:disable Style/ClassVars
23
+ attr_reader :svi
24
+
25
+ def self.runnable_methods
26
+ # We don't have a separate YAML file to key off, so we check platform
27
+ return super unless platform == :ios_xr
28
+ remove_method :setup
29
+ remove_method :teardown
30
+ [:xr_unsupported]
31
+ end
23
32
 
24
- def remove_all_svis
25
- Interface.interfaces.each do |int, obj|
26
- next unless int[/vlan/]
27
- next if int[/vlan1/]
28
- obj.destroy
29
- end
33
+ def xr_unsupported
34
+ skip("Skipping #{self.class}; Vlan interfaces are not supported on IOS XR")
30
35
  end
31
36
 
32
37
  def setup
33
38
  super
34
39
  remove_all_svis if @@pre_clean_needed
35
40
  @@pre_clean_needed = false # rubocop:disable Style/ClassVars
41
+ @svi = Interface.new('Vlan23')
42
+ end
43
+
44
+ def remove_all_svis
45
+ Interface.interfaces.each do |int, obj|
46
+ next unless int[/vlan/]
47
+ next if int[/vlan1/]
48
+ obj.destroy
49
+ end
36
50
  end
37
51
 
38
52
  def teardown
39
- super
40
53
  remove_all_svis
54
+ config_no_warn('no feature private-vlan')
55
+ super
41
56
  end
42
57
 
43
- def cmd_ref_autostate
44
- ref = cmd_ref.lookup('interface', 'svi_autostate')
45
- assert(ref, 'Error, reference not found for autostate')
46
- ref
58
+ def skip_autostate_test?
59
+ skip('svi autostate properties are not supported on this platform') if
60
+ node.product_id =~ /N(5|6)K/
47
61
  end
48
62
 
49
- # Decides whether to check for a raised Exception or an equal value.
50
- def assert_result(expected_result, err_msg, &block)
51
- if expected_result.is_a? Class
52
- assert_raises(expected_result, &block)
53
- else
54
- value = block.call
55
- assert_equal(expected_result, value, err_msg)
63
+ def system_default_svi_autostate(state='')
64
+ s = config("#{state}system default interface-vlan autostate")
65
+ if s[/Invalid input/] # rubocop:disable Style/GuardClause
66
+ skip("'system default interface-vlan autostate' is not supported")
56
67
  end
57
68
  end
58
69
 
59
- def skip_autostate_test?
60
- skip('svi autostate properties are not supported on this platform') if
61
- node.product_id =~ /N(5|6)K/
70
+ def test_private_vlan_mapping
71
+ if validate_property_excluded?('interface',
72
+ 'private_vlan_mapping')
73
+ assert_nil(svi.private_vlan_mapping)
74
+ return
75
+ end
76
+ input = %w(10-20 30)
77
+ result = ['10-20,30']
78
+ svi.private_vlan_mapping = input
79
+ assert_equal(result,
80
+ svi.private_vlan_mapping,
81
+ 'Error: svi private mapping not configured')
82
+
83
+ input = %w(11-13)
84
+ result = %w(11-13)
85
+ svi.private_vlan_mapping = input
86
+ assert_equal(result,
87
+ svi.private_vlan_mapping,
88
+ 'Error: svi private mapping not configured')
89
+
90
+ input = []
91
+ result = []
92
+ svi.private_vlan_mapping = input
93
+ input = svi.private_vlan_mapping
94
+ assert_equal(input, result,
95
+ 'Err: wrong config for svi pvlan mapping')
62
96
  end
63
97
 
64
- def system_default_svi_autostate(state='')
65
- config("#{state}system default interface-vlan autostate")
98
+ def test_private_vlan_mapping_bad_args
99
+ if validate_property_excluded?('interface',
100
+ 'private_vlan_mapping')
101
+ assert_nil(svi.private_vlan_mapping)
102
+ return
103
+ end
104
+ input = %w(10 20)
105
+ result = ['10,20']
106
+ svi.private_vlan_mapping = input
107
+ input = svi.private_vlan_mapping
108
+ assert_equal(result,
109
+ svi.private_vlan_mapping,
110
+ 'Error: svi private mapping not configured')
111
+
112
+ input = %w(23)
113
+ assert_raises(RuntimeError,
114
+ 'svi pvlan mapping did not raise RuntimeError') do
115
+ svi.private_vlan_mapping = input
116
+ end
66
117
  end
67
118
 
68
119
  def test_prop_nil_when_ethernet
@@ -75,27 +126,23 @@ class TestSvi < CiscoTestCase
75
126
  end
76
127
 
77
128
  def test_create_valid
78
- svi = Interface.new('Vlan23')
79
- s = @device.cmd('show run interface all | inc Vlan')
80
- cmd = 'interface Vlan1'
81
- assert(s.include?(cmd), 'Error: Failed to create svi Vlan1')
129
+ @default_show_command = 'show run interface all | inc Vlan'
130
+ assert_show_match(pattern: /interface Vlan1/,
131
+ msg: 'Error: Failed to create svi Vlan1')
132
+
133
+ assert_show_match(pattern: /interface Vlan23/,
134
+ msg: 'Error: Failed to create svi Vlan23')
82
135
 
83
- cmd = 'interface Vlan23'
84
- assert(s.include?(cmd), 'Error: Failed to create svi Vlan23')
85
136
  svi.destroy
86
137
 
87
138
  # Verify that svi23 got removed now that we invoked svi.destroy
88
- s = @device.cmd('show run interface all | inc Vlan')
89
- cmd = 'interface Vlan23'
90
- refute(s.include?(cmd), 'Error: svi Vlan23 still configured')
139
+ refute_show_match(pattern: /interface Vlan23/,
140
+ msg: 'Error: svi Vlan23 still configured')
91
141
  end
92
142
 
93
- def test_create_vlan_invalid
143
+ def test_create_invalid
94
144
  assert_raises(CliError) { Interface.new('10.1.1.1') }
95
- end
96
-
97
- def test_create_vlan_invalid_value
98
- assert_raises(CliError) { Interface.new('Vlan0') }
145
+ assert_raises(CliError, Cisco::UnsupportedError) { Interface.new('Vlan0') }
99
146
  end
100
147
 
101
148
  def test_create_vlan_nil
@@ -103,106 +150,59 @@ class TestSvi < CiscoTestCase
103
150
  end
104
151
 
105
152
  def test_name
106
- svi = Interface.new('Vlan23')
107
153
  assert_equal('vlan23', svi.name, 'Error: svi vlan name is wrong')
108
- svi.destroy
109
154
  end
110
155
 
111
156
  def test_assignment
112
- svi = Interface.new('Vlan23')
113
157
  svi.svi_management = true
114
158
  assert(svi.svi_management, 'Error: svi svi_management, false')
115
- svi_extra = svi
159
+ svi_extra = Interface.new('Vlan23')
116
160
  assert(svi_extra.svi_management, 'Error: new svi svi_management, false')
117
- svi.destroy
118
161
  end
119
162
 
120
- def test_get_autostate_false
163
+ def test_get_autostate
121
164
  skip_autostate_test?
122
- svi = Interface.new('Vlan23')
123
165
 
124
166
  config('interface vlan 23', 'no autostate')
125
167
  refute(svi.svi_autostate, 'Error: svi autostate not correct.')
126
- svi.destroy
127
- end
128
-
129
- def test_get_autostate_true
130
- skip_autostate_test?
131
- svi = Interface.new('Vlan23')
132
168
 
133
169
  config('interface vlan 23', 'autostate')
134
170
  assert(svi.svi_autostate, 'Error: svi autostate not correct.')
135
- svi.destroy
136
171
  end
137
172
 
138
- def test_set_autostate_false
173
+ def test_set_autostate
139
174
  skip_autostate_test?
140
- ref = cmd_ref_autostate
141
- svi = Interface.new('Vlan23')
142
- assert_result(ref.test_config_result(false),
143
- 'Error: svi autostate not set to false') do
144
- svi.svi_autostate = false
145
- end
146
- svi.destroy
147
- end
175
+ svi.svi_autostate = false
176
+ refute(svi.svi_autostate, 'Error: svi autostate not set to false')
148
177
 
149
- def test_set_autostate_true
150
- skip_autostate_test?
151
- svi = Interface.new('Vlan23')
152
- ref = cmd_ref_autostate
153
- assert_result(ref.test_config_result(true),
154
- 'Error: svi autostate not set to true') do
155
- svi.svi_autostate = true
156
- end
157
- svi.destroy
158
- end
178
+ svi.svi_autostate = true
179
+ assert(svi.svi_autostate, 'Error: svi autostate not set to true')
159
180
 
160
- def test_set_autostate_default
161
- skip_autostate_test?
162
- svi = Interface.new('Vlan23')
163
- ref = cmd_ref_autostate
164
- default_value = ref.default_value
165
- assert_result(ref.test_config_result(default_value),
166
- 'Error: svi autostate not set to default') do
167
- svi.svi_autostate = default_value
168
- end
169
- svi.destroy
181
+ svi.svi_autostate = svi.default_svi_autostate
182
+ assert_equal(svi.default_svi_autostate, svi.svi_autostate,
183
+ 'Error: svi autostate not set to default')
170
184
  end
171
185
 
172
- def test_get_management_true
173
- svi = Interface.new('Vlan23')
174
-
186
+ def test_get_management
175
187
  config('interface vlan 23', 'management')
176
188
 
177
189
  assert(svi.svi_management)
178
- svi.destroy
179
190
  end
180
191
 
181
- def test_set_management_false
182
- svi = Interface.new('Vlan23')
192
+ def test_set_management
183
193
  svi.svi_management = false
184
194
  refute(svi.svi_management)
185
- svi.destroy
186
- end
187
195
 
188
- def test_set_management_true
189
- svi = Interface.new('Vlan23')
190
- svi.svi_management = true
191
- assert(svi.svi_management)
192
- svi.destroy
193
- end
194
-
195
- def test_set_management_default
196
- svi = Interface.new('Vlan23')
197
196
  svi.svi_management = true
198
197
  assert(svi.svi_management)
199
198
 
200
199
  svi.svi_management = svi.default_svi_management
201
200
  assert_equal(svi.default_svi_management, svi.svi_management)
202
- svi.destroy
203
201
  end
204
202
 
205
203
  def config_svi_properties(state)
204
+ # We don't want the default vlan23 for this test:
205
+ svi.destroy
206
206
  # Skip default vlan1
207
207
  (2..6).each do |i|
208
208
  svi = Interface.new('Vlan' + i.to_s)
@@ -234,13 +234,10 @@ class TestSvi < CiscoTestCase
234
234
  end
235
235
 
236
236
  def test_create_interface_description
237
- svi = Interface.new('Vlan23')
238
-
239
237
  description = 'Test description'
240
238
  svi.description = description
241
239
  assert_equal(description, svi.description,
242
240
  'Error: Description not configured')
243
- svi.destroy
244
241
  end
245
242
 
246
243
  def test_system_default_svi_autostate_on_off