cisco_node_utils 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/CHANGELOG.md +126 -1
  4. data/README.md +19 -12
  5. data/Rakefile +1 -0
  6. data/bin/git/hooks/commit-msg/enforce_style +8 -0
  7. data/cisco_node_utils.gemspec +4 -3
  8. data/docs/README-develop-best-practices.md +127 -109
  9. data/docs/README-develop-node-utils-APIs.md +47 -39
  10. data/docs/template-router.rb +3 -7
  11. data/lib/.rubocop.yml +4 -4
  12. data/lib/cisco_node_utils.rb +1 -1
  13. data/lib/cisco_node_utils/aaa_authentication_login.rb +96 -0
  14. data/lib/cisco_node_utils/aaa_authentication_login_service.rb +133 -0
  15. data/lib/cisco_node_utils/aaa_authorization_service.rb +150 -0
  16. data/lib/cisco_node_utils/ace.rb +196 -0
  17. data/lib/cisco_node_utils/acl.rb +100 -0
  18. data/lib/cisco_node_utils/bgp.rb +301 -163
  19. data/lib/cisco_node_utils/bgp_af.rb +187 -19
  20. data/lib/cisco_node_utils/bgp_neighbor.rb +18 -33
  21. data/lib/cisco_node_utils/bgp_neighbor_af.rb +25 -48
  22. data/lib/cisco_node_utils/cisco_cmn_utils.rb +23 -4
  23. data/lib/cisco_node_utils/cmd_ref/README_YAML.md +593 -0
  24. data/lib/cisco_node_utils/cmd_ref/aaa_auth_login_service.yaml +22 -0
  25. data/lib/cisco_node_utils/cmd_ref/aaa_authentication_login.yaml +31 -0
  26. data/lib/cisco_node_utils/cmd_ref/aaa_authorization_service.yaml +22 -0
  27. data/lib/cisco_node_utils/cmd_ref/acl.yaml +43 -0
  28. data/lib/cisco_node_utils/cmd_ref/bgp.yaml +242 -0
  29. data/lib/cisco_node_utils/cmd_ref/bgp_af.yaml +164 -0
  30. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor.yaml +131 -0
  31. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor_af.yaml +179 -0
  32. data/lib/cisco_node_utils/cmd_ref/dnsclient.yaml +34 -0
  33. data/lib/cisco_node_utils/cmd_ref/evpn_vni.yaml +42 -0
  34. data/lib/cisco_node_utils/cmd_ref/fabricpath.yaml +172 -0
  35. data/lib/cisco_node_utils/cmd_ref/fabricpath_topology.yaml +35 -0
  36. data/lib/cisco_node_utils/cmd_ref/feature.yaml +42 -0
  37. data/lib/cisco_node_utils/cmd_ref/fex.yaml +9 -0
  38. data/lib/cisco_node_utils/cmd_ref/images.yaml +7 -0
  39. data/lib/cisco_node_utils/cmd_ref/interface.yaml +339 -0
  40. data/lib/cisco_node_utils/cmd_ref/interface_channel_group.yaml +28 -0
  41. data/lib/cisco_node_utils/cmd_ref/interface_ospf.yaml +61 -0
  42. data/lib/cisco_node_utils/cmd_ref/interface_portchannel.yaml +54 -0
  43. data/lib/cisco_node_utils/cmd_ref/interface_service_vni.yaml +32 -0
  44. data/lib/cisco_node_utils/cmd_ref/inventory.yaml +45 -0
  45. data/lib/cisco_node_utils/cmd_ref/memory.yaml +13 -0
  46. data/lib/cisco_node_utils/cmd_ref/ntp_config.yaml +7 -0
  47. data/lib/cisco_node_utils/cmd_ref/ntp_server.yaml +14 -0
  48. data/lib/cisco_node_utils/cmd_ref/ospf.yaml +74 -0
  49. data/lib/cisco_node_utils/cmd_ref/overlay_global.yaml +33 -0
  50. data/lib/cisco_node_utils/cmd_ref/pim.yaml +40 -0
  51. data/lib/cisco_node_utils/cmd_ref/portchannel_global.yaml +69 -0
  52. data/lib/cisco_node_utils/cmd_ref/radius_global.yaml +25 -0
  53. data/lib/cisco_node_utils/cmd_ref/radius_server.yaml +64 -0
  54. data/lib/cisco_node_utils/cmd_ref/radius_server_group.yaml +14 -0
  55. data/lib/cisco_node_utils/cmd_ref/show_system.yaml +5 -0
  56. data/lib/cisco_node_utils/cmd_ref/show_version.yaml +72 -0
  57. data/lib/cisco_node_utils/cmd_ref/snmp_community.yaml +23 -0
  58. data/lib/cisco_node_utils/cmd_ref/snmp_group.yaml +7 -0
  59. data/lib/cisco_node_utils/cmd_ref/snmp_notification_receiver.yaml +50 -0
  60. data/lib/cisco_node_utils/cmd_ref/snmp_server.yaml +51 -0
  61. data/lib/cisco_node_utils/cmd_ref/snmp_user.yaml +55 -0
  62. data/lib/cisco_node_utils/cmd_ref/snmpnotification.yaml +11 -0
  63. data/lib/cisco_node_utils/cmd_ref/syslog_server.yaml +18 -0
  64. data/lib/cisco_node_utils/cmd_ref/syslog_settings.yaml +7 -0
  65. data/lib/cisco_node_utils/cmd_ref/system.yaml +6 -0
  66. data/lib/cisco_node_utils/cmd_ref/tacacs_server.yaml +49 -0
  67. data/lib/cisco_node_utils/cmd_ref/tacacs_server_group.yaml +33 -0
  68. data/lib/cisco_node_utils/cmd_ref/tacacs_server_host.yaml +35 -0
  69. data/lib/cisco_node_utils/cmd_ref/vdc.yaml +38 -0
  70. data/lib/cisco_node_utils/cmd_ref/virtual_service.yaml +6 -0
  71. data/lib/cisco_node_utils/cmd_ref/vlan.yaml +56 -0
  72. data/lib/cisco_node_utils/cmd_ref/vni.yaml +76 -0
  73. data/lib/cisco_node_utils/cmd_ref/vpc.yaml +197 -0
  74. data/lib/cisco_node_utils/cmd_ref/vrf.yaml +88 -0
  75. data/lib/cisco_node_utils/cmd_ref/vtp.yaml +38 -0
  76. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep.yaml +60 -0
  77. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep_vni.yaml +39 -0
  78. data/lib/cisco_node_utils/cmd_ref/yum.yaml +13 -0
  79. data/lib/cisco_node_utils/command_reference.rb +359 -187
  80. data/lib/cisco_node_utils/configparser_lib.rb +1 -1
  81. data/lib/cisco_node_utils/dns_domain.rb +19 -5
  82. data/lib/cisco_node_utils/domain_name.rb +4 -8
  83. data/lib/cisco_node_utils/evpn_vni.rb +157 -0
  84. data/lib/cisco_node_utils/fabricpath_global.rb +388 -0
  85. data/lib/cisco_node_utils/fabricpath_topology.rb +150 -0
  86. data/lib/cisco_node_utils/feature.rb +111 -0
  87. data/lib/cisco_node_utils/interface.rb +390 -97
  88. data/lib/cisco_node_utils/interface_channel_group.rb +124 -0
  89. data/lib/cisco_node_utils/interface_ospf.rb +11 -34
  90. data/lib/cisco_node_utils/interface_portchannel.rb +157 -0
  91. data/lib/cisco_node_utils/interface_service_vni.rb +132 -0
  92. data/lib/cisco_node_utils/name_server.rb +1 -1
  93. data/lib/cisco_node_utils/node.rb +55 -249
  94. data/lib/cisco_node_utils/node_util.rb +5 -1
  95. data/lib/cisco_node_utils/ntp_config.rb +2 -2
  96. data/lib/cisco_node_utils/ntp_server.rb +14 -5
  97. data/lib/cisco_node_utils/overlay_global.rb +153 -0
  98. data/lib/cisco_node_utils/pim.rb +124 -0
  99. data/lib/cisco_node_utils/pim_group_list.rb +108 -0
  100. data/lib/cisco_node_utils/pim_rp_address.rb +102 -0
  101. data/lib/cisco_node_utils/platform.rb +8 -9
  102. data/lib/cisco_node_utils/portchannel_global.rb +277 -0
  103. data/lib/cisco_node_utils/radius_global.rb +9 -19
  104. data/lib/cisco_node_utils/radius_server.rb +31 -41
  105. data/lib/cisco_node_utils/radius_server_group.rb +117 -0
  106. data/lib/cisco_node_utils/router_ospf.rb +1 -1
  107. data/lib/cisco_node_utils/router_ospf_vrf.rb +14 -19
  108. data/lib/cisco_node_utils/snmp_notification_receiver.rb +158 -0
  109. data/lib/cisco_node_utils/snmpcommunity.rb +3 -5
  110. data/lib/cisco_node_utils/snmpgroup.rb +1 -1
  111. data/lib/cisco_node_utils/snmpnotification.rb +57 -0
  112. data/lib/cisco_node_utils/snmpserver.rb +8 -17
  113. data/lib/cisco_node_utils/snmpuser.rb +67 -28
  114. data/lib/cisco_node_utils/syslog_server.rb +3 -9
  115. data/lib/cisco_node_utils/syslog_settings.rb +2 -10
  116. data/lib/cisco_node_utils/tacacs_server.rb +9 -14
  117. data/lib/cisco_node_utils/tacacs_server_group.rb +145 -0
  118. data/lib/cisco_node_utils/tacacs_server_host.rb +5 -9
  119. data/lib/cisco_node_utils/vdc.rb +88 -0
  120. data/lib/cisco_node_utils/version.rb +5 -2
  121. data/lib/cisco_node_utils/vlan.rb +71 -8
  122. data/lib/cisco_node_utils/vni.rb +227 -0
  123. data/lib/cisco_node_utils/vpc.rb +377 -0
  124. data/lib/cisco_node_utils/vrf.rb +60 -9
  125. data/lib/cisco_node_utils/vrf_af.rb +191 -0
  126. data/lib/cisco_node_utils/vtp.rb +8 -6
  127. data/lib/cisco_node_utils/vxlan_vtep.rb +151 -0
  128. data/lib/cisco_node_utils/vxlan_vtep_vni.rb +234 -0
  129. data/lib/cisco_node_utils/yum.rb +1 -1
  130. data/tests/.rubocop.yml +1 -1
  131. data/tests/basetest.rb +16 -7
  132. data/tests/ciscotest.rb +55 -13
  133. data/tests/cmd_config.yaml +2 -2
  134. data/tests/platform_info.rb +3 -2
  135. data/tests/test_aaa_authentication_login.rb +219 -0
  136. data/tests/test_aaa_authentication_login_service.rb +759 -0
  137. data/tests/test_aaa_authorization_service.rb +1041 -0
  138. data/tests/test_ace.rb +160 -0
  139. data/tests/test_acl.rb +176 -0
  140. data/tests/test_bgp_af.rb +269 -13
  141. data/tests/test_bgp_neighbor.rb +38 -40
  142. data/tests/test_bgp_neighbor_af.rb +92 -32
  143. data/tests/test_command_config.rb +5 -5
  144. data/tests/test_command_reference.rb +284 -101
  145. data/tests/test_dns_domain.rb +1 -1
  146. data/tests/test_domain_name.rb +1 -1
  147. data/tests/test_evpn_vni.rb +106 -0
  148. data/tests/test_fabricpath_global.rb +243 -0
  149. data/tests/test_fabricpath_topology.rb +98 -0
  150. data/tests/test_interface.rb +292 -74
  151. data/tests/test_interface_channel_group.rb +74 -0
  152. data/tests/test_interface_ospf.rb +9 -4
  153. data/tests/test_interface_portchannel.rb +105 -0
  154. data/tests/test_interface_service_vni.rb +232 -0
  155. data/tests/test_interface_svi.rb +77 -62
  156. data/tests/test_interface_switchport.rb +17 -5
  157. data/tests/test_name_server.rb +1 -1
  158. data/tests/test_node.rb +1 -1
  159. data/tests/test_node_ext.rb +10 -20
  160. data/tests/test_ntp_config.rb +1 -1
  161. data/tests/test_ntp_server.rb +18 -6
  162. data/tests/test_overlay_global.rb +102 -0
  163. data/tests/test_pim.rb +177 -0
  164. data/tests/test_pim_group_list.rb +181 -0
  165. data/tests/test_pim_rp_address.rb +153 -0
  166. data/tests/test_platform.rb +3 -3
  167. data/tests/test_portchannel_global.rb +202 -0
  168. data/tests/test_radius_global.rb +1 -1
  169. data/tests/test_radius_server.rb +92 -57
  170. data/tests/test_radius_server_group.rb +149 -0
  171. data/tests/test_router_bgp.rb +283 -112
  172. data/tests/test_router_ospf.rb +2 -2
  173. data/tests/test_router_ospf_vrf.rb +4 -4
  174. data/tests/test_snmp_notification_receiver.rb +167 -0
  175. data/tests/test_snmpcommunity.rb +1 -1
  176. data/tests/test_snmpgroup.rb +1 -1
  177. data/tests/test_snmpnotification.rb +72 -0
  178. data/tests/test_snmpserver.rb +29 -105
  179. data/tests/test_snmpuser.rb +32 -30
  180. data/tests/test_syslog_server.rb +36 -10
  181. data/tests/test_syslog_settings.rb +1 -1
  182. data/tests/test_tacacs_server.rb +1 -1
  183. data/tests/test_tacacs_server_group.rb +405 -0
  184. data/tests/test_tacacs_server_host.rb +1 -1
  185. data/tests/test_vdc.rb +78 -0
  186. data/tests/test_vlan.rb +74 -19
  187. data/tests/test_vlan_mt_full.rb +95 -0
  188. data/tests/test_vni.rb +106 -0
  189. data/tests/test_vpc.rb +361 -0
  190. data/tests/test_vrf.rb +172 -29
  191. data/tests/test_vtp.rb +1 -1
  192. data/tests/test_vxlan_vtep.rb +214 -0
  193. data/tests/test_vxlan_vtep_vni.rb +201 -0
  194. data/tests/test_yum.rb +1 -1
  195. metadata +120 -11
  196. data/lib/cisco_node_utils/README_YAML.md +0 -325
  197. data/lib/cisco_node_utils/command_reference_common.yaml +0 -1051
  198. data/lib/cisco_node_utils/command_reference_common_bgp.yaml +0 -535
  199. data/lib/cisco_node_utils/command_reference_n3064.yaml +0 -13
  200. data/lib/cisco_node_utils/command_reference_n7k.yaml +0 -52
  201. data/lib/cisco_node_utils/command_reference_n9k.yaml +0 -26
  202. data/tests/platform_info.yaml +0 -10
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013-2015 Cisco and/or its affiliates.
1
+ # Copyright (c) 2013-2016 Cisco and/or its affiliates.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -13,7 +13,9 @@
13
13
  # limitations under the License.
14
14
 
15
15
  require_relative 'ciscotest'
16
+ require_relative '../lib/cisco_node_utils/acl'
16
17
  require_relative '../lib/cisco_node_utils/interface'
18
+ require_relative '../lib/cisco_node_utils/overlay_global'
17
19
 
18
20
  include Cisco
19
21
 
@@ -39,7 +41,6 @@ class TestInterface < CiscoTestCase
39
41
  DEFAULT_IF_IP_PROXY_ARP = false
40
42
  DEFAULT_IF_IP_REDIRECTS = true
41
43
  DEFAULT_IF_VRF = ''
42
- IF_DESCRIPTION_SIZE = 243 # SIZE = VSH Max 255 - "description " keyword
43
44
  IF_VRF_MAX_LENGTH = 32
44
45
 
45
46
  def interface_ipv4_config(ifname, address, length,
@@ -62,7 +63,8 @@ class TestInterface < CiscoTestCase
62
63
  end
63
64
 
64
65
  def show_cmd(name)
65
- "show run interface #{name} all | no-more"
66
+ all = (name =~ /port-channel\d/ && node.product_id =~ /N7/) ? '' : 'all'
67
+ "show run interface #{name} #{all} | no-more"
66
68
  end
67
69
 
68
70
  def interface_count
@@ -75,6 +77,17 @@ class TestInterface < CiscoTestCase
75
77
  arr.count
76
78
  end
77
79
 
80
+ # Helper to check for misc speed change disallowed error messages.
81
+ def speed_change_disallowed(message)
82
+ patterns = ['port doesn t support this speed',
83
+ 'Changing interface speed is not permitted',
84
+ 'requested config change not allowed',
85
+ /does not match the (transceiver speed|port capability)/]
86
+ skip('Skip test: Interface type does not allow config change') if
87
+ message[Regexp.union(patterns)]
88
+ flunk(message)
89
+ end
90
+
78
91
  def create_interface(ifname=interfaces[0])
79
92
  @default_show_command = show_cmd(ifname)
80
93
  Interface.new(ifname)
@@ -165,6 +178,10 @@ class TestInterface < CiscoTestCase
165
178
  "Error: #{interface.name}, switchport mode, default, " \
166
179
  'not correct')
167
180
  end
181
+ rescue RuntimeError => e
182
+ skip('NX-OS defect: system default switchport nvgens twice') if
183
+ e.message[/Expected zero.one value/]
184
+ flunk(e.message)
168
185
  end
169
186
 
170
187
  def validate_description(inttype_h)
@@ -247,7 +264,7 @@ class TestInterface < CiscoTestCase
247
264
  # Validate the collection
248
265
  inttype_h.each do |k, v|
249
266
  # Skipping loopback, proxy arp not supported
250
- next if (k == 'loopback0')
267
+ next if k == 'loopback0'
251
268
 
252
269
  interface = v[:interface]
253
270
  cmd = show_cmd(interface.name)
@@ -305,36 +322,25 @@ class TestInterface < CiscoTestCase
305
322
  assert_equal(ref.default_value, interface.default_ipv4_redirects,
306
323
  "ipv4 redirects default incorrect for interface #{k}")
307
324
 
308
- begin
309
- config_set = ref.config_set
310
- rescue IndexError
311
- config_set = nil
312
- end
313
-
314
- if config_set
315
- pattern = ref.test_config_get_regex[0]
325
+ if ref.config_set?
316
326
  cmd = show_cmd(interface.name)
317
- if k.include?('loopback')
318
- assert_raises(Cisco::CliError) { interface.ipv4_redirects = true }
319
- else
320
- interface.ipv4_redirects = true
321
- assert(interface.ipv4_redirects, "Couldn't set redirects to true")
322
- refute_show_match(command: cmd, pattern: pattern)
327
+ interface.ipv4_redirects = true
328
+ assert(interface.ipv4_redirects, "Couldn't set redirects to true")
329
+ refute_show_match(command: cmd, pattern: ref.test_config_get_regex[1])
323
330
 
324
- interface.ipv4_redirects = false
325
- refute(interface.ipv4_redirects, "Couldn't set redirects to false")
326
- assert_show_match(command: cmd, pattern: pattern)
327
- end
331
+ interface.ipv4_redirects = false
332
+ refute(interface.ipv4_redirects, "Couldn't set redirects to false")
333
+ refute_show_match(command: cmd, pattern: ref.test_config_get_regex[0])
328
334
  else
329
335
  # Getter should return same value as default if setter isn't supported
330
336
  assert_equal(interface.ipv4_redirects, interface.default_ipv4_redirects,
331
337
  'ipv4 redirects default incorrect')
332
338
 
333
339
  # Make sure setter fails
334
- assert_raises(ref.test_config_result(true)) do
340
+ assert_raises(Cisco::UnsupportedError) do
335
341
  interface.ipv4_redirects = true
336
342
  end
337
- assert_raises(ref.test_config_result(false)) do
343
+ assert_raises(Cisco::UnsupportedError) do
338
344
  interface.ipv4_redirects = false
339
345
  end
340
346
  end
@@ -394,24 +400,11 @@ class TestInterface < CiscoTestCase
394
400
  assert_equal('', interface.description)
395
401
  end
396
402
 
397
- def test_interface_description_too_long
398
- interface = Interface.new(interfaces[0])
399
- description = 'a' * (IF_DESCRIPTION_SIZE + 1)
400
- assert_raises(RuntimeError) { interface.description = description }
401
- interface_ethernet_default(interfaces_id[0])
402
- end
403
-
404
403
  def test_interface_description_valid
405
404
  interface = Interface.new(interfaces[0])
406
- alphabet = 'abcdefghijklmnopqrstuvwxyz 0123456789'
407
- description = ''
408
- 1.upto(IF_DESCRIPTION_SIZE) do |i|
409
- description += alphabet[i % alphabet.size, 1]
410
- next unless i == IF_DESCRIPTION_SIZE
411
- # puts("description (#{i}): #{description}")
412
- interface.description = description
413
- assert_equal(description.rstrip, interface.description)
414
- end
405
+ description = 'This is a test description ! '
406
+ interface.description = description
407
+ assert_equal(description.rstrip, interface.description)
415
408
  interface_ethernet_default(interfaces_id[0])
416
409
  end
417
410
 
@@ -448,6 +441,7 @@ class TestInterface < CiscoTestCase
448
441
 
449
442
  def test_interface_mtu_change
450
443
  interface = Interface.new(interfaces[0])
444
+ interface.switchport_mode = :disabled
451
445
  interface.mtu = 1520
452
446
  assert_equal(1520, interface.mtu)
453
447
  interface.mtu = 1580
@@ -457,16 +451,76 @@ class TestInterface < CiscoTestCase
457
451
 
458
452
  def test_interface_mtu_invalid
459
453
  interface = Interface.new(interfaces[0])
454
+ interface.switchport_mode = :disabled
460
455
  assert_raises(RuntimeError) { interface.mtu = 'hello' }
461
456
  end
462
457
 
463
458
  def test_interface_mtu_valid
464
459
  interface = Interface.new(interfaces[0])
460
+ interface.switchport_mode = :disabled
465
461
  interface.mtu = 1550
466
462
  assert_equal(1550, interface.mtu)
467
463
  interface_ethernet_default(interfaces_id[0])
468
464
  end
469
465
 
466
+ def test_interface_speed_change
467
+ interface = Interface.new(interfaces[0])
468
+ begin
469
+ interface.speed = 100
470
+ assert_equal('100', interface.speed)
471
+ interface.speed = 1000
472
+ assert_equal('1000', interface.speed)
473
+ interface_ethernet_default(interfaces_id[0])
474
+ rescue RuntimeError => e
475
+ speed_change_disallowed(e.message)
476
+ end
477
+ end
478
+
479
+ def test_interface_speed_invalid
480
+ interface = Interface.new(interfaces[0])
481
+ assert_raises(RuntimeError) { interface.speed = 'hello' }
482
+ end
483
+
484
+ def test_interface_speed_valid
485
+ interface = Interface.new(interfaces[0])
486
+ interface.speed = 1000
487
+ assert_equal('1000', interface.speed)
488
+ interface_ethernet_default(interfaces_id[0])
489
+ rescue RuntimeError => e
490
+ speed_change_disallowed(e.message)
491
+ end
492
+
493
+ def test_interface_duplex_change
494
+ interface = Interface.new(interfaces[0])
495
+ interface.speed = 1000
496
+ interface.duplex = 'full'
497
+ assert_equal('full', interface.duplex)
498
+ interface.duplex = 'auto'
499
+ assert_equal('auto', interface.duplex)
500
+ interface_ethernet_default(interfaces_id[0])
501
+ rescue RuntimeError => e
502
+ speed_change_disallowed(e.message)
503
+ end
504
+
505
+ def test_interface_duplex_invalid
506
+ interface = Interface.new(interfaces[0])
507
+ interface.speed = 1000
508
+ assert_raises(RuntimeError) { interface.duplex = 'hello' }
509
+ interface_ethernet_default(interfaces_id[0])
510
+ rescue RuntimeError => e
511
+ speed_change_disallowed(e.message)
512
+ end
513
+
514
+ def test_interface_duplex_valid
515
+ interface = Interface.new(interfaces[0])
516
+ interface.speed = 1000
517
+ interface.duplex = 'full'
518
+ assert_equal('full', interface.duplex)
519
+ interface_ethernet_default(interfaces_id[0])
520
+ rescue RuntimeError => e
521
+ speed_change_disallowed(e.message)
522
+ end
523
+
470
524
  def test_interface_shutdown_valid
471
525
  interface = Interface.new(interfaces[0])
472
526
  interface.shutdown = true
@@ -562,17 +616,12 @@ class TestInterface < CiscoTestCase
562
616
  interface.negotiate_auto = default
563
617
  # Delay as this change is sometimes too quick for some interfaces
564
618
  sleep 1 unless default == interface.negotiate_auto
619
+ node.cache_flush
565
620
  assert_equal(default, interface.negotiate_auto,
566
621
  "Error: #{inf_name} negotiate auto value " \
567
622
  'should be same as default')
568
623
 
569
- begin
570
- config_set = cmd_ref.config_set
571
- rescue IndexError
572
- config_set = nil
573
- end
574
-
575
- unless config_set
624
+ unless cmd_ref.config_set?
576
625
  # check the set for unsupported platforms
577
626
  assert_raises(RuntimeError) do
578
627
  interface.negotiate_auto = true
@@ -581,7 +630,7 @@ class TestInterface < CiscoTestCase
581
630
  end
582
631
 
583
632
  interface.negotiate_auto = default
584
- assert_equal(interface.negotiate_auto, default,
633
+ assert_equal(default, interface.negotiate_auto,
585
634
  "Error: #{inf_name} negotiate auto value not #{default}")
586
635
 
587
636
  pattern = cmd_ref.test_config_get_regex[default ? 1 : 0]
@@ -594,11 +643,16 @@ class TestInterface < CiscoTestCase
594
643
  begin
595
644
  interface.negotiate_auto = non_default
596
645
  rescue RuntimeError
597
- assert_equal(interface.negotiate_auto, default,
646
+ assert_equal(default, interface.negotiate_auto,
598
647
  "Error: #{inf_name} negotiate auto value not #{default}")
599
648
  return
600
649
  end
601
- assert_equal(interface.negotiate_auto, non_default,
650
+
651
+ # Delay as this change is sometimes too quick for some interfaces
652
+ sleep 1 unless non_default == interface.negotiate_auto
653
+ node.cache_flush
654
+
655
+ assert_equal(non_default, interface.negotiate_auto,
602
656
  "Error: #{inf_name} negotiate auto value not #{non_default}")
603
657
 
604
658
  pattern = cmd_ref.test_config_get_regex[non_default ? 1 : 0]
@@ -606,7 +660,7 @@ class TestInterface < CiscoTestCase
606
660
 
607
661
  # Clean up after ourselves
608
662
  interface.negotiate_auto = default
609
- assert_equal(interface.negotiate_auto, default,
663
+ assert_equal(default, interface.negotiate_auto,
610
664
  "Error: #{inf_name} negotiate auto value not #{default}")
611
665
 
612
666
  pattern = cmd_ref.test_config_get_regex[default ? 1 : 0]
@@ -640,6 +694,9 @@ class TestInterface < CiscoTestCase
640
694
  'negotiate_auto_ethernet')
641
695
  assert(ref, 'Error, reference not found')
642
696
 
697
+ # Cleanup
698
+ interface_ethernet_default(interfaces_id[0])
699
+
643
700
  # Some platforms does not support negotiate auto
644
701
  # if so then we abort the test.
645
702
 
@@ -649,9 +706,10 @@ class TestInterface < CiscoTestCase
649
706
  # Some platforms/interfaces/versions do not support negotiation changes
650
707
  begin
651
708
  interface.negotiate_auto = false
652
- rescue => e
709
+ rescue CliError => e
653
710
  skip('Skip test: Interface type does not allow config change') if
654
711
  e.message[/requested config change not allowed/]
712
+ flunk(e.message)
655
713
  end
656
714
 
657
715
  default = ref.default_value
@@ -680,10 +738,10 @@ class TestInterface < CiscoTestCase
680
738
  assert_equal(interface.negotiate_auto, ref.default_value,
681
739
  "Error: #{inf_name} negotiate auto value mismatch")
682
740
 
683
- assert_raises(ref.test_config_result(true)) do
741
+ assert_raises(Cisco::UnsupportedError) do
684
742
  interface.negotiate_auto = true
685
743
  end
686
- assert_raises(ref.test_config_result(false)) do
744
+ assert_raises(Cisco::UnsupportedError) do
687
745
  interface.negotiate_auto = false
688
746
  end
689
747
 
@@ -701,7 +759,6 @@ class TestInterface < CiscoTestCase
701
759
  assert_raises(RuntimeError) do
702
760
  interface.ipv4_addr_mask_set('', 14)
703
761
  end
704
- interface.switchport_mode = :access
705
762
  interface_ethernet_default(interfaces_id[0])
706
763
  end
707
764
 
@@ -711,17 +768,90 @@ class TestInterface < CiscoTestCase
711
768
  assert_raises(RuntimeError) do
712
769
  interface.ipv4_addr_mask_set('8.1.1.2', DEFAULT_IF_IP_NETMASK_LEN)
713
770
  end
714
- interface.switchport_mode = :access
715
771
  interface_ethernet_default(interfaces_id[0])
716
772
  end
717
773
 
774
+ def test_ipv4_acl
775
+ # Sample cli:
776
+ #
777
+ # interface Ethernet1/1
778
+ # ip access-group v4acl1 in
779
+ # ip access-group v4acl2 out
780
+ #
781
+
782
+ # create acls first
783
+ %w(v4acl1 v4acl2 v4acl3 v4acl4).each do |acl_name|
784
+ Acl.new('ipv4', acl_name)
785
+ end
786
+ interface_ethernet_default(interfaces[0])
787
+ intf = Interface.new(interfaces[0])
788
+
789
+ intf.ipv4_acl_in = 'v4acl1'
790
+ assert_equal('v4acl1', intf.ipv4_acl_in)
791
+ intf.ipv4_acl_out = 'v4acl2'
792
+ assert_equal('v4acl2', intf.ipv4_acl_out)
793
+
794
+ intf.ipv4_acl_in = 'v4acl3'
795
+ assert_equal('v4acl3', intf.ipv4_acl_in)
796
+ intf.ipv4_acl_out = 'v4acl4'
797
+ assert_equal('v4acl4', intf.ipv4_acl_out)
798
+
799
+ intf.ipv4_acl_in = intf.default_ipv4_acl_in
800
+ assert_equal('', intf.ipv4_acl_in)
801
+ intf.ipv4_acl_out = intf.default_ipv4_acl_out
802
+ assert_equal('', intf.ipv4_acl_out)
803
+
804
+ # delete acls
805
+ %w(v4acl1 v4acl2 v4acl3 v4acl4).each do |acl_name|
806
+ config('no ip access-list ' + acl_name)
807
+ end
808
+ end
809
+
810
+ def test_ipv6_acl
811
+ # Sample cli:
812
+ #
813
+ # interface Ethernet1/1
814
+ # ipv6 traffic-filter v6acl1 in
815
+ # ipv6 traffic-filter v6acl2 out
816
+ #
817
+ interface_ethernet_default(interfaces[0])
818
+ intf = Interface.new(interfaces[0])
819
+
820
+ # create acls first
821
+ %w(v6acl1 v6acl2 v6acl3 v6acl4).each do |acl_name|
822
+ Acl.new('ipv6', acl_name)
823
+ end
824
+
825
+ intf.ipv6_acl_in = 'v6acl1'
826
+ assert_equal('v6acl1', intf.ipv6_acl_in)
827
+ intf.ipv6_acl_out = 'v6acl2'
828
+ assert_equal('v6acl2', intf.ipv6_acl_out)
829
+
830
+ intf.ipv6_acl_in = 'v6acl3'
831
+ assert_equal('v6acl3', intf.ipv6_acl_in)
832
+ intf.ipv6_acl_out = 'v6acl4'
833
+ assert_equal('v6acl4', intf.ipv6_acl_out)
834
+
835
+ intf.ipv6_acl_in = intf.default_ipv6_acl_in
836
+ assert_equal('', intf.ipv6_acl_in)
837
+ intf.ipv6_acl_out = intf.default_ipv6_acl_out
838
+ assert_equal('', intf.ipv6_acl_out)
839
+
840
+ # delete acls
841
+ %w(v6acl1 v6acl2 v6acl3 v6acl4).each do |acl_name|
842
+ config('no ipv6 access-list ' + acl_name)
843
+ end
844
+ end
845
+
718
846
  def test_interface_ipv4_address
719
847
  interface = create_interface
720
848
  interface.switchport_mode = :disabled
721
849
  address = '8.7.1.1'
850
+ sec_addr = '10.5.5.1'
851
+ secondary = true
722
852
  length = 15
723
853
 
724
- # setter, getter
854
+ # Primary: setter, getter
725
855
  interface.ipv4_addr_mask_set(address, length)
726
856
  pattern = %r{^\s+ip address #{address}/#{length}}
727
857
  assert_show_match(pattern: pattern,
@@ -730,6 +860,17 @@ class TestInterface < CiscoTestCase
730
860
  'Error: ipv4 address get value mismatch')
731
861
  assert_equal(length, interface.ipv4_netmask_length,
732
862
  'Error: ipv4 netmask length get value mismatch')
863
+
864
+ # Secondary: setter, getter
865
+ interface.ipv4_addr_mask_set(sec_addr, length, secondary)
866
+ pattern = %r{^\s+ip address #{sec_addr}/#{length} secondary}
867
+ assert_show_match(pattern: pattern,
868
+ msg: 'Error: ipv4 address missing in CLI')
869
+ assert_equal(sec_addr, interface.ipv4_address_secondary,
870
+ 'Error: ipv4 address get value mismatch')
871
+ assert_equal(length, interface.ipv4_netmask_length,
872
+ 'Error: ipv4 netmask length get value mismatch')
873
+
733
874
  # get default
734
875
  assert_equal(DEFAULT_IF_IP_ADDRESS, interface.default_ipv4_address,
735
876
  'Error: ipv4 address get default value mismatch')
@@ -739,7 +880,13 @@ class TestInterface < CiscoTestCase
739
880
  interface.default_ipv4_netmask_length,
740
881
  'Error: ipv4 netmask length get default value mismatch')
741
882
 
742
- # unconfigure ipaddress
883
+ # unconfigure ipaddress - secondary must be removed first
884
+ interface.ipv4_addr_mask_set(interface.default_ipv4_address, length,
885
+ secondary)
886
+ interface.ipv4_addr_mask_set(interface.default_ipv4_address, length)
887
+ # unconfigure should be safely idempotent
888
+ interface.ipv4_addr_mask_set(interface.default_ipv4_address, length,
889
+ secondary)
743
890
  interface.ipv4_addr_mask_set(interface.default_ipv4_address, length)
744
891
  pattern = (/^\s+ip address (.*)/)
745
892
  refute_show_match(pattern: pattern,
@@ -750,7 +897,6 @@ class TestInterface < CiscoTestCase
750
897
  interface.ipv4_netmask_length,
751
898
  'Error: ipv4 netmask length default get value mismatch')
752
899
 
753
- interface.switchport_mode = :access
754
900
  interface_ethernet_default(interfaces_id[0])
755
901
  end
756
902
 
@@ -794,6 +940,56 @@ class TestInterface < CiscoTestCase
794
940
  interface_ethernet_default(interfaces_id[0])
795
941
  end
796
942
 
943
+ def test_interface_ipv4_arp_timeout
944
+ # Setup
945
+ config('no interface vlan11')
946
+ int = Interface.new('vlan11')
947
+
948
+ # Test default
949
+ assert_equal(int.default_ipv4_arp_timeout, int.ipv4_arp_timeout)
950
+ # Test non-default
951
+ int.ipv4_arp_timeout = 300
952
+ assert_equal(300, int.ipv4_arp_timeout)
953
+ # Set back to default
954
+ int.ipv4_arp_timeout = int.default_ipv4_arp_timeout
955
+ assert_equal(int.default_ipv4_arp_timeout, int.ipv4_arp_timeout)
956
+
957
+ # Attempt to configure on a non-vlan interface
958
+ nonvlanint = create_interface
959
+ assert_raises(RuntimeError) { nonvlanint.ipv4_arp_timeout = 300 }
960
+ end
961
+
962
+ def test_interface_fabric_forwarding_anycast_gateway
963
+ # Setup
964
+ config('no interface vlan11')
965
+ int = Interface.new('vlan11')
966
+ foo = OverlayGlobal.new
967
+ foo.anycast_gateway_mac = '1223.3445.5668'
968
+
969
+ # 1. Testing default for newly created vlan
970
+ assert_equal(int.default_fabric_forwarding_anycast_gateway,
971
+ int.fabric_forwarding_anycast_gateway)
972
+
973
+ # 2. Testing non-default:true
974
+ int.fabric_forwarding_anycast_gateway = true
975
+ assert(int.fabric_forwarding_anycast_gateway)
976
+
977
+ # 3. Setting back to false
978
+ int.fabric_forwarding_anycast_gateway = false
979
+ refute(int.fabric_forwarding_anycast_gateway)
980
+
981
+ # 4. Attempt to configure on a non-vlan interface
982
+ nonvlanint = create_interface
983
+ assert_raises(RuntimeError) do
984
+ nonvlanint.fabric_forwarding_anycast_gateway = true
985
+ end
986
+
987
+ # 5. Attempt to set 'fabric forwarding anycast gateway' while the
988
+ # overlay gateway mac is not set.
989
+ foo.anycast_gateway_mac = foo.default_anycast_gateway_mac
990
+ assert_raises(RuntimeError) { int.fabric_forwarding_anycast_gateway = true }
991
+ end
992
+
797
993
  def test_interface_ipv4_proxy_arp
798
994
  interface = create_interface
799
995
  interface.switchport_mode = :disabled
@@ -826,7 +1022,6 @@ class TestInterface < CiscoTestCase
826
1022
  interface.ipv4_proxy_arp,
827
1023
  'Error: ip proxy-arp default get value mismatch')
828
1024
 
829
- interface.switchport_mode = :access
830
1025
  interface_ethernet_default(interfaces_id[0])
831
1026
  end
832
1027
 
@@ -861,7 +1056,6 @@ class TestInterface < CiscoTestCase
861
1056
  assert_equal(DEFAULT_IF_IP_REDIRECTS, interface.ipv4_redirects,
862
1057
  'Error: ip redirects default get value mismatch')
863
1058
 
864
- interface.switchport_mode = :access
865
1059
  interface_ethernet_default(interfaces_id[0])
866
1060
  end
867
1061
 
@@ -970,24 +1164,30 @@ class TestInterface < CiscoTestCase
970
1164
  # pre-configure
971
1165
  inttype_h = config_from_hash(inttype_h)
972
1166
 
973
- # Validate the collection
974
- validate_interfaces_not_empty
975
- validate_get_switchport(inttype_h)
976
- validate_description(inttype_h)
977
- validate_get_access_vlan(inttype_h)
978
- validate_ipv4_address(inttype_h)
979
- validate_ipv4_proxy_arp(inttype_h)
980
- validate_ipv4_redirects(inttype_h)
981
- validate_interface_shutdown(inttype_h)
982
- validate_vrf(inttype_h)
983
-
984
- # Cleanup the preload configuration
1167
+ # Steps to cleanup the preload configuration
985
1168
  cfg = []
986
1169
  inttype_h.each_key do |k|
987
1170
  cfg << "#{/^Ethernet/.match(k) ? 'default' : 'no'} interface #{k}"
988
1171
  end
989
1172
  cfg << 'no feature interface-vlan'
990
- config(*cfg)
1173
+
1174
+ begin
1175
+ # Validate the collection
1176
+ validate_interfaces_not_empty
1177
+ validate_get_switchport(inttype_h)
1178
+ validate_description(inttype_h)
1179
+ validate_get_access_vlan(inttype_h)
1180
+ validate_ipv4_address(inttype_h)
1181
+ validate_ipv4_proxy_arp(inttype_h)
1182
+ validate_ipv4_redirects(inttype_h)
1183
+ validate_interface_shutdown(inttype_h)
1184
+ validate_vrf(inttype_h)
1185
+ config(*cfg)
1186
+ rescue Minitest::Assertion
1187
+ # clean up before failing
1188
+ config(*cfg)
1189
+ raise
1190
+ end
991
1191
  end
992
1192
 
993
1193
  def test_interface_vrf_default
@@ -1032,4 +1232,22 @@ class TestInterface < CiscoTestCase
1032
1232
  assert_equal(vrf, interface.vrf)
1033
1233
  interface.destroy
1034
1234
  end
1235
+
1236
+ def test_ipv4_pim_sparse_mode
1237
+ # Sample cli:
1238
+ #
1239
+ # interface Ethernet1/1
1240
+ # ip pim sparse-mode
1241
+ #
1242
+ config('no feature pim')
1243
+ i = Interface.new(interfaces[0])
1244
+ i.ipv4_pim_sparse_mode = false
1245
+ refute(i.ipv4_pim_sparse_mode)
1246
+
1247
+ i.ipv4_pim_sparse_mode = true
1248
+ assert(i.ipv4_pim_sparse_mode)
1249
+
1250
+ i.ipv4_pim_sparse_mode = i.default_ipv4_pim_sparse_mode
1251
+ assert_equal(i.default_ipv4_pim_sparse_mode, i.ipv4_pim_sparse_mode)
1252
+ end
1035
1253
  end