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
@@ -20,23 +20,33 @@ require_relative '../lib/cisco_node_utils/dns_domain'
20
20
 
21
21
  # TestDnsDomain - Minitest for DnsDomain node utility.
22
22
  class TestDnsDomain < CiscoTestCase
23
+ @skip_unless_supported = 'dnsclient'
24
+
23
25
  def setup
24
26
  # setup runs at the beginning of each test
25
27
  super
28
+ @backup_resolve = backup_resolv_file
26
29
  no_dnsdomain_tests
27
30
  end
28
31
 
29
32
  def teardown
30
33
  # teardown runs at the end of each test
31
34
  no_dnsdomain_tests
35
+ restore_resolv_file(@backup_resolve)
32
36
  super
33
37
  end
34
38
 
35
39
  def no_dnsdomain_tests
36
40
  # Turn the feature off for a clean test.
37
- config('no ip domain-list aoeu.com',
38
- 'no ip domain-list asdf.com',
39
- 'no vrf context test')
41
+ if platform == :ios_xr
42
+ config('no domain list aoeu.com',
43
+ 'no domain list asdf.com',
44
+ 'no vrf test')
45
+ else
46
+ config('no ip domain-list aoeu.com',
47
+ 'no ip domain-list asdf.com',
48
+ 'no vrf context test')
49
+ end
40
50
  end
41
51
 
42
52
  # TESTS
@@ -20,23 +20,33 @@ require_relative '../lib/cisco_node_utils/domain_name'
20
20
 
21
21
  # TestDomainName - Minitest for DomainName node utility.
22
22
  class TestDomainName < CiscoTestCase
23
+ @skip_unless_supported = 'dnsclient'
24
+
23
25
  def setup
24
26
  # setup runs at the beginning of each test
25
27
  super
28
+ @backup_resolve = backup_resolv_file
26
29
  no_domainname_test_xyz
27
30
  end
28
31
 
29
32
  def teardown
30
33
  # teardown runs at the end of each test
31
34
  no_domainname_test_xyz
35
+ restore_resolv_file(@backup_resolve)
32
36
  super
33
37
  end
34
38
 
35
39
  def no_domainname_test_xyz
36
40
  # Turn the feature off for a clean test.
37
- config('no ip domain-name test.abc',
38
- 'no ip domain-name test.xyz',
39
- 'no vrf context test')
41
+ if platform == :ios_xr
42
+ config('no domain name test.abc',
43
+ 'no domain name test.xyz',
44
+ 'no vrf test')
45
+ else
46
+ config('no ip domain-name test.abc',
47
+ 'no ip domain-name test.xyz',
48
+ 'no vrf context test')
49
+ end
40
50
  end
41
51
 
42
52
  # TESTS
@@ -0,0 +1,77 @@
1
+ # Copyright (c) 2014-2016 Cisco and/or its affiliates.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'ciscotest'
16
+ require_relative '../lib/cisco_node_utils/encapsulation'
17
+ require_relative '../lib/cisco_node_utils/vdc'
18
+
19
+ # TestEncapsulation - Minitest for Encapsulation node utility class
20
+ class TestEncapsulation < CiscoTestCase
21
+ @skip_unless_supported = 'encapsulation'
22
+ @@pre_clean_needed = true # rubocop:disable Style/ClassVars
23
+
24
+ def setup
25
+ super
26
+ return unless @@pre_clean_needed
27
+
28
+ # This provider requires MT-Full and a compatible linecard
29
+ mt_full_interface?
30
+ Vdc.new('default').limit_resource_module_type = 'f3'
31
+ cleanup
32
+ @@pre_clean_needed = false # rubocop:disable Style/ClassVars
33
+ end
34
+
35
+ def teardown
36
+ cleanup
37
+ super
38
+ end
39
+
40
+ def cleanup
41
+ config_no_warn('no feature vni')
42
+ Encapsulation.encaps.each do |_encap, obj|
43
+ obj.destroy
44
+ end
45
+ end
46
+
47
+ # TESTS
48
+
49
+ def test_create_destroy
50
+ profile = 'cisco'
51
+ e = Encapsulation.new(profile)
52
+ assert(Encapsulation.encaps[profile], "profile '#{profile}' not found")
53
+ e.destroy
54
+ end
55
+
56
+ def test_dot1q_map
57
+ e = Encapsulation.new('cisco')
58
+ assert_equal(e.default_dot1q_map, e.dot1q_map)
59
+
60
+ map = ['100-110,150', '5000-5010,5050']
61
+ e.dot1q_map = map
62
+ assert_equal(map, e.dot1q_map)
63
+
64
+ e.dot1q_map = e.default_dot1q_map
65
+ assert_equal(e.default_dot1q_map, e.dot1q_map)
66
+
67
+ e.destroy
68
+ end
69
+
70
+ def test_dot1q_map_negative
71
+ e = Encapsulation.new('cisco')
72
+ assert_raises(CliError) do
73
+ # Test for range imbalance (3 vlans to only 2 vnis)
74
+ e.dot1q_map = ['101-103', '5101-5102']
75
+ end
76
+ end
77
+ end
@@ -21,13 +21,23 @@ require_relative '../lib/cisco_node_utils/evpn_vni'
21
21
 
