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
data/tests/test_vtp.rb CHANGED
@@ -17,20 +17,16 @@ require_relative '../lib/cisco_node_utils/vtp'
17
17
 
18
18
  # TestVtp - Minitest for Vtp node utility class
19
19
  class TestVtp < CiscoTestCase
20
+ @skip_unless_supported = 'vtp'
21
+
20
22
  def setup
21
23
  super
22
- no_feature_vtp
24
+ config('no feature vtp')
23
25
  end
24
26
 
25
27
  def teardown
26
- no_feature_vtp
27
- super
28
- end
29
-
30
- def no_feature_vtp
31
- # VTP will raise an error if the domain is configured twice so we need to
32
- # turn the feature off for a clean test.
33
28
  config('no feature vtp')
29
+ super
34
30
  end
35
31
 
36
32
  def vtp_domain(domain)
@@ -39,19 +35,19 @@ class TestVtp < CiscoTestCase
39
35
  vtp
40
36
  end
41
37
 
42
- def test_vtp_disabled
38
+ def test_disabled
43
39
  vtp = Vtp.new(false)
44
40
  assert_empty(vtp.domain)
45
41
  assert_equal(vtp.default_password, vtp.password)
46
42
  assert_equal(vtp.default_filename, vtp.filename)
47
43
  assert_equal(vtp.default_version, vtp.version)
48
- refute(Vtp.enabled, 'VTP feature was unexpectedly enabled?')
44
+ refute(Feature.vtp_enabled?, 'VTP feature was unexpectedly enabled?')
49
45
  end
50
46
 
51
- def test_vtp_enabled_but_no_domain
47
+ def test_enabled_but_no_domain
52
48
  vtp = Vtp.new(false)
53
49
  config('feature vtp')
54
- assert(Vtp.enabled)
50
+ assert(Feature.vtp_enabled?)
55
51
  assert_empty(vtp.domain)
56
52
  assert_equal(vtp.default_password, vtp.password)
57
53
  assert_equal(vtp.default_filename, vtp.filename)
@@ -62,12 +58,12 @@ class TestVtp < CiscoTestCase
62
58
  vtp.version = 1
63
59
  assert_equal(1, vtp.version)
64
60
  # Can't set any of the below without setting a domain first
65
- assert_raises(RuntimeError) do
61
+ assert_raises(CliError) do
66
62
  vtp.password = 'hello'
67
63
  end
68
64
  end
69
65
 
70
- def test_vtp_domain_enable_disable
66
+ def test_domain_enable_disable
71
67
  assert_empty(Vtp.domain)
72
68
  vtp = vtp_domain('enable')
73
69
  assert_equal('enable', Vtp.domain)
@@ -75,57 +71,41 @@ class TestVtp < CiscoTestCase
75
71
  assert_empty(Vtp.domain)
76
72
  end
77
73
 
78
- def test_vtp_create_valid
79
- vtp_domain('accounting')
80
- s = @device.cmd("show run vtp | incl '^vtp domain'")
81
- assert_match(/^vtp domain accounting/, s,
82
- 'Error: failed to create vtp domain')
74
+ def test_create_valid
75
+ vtp = vtp_domain('accounting')
76
+ assert_equal('accounting', vtp.domain)
83
77
  end
84
78
 
85
- def test_vtp_domain_name_change
79
+ def test_domain_name_change
86
80
  vtp = vtp_domain('accounting')
87
81
  vtp_domain('uplink')
88
82
  assert_equal('uplink', vtp.domain,
89
83
  'Error: vtp domain name incorrect')
90
84
  end
91
85
 
92
- def test_vtp_create_preconfig_no_change
93
- config('feature vtp', 'vtp domain accounting')
86
+ def test_negative
87
+ assert_raises(ArgumentError) { vtp_domain(nil) }
88
+ assert_raises(ArgumentError) { vtp_domain('') }
94
89
 
90
+ # Create the same domain twice
95
91
  vtp = vtp_domain('accounting')
96
- assert_equal('accounting', vtp.domain,
97
- 'Error: vtp domain wrong')
98
- end
92
+ assert_raises(Cisco::CliError) { vtp_domain('accounting') }
99
93
 
100
- def test_vtp_create_double
101
- vtp = vtp_domain('accounting')
102
- vtp_new = vtp_domain('accounting')
94
+ # Set password to nil
95
+ assert_raises(TypeError) { vtp.password = nil }
103
96
 
104
- assert_equal('accounting', vtp.domain,
105
- 'Error: vtp domain wrong')
106
- assert_equal('accounting', vtp_new.domain,
107
- 'Error: vtp_new domain wrong')
108
- end
109
-
110
- def test_vtp_create_domain_invalid
111
- assert_raises(ArgumentError) do
112
- vtp_domain(node)
113
- end
114
- end
97
+ # Password too long
98
+ password = 'a' * (Vtp::MAX_VTP_PASSWORD_SIZE + 1)
99
+ assert_raises(ArgumentError) { vtp.password = password }
115
100
 
116
- def test_vtp_create_domain_nil
117
- assert_raises(ArgumentError) do
118
- vtp_domain(nil)
119
- end
120
- end
101
+ # Set filename to nil
102
+ assert_raises(TypeError) { vtp.filename = nil }
121
103
 
122
- def test_vtp_create_domain_empty
123
- assert_raises(ArgumentError) do
124
- vtp_domain('')
125
- end
104
+ # Invalid version
105
+ assert_raises(Cisco::CliError) { vtp.version = 34 }
126
106
  end
127
107
 
128
- def test_vtp_assignment
108
+ def test_assignment
129
109
  vtp = vtp_domain('accounting')
130
110
  vtp.password = 'copy_test'
131
111
  assert_equal('copy_test', vtp.password,
@@ -135,20 +115,13 @@ class TestVtp < CiscoTestCase
135
115
  'Error: vtp password not set')
136
116
  end
137
117
 
138
- def test_vtp_domain_get
118
+ def test_domain_get
139
119
  vtp = vtp_domain('accounting')
140
120
  assert_equal('accounting', vtp.domain,
141
121
  'Error: vtp domain incorrect')
142
122
  end
143
123
 
144
- def test_vtp_password_nil
145
- vtp = vtp_domain('accounting')
146
- assert_raises(TypeError) do
147
- vtp.password = nil
148
- end
149
- end
150
-
151
- def test_vtp_password_default
124
+ def test_password_default
152
125
  vtp = vtp_domain('accounting')
153
126
  vtp.password = 'test_me'
154
127
  assert_equal('test_me', vtp.password,
@@ -159,14 +132,14 @@ class TestVtp < CiscoTestCase
159
132
  'Error: vtp password not correct')
160
133
  end
161
134
 
162
- def test_vtp_password_zero_length
135
+ def test_password_zero_length
163
136
  vtp = vtp_domain('accounting')
164
137
  vtp.password = ''
165
138
  assert_equal('', vtp.password,
166
139
  'Error: vtp password not empty')
167
140
  end
168
141
 
169
- def test_vtp_password_get
142
+ def test_password_get
170
143
  vtp = vtp_domain('accounting')
171
144
 
172
145
  config('vtp password cisco123')
@@ -174,13 +147,13 @@ class TestVtp < CiscoTestCase
174
147
  'Error: vtp password not correct')
175
148
  end
176
149
 
177
- def test_vtp_password_get_not_set
150
+ def test_password_get_not_set
178
151
  vtp = vtp_domain('accounting')
179
152
  assert_equal('', vtp.password,
180
153
  'Error: vtp password not empty')
181
154
  end
182
155
 
183
- def test_vtp_password_clear
156
+ def test_password_clear
184
157
  vtp = vtp_domain('accounting')
185
158
  vtp.password = 'cisco123'
186
159
  assert_equal('cisco123', vtp.password,
@@ -191,7 +164,7 @@ class TestVtp < CiscoTestCase
191
164
  'Error: vtp default password not set')
192
165
  end
193
166
 
194
- def test_vtp_password_valid
167
+ def test_password_valid
195
168
  vtp = vtp_domain('accounting')
196
169
  alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789'
197
170
  password = ''
@@ -203,33 +176,20 @@ class TestVtp < CiscoTestCase
203
176
  end
204
177
  end
205
178
 
206
- def test_vtp_password_too_long
207
- vtp = vtp_domain('accounting')
208
- password = 'a' * (Vtp::MAX_VTP_PASSWORD_SIZE + 1)
209
- assert_raises(ArgumentError) { vtp.password = password }
210
- end
211
-
212
- def test_vtp_password_special_characters
179
+ def test_password_special_characters
213
180
  vtp = vtp_domain('password')
214
181
  vtp.password = 'hello!//\\#%$x'
215
182
  assert_equal('hello!//\\#%$x', vtp.password)
216
183
  end
217
184
 
218
- def test_vtp_filename_nil
219
- vtp = vtp_domain('accounting')
220
- assert_raises(TypeError) do
221
- vtp.filename = nil
222
- end
223
- end
224
-
225
- def test_vtp_filename_valid
185
+ def test_filename_valid
226
186
  vtp = vtp_domain('accounting')
227
187
  vtp.filename = 'bootflash:/test.dat'
228
188
  assert_equal('bootflash:/test.dat', vtp.filename,
229
189
  'Error: vtp file content wrong')
230
190
  end
231
191
 
232
- def test_vtp_filename_zero_length
192
+ def test_filename_zero_length
233
193
  vtp = vtp_domain('accounting')
234
194
  vtp.filename = vtp.default_filename
235
195
  assert_equal(node.config_get_default('vtp', 'filename'), vtp.filename,
@@ -242,30 +202,33 @@ class TestVtp < CiscoTestCase
242
202
  'Error: vtp file content wrong')
243
203
  end
244
204
 
245
- def test_vtp_filename_auto_enable
205
+ def test_filename_auto_enable
246
206
  vtp = Vtp.new(false)
247
- refute(Vtp.enabled, 'VTP should not be enabled')
207
+ refute(Feature.vtp_enabled?, 'VTP should not be enabled')
248
208
  vtp.filename = 'bootflash:/foo.bar'
249
- assert(Vtp.enabled)
209
+ assert(Feature.vtp_enabled?)
250
210
  assert_equal('bootflash:/foo.bar', vtp.filename)
251
211
  end
252
212
 
253
- def test_vtp_version_valid
213
+ def test_version_valid
254
214
  vtp = vtp_domain('accounting')
255
215
  vtp.version = vtp.default_version
256
216
  assert_equal(node.config_get_default('vtp', 'version'), vtp.version,
257
217
  'Error: vtp version not default')
258
218
  end
259
219
 
260
- def test_vtp_version3_valid
220
+ def test_version3_valid
261
221
  vtp = vtp_domain('accounting')
262
222
 
263
223
  ref = cmd_ref.lookup('vtp', 'version')
264
224
  assert(ref, 'Error, reference not found for vtp version3')
265
225
 
266
- assert_result(ref.test_config_result(3), 'Error: vtp version3 error') do
226
+ case node.product_id
227
+ when /N(5|6|7)K/
267
228
  vtp.version = 3
268
- vtp.version
229
+ assert_equal(vtp.version, 3)
230
+ else
231
+ assert_raises(Cisco::CliError) { vtp.version = 3 }
269
232
  end
270
233
  end
271
234
 
@@ -282,14 +245,7 @@ class TestVtp < CiscoTestCase
282
245
  end
283
246
  end
284
247
 
285
- def test_vtp_version_invalid
286
- vtp = vtp_domain('accounting')
287
- assert_raises(Cisco::CliError) do
288
- vtp.version = 34
289
- end
290
- end
291
-
292
- def test_vtp_version_default
248
+ def test_version_default
293
249
  vtp = vtp_domain('accounting')
294
250
  vtp.version = 2
295
251
  assert_equal(2, vtp.version,
@@ -299,19 +255,19 @@ class TestVtp < CiscoTestCase
299
255
  'Error: vtp version not default')
300
256
  end
301
257
 
302
- def test_vtp_version_auto_enable
258
+ def test_version_auto_enable
303
259
  vtp = Vtp.new(false)
304
- refute(Vtp.enabled, 'VTP should not be enabled')
260
+ refute(Feature.vtp_enabled?, 'VTP should not be enabled')
305
261
  vtp.version = 1
306
- assert(Vtp.enabled)
262
+ assert(Feature.vtp_enabled?)
307
263
  assert_equal(1, vtp.version)
308
264
  end
309
265
 
310
- def test_vtp_feature_enable_disable
311
- Vtp.new.enable
312
- assert(Vtp.enabled, 'Error: vtp is not enabled')
266
+ def test_feature_enable_disable
267
+ Feature.vtp_enable
268
+ assert(Feature.vtp_enabled?, 'Error: vtp is not enabled')
313
269
 
314
- Vtp.new.destroy
315
- refute(Vtp.enabled, 'Error: vtp is not disabled')
270
+ Feature.vtp_disable
271
+ refute(Feature.vtp_enabled?, 'Error: vtp is not disabled')
316
272
  end
317
273
  end
@@ -19,8 +19,10 @@ require_relative '../lib/cisco_node_utils/vdc'
19
19
 
20
20
  include Cisco
21
21
 
22
- # TestVxlanGlobal - Minitest for VxlanGlobal node utility
22
+ # TestVxlanVtep - Minitest for VxlanVtep node utility
23
23
  class TestVxlanVtep < CiscoTestCase
24
+ @skip_unless_supported = 'vxlan_vtep'
25
+
24
26
  def setup
25
27
  super
26
28
  skip('Platform does not support MT-full or MT-lite') unless
@@ -28,37 +30,26 @@ class TestVxlanVtep < CiscoTestCase
28
30
  end
29
31
 
30
32
  def teardown
33
+ Feature.nv_overlay_disable
31
34
  return unless Vdc.vdc_support
32
35
  # Reset the vdc module type back to default
33
36
  v = Vdc.new('default')
34
37
  v.limit_resource_module_type = '' if v.limit_resource_module_type == 'f3'
35
38
  end
36
39
 
37
- def compatible_interface?
38
- # MT-full tests require a specific linecard; either because they need a
39
- # compatible interface or simply to enable the features. Either way
40
- # we will provide an appropriate interface name if the linecard is present.
41
- # Example 'show mod' output to match against:
42
- # '9 12 10/40 Gbps Ethernet Module N7K-F312FQ-25 ok'
43
- sh_mod = @device.cmd("sh mod | i '^[0-9]+.*N7K-F3'")[/^(\d+)\s.*N7K-F3/]
44
- slot = sh_mod.nil? ? nil : Regexp.last_match[1]
45
- skip('Unable to find a compatible interface in chassis') if slot.nil?
46
-
47
- "ethernet#{slot}/1"
48
- end
49
-
50
40
  def mt_full_env_setup
51
41
  skip('Platform does not support MT-full') unless VxlanVtep.mt_full_support
52
- compatible_interface?
42
+ vxlan_linecard?
53
43
  v = Vdc.new('default')
54
44
  v.limit_resource_module_type = 'f3' unless
55
45
  v.limit_resource_module_type == 'f3'
56
- config('no feature nv overlay')
46
+ Feature.nv_overlay_disable
57
47
  end
58
48
 
59
49
  def mt_lite_env_setup
60
50
  skip('Platform does not support MT-lite') unless VxlanVtep.mt_lite_support
61
- config('no feature nv overlay')
51
+ vxlan_linecard?
52
+ Feature.nv_overlay_disable
62
53
  config('no feature vn-segment-vlan-based')
63
54
  end
64
55
 
@@ -211,4 +202,34 @@ class TestVxlanVtep < CiscoTestCase
211
202
  vtep.source_interface = val
212
203
  assert_equal(val, vtep.source_interface)
213
204
  end
205
+
206
+ def test_source_interface_hold_down_time
207
+ mt_full_env_setup if VxlanVtep.mt_full_support
208
+ mt_lite_env_setup if VxlanVtep.mt_lite_support
209
+
210
+ vtep = VxlanVtep.new('nve1')
211
+ if validate_property_excluded?('vxlan_vtep', 'source_intf_hold_down_time')
212
+ assert_nil(vtep.source_interface_hold_down_time)
213
+ assert_nil(vtep.default_source_interface_hold_down_time)
214
+ assert_raises(Cisco::UnsupportedError) do
215
+ vtep.source_interface_hold_down_time = 50
216
+ end
217
+ return
218
+ end
219
+
220
+ # Set source_interface to non-default value
221
+ val = 'loopback55'
222
+ vtep.source_interface = val
223
+ assert_equal(val, vtep.source_interface)
224
+
225
+ # Set source_interface_hold_down_time
226
+ time = 50
227
+ vtep.source_interface_hold_down_time = time
228
+ assert_equal(time, vtep.source_interface_hold_down_time)
229
+
230
+ # Set source_interface_hold_down_time to default value
231
+ val = vtep.default_source_interface_hold_down_time
232
+ vtep.source_interface_hold_down_time = val
233
+ assert_equal(val, vtep.source_interface_hold_down_time)
234
+ end
214
235
  end
@@ -18,17 +18,35 @@ require_relative '../lib/cisco_node_utils/vxlan_vtep_vni'
18
18
 
19
19
  include Cisco
20
20
 
21
- # TestVxlanGlobal - Minitest for VxlanGlobal node utility
21
+ # TestVxlanVtepVni - Minitest for VxlanVtepVni node utility
22
22
  class TestVxlanVtepVni < CiscoTestCase
23
+ @skip_unless_supported = 'vxlan_vtep_vni'
24
+ @@pre_clean_needed = true # rubocop:disable Style/ClassVars
25
+
23
26
  def setup
24
27
  super
25
- config('no feature nv overlay')
26
- config('feature nv overlay')
27
- config('interface nve1')
28
+ return unless @@pre_clean_needed
29
+ # Disable features on initial cleanup only as it's too expensive
30
+ # to do a disable for every testcase.
31
+ Feature.nv_overlay_disable
32
+ # nv overlay is slow on some platforms
33
+ sleep 1
34
+ vxlan_linecard?
35
+ if VxlanVtep.mt_full_support
36
+ return unless Vdc.vdc_support
37
+ v = Vdc.new('default')
38
+ v.limit_resource_module_type = 'f3' unless
39
+ v.limit_resource_module_type == 'f3'
40
+ else
41
+ config_no_warn('no feature vn-segment-vlan-based')
42
+ end
43
+ Feature.nv_overlay_enable
44
+ config_no_warn('feature vn-segment-vlan-based') if VxlanVtep.mt_lite_support
45
+ @@pre_clean_needed = false # rubocop:disable Style/ClassVars
28
46
  end
29
47
 
30
48
  def teardown
31
- config('no feature nv overlay')
49
+ config_no_warn('no interface nve1')
32
50
  super
33
51
  end
34
52
 
@@ -49,6 +67,7 @@ class TestVxlanVtepVni < CiscoTestCase
49
67
  end
50
68
 
51
69
  def test_vnis
70
+ VxlanVtep.new('nve1')
52
71
  skip('Platform does not support vnis') if VxlanVtepVni.vnis['nve1'].nil?
53
72
 
54
73
  # Test empty case
@@ -92,6 +111,10 @@ class TestVxlanVtepVni < CiscoTestCase
92
111
 
93
112
  def test_ingress_replication
94
113
  vni = VxlanVtepVni.new('nve1', '5000')
114
+ if validate_property_excluded?('vxlan_vtep_vni', 'ingress_replication')
115
+ assert_raises(Cisco::UnsupportedError) { vni.ingress_replication = 'bgp' }
116
+ return
117
+ end
95
118
 
96
119
  # Test non-default values
97
120
  vni.ingress_replication = 'static'
@@ -127,11 +150,13 @@ class TestVxlanVtepVni < CiscoTestCase
127
150
 
128
151
  # Test the case where an existing ingress_replication is removed before
129
152
  # configuring multicast_group
130
- vni1.ingress_replication = 'static'
131
- assert_equal('static', vni1.ingress_replication)
153
+ unless validate_property_excluded?('vxlan_vtep_vni', 'ingress_replication')
154
+ vni1.ingress_replication = 'static'
155
+ assert_equal('static', vni1.ingress_replication)
132
156
 
133
- vni1.multicast_group = '224.1.1.1'
134
- assert_equal('224.1.1.1', vni1.multicast_group)
157
+ vni1.multicast_group = '224.1.1.1'
158
+ assert_equal('224.1.1.1', vni1.multicast_group)
159
+ end
135
160
 
136
161
  # Test multicast group range
137
162
  vni2.multicast_group = '224.1.1.1 224.1.1.200'
@@ -146,6 +171,10 @@ class TestVxlanVtepVni < CiscoTestCase
146
171
 
147
172
  def test_peer_list
148
173
  vni = VxlanVtepVni.new('nve1', '6000')
174
+ if validate_property_excluded?('vxlan_vtep_vni', 'ingress_replication')
175
+ assert_raises(Cisco::UnsupportedError) { vni.peer_list = ['1.1.1.1'] }
176
+ return
177
+ end
149
178
 
150
179
  peer_list = ['1.1.1.1', '2.2.2.2', '3.3.3.3', '4.4.4.4']
151
180
 
@@ -180,6 +209,7 @@ class TestVxlanVtepVni < CiscoTestCase
180
209
 
181
210
  def test_suppress_arp
182
211
  vni = VxlanVtepVni.new('nve1', '6000')
212
+ VxlanVtep.new('nve1').host_reachability = 'evpn'
183
213
 
184
214
  # Test: Check suppress_arp is not configured.
185
215
  refute(vni.suppress_arp, 'suppress_arp should be disabled')
@@ -198,4 +228,26 @@ class TestVxlanVtepVni < CiscoTestCase
198
228
  vni.suppress_arp = vni.default_suppress_arp
199
229
  refute(vni.suppress_arp, 'suppress_arp should be disabled')
200
230
  end
231
+
232
+ def test_suppress_uuc
233
+ vni = VxlanVtepVni.new('nve1', '6000')
234
+ VxlanVtep.new('nve1').host_reachability = 'evpn'
235
+ if validate_property_excluded?('vxlan_vtep_vni', 'suppress_uuc')
236
+ assert_nil(vni.suppress_uuc)
237
+ assert_nil(vni.default_suppress_uuc)
238
+ assert_raises(Cisco::UnsupportedError) { vni.suppress_uuc = true }
239
+ return
240
+ end
241
+
242
+ # Test: Check suppress_uuc is not configured.
243
+ refute(vni.suppress_uuc, 'suppress_uuc should be disabled')
244
+
245
+ # Test: Enable suppress_uuc
246
+ vni.suppress_uuc = true
247
+ assert(vni.suppress_uuc, 'suppress_uuc should be enabled')
248
+
249
+ # Test: Default
250
+ vni.suppress_uuc = vni.default_suppress_uuc
251
+ refute(vni.suppress_uuc, 'suppress_uuc should be disabled')
252
+ end
201
253
  end