cisco_node_utils 1.8.0 → 1.9.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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +43 -1
  3. data/README.md +4 -4
  4. data/docs/README-maintainers.md +1 -0
  5. data/lib/cisco_node_utils/bgp_neighbor.rb +20 -0
  6. data/lib/cisco_node_utils/bgp_neighbor_af.rb +20 -0
  7. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor.yaml +7 -0
  8. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor_af.yaml +7 -0
  9. data/lib/cisco_node_utils/cmd_ref/evpn_multicast.yaml +12 -0
  10. data/lib/cisco_node_utils/cmd_ref/evpn_multisite.yaml +18 -0
  11. data/lib/cisco_node_utils/cmd_ref/evpn_stormcontrol.yaml +18 -0
  12. data/lib/cisco_node_utils/cmd_ref/feature.yaml +7 -0
  13. data/lib/cisco_node_utils/cmd_ref/interface_evpn_multisite.yaml +17 -0
  14. data/lib/cisco_node_utils/cmd_ref/ip_multicast.yaml +18 -0
  15. data/lib/cisco_node_utils/cmd_ref/vrf_af.yaml +21 -0
  16. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep.yaml +6 -0
  17. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep_vni.yaml +7 -0
  18. data/lib/cisco_node_utils/evpn_multicast.rb +66 -0
  19. data/lib/cisco_node_utils/evpn_multisite.rb +96 -0
  20. data/lib/cisco_node_utils/evpn_stormcontrol.rb +84 -0
  21. data/lib/cisco_node_utils/feature.rb +19 -0
  22. data/lib/cisco_node_utils/interface.rb +2 -1
  23. data/lib/cisco_node_utils/interface_evpn_multisite.rb +63 -0
  24. data/lib/cisco_node_utils/ip_multicast.rb +86 -0
  25. data/lib/cisco_node_utils/version.rb +2 -2
  26. data/lib/cisco_node_utils/vrf_af.rb +56 -5
  27. data/lib/cisco_node_utils/vxlan_vtep.rb +24 -0
  28. data/lib/cisco_node_utils/vxlan_vtep_vni.rb +21 -0
  29. data/tests/ciscotest.rb +36 -3
  30. data/tests/tacacs_server.yaml.example +1 -1
  31. data/tests/test_bgp_af.rb +1 -1
  32. data/tests/test_bgp_neighbor.rb +15 -0
  33. data/tests/test_bgp_neighbor_af.rb +27 -0
  34. data/tests/test_evpn_multicast.rb +65 -0
  35. data/tests/test_evpn_multisite.rb +70 -0
  36. data/tests/test_evpn_stormcontrol.rb +56 -0
  37. data/tests/test_feature.rb +6 -1
  38. data/tests/test_interface_evpn_multisite.rb +59 -0
  39. data/tests/test_ip_multicast.rb +69 -0
  40. data/tests/test_node_ext.rb +3 -2
  41. data/tests/test_radius_global.rb +7 -5
  42. data/tests/test_router_ospf_vrf.rb +2 -0
  43. data/tests/test_stp_global.rb +7 -0
  44. data/tests/test_tacacs_global.rb +10 -7
  45. data/tests/test_vrf_af.rb +52 -1
  46. data/tests/test_vxlan_vtep.rb +23 -0
  47. data/tests/test_vxlan_vtep_vni.rb +31 -0
  48. data/tests/yum_package.yaml +10 -0
  49. metadata +18 -3
data/tests/ciscotest.rb CHANGED
@@ -83,9 +83,10 @@ class CiscoTestCase < TestCase
83
83
  @@node.cache_auto = true
84
84
  # Record the platform we're running on
85
85
  puts "\nNode under test:"
86
- puts " - name - #{@@node.host_name}"
87
- puts " - type - #{@@node.product_id}"
88
- puts " - image - #{@@node.system}\n\n"
86
+ puts " - name - #{@@node.host_name}"
87
+ puts " - type - #{@@node.product_id}"
88
+ puts " - image - #{@@node.system}"
89
+ puts " - version - #{@@node.os_version}\n\n"
89
90
  end
90
91
  @@node
91
92
  rescue Cisco::AuthenticationFailed
@@ -226,6 +227,38 @@ class CiscoTestCase < TestCase
226
227
  skip(msg) if Utils.image_version?(Regexp.new(pattern))
227
228
  end
228
229
 
230
+ def step_unless_legacy_defect(pattern, msg)
231
+ if pattern.is_a?(String)
232
+ pattern = [pattern]
233
+ elsif !pattern.is_a?(Array)
234
+ fail 'Argument: pattern must be a String or Array object'
235
+ end
236
+ pattern.each do |pat|
237
+ if Utils.image_version?(Regexp.new(pat))
238
+ puts "Skip Step: Defect in legacy image: [#{msg}]"
239
+ return false
240
+ end
241
+ end
242
+ end
243
+
244
+ def step_unless_version_unsupported(pattern)
245
+ if pattern.is_a?(String)
246
+ pattern = [pattern]
247
+ elsif !pattern.is_a?(Array)
248
+ fail 'Argument: pattern must be a String or Array object'
249
+ end
250
+ pattern.each do |pat|
251
+ if Utils.image_version?(Regexp.new(pat))
252
+ puts "Skip Step: Feature not supported in this image version: [#{Platform.image_version}]"
253
+ return false
254
+ end
255
+ end
256
+ end
257
+
258
+ def virtual_platform?
259
+ node.product_id[/N9K-NXOSV|N9K-9000v/] ? true : false
260
+ end
261
+
229
262
  def interfaces
230
263
  unless @@interfaces
231
264
  # Build the platform_info, used for interface lookup
@@ -1,6 +1,6 @@
1
1
  # Tacacs server configuration for test_aaa_authorization_service.rb
2
2
  # Tacacs server must be set up with external access for test to run
3
- host: '10.122.197.197'
3
+ host: '10.122.197.184'
4
4
  key: 'testing123'
5
5
  vrf: 'management'
6
6
  intf: 'mgmt0'
data/tests/test_bgp_af.rb CHANGED
@@ -170,7 +170,7 @@ class TestBgpAF < CiscoTestCase
170
170
  # triggers a version check below.
171
171
  if expect == :runtime
172
172
  case Platform.image_version
173
- when /8.0|8.1|8.2|F3.2/
173
+ when /8.0|8.1|8.2|8.3|F3.2/
174
174
  expect = :success
175
175
  expect = :runtime if test == :additional_paths_receive && Platform.image_version[/8.0|8.1/]
176
176
  when /I5.2|I5.3|I6/
@@ -578,4 +578,19 @@ class TestBgpNeighbor < CiscoTestCase
578
578
  neighbor.destroy
579
579
  end
580
580
  end
581
+
582
+ def test_peer_type
583
+ skip("#{node.product_id} doesn't support this feature") unless
584
+ node.product_id[/N9K.*EX/]
585
+ %w(default test_vrf).each do |vrf|
586
+ neighbor = RouterBgpNeighbor.new(ASN, vrf, ADDR)
587
+ check = ['fabric-border-leaf', 'fabric-external',
588
+ neighbor.default_peer_type]
589
+ check.each do |val|
590
+ neighbor.peer_type = val
591
+ assert_equal(val, neighbor.peer_type)
592
+ end
593
+ neighbor.destroy
594
+ end
595
+ end
581
596
  end
@@ -751,4 +751,31 @@ class TestBgpNeighborAF < CiscoTestCase
751
751
  assert_equal(af.default_weight, af.weight,
752
752
  "Test 3. #{dbg} Failed to remove weight")
753
753
  end
754
+
755
+ def test_rewrite_evpn_rt_asn
756
+ skip("#{node.product_id} doesn't support this feature") unless
757
+ node.product_id[/N9K.*EX/]
758
+ af_args = @@matrix[:evpn]
759
+ # clean_af needs true since rewrite_rt_asn is ebgp only
760
+ af, dbg = clean_af(af_args, true)
761
+ rewrite_evpn_rt_asn(af, dbg)
762
+ end
763
+
764
+ def rewrite_evpn_rt_asn(af, dbg)
765
+ # eBGP only
766
+ af.rewrite_evpn_rt_asn = true
767
+ assert(af.rewrite_evpn_rt_asn,
768
+ "Test 1. #{dbg} Did not set true")
769
+
770
+ af.rewrite_evpn_rt_asn = false
771
+ refute(af.rewrite_evpn_rt_asn,
772
+ "Test 2. #{dbg} Did not set false")
773
+
774
+ af.rewrite_evpn_rt_asn = true
775
+
776
+ def_val = af.default_rewrite_evpn_rt_asn
777
+ af.rewrite_evpn_rt_asn = def_val
778
+ assert_equal(def_val, af.rewrite_evpn_rt_asn,
779
+ "Test 3. #{dbg} Did not set to default")
780
+ end
754
781
  end
@@ -0,0 +1,65 @@
1
+ # Evpn Multicast Unit Tests
2
+ #
3
+ # Rahul Shenoy, January, 2018
4
+ #
5
+ # Copyright (c) 2018 Cisco and/or its affiliates.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require_relative 'ciscotest'
20
+ require_relative '../lib/cisco_node_utils/evpn_multicast'
21
+ require_relative '../lib/cisco_node_utils/feature'
22
+
23
+ # TestEvpnMulticast - Minitest for EvpnMulticast class
24
+ class TestEvpnMulticast < CiscoTestCase
25
+ @skip_unless_supported = 'evpn_multicast'
26
+
27
+ def setup
28
+ # Disable feature ngmvpn before each test to
29
+ # ensure we are starting with a clean slate for each test.
30
+ super
31
+ skip_incompat_version?('feature', 'ngmvpn')
32
+ config_no_warn('no feature ngmvpn')
33
+ config_no_warn('no advertise evpn multicast')
34
+ end
35
+
36
+ def teardown
37
+ # disable feature ngmvpn and advertise evpn multicast
38
+ # after each test
39
+ config_no_warn('no feature ngmvpn')
40
+ config_no_warn('no advertise evpn multicast')
41
+ super
42
+ end
43
+
44
+ def test_create_and_destroy
45
+ mc = EvpnMulticast.new
46
+ assert_equal('advertise evpn multicast', mc.multicast,
47
+ 'Error: failed to enable evpn multicast')
48
+ assert(Feature.ngmvpn_enabled?,
49
+ 'Error: failed to enable feature ngmvpn')
50
+ mc.destroy
51
+ assert_equal('', mc.multicast,
52
+ 'Error: failed to disable evpn multicast')
53
+ end
54
+
55
+ def test_multicast
56
+ mc = EvpnMulticast.new
57
+ mc.multicast = false
58
+ assert_equal('', mc.multicast,
59
+ 'Error: failed to disable evpn multicast')
60
+ mc.multicast = true
61
+ assert_equal('advertise evpn multicast', mc.multicast,
62
+ 'Error: failed to enable evpn multicast')
63
+ mc.destroy
64
+ end
65
+ end
@@ -0,0 +1,70 @@
1
+ # Evpn Multisite Unit Tests
2
+ #
3
+ # Rahul Shenoy, October, 2017
4
+ #
5
+ # Copyright (c) 2017 Cisco and/or its affiliates.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require_relative 'ciscotest'
20
+ require_relative '../lib/cisco_node_utils/evpn_multisite'
21
+
22
+ # TestEvpnMultisite - Minitest for EvpnMultisite class
23
+ class TestEvpnMultisite < CiscoTestCase
24
+ @skip_unless_supported = 'evpn_multisite'
25
+
26
+ def setup
27
+ # Disable feature nv overlay before each test to
28
+ # ensure we are starting with a clean slate for each test.
29
+ super
30
+ skip("#{node.product_id} doesn't support this feature") unless
31
+ node.product_id[/N9K.*EX/]
32
+ config('no feature nv overlay')
33
+ end
34
+
35
+ def test_create_and_destroy
36
+ ms = EvpnMultisite.new(100)
37
+ ms_id = ms.multisite
38
+ assert_equal('100', ms_id,
39
+ 'Error: failed to create multisite border-gateway 100')
40
+ ms.destroy
41
+ ms_id = ms.multisite
42
+ assert_nil(ms_id, 'Error: failed to destroy multisite border-gateway 100')
43
+ end
44
+
45
+ def test_delay_restore
46
+ ms = EvpnMultisite.new(100)
47
+ ms.delay_restore = 31
48
+ assert_equal('31', ms.delay_restore,
49
+ 'multisite border-gateway delay_restore should be 31')
50
+ ms.delay_restore = 1000
51
+ assert_equal('1000', ms.delay_restore,
52
+ 'multisite border-gateway delay_restore should be 1000')
53
+ ms.destroy
54
+ end
55
+
56
+ def test_update_multisiteid
57
+ ms = EvpnMultisite.new(100)
58
+ ms.delay_restore = 50
59
+ assert_equal('100', ms.multisite,
60
+ 'Error: failed to create multisite border-gateway 100')
61
+ assert_equal('50', ms.delay_restore,
62
+ 'multisite border-gateway delay_restore should be 50')
63
+ ms.multisite = 200
64
+ assert_equal('200', ms.multisite,
65
+ 'Error: failed to create multisite border-gateway 200')
66
+ assert_equal('50', ms.delay_restore,
67
+ 'multisite border-gateway delay_restore should be 50')
68
+ ms.destroy
69
+ end
70
+ end
@@ -0,0 +1,56 @@
1
+ # Evpn Stormcontrol Unit Tests
2
+ #
3
+ # Rahul Shenoy, October, 2017
4
+ #
5
+ # Copyright (c) 2017 Cisco and/or its affiliates.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require_relative 'ciscotest'
20
+ require_relative '../lib/cisco_node_utils/evpn_stormcontrol'
21
+
22
+ # TestEvpnStormcontrol - Minitest for EvpnStormcontrol class
23
+ class TestEvpnStormcontrol < CiscoTestCase
24
+ @skip_unless_supported = 'evpn_stormcontrol'
25
+
26
+ def setup
27
+ # Ensure we are starting with a clean slate for each test.
28
+ super
29
+ skip("#{node.product_id} doesn't support this feature") unless
30
+ node.product_id[/N9K.*EX/]
31
+ config('no evpn storm-control broadcast level 50')
32
+ config('no evpn storm-control multicast level 50')
33
+ config('no evpn storm-control unicast level 50')
34
+ end
35
+
36
+ def test_create_and_destroy
37
+ sc = EvpnStormcontrol.new('broadcast', 50)
38
+ sc_level = sc.level
39
+ assert_equal('50', sc_level,
40
+ 'Error: failed to configure evpn storm-control broadcast ' \
41
+ 'level 50')
42
+ sc.destroy
43
+ sc_level = sc.level
44
+ assert_nil(sc_level, 'Error: failed to destroy storm-control config')
45
+ end
46
+
47
+ def test_update_level
48
+ sc = EvpnStormcontrol.new('multicast', 50)
49
+ assert_equal('50', sc.level,
50
+ 'Error: multicast storm-control level should be 50')
51
+ sc.level = 51
52
+ assert_equal('51', sc.level,
53
+ 'Error: failed to create multisite border-gateway 200')
54
+ sc.destroy
55
+ end
56
+ end
@@ -31,7 +31,6 @@ class TestFeature < CiscoTestCase
31
31
  'no feature bgp',
32
32
  'no feature dhcp',
33
33
  'no feature fabric forwarding',
34
- 'no feature-set fex',
35
34
  'no feature hsrp',
36
35
  'no feature itd',
37
36
  'no feature nv overlay',
@@ -42,6 +41,11 @@ class TestFeature < CiscoTestCase
42
41
  'no feature vn-segment-vlan-based',
43
42
  'no feature vni',
44
43
  'no feature vtp'].each { |f| config_no_warn(f) }
44
+
45
+ # Special case for 'no feature-set fex'
46
+ # Some image versions prompt y/n to remove the feature-set.
47
+ config_no_warn('terminal dont-ask')
48
+ config_no_warn('no feature-set fex')
45
49
  end
46
50
 
47
51
  ###########
@@ -226,6 +230,7 @@ class TestFeature < CiscoTestCase
226
230
 
227
231
  # clean
228
232
  if Feature.fex_installed?
233
+ config_no_warn('terminal dont-ask')
229
234
  config_no_warn("no #{fs}")
230
235
  config_no_warn("no install #{fs}")
231
236
  end
@@ -0,0 +1,59 @@
1
+ # Interface Evpn Multisite Unit Tests
2
+ #
3
+ # Rahul Shenoy, October, 2017
4
+ #
5
+ # Copyright (c) 2017 Cisco and/or its affiliates.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require_relative 'ciscotest'
20
+ require_relative '../lib/cisco_node_utils/interface_evpn_multisite'
21
+ require_relative '../lib/cisco_node_utils/evpn_multisite'
22
+
23
+ # TestInterfaceEvpnMultisite - Minitest for InterfaceEvpnMultisite class
24
+ class TestInterfaceEvpnMultisite < CiscoTestCase
25
+ @skip_unless_supported = 'interface_evpn_multisite'
26
+
27
+ def setup
28
+ # ensure we are starting with a clean slate for each test.
29
+ super
30
+ skip("#{node.product_id} doesn't support this feature") unless
31
+ node.product_id[/N9K.*EX/]
32
+ interface_ethernet_default(interfaces[0])
33
+ end
34
+
35
+ def interface_ethernet_default(intf)
36
+ config("default interface #{intf}")
37
+ end
38
+
39
+ def test_enable_disable
40
+ interface = interfaces[0]
41
+ intf_ms = InterfaceEvpnMultisite.new(interface)
42
+ ms = EvpnMultisite.new(100)
43
+ intf_ms.enable('dci-tracking')
44
+ assert_equal('dci-tracking', intf_ms.tracking)
45
+ intf_ms.disable('dci-tracking')
46
+ assert_nil(intf_ms.tracking)
47
+ ms.destroy
48
+ end
49
+
50
+ def test_enable_with_no_multisite_bordergateway
51
+ interface = interfaces[0]
52
+ intf_ms = InterfaceEvpnMultisite.new(interface)
53
+ ms = EvpnMultisite.new(100)
54
+ ms.destroy
55
+ assert_raises(CliError, 'Invalid command') do
56
+ intf_ms.enable('dci-tracking')
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,69 @@
1
+ # IP Multicast Unit Tests
2
+ #
3
+ # Rahul Shenoy, January, 2018
4
+ #
5
+ # Copyright (c) 2018 Cisco and/or its affiliates.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require_relative 'ciscotest'
20
+ require_relative '../lib/cisco_node_utils/ip_multicast'
21
+ require_relative '../lib/cisco_node_utils/feature'
22
+
23
+ # TestIpMulticast - Minitest for IpMulticast class
24
+ class TestIpMulticast < CiscoTestCase
25
+ @skip_unless_supported = 'ip_multicast'
26
+
27
+ def setup
28
+ # Disable feature ngmvpn before each test to
29
+ # ensure we are starting with a clean slate for each test.
30
+ super
31
+ skip_incompat_version?('feature', 'ngmvpn')
32
+ config_no_warn('no feature ngmvpn')
33
+ end
34
+
35
+ def teardown
36
+ # Disable feature ngmvpn after each test
37
+ config_no_warn('no feature ngmvpn')
38
+ super
39
+ end
40
+
41
+ def test_ip_multicast
42
+ ipm = IpMulticast.new
43
+ opts = %w(overlay_distributed_dr overlay_spt_only)
44
+
45
+ # test defaults
46
+ opts.each do |opt|
47
+ have = ipm.send("#{opt}")
48
+ should = ipm.send("default_#{opt}")
49
+ assert_equal(have, should, "#{opt} doesn't match the default")
50
+ end
51
+
52
+ # test property set
53
+ opts.each do |opt|
54
+ ipm.send("#{opt}=", true)
55
+ should = 'ip multicast ' + opt.tr('_', '-')
56
+ assert_equal(ipm.send("#{opt}"), should, "#{opt} was not set")
57
+ end
58
+
59
+ # unset property
60
+ opts.each do |opt|
61
+ ipm.send("#{opt}=", false)
62
+ should = false
63
+ assert_equal(ipm.send("#{opt}"), should, "#{opt} was not unset")
64
+ assert_equal(ipm.send("#{opt}"), ipm.send("default_#{opt}"), "#{opt} doesn't match default")
65
+ end
66
+
67
+ ipm.destroy
68
+ end
69
+ end