22
22
  # TestEvpnVni - Minitest for EvpnVni class
23
23
  class TestEvpnVni < CiscoTestCase
24
+ @skip_unless_supported = 'evpn_vni'
25
+
24
26
  def setup
25
27
  # Disable feature bgp and no overlay evpn before each test to
26
28
  # ensure we are starting with a clean slate for each test.
27
29
  super
28
30
  config('no feature bgp')
29
- config('no nv overlay evpn')
30
- config('no evpn')
31
+
32
+ # Some platforms complain when nv overlay is not configured
33
+ config_no_warn('no nv overlay evpn')
34
+
35
+ # Some platforms remove the 'evpn' command when 'no nv overlay evpn'
36
+ # is processed, while others must remove it explicitly.
37
+ config_no_warn('no evpn')
38
+
39
+ rescue RuntimeError => e
40
+ hardware_supports_feature?(e.message)
31
41
  end
32
42
 
33
43
  def test_create_and_destroy
@@ -38,11 +48,9 @@ class TestEvpnVni < CiscoTestCase
38
48
  vni.destroy
39
49
  vni_list = EvpnVni.vnis
40
50
  refute(vni_list.key?('4096'), 'Error: failed to destroy evpn vni 4096')
41
- end
42
51
 
43
- def test_vni_collection
44
- vni_list = EvpnVni.vnis
45
- assert_equal(true, vni_list.empty?, 'VLAN collection is empty')
52
+ rescue RuntimeError => e
53
+ hardware_supports_feature?(e.message)
46
54
  end
47
55
 
48
56
  def test_route_distinguisher
@@ -57,6 +65,9 @@ class TestEvpnVni < CiscoTestCase
57
65
  assert_empty(vni.route_distinguisher,
58
66
  'vni route_distinguisher should *NOT* be configured')
59
67
  vni.destroy
68
+
69
+ rescue RuntimeError => e
70
+ hardware_supports_feature?(e.message)
60
71
  end
61
72
 
62
73
  # test route_target
@@ -64,7 +75,11 @@ class TestEvpnVni < CiscoTestCase
64
75
  vni = EvpnVni.new(4096)
65
76
 
66
77
  # test route target both auto and route target both auto evpn
67
- opts = [:both, :import, :export]
78
+ if Utils.nexus_i2_image
79
+ opts = [:import, :export]
80
+ else
81
+ opts = [:both, :import, :export]
82
+ end
68
83
 
69
84
  # Master list of communities to test against
70
85
  master = ['1.2.3.4:55', '2:2', '55:33', 'auto']
@@ -86,6 +101,9 @@ class TestEvpnVni < CiscoTestCase
86
101
  route_target_tester(vni, opts, should, 'Test 4')
87
102
 
88
103
  vni .destroy
104
+
105
+ rescue RuntimeError => e
106
+ hardware_supports_feature?(e.message)
89
107
  end
90
108
 
91
109
  def route_target_tester(vni, opts, should, test_id)
@@ -15,16 +15,19 @@
15
15
  require_relative 'ciscotest'
16
16
  require_relative '../lib/cisco_node_utils/cisco_cmn_utils'
17
17
  require_relative '../lib/cisco_node_utils/fabricpath_global'
18
+ require_relative '../lib/cisco_node_utils/interface'
19
+ require_relative '../lib/cisco_node_utils/platform'
18
20
 
19
21
  include Cisco
20
22
 
21
23
  # TestFabricpathGlobal - Minitest for Fabricpath Global node utils
22
24
  class TestFabricpathGlobal < CiscoTestCase
25
+ @skip_unless_supported = 'fabricpath'
26
+
23
27
  def setup
24
28
  # setup runs at the beginning of each test
25
29
  super
26
- skip("Test not supported on #{node.product_id}") if
27
- cmd_ref.lookup('fabricpath', 'feature').default_value.nil?
30
+ fabricpath_testenv_setup
28
31
  no_feature_fabricpath
29
32
  end
30
33
 
@@ -35,209 +38,210 @@ class TestFabricpathGlobal < CiscoTestCase
35
38
  end
36
39
 
37
40
  def no_feature_fabricpath
38
- # Turn the feature off for a clean test.
39
- config('no feature-set fabricpath')
41
+ fg = FabricpathGlobal.globals
42
+ fg.each { |_key, elem| elem.destroy } unless fg.empty?
40
43
  end
41
44
 
42
- def n5k6k_platforms?
43
- /N[56]K/ =~ node.product_id
44
- end
45
+ # def no_feature_fabricpath
46
+ # # Turn the feature off for a clean test.
47
+ # config('no feature-set fabricpath')
48
+ # end
45
49
 
46
50
  # TESTS
47
51
 
48
- def test_global_collection_empty
49
- globals = FabricpathGlobal.globals
50
- assert_equal(true, globals.empty?,
51
- 'Globals should be empty for this test')
52
- end
52
+ def test_create_destroy
53
+ assert_empty(FabricpathGlobal.globals)
53
54
 
54
- def test_global_create
55
- @global = FabricpathGlobal.new('default')
56
- assert_equal(true, @global.name == 'default',
57
- "Global name not set correctly #{@global.name}")
58
- assert_equal(:enabled, FabricpathGlobal.fabricpath_feature,
59
- 'Fabricpath feature should have been enabled')
60
- refute(FabricpathGlobal.globals.empty?,
61
- 'Globals should not be empty after create')
62
- end
55
+ # create
56
+ fg = FabricpathGlobal.new('default')
57
+ assert_equal('default', fg.name)
58
+ assert_equal(:enabled, FabricpathGlobal.fabricpath_feature)
59
+ refute_empty(FabricpathGlobal.globals)
63
60
 
64
- def test_global_destroy
65
- # create and test again
66
- test_global_create
67
- @global.destroy
68
- # now it should be wiped out
69
- test_global_collection_empty
61
+ # destroy
62
+ fg.destroy
63
+ assert_empty(FabricpathGlobal.globals)
70
64
  end
71
65
 
72
66
  def test_aggregate_multicast_routes
73
- return if n5k6k_platforms?
74
- @global = FabricpathGlobal.new('default')
75
- @global.aggregate_multicast_routes = true
76
- assert(@global.aggregate_multicast_routes,
77
- 'Aggregate multicast routes not set')
78
- @global.aggregate_multicast_routes = false
79
- refute(@global.aggregate_multicast_routes,
80
- 'Aggregate multicast routes not reset')
67
+ fg = FabricpathGlobal.new('default')
68
+ if validate_property_excluded?('fabricpath', 'aggregate_multicast_routes')
69
+ assert_raises(Cisco::UnsupportedError) do
70
+ fg.aggregate_multicast_routes = true
71
+ end
72
+ return
73
+ end
74
+
75
+ fg = FabricpathGlobal.new('default')
76
+ fg.aggregate_multicast_routes = true
77
+ assert(fg.aggregate_multicast_routes,
78
+ 'aggregate_multicast_routes: Expected: true')
79
+
80
+ fg.aggregate_multicast_routes = false
81
+ refute(fg.aggregate_multicast_routes,
82
+ 'aggregate_multicast_routes: Expected: false')
81
83
  end
82
84
 
83
85
  def test_allocate_delay
84
- @global = FabricpathGlobal.new('default')
85
- # test default value
86
- assert_equal(@global.default_allocate_delay,
87
- @global.allocate_delay,
88
- 'Default allocate_delay not set correctly')
89
- @global.allocate_delay = 20
90
- assert_equal(20, @global.allocate_delay,
91
- 'allocate_delay not set to 20')
86
+ fg = FabricpathGlobal.new('default')
87
+ assert_equal(fg.default_allocate_delay, fg.allocate_delay)
88
+
89
+ fg.allocate_delay = 20
90
+ assert_equal(20, fg.allocate_delay)
92
91
  end
93
92
 
94
93
  def test_graceful_merge
95
- @global = FabricpathGlobal.new('default')
96
- # test default value
97
- assert_equal(:enable, @global.graceful_merge,
98
- 'Default graceful_merge not set correctly')
99
- @global.graceful_merge = :disable
100
- assert_equal(:disable, @global.graceful_merge,
101
- 'graceful merge not set to disable')
94
+ fg = FabricpathGlobal.new('default')
95
+ assert_equal(fg.default_graceful_merge, fg.graceful_merge)
96
+
97
+ fg.graceful_merge = :disable
98
+ assert_equal(:disable, fg.graceful_merge)
102
99
  end
103
100
 
104
101
  def test_linkup_delay_all
105
- @global = FabricpathGlobal.new('default')
106
- # test default value
107
- assert_equal(@global.default_linkup_delay,
108
- @global.linkup_delay,
109
- 'Default linkup_delay not set correctly')
110
- @global.linkup_delay = 25
111
- assert_equal(25, @global.linkup_delay,
112
- 'linkup_delay not set to 25')
113
-
114
- return if n5k6k_platforms?
115
-
116
- refute(@global.linkup_delay_always,
117
- 'linkup_delay_always should not be set by default')
118
- @global.linkup_delay_always = true
119
- assert(@global.linkup_delay_always,
120
- 'linkup_delay_always is not getting set')
121
-
122
- @global.linkup_delay_enable = true
123
- @global.linkup_delay_enable = false
124
- refute(@global.linkup_delay_enable,
125
- 'linkup_delay is not getting disabled')
102
+ fg = FabricpathGlobal.new('default')
103
+ assert_equal(fg.default_linkup_delay, fg.linkup_delay)
104
+
105
+ fg.linkup_delay = 25
106
+ assert_equal(25, fg.linkup_delay)
107
+
108
+ if validate_property_excluded?('fabricpath', 'linkup_delay_always')
109
+ assert_raises(Cisco::UnsupportedError) { fg.linkup_delay_always = true }
110
+ else
111
+ assert_equal(fg.default_linkup_delay_always, fg.linkup_delay_always)
112
+ fg.linkup_delay_always = true
113
+ assert(fg.linkup_delay_always, 'linkup_delay_always: Expected: true')
114
+ fg.linkup_delay_always = false
115
+ refute(fg.linkup_delay_always, 'linkup_delay_always: Expected: false')
116
+ end
117
+
118
+ if validate_property_excluded?('fabricpath', 'linkup_delay_enable')
119
+ assert_raises(Cisco::UnsupportedError) { fg.linkup_delay_enable = true }
120
+ return
121
+ end
122
+
123
+ assert_equal(fg.default_linkup_delay_enable, fg.linkup_delay_enable)
124
+ fg.linkup_delay_enable = true
125
+ assert(fg.linkup_delay_enable, 'linkup_delay_enable: Expected: true')
126
+ fg.linkup_delay_enable = false
127
+ refute(fg.linkup_delay_enable, 'linkup_delay_enable: Expected: false')
126
128
  end
127
129
 
128
130
  def test_loadbalance_algorithm
129
- @global = FabricpathGlobal.new('default')
130
- # test default value
131
- check_val = n5k6k_platforms? ? 'source-destination' : 'symmetric'
132
- assert_equal(check_val, @global.loadbalance_algorithm,
133
- "default algo should be #{check_val} but is
134
- #{@global.loadbalance_algorithm}")
135
- @global.loadbalance_algorithm = 'source'
136
- assert_equal('source', @global.loadbalance_algorithm,
137
- 'algo not getting set to source-destination')
131
+ fg = FabricpathGlobal.new('default')
132
+ assert_equal(fg.default_loadbalance_algorithm, fg.loadbalance_algorithm)
133
+
134
+ fg.loadbalance_algorithm = 'source'
135
+ assert_equal('source', fg.loadbalance_algorithm)
136
+ if validate_property_excluded?('fabricpath',
137
+ 'loadbalance_algorithm_symmetric_support')
138
+ assert_nil(fg.loadbalance_algorithm_symmetric_support)
139
+ return
140
+ end
141
+ fg.loadbalance_algorithm = 'symmetric'
142
+ assert_equal('symmetric', fg.loadbalance_algorithm)
138
143
  end
139
144
 
140
145
  def test_loadbalance_multicast
141
- return if n5k6k_platforms?
142
- @global = FabricpathGlobal.new('default')
143
- # test default values first
144
- assert_equal(@global.default_loadbalance_multicast_rotate,
145
- @global.loadbalance_multicast_rotate,
146
- "default mcast rotate should be 6
147
- but is #{@global.loadbalance_multicast_rotate}")
148
- assert(@global.loadbalance_multicast_has_vlan,
149
- "default mcast include-vlan should be true
150
- but is #{@global.loadbalance_multicast_has_vlan}")
151
- @global.send(:loadbalance_multicast=, 3, false)
152
- assert_equal(3, @global.loadbalance_multicast_rotate,
153
- "mcast rotate should now be 3
154
- but is #{@global.loadbalance_multicast_rotate}")
155
- refute(@global.loadbalance_multicast_has_vlan,
156
- "mcast include-vlan should now be false
157
- but is #{@global.loadbalance_multicast_has_vlan}")
146
+ # loadbalance_multicast= is a custom setter that takes 2 args:
147
+ # rotate, has_vlan
148
+ fg = FabricpathGlobal.new('default')
149
+ if validate_property_excluded?('fabricpath',
150
+ 'loadbalance_multicast_set')
151
+ assert_raises(Cisco::UnsupportedError) do
152
+ (fg.send(:loadbalance_multicast=, 0, 0))
153
+ end
154
+ return
155
+ end
156
+
157
+ # default_loadbalance_multicast_rotate: n/a
158
+ assert(fg.loadbalance_multicast_has_vlan,
159
+ 'loadbalance_multicast_has_vlan: Expected: true')
160
+
161
+ fg.send(:loadbalance_multicast=, 3, false)
162
+ assert_equal(3, fg.loadbalance_multicast_rotate)
163
+ refute(fg.loadbalance_multicast_has_vlan,
164
+ 'loadbalance_multicast_has_vlan: Expected: false')
158
165
  end
159
166
 
160
167
  def test_loadbalance_unicast
161
- @global = FabricpathGlobal.new('default')
162
- # test default values first
163
- assert_equal(@global.default_loadbalance_unicast_layer,
164
- @global.loadbalance_unicast_layer,
165
- "default unicast layer should be mixed
166
- but is #{@global.loadbalance_unicast_layer}")
167
- assert_equal(@global.default_loadbalance_unicast_rotate,
168
- @global.loadbalance_unicast_rotate,
169
- "default unicast rotate not set correctly
170
- but is set to #{@global.loadbalance_unicast_rotate}") unless
171
- n5k6k_platforms?
172
- assert(@global.loadbalance_unicast_has_vlan,
173
- "default unicast include-vlan should be true
174
- but is #{@global.loadbalance_unicast_has_vlan}")
175
- @global.send(:loadbalance_unicast=, 'layer4', 3, false)
176
- assert_equal('layer4', @global.loadbalance_unicast_layer,
177
- "unicast layer should be layer4
178
- but is #{@global.loadbalance_unicast_layer}")
179
- assert_equal(3, @global.loadbalance_unicast_rotate,
180
- "unicast rotate should now be 3
181
- but is #{@global.loadbalance_unicast_rotate}") unless
182
- n5k6k_platforms?
183
- refute(@global.loadbalance_unicast_has_vlan,
184
- "unicast include-vlan should now be false
185
- but is #{@global.loadbalance_unicast_has_vlan}")
168
+ # loadbalance_unicast= is a custom setter that takes up to 3 args:
169
+ # layer, rotate, has_vlan (rotate is not supported on some plats)
170
+
171
+ fg = FabricpathGlobal.new('default')
172
+ assert_equal(fg.default_loadbalance_unicast_layer,
173
+ fg.loadbalance_unicast_layer)
174
+
175
+ # default_loadbalance_unicast_rotate: n/a
176
+ assert_equal(fg.default_loadbalance_unicast_has_vlan,
177
+ fg.loadbalance_unicast_has_vlan)
178
+
179
+ fg.send(:loadbalance_unicast=, 'layer4', 3, false)
180
+ assert_equal('layer4', fg.loadbalance_unicast_layer)
181
+ unless validate_property_excluded?('fabricpath',
182
+ 'loadbalance_unicast_rotate')
183
+ assert_equal(3, fg.loadbalance_unicast_rotate)
184
+ end
185
+ refute(fg.loadbalance_unicast_has_vlan,
186
+ 'loadbalance_unicast_has_vlan: Expected: false')
186
187
  end
187
188
 
188
189
  def test_mode
189
- @global = FabricpathGlobal.new('default')
190
- # test default value
191
- assert_equal(@global.default_mode, @global.mode,
192
- "default mode should be normal but is #{@global.mode}")
193
- @global.mode = 'transit'
194
- assert_equal('transit', @global.mode,
195
- 'mode not getting set to transit')
196
- @global.mode = 'normal'
197
- assert_equal('normal', @global.mode,
198
- 'mode not getting set to transit')
190
+ fg = FabricpathGlobal.new('default')
191
+ assert_equal(fg.default_mode, fg.mode)
192
+
193
+ fg.mode = 'transit'
194
+ assert_equal('transit', fg.mode)
195
+ fg.mode = 'normal'
196
+ assert_equal('normal', fg.mode)
199
197
  end
200
198
 
201
199
  def test_switch_id
202
- @global = FabricpathGlobal.new('default')
203
- # auto_id = @global.switch_id
204
- @global.switch_id = 100
205
- assert_equal(100, @global.switch_id,
206
- 'switchid not getting set to 100')
200
+ fg = FabricpathGlobal.new('default')
201
+ # auto_id = fg.switch_id
202
+ # switch_id does not have a default
203
+ fg.switch_id = 100
204
+ assert_equal(100, fg.switch_id)
207
205
  end
208
206
 
209
207
  def test_transition_delay
210
- @global = FabricpathGlobal.new('default')
211
- # test default value
212
- assert_equal(@global.default_transition_delay,
213
- @global.transition_delay,
214
- 'Default allocate_delay not set correctly')
215
- @global.transition_delay = 20
216
- assert_equal(20, @global.transition_delay,
217
- 'transition_delay not set to 20')
208
+ fg = FabricpathGlobal.new('default')
209
+ assert_equal(fg.default_transition_delay, fg.transition_delay)
210
+
211
+ fg.transition_delay = 20
212
+ assert_equal(20, fg.transition_delay)
218
213
  end
219
214
 
220
215
  def test_ttl_multicast
221
- return if n5k6k_platforms?
222
- @global = FabricpathGlobal.new('default')
223
- # test default value
224
- assert_equal(@global.default_ttl_multicast,
225
- @global.ttl_multicast,
226
- 'Default multicast ttl not set correctly')
227
- @global.ttl_multicast = 16
228
- assert_equal(16, @global.ttl_multicast,
229
- 'multicast ttl not getting set to 16')
216
+ fg = FabricpathGlobal.new('default')
217
+ if validate_property_excluded?('fabricpath', 'ttl_multicast')
218
+ assert_raises(Cisco::UnsupportedError) { fg.ttl_multicast = 40 }
219
+ return
220
+ end
221
+
222
+ assert_equal(fg.default_ttl_multicast, fg.ttl_multicast)
223
+ fg.ttl_multicast = 16
224
+ assert_equal(16, fg.ttl_multicast)
230
225
  end
231
226
 
232
227
  def test_ttl_unicast
233
- return if n5k6k_platforms?
234
- @global = FabricpathGlobal.new('default')
235
- # test default value
236
- assert_equal(@global.default_ttl_unicast,
237
- @global.ttl_unicast,
238
- 'Default unicast ttl not set correctly')
239
- @global.ttl_unicast = 40
240
- assert_equal(40, @global.ttl_unicast,
241
- 'unicast ttl not getting set to 40')
228
+ fg = FabricpathGlobal.new('default')
229
+ if validate_property_excluded?('fabricpath', 'ttl_unicast')
230
+ assert_raises(Cisco::UnsupportedError) { fg.ttl_unicast = 40 }
231
+ return
232
+ end
233
+ assert_equal(fg.default_ttl_unicast, fg.ttl_unicast)
234
+ fg.ttl_unicast = 40
235
+ assert_equal(40, fg.ttl_unicast)
236
+ end
237
+
238
+ def test_interface_switchport_mode
239
+ i = Interface.new(interfaces[0])
240
+ i.switchport_mode = :fabricpath
241
+ assert_equal(:fabricpath, i.switchport_mode)
242
+
243
+ i.switchport_mode = :trunk
244
+ assert_equal(:trunk, i.switchport_mode)
245
+ config("default interface #{interfaces[0]}")
242
246
  end
243
247
  end