cisco_node_utils 1.3.0 → 1.4.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 (151) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +66 -0
  4. data/Gemfile +1 -0
  5. data/README.md +44 -43
  6. data/bin/.rubocop.yml +18 -0
  7. data/bin/show_running_yang.rb +233 -0
  8. data/cisco_node_utils.gemspec +1 -1
  9. data/docs/README-maintainers.md +1 -0
  10. data/docs/README-utilities.md +14 -0
  11. data/lib/.rubocop.yml +1 -1
  12. data/lib/cisco_node_utils/aaa_authentication_login_service.rb +8 -3
  13. data/lib/cisco_node_utils/aaa_authorization_service.rb +6 -0
  14. data/lib/cisco_node_utils/bfd_global.rb +300 -0
  15. data/lib/cisco_node_utils/bgp.rb +6 -4
  16. data/lib/cisco_node_utils/bgp_af.rb +2 -0
  17. data/lib/cisco_node_utils/bgp_neighbor.rb +14 -0
  18. data/lib/cisco_node_utils/bgp_neighbor_af.rb +4 -1
  19. data/lib/cisco_node_utils/cisco_cmn_utils.rb +126 -0
  20. data/lib/cisco_node_utils/client/client.rb +6 -2
  21. data/lib/cisco_node_utils/client/grpc/client.rb +120 -36
  22. data/lib/cisco_node_utils/client/nxapi/client.rb +6 -2
  23. data/lib/cisco_node_utils/cmd_ref/DEPRECATED.yaml +118 -0
  24. data/lib/cisco_node_utils/cmd_ref/aaa_authorization_service.yaml +14 -0
  25. data/lib/cisco_node_utils/cmd_ref/bfd_global.yaml +117 -0
  26. data/lib/cisco_node_utils/cmd_ref/bgp.yaml +7 -7
  27. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor.yaml +7 -0
  28. data/lib/cisco_node_utils/cmd_ref/dhcp_relay_global.yaml +125 -0
  29. data/lib/cisco_node_utils/cmd_ref/feature.yaml +10 -0
  30. data/lib/cisco_node_utils/cmd_ref/interface.yaml +141 -49
  31. data/lib/cisco_node_utils/cmd_ref/interface_ospf.yaml +44 -0
  32. data/lib/cisco_node_utils/cmd_ref/interface_portchannel.yaml +6 -0
  33. data/lib/cisco_node_utils/cmd_ref/ospf.yaml +6 -0
  34. data/lib/cisco_node_utils/cmd_ref/ospf_area.yaml +91 -0
  35. data/lib/cisco_node_utils/cmd_ref/ospf_area_vlink.yaml +88 -0
  36. data/lib/cisco_node_utils/cmd_ref/overlay_global.yaml +0 -3
  37. data/lib/cisco_node_utils/cmd_ref/show_version.yaml +3 -3
  38. data/lib/cisco_node_utils/cmd_ref/snmp_community.yaml +39 -15
  39. data/lib/cisco_node_utils/cmd_ref/snmp_notification_receiver.yaml +43 -21
  40. data/lib/cisco_node_utils/cmd_ref/snmp_server.yaml +48 -19
  41. data/lib/cisco_node_utils/cmd_ref/snmp_user.yaml +0 -0
  42. data/lib/cisco_node_utils/cmd_ref/tacacs_global.yaml +30 -0
  43. data/lib/cisco_node_utils/cmd_ref/tacacs_server.yaml +18 -6
  44. data/lib/cisco_node_utils/cmd_ref/vdc.yaml +4 -0
  45. data/lib/cisco_node_utils/cmd_ref/virtual_service.yaml +1 -0
  46. data/lib/cisco_node_utils/cmd_ref/vlan.yaml +23 -10
  47. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep.yaml +8 -2
  48. data/lib/cisco_node_utils/cmd_ref/yang.yaml +7 -0
  49. data/lib/cisco_node_utils/cmd_ref/yum.yaml +10 -1
  50. data/lib/cisco_node_utils/constants.rb +8 -1
  51. data/lib/cisco_node_utils/dhcp_relay_global.rb +302 -0
  52. data/lib/cisco_node_utils/exceptions.rb +29 -0
  53. data/lib/cisco_node_utils/feature.rb +28 -0
  54. data/lib/cisco_node_utils/interface.rb +493 -402
  55. data/lib/cisco_node_utils/interface_DEPRECATED.rb +513 -0
  56. data/lib/cisco_node_utils/interface_ospf.rb +126 -0
  57. data/lib/cisco_node_utils/interface_portchannel.rb +16 -0
  58. data/lib/cisco_node_utils/logger.rb +3 -0
  59. data/lib/cisco_node_utils/node.rb +29 -1
  60. data/lib/cisco_node_utils/overlay_global.rb +1 -12
  61. data/lib/cisco_node_utils/pim.rb +1 -0
  62. data/lib/cisco_node_utils/pim_group_list.rb +1 -0
  63. data/lib/cisco_node_utils/pim_rp_address.rb +1 -0
  64. data/lib/cisco_node_utils/platform.rb +9 -2
  65. data/lib/cisco_node_utils/router_ospf.rb +1 -1
  66. data/lib/cisco_node_utils/router_ospf_area.rb +416 -0
  67. data/lib/cisco_node_utils/router_ospf_area_vlink.rb +313 -0
  68. data/lib/cisco_node_utils/router_ospf_vrf.rb +17 -0
  69. data/lib/cisco_node_utils/snmp_notification_receiver.rb +27 -9
  70. data/lib/cisco_node_utils/snmpcommunity.rb +34 -8
  71. data/lib/cisco_node_utils/snmpserver.rb +4 -4
  72. data/lib/cisco_node_utils/snmpuser.rb +0 -0
  73. data/lib/cisco_node_utils/tacacs_global.rb +102 -0
  74. data/lib/cisco_node_utils/tacacs_server.rb +8 -7
  75. data/lib/cisco_node_utils/vdc.rb +25 -7
  76. data/lib/cisco_node_utils/version.rb +1 -1
  77. data/lib/cisco_node_utils/vlan.rb +30 -56
  78. data/lib/cisco_node_utils/vlan_DEPRECATED.rb +108 -0
  79. data/lib/cisco_node_utils/yang.rb +160 -0
  80. data/lib/cisco_node_utils/yum.rb +25 -32
  81. data/tests/.rubocop.yml +3 -0
  82. data/tests/ciscotest.rb +136 -19
  83. data/tests/cmd_config_invalid.yaml +1 -1
  84. data/tests/noop.rb +7 -0
  85. data/tests/tacacs_server.yaml.example +6 -0
  86. data/tests/test_aaa_authentication_login.rb +24 -1
  87. data/tests/test_aaa_authentication_login_service.rb +9 -16
  88. data/tests/test_aaa_authorization_service.rb +111 -84
  89. data/tests/test_bfd_global.rb +278 -0
  90. data/tests/test_bgp_neighbor.rb +20 -0
  91. data/tests/test_bridge_domain_vni.rb +2 -9
  92. data/tests/test_cmn_utils.rb +76 -0
  93. data/tests/test_dhcp_relay_global.rb +284 -0
  94. data/tests/test_dns_domain.rb +4 -4
  95. data/tests/test_domain_name.rb +2 -2
  96. data/tests/test_encapsulation.rb +2 -4
  97. data/tests/test_evpn_vni.rb +14 -7
  98. data/tests/test_fabricpath_global.rb +12 -13
  99. data/tests/test_feature.rb +35 -17
  100. data/tests/test_interface.rb +352 -127
  101. data/tests/test_interface_bdi.rb +2 -2
  102. data/tests/test_interface_channel_group.rb +1 -1
  103. data/tests/test_interface_ospf.rb +153 -23
  104. data/tests/test_interface_portchannel.rb +15 -6
  105. data/tests/test_interface_private_vlan.rb +200 -576
  106. data/tests/test_interface_svi.rb +5 -52
  107. data/tests/test_interface_switchport.rb +80 -240
  108. data/tests/test_itd_device_group.rb +2 -2
  109. data/tests/test_itd_device_group_node.rb +2 -2
  110. data/tests/test_itd_service.rb +1 -1
  111. data/tests/test_name_server.rb +3 -3
  112. data/tests/test_node_ext.rb +15 -17
  113. data/tests/test_ntp_config.rb +1 -1
  114. data/tests/test_ntp_server.rb +3 -3
  115. data/tests/test_nxapi.rb +1 -0
  116. data/tests/test_overlay_global.rb +15 -19
  117. data/tests/test_pim.rb +5 -5
  118. data/tests/test_pim_group_list.rb +1 -37
  119. data/tests/test_pim_rp_address.rb +1 -1
  120. data/tests/test_platform.rb +9 -11
  121. data/tests/test_portchannel_global.rb +43 -3
  122. data/tests/test_radius_server.rb +1 -1
  123. data/tests/test_radius_server_group.rb +1 -1
  124. data/tests/test_router_bgp.rb +17 -30
  125. data/tests/test_router_ospf_area.rb +433 -0
  126. data/tests/test_router_ospf_area_vlink.rb +298 -0
  127. data/tests/test_router_ospf_vrf.rb +17 -0
  128. data/tests/test_snmp_notification_receiver.rb +11 -11
  129. data/tests/test_snmpcommunity.rb +177 -69
  130. data/tests/test_snmpgroup.rb +7 -7
  131. data/tests/test_snmpserver.rb +164 -253
  132. data/tests/test_snmpuser.rb +73 -69
  133. data/tests/test_stp_global.rb +15 -15
  134. data/tests/test_syslog_settings.rb +1 -1
  135. data/tests/test_tacacs_global.rb +80 -0
  136. data/tests/test_tacacs_server.rb +129 -51
  137. data/tests/test_tacacs_server_group.rb +3 -29
  138. data/tests/test_tacacs_server_host.rb +24 -27
  139. data/tests/test_vlan.rb +57 -59
  140. data/tests/test_vlan_private.rb +271 -284
  141. data/tests/test_vpc.rb +10 -4
  142. data/tests/test_vrf.rb +2 -0
  143. data/tests/test_vrf_af.rb +2 -5
  144. data/tests/test_vtp.rb +5 -2
  145. data/tests/test_vxlan_vtep.rb +20 -44
  146. data/tests/test_vxlan_vtep_vni.rb +23 -16
  147. data/tests/test_yang.rb +369 -0
  148. data/tests/test_yum.rb +34 -42
  149. data/tests/yum_package.yaml +35 -0
  150. metadata +31 -4
  151. data/tests/test_vlan_mt_full.rb +0 -85
@@ -19,7 +19,7 @@ require_relative '../lib/cisco_node_utils/bridge_domain'
19
19
  include Cisco
20
20
 
21
21
  # TestBdi - Minitest for Interface configuration of BDI interfaces.
22
- class TestBdi < CiscoTestCase
22
+ class TestInterfaceBdi < CiscoTestCase
23
23
  @@pre_clean_needed = true # rubocop:disable Style/ClassVars
24
24
  attr_reader :bdi
25
25
 
@@ -57,7 +57,7 @@ platform")
57
57
  super
58
58
  end
59
59
 
60
- def test_create_and_check_all_properties
60
+ def test_bdi
61
61
  # Check all the default values
62
62
  assert_equal(@bdi.default_vrf, @bdi.vrf)
63
63
  assert_equal(@bdi.default_ipv4_address, @bdi.ipv4_address)
@@ -16,7 +16,7 @@ require_relative 'ciscotest'
16
16
  require_relative '../lib/cisco_node_utils/interface_channel_group'
17
17
 
18
18
  # TestInterface - Minitest for general functionality of the Interface class.
19
- class TestInterfaceChannelGroup < CiscoTestCase
19
+ class TestInterfaceChanGrp < CiscoTestCase
20
20
  @@clean = false # rubocop:disable Style/ClassVars
21
21
  def setup
22
22
  super
@@ -138,6 +138,30 @@ class TestInterfaceOspf < CiscoTestCase
138
138
  'dead_interval'),
139
139
  interface.dead_interval,
140
140
  'Error: get dead interval failed')
141
+ assert_equal(node.config_get_default('interface_ospf',
142
+ 'bfd'),
143
+ interface.bfd,
144
+ 'Error: bfd get failed')
145
+ assert_equal(node.config_get_default('interface_ospf',
146
+ 'mtu_ignore'),
147
+ interface.mtu_ignore,
148
+ 'Error: mtu_ignore get failed')
149
+ assert_equal(node.config_get_default('interface_ospf',
150
+ 'priority'),
151
+ interface.priority,
152
+ 'Error: priority get failed')
153
+ assert_equal(node.config_get_default('interface_ospf',
154
+ 'network_type_default'),
155
+ interface.network_type,
156
+ 'Error: network type get failed')
157
+ assert_equal(node.config_get_default('interface_ospf',
158
+ 'shutdown'),
159
+ interface.shutdown,
160
+ 'Error: shutdown get failed')
161
+ assert_equal(node.config_get_default('interface_ospf',
162
+ 'transmit_delay'),
163
+ interface.transmit_delay,
164
+ 'Error: transmit_delay get failed')
141
165
  assert_equal(node.config_get_default('interface_ospf',
142
166
  'passive_interface'),
143
167
  interface.passive_interface,
@@ -154,13 +178,13 @@ class TestInterfaceOspf < CiscoTestCase
154
178
  end
155
179
  end
156
180
 
157
- def test_create_routerospf_nil
181
+ def test_routerospf_nil
158
182
  assert_raises(TypeError) do
159
183
  InterfaceOspf.new(interfaces[0], nil, '0.0.0.0')
160
184
  end
161
185
  end
162
186
 
163
- def test_create_interface_name_zero_length
187
+ def test_name_zero_length
164
188
  name = 'ospfTest'
165
189
  ospf = RouterOspf.new(name)
166
190
  assert_raises(ArgumentError) do
@@ -168,7 +192,7 @@ class TestInterfaceOspf < CiscoTestCase
168
192
  end
169
193
  end
170
194
 
171
- def test_create_interface_area_zero_length
195
+ def test_area_zero_length
172
196
  name = 'ospfTest'
173
197
  ospf = RouterOspf.new(name)
174
198
  assert_raises(ArgumentError) do
@@ -176,7 +200,7 @@ class TestInterfaceOspf < CiscoTestCase
176
200
  end
177
201
  end
178
202
 
179
- def test_routerospf_create_valid
203
+ def test_routerospf
180
204
  ospf = create_routerospf
181
205
  ifname = interfaces[1]
182
206
  area = '0.0.0.0'
@@ -211,17 +235,35 @@ class TestInterfaceOspf < CiscoTestCase
211
235
  refute_show_match(pattern: /^\s+ip ospf dead-interval \S+/,
212
236
  msg: "'dead-interval' not removed")
213
237
 
238
+ refute_show_match(pattern: /^\s+ip ospf bfd \S+/,
239
+ msg: "'bfd' not removed")
240
+
241
+ refute_show_match(pattern: /^\s+ip ospf mtu-ignore \S+/,
242
+ msg: "'mtu_ignore' not removed")
243
+
244
+ refute_show_match(pattern: /^\s+ip ospf shutdown \S+/,
245
+ msg: "'shutdown' not removed")
246
+
247
+ refute_show_match(pattern: /^\s+ip ospf transmit-delay \S+/,
248
+ msg: "'transmit_delay' not removed")
249
+
250
+ refute_show_match(pattern: /^\s+ip ospf priority \S+/,
251
+ msg: "'priority' not removed")
252
+
253
+ refute_show_match(pattern: /^\s+ip ospf network point-to-point/,
254
+ msg: "'network_type' not removed")
255
+
214
256
  refute_show_match(pattern: /^\s+ip ospf passive-interface/,
215
257
  msg: "'passive interface' not removed")
216
258
  end
217
259
 
218
- def test_routerospf_get_parent
260
+ def test_get_parent
219
261
  ospf = create_routerospf
220
262
  interface = create_interfaceospf(ospf)
221
263
  assert_equal(ospf.name, interface.ospf_name)
222
264
  end
223
265
 
224
- def test_cost_invalid_range
266
+ def test_cost_inv
225
267
  ospf = create_routerospf
226
268
  interface = create_interfaceospf(ospf)
227
269
  # upper range
@@ -250,7 +292,7 @@ class TestInterfaceOspf < CiscoTestCase
250
292
  msg: 'Error: default cost set failed')
251
293
  end
252
294
 
253
- def test_hello_interval_invalid_range
295
+ def test_hello_inv
254
296
  ospf = create_routerospf
255
297
  interface = create_interfaceospf(ospf)
256
298
  # upper range
@@ -263,7 +305,7 @@ class TestInterfaceOspf < CiscoTestCase
263
305
  end
264
306
  end
265
307
 
266
- def test_hello_interval
308
+ def test_hello
267
309
  ospf = create_routerospf
268
310
  interface = create_interfaceospf(ospf)
269
311
  interval = 90
@@ -280,7 +322,7 @@ class TestInterfaceOspf < CiscoTestCase
280
322
  msg: 'Error: default hello-interval set failed')
281
323
  end
282
324
 
283
- def test_dead_interval_invalid_range
325
+ def test_dead_inv
284
326
  ospf = create_routerospf
285
327
  interface = create_interfaceospf(ospf)
286
328
 
@@ -297,7 +339,7 @@ class TestInterfaceOspf < CiscoTestCase
297
339
  end
298
340
  end
299
341
 
300
- def test_dead_interval
342
+ def test_dead
301
343
  ospf = create_routerospf
302
344
  interface = create_interfaceospf(ospf)
303
345
  interval = 150
@@ -314,7 +356,51 @@ class TestInterfaceOspf < CiscoTestCase
314
356
  msg: 'Error: default dead-interval set failed')
315
357
  end
316
358
 
317
- def test_passive_interface
359
+ def test_bfd
360
+ ospf = create_routerospf
361
+ interface = create_interfaceospf(ospf)
362
+ assert_equal(interface.default_bfd, interface.bfd)
363
+ interface.bfd = true
364
+ assert_equal(true, interface.bfd)
365
+ interface.bfd = false
366
+ assert_equal(false, interface.bfd)
367
+ interface.bfd = interface.default_bfd
368
+ assert_equal(interface.default_bfd, interface.bfd)
369
+ end
370
+
371
+ def test_mtu_ignore
372
+ ospf = create_routerospf
373
+ interface = create_interfaceospf(ospf)
374
+ assert_equal(interface.default_mtu_ignore, interface.mtu_ignore)
375
+ interface.mtu_ignore = true
376
+ assert_equal(true, interface.mtu_ignore)
377
+ interface.mtu_ignore = interface.default_mtu_ignore
378
+ assert_equal(interface.default_mtu_ignore, interface.mtu_ignore)
379
+ end
380
+
381
+ def test_network_type
382
+ ospf = create_routerospf
383
+ interface = create_interfaceospf(ospf)
384
+
385
+ assert_equal(interface.default_network_type, interface.network_type)
386
+ interface.network_type = 'p2p'
387
+ assert_equal('p2p', interface.network_type)
388
+ interface.network_type = interface.default_network_type
389
+ assert_equal(interface.default_network_type, interface.network_type)
390
+
391
+ # setup a loopback to use
392
+ config('interface loopback12')
393
+ interface = InterfaceOspf.new('loopback12', '12', '0.0.0.0')
394
+ assert_equal(interface.default_network_type, interface.network_type)
395
+ interface.network_type = 'p2p'
396
+ assert_equal('p2p', interface.network_type)
397
+ interface.network_type = interface.default_network_type
398
+ assert_equal(interface.default_network_type, interface.network_type)
399
+ # cleanup
400
+ config('no interface loopback12')
401
+ end
402
+
403
+ def test_passive
318
404
  ospf = create_routerospf
319
405
  interface = create_interfaceospf(ospf)
320
406
 
@@ -331,7 +417,37 @@ class TestInterfaceOspf < CiscoTestCase
331
417
  msg: 'default passive interface set failed')
332
418
  end
333
419
 
334
- def test_create_valid_multiple
420
+ def test_priority
421
+ ospf = create_routerospf
422
+ interface = create_interfaceospf(ospf)
423
+ assert_equal(interface.default_priority, interface.priority)
424
+ interface.priority = 100
425
+ assert_equal(100, interface.priority)
426
+ interface.priority = interface.default_priority
427
+ assert_equal(interface.default_priority, interface.priority)
428
+ end
429
+
430
+ def test_shutdown
431
+ ospf = create_routerospf
432
+ interface = create_interfaceospf(ospf)
433
+ assert_equal(interface.default_shutdown, interface.shutdown)
434
+ interface.shutdown = true
435
+ assert_equal(true, interface.shutdown)
436
+ interface.shutdown = interface.default_shutdown
437
+ assert_equal(interface.default_shutdown, interface.shutdown)
438
+ end
439
+
440
+ def test_transmit_delay
441
+ ospf = create_routerospf
442
+ interface = create_interfaceospf(ospf)
443
+ assert_equal(interface.default_transmit_delay, interface.transmit_delay)
444
+ interface.transmit_delay = 400
445
+ assert_equal(400, interface.transmit_delay)
446
+ interface.transmit_delay = interface.default_transmit_delay
447
+ assert_equal(interface.default_transmit_delay, interface.transmit_delay)
448
+ end
449
+
450
+ def test_mult
335
451
  # ospf and interfaces[0]
336
452
  ospf = create_routerospf
337
453
  interface = create_interfaceospf(ospf)
@@ -339,7 +455,6 @@ class TestInterfaceOspf < CiscoTestCase
339
455
  pattern: /\s+ip router ospf #{ospf.name} area #{interface.area}/,
340
456
  msg: "'ip router ospf #{ospf.name} default area' not configured")
341
457
 
342
- # ospf and interfaces_id[2]
343
458
  ifname = interfaces[2]
344
459
  area = '1.1.1.1'
345
460
  create_interfaceospf(ospf, ifname, area)
@@ -348,12 +463,11 @@ class TestInterfaceOspf < CiscoTestCase
348
463
  msg: "'ip router ospf #{ospf.name} area #{area}' is not configured")
349
464
  end
350
465
 
351
- def test_create_multiple_delete_one
466
+ def test_mult_delete_one
352
467
  # ospf and interfaces[0]
353
468
  ospf = create_routerospf
354
469
  interface = create_interfaceospf(ospf)
355
470
 
356
- # ospf and interfaces_id[2]
357
471
  ifname = interfaces[2]
358
472
  area = '1.1.1.1'
359
473
  interface1 = create_interfaceospf(ospf, ifname, area)
@@ -361,7 +475,6 @@ class TestInterfaceOspf < CiscoTestCase
361
475
  "Error: 'ip router ospf #{ospf.name} area #{area}' " \
362
476
  'not configured')
363
477
 
364
- # delete ospf instance from interfaces_id[2]
365
478
  interface1.destroy
366
479
  refute_show_match(
367
480
  command: show_cmd(ifname),
@@ -389,9 +502,14 @@ class TestInterfaceOspf < CiscoTestCase
389
502
  end
390
503
  # puts "k1: #{k1}, k: #{k}, area #{v1[:area]}"
391
504
  cfg << "ip router ospf #{k} area #{v1[:area]}"
505
+ cfg << 'ip ospf bfd' if v1[:bfd]
506
+ cfg << 'ip ospf bfd disable' if v1[:bfd] == false
507
+ cfg << 'no ip ospf bfd' if v1[:bfd].nil?
392
508
  cfg << "ip ospf cost #{v1[:cost]}" unless v1[:cost] == 0
393
509
  cfg << "ip ospf hello-interval #{v1[:hello]}" unless v1[:hello].nil?
394
510
  cfg << "ip ospf dead-interval #{v1[:dead]}" unless v1[:dead].nil?
511
+ cfg << 'ip ospf network point-to-point' if v1[:net] == 'p2p'
512
+ cfg << 'no ip ospf network' if v1[:net] == 'broadcast'
395
513
  cfg << 'ip ospf passive-interface' if !v1[:pass].nil? &&
396
514
  v1[:pass] == true
397
515
  config(*cfg)
@@ -404,37 +522,44 @@ class TestInterfaceOspf < CiscoTestCase
404
522
  hash = {
405
523
  'ospfTest' => {
406
524
  interfaces[0].downcase => {
407
- area: '0.0.0.0', cost: 10, hello: 30, dead: 120, pass: true },
525
+ area: '0.0.0.0', bfd: true, cost: 10, hello: 30,
526
+ dead: 120, net: 'p2p', pass: true },
408
527
  interfaces[1].downcase => {
409
- area: '1.1.1.38', dead: 40, pass: false },
528
+ area: '1.1.1.38', bfd: false, dead: 40, net: 'p2p', pass: false },
410
529
  'vlan101' => {
411
- area: '2.2.2.101', cost: 5, hello: 20, dead: 80, pass: true },
530
+ area: '2.2.2.101', bfd: true, cost: 5, hello: 20, dead: 80,
531
+ net: 'p2p', pass: true },
412
532
  },
413
533
  'TestOspfInt' => {
414
534
  interfaces[2].downcase => {
415
535
  area: '0.0.0.19' },
416
536
  'vlan290' => {
417
- area: '2.2.2.29', cost: 200, hello: 30, dead: 120, pass: true },
537
+ area: '2.2.2.29', bfd: true, cost: 200, hello: 30,
538
+ dead: 120, net: 'broadcast', pass: true },
418
539
  'port-channel100' => {
419
- area: '3.2.2.29', cost: 25, hello: 50, dead: 200, pass: false },
540
+ area: '3.2.2.29', bfd: false, cost: 25, hello: 50, dead: 200,
541
+ net: 'p2p', pass: false },
420
542
  },
421
543
  }
422
544
  # rubocop:enable Style/AlignHash
423
545
  # Set defaults
424
546
  hash.each_key do |name|
425
547
  hash[name].each_value do |hv|
548
+ hv[:bfd] ||= node.config_get_default('interface_ospf', 'bfd')
426
549
  hv[:cost] ||= node.config_get_default('interface_ospf', 'cost')
427
550
  hv[:hello] ||= node.config_get_default('interface_ospf',
428
551
  'hello_interval')
429
552
  hv[:dead] ||= node.config_get_default('interface_ospf',
430
553
  'dead_interval')
554
+ hv[:net] ||= node.config_get_default('interface_ospf',
555
+ 'network_type_default')
431
556
  hv[:pass] ||= node.config_get_default('interface_ospf',
432
557
  'passive_interface')
433
558
  end
434
559
  end
435
560
  end
436
561
 
437
- def test_collection_multiple_interface
562
+ def test_collect_mult_intf
438
563
  s = config('int port-channel 42', 'descr foo')
439
564
  known_failure = s[/ERROR:.*port channel not present/]
440
565
  refute(known_failure, 'ERROR: port channel not present')
@@ -444,6 +569,7 @@ class TestInterfaceOspf < CiscoTestCase
444
569
  # enable feature ospf
445
570
  config('no feature ospf',
446
571
  'feature ospf',
572
+ 'feature bfd',
447
573
  'feature interface-vlan',
448
574
  "default interface #{interfaces[0]}",
449
575
  "default interface #{interfaces[1]}",
@@ -471,11 +597,14 @@ class TestInterfaceOspf < CiscoTestCase
471
597
  msg: "Error: ip router ospf #{name} area #{hv[:area]} "\
472
598
  "not found under #{ifname}")
473
599
 
600
+ assert_equal(hv[:bfd], interface.bfd, 'Error: get bfd failed')
474
601
  assert_equal(hv[:cost], interface.cost, 'Error: get cost failed')
475
602
  assert_equal(hv[:hello], interface.hello_interval,
476
603
  'Error: get hello interval failed')
477
604
  assert_equal(hv[:dead], interface.dead_interval,
478
605
  'Error: get dead interval failed')
606
+ assert_equal(hv[:net], interface.network_type,
607
+ 'Error: network_type get failed')
479
608
  assert_equal(hv[:pass], interface.passive_interface,
480
609
  'Error: passive interface get failed')
481
610
  end
@@ -484,6 +613,7 @@ class TestInterfaceOspf < CiscoTestCase
484
613
 
485
614
  # disable feature interface-vlan
486
615
  config('no feature interface-vlan')
616
+ config('no feature bfd')
487
617
  # clean up port channel
488
618
  ospf_h.each_value do |v|
489
619
  v.each_key do |k1|
@@ -577,7 +707,7 @@ class TestInterfaceOspf < CiscoTestCase
577
707
  assert_equal(encr, interface.message_digest_encryption_type)
578
708
  end
579
709
 
580
- def test_message_digest_key_invalid_password
710
+ def test_message_digest_key_inv
581
711
  ospf = create_routerospf
582
712
  interface = create_interfaceospf(ospf)
583
713
 
@@ -41,7 +41,16 @@ class TestInterfacePortChannel < CiscoTestCase
41
41
  InterfacePortChannel.new(ifname)
42
42
  end
43
43
 
44
- def test_get_set_port_hash_distribution
44
+ def test_bfd_per_link
45
+ interface = create_port_channel
46
+ assert_equal(interface.default_bfd_per_link, interface.bfd_per_link)
47
+ interface.bfd_per_link = true
48
+ assert_equal(true, interface.bfd_per_link)
49
+ interface.bfd_per_link = interface.default_bfd_per_link
50
+ assert_equal(interface.default_bfd_per_link, interface.bfd_per_link)
51
+ end
52
+
53
+ def test_port_hash_distribution
45
54
  skip('Platform does not support this property') if n6k_platform?
46
55
  interface = create_port_channel
47
56
  interface.port_hash_distribution = 'adaptive'
@@ -54,7 +63,7 @@ class TestInterfacePortChannel < CiscoTestCase
54
63
  interface.port_hash_distribution)
55
64
  end
56
65
 
57
- def test_get_set_lacp_graceful_convergence
66
+ def test_lacp_graceful_convergence
58
67
  interface = create_port_channel
59
68
  interface.lacp_graceful_convergence = false
60
69
  assert_equal(false, interface.lacp_graceful_convergence)
@@ -64,7 +73,7 @@ class TestInterfacePortChannel < CiscoTestCase
64
73
  interface.lacp_graceful_convergence)
65
74
  end
66
75
 
67
- def test_get_set_lacp_min_links
76
+ def test_lacp_min_links
68
77
  interface = create_port_channel
69
78
  interface.lacp_min_links = 5
70
79
  assert_equal(5, interface.lacp_min_links)
@@ -73,7 +82,7 @@ class TestInterfacePortChannel < CiscoTestCase
73
82
  interface.lacp_min_links)
74
83
  end
75
84
 
76
- def test_get_set_lacp_max_bundle
85
+ def test_lacp_max_bundle
77
86
  interface = create_port_channel
78
87
  interface.lacp_max_bundle = 10
79
88
  assert_equal(10, interface.lacp_max_bundle)
@@ -83,7 +92,7 @@ class TestInterfacePortChannel < CiscoTestCase
83
92
  interface.lacp_max_bundle)
84
93
  end
85
94
 
86
- def test_get_set_lacp_suspend_individual
95
+ def test_lacp_suspend_individual
87
96
  interface = create_port_channel
88
97
  interface.lacp_suspend_individual = false
89
98
  assert_equal(false, interface.lacp_suspend_individual)
@@ -93,7 +102,7 @@ class TestInterfacePortChannel < CiscoTestCase
93
102
  interface.lacp_suspend_individual)
94
103
  end
95
104
 
96
- def test_get_set_port_load_defer
105
+ def test_port_load_defer
97
106
  skip('Platform does not support this property') if n6k_platform?
98
107
  interface = create_port_channel
99
108
  interface.port_load_defer = true
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2014-2016 Cisco and/or its affiliates.
1
+ # Copyright (c) 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.
@@ -18,18 +18,25 @@ require_relative '../lib/cisco_node_utils/vlan'
18
18
 
19
19
  include Cisco
20
20
 
21
- # TestInterfaceSwitchport
21
+ # TestInterfacePrivateVlan
22
22
  # Parent class for specific types of switchport tests (below)
23
- class TestInterfaceSwitchport < CiscoTestCase
24
- @@pre_clean_needed = true # rubocop:disable Style/ClassVars
25
- attr_reader :interface
23
+ class TestInterfacePVlan < CiscoTestCase
24
+ # rubocop:disable Style/ClassVars
25
+ @@pre_clean_needed = true
26
+ attr_reader :i
27
+
28
+ def i
29
+ @@interface
30
+ end
26
31
 
27
32
  def setup
28
33
  super
29
- @interface = Interface.new(interfaces[0])
30
- cleanup if @@pre_clean_needed
31
- @@pre_clean_needed = false # rubocop:disable Style/ClassVars
34
+ return unless @@pre_clean_needed
35
+ cleanup
36
+ @@interface = Interface.new(interfaces[0])
37
+ @@pre_clean_needed = false
32
38
  end
39
+ # rubocop:enable Style/ClassVars
33
40
 
34
41
  def teardown
35
42
  cleanup
@@ -37,688 +44,305 @@ class TestInterfaceSwitchport < CiscoTestCase
37
44
  end
38
45
 
39
46
  def cleanup
40
- remove_svis
41
- cleanup_pvlan_intfs
47
+ interface_cleanup_pvlan
42
48
  remove_all_vlans
43
49
  config_no_warn('no feature private-vlan', 'no feature vtp')
44
50
  end
45
51
 
46
- def remove_svis
47
- Interface.interfaces.each do |name, _i|
48
- next unless name[/vlan/] || name.match(/^vlan1$/)
49
- config("no interface #{name}")
50
- end
51
- end
52
-
53
- def cleanup_pvlan_intfs
54
- pvlan_intfs = Interface.interfaces(:private_vlan_any)
52
+ def interface_cleanup_pvlan
53
+ pvlan_intfs = Interface.interfaces(:pvlan_any)
55
54
  pvlan_intfs.keys.each { |name| interface_cleanup(name) }
56
55
  end
57
- end
58
56
 
59
- # TestSwitchport - general interface switchport tests.
60
- class TestSwitchport < TestInterfaceSwitchport
61
- def test_interface_switchport_private_host_mode
62
- if validate_property_excluded?('interface',
63
- 'switchport_mode_private_vlan_host')
57
+ def test_pvlan_mapping
58
+ # This is an SVI property
59
+ svi = Interface.new('vlan13')
60
+ if validate_property_excluded?('interface', 'pvlan_mapping')
64
61
  assert_raises(Cisco::UnsupportedError) do
65
- interface.switchport_mode_private_vlan_host = :host
62
+ svi.pvlan_mapping = ['10-11,4-7,8']
66
63
  end
67
64
  return
68
65
  end
69
- switchport_modes = [
70
- :host,
71
- :promiscuous,
72
- ]
73
-
74
- switchport_modes.each do |start|
75
- interface.switchport_mode_private_vlan_host = start
76
- assert_equal(start, interface.switchport_mode_private_vlan_host,
77
- "Err: Switchport mode, #{start}, not as expected")
78
- end
79
- end
80
66
 
81
- def test_interface_switchport_private_trunk_promisc
82
- if validate_property_excluded?(
83
- 'interface',
84
- 'switchport_mode_private_vlan_trunk_secondary')
85
- assert_raises(Cisco::UnsupportedError) do
86
- interface.switchport_mode_private_vlan_trunk_promiscuous = true
87
- end
88
- return
89
- end
90
- interface.switchport_mode_private_vlan_trunk_promiscuous = true
91
- assert(interface.switchport_mode_private_vlan_trunk_promiscuous,
92
- 'Err: Switchport mode, not as expected')
93
- end
67
+ default = svi.default_pvlan_mapping
68
+ assert_equal(default, svi.pvlan_mapping)
94
69
 
95
- def test_interface_switchport_private_trunk_secondary
96
- if validate_property_excluded?(
97
- 'interface',
98
- 'switchport_mode_private_vlan_trunk_secondary')
99
- assert_raises(Cisco::UnsupportedError) do
100
- interface.switchport_mode_private_vlan_trunk_secondary = true
101
- end
102
- return
103
- end
104
- interface.switchport_mode_private_vlan_trunk_secondary = true
105
- assert(interface.switchport_mode_private_vlan_trunk_secondary,
106
- 'Err: Switchport mode, not as expected')
107
- end
70
+ # Input can be Array or String
71
+ svi.pvlan_mapping = ['10-11,4-7,8']
72
+ assert_equal(['4-8,10-11'], svi.pvlan_mapping)
108
73
 
109
- def test_interface_no_switchport_private_host_mode
110
- if validate_property_excluded?('interface',
111
- 'switchport_mode_private_vlan_host')
112
- assert_raises(Cisco::UnsupportedError) do
113
- interface.switchport_mode_private_vlan_host = :host
114
- end
115
- return
116
- end
117
- switchport_modes = [
118
- :host,
119
- :promiscuous,
120
- ]
121
-
122
- switchport_modes.each do |start|
123
- interface.switchport_mode_private_vlan_host = start
124
- assert_equal(start, interface.switchport_mode_private_vlan_host,
125
- "Err: Switchport mode, #{start}, not as expected")
126
- interface.switchport_mode_private_vlan_host = :disabled
127
- assert_equal(:disabled, interface.switchport_mode_private_vlan_host,
128
- 'Error: Switchport mode not disabled')
129
- end
130
- end
74
+ # Change range
75
+ svi.pvlan_mapping = '11,4-6,8'
76
+ assert_equal(['4-6,8,11'], svi.pvlan_mapping)
131
77
 
132
- def test_interface_no_switchport_private_trunk_mode
133
- if validate_property_excluded?(
134
- 'interface',
135
- 'switchport_mode_private_vlan_trunk_secondary')
136
- assert_raises(Cisco::UnsupportedError) do
137
- interface.switchport_mode_private_vlan_trunk_secondary = true
138
- end
139
- return
140
- end
141
- interface.switchport_mode_private_vlan_trunk_secondary = true
142
- assert(interface.switchport_mode_private_vlan_trunk_secondary,
143
- 'Err: Switchport mode not as expected')
144
- interface.switchport_mode_private_vlan_trunk_secondary = false
145
- refute(interface.switchport_mode_private_vlan_trunk_secondary,
146
- 'Err: Switchport mode not disabled')
78
+ svi.pvlan_mapping = default
79
+ assert_equal(default, svi.pvlan_mapping)
147
80
  end
148
81
 
149
- def test_interface_switchport_private_host_association
82
+ def test_switchport_pvlan_host
150
83
  if validate_property_excluded?('interface',
151
- 'switchport_mode_private_vlan_host')
84
+ 'switchport_pvlan_host')
152
85
  assert_raises(Cisco::UnsupportedError) do
153
- interface.switchport_mode_private_vlan_host = :host
86
+ i.switchport_pvlan_host = true
154
87
  end
155
88
  return
156
89
  end
157
- v1 = Vlan.new(10)
158
- v1.private_vlan_type = 'primary'
159
- v2 = Vlan.new(11)
160
- v2.private_vlan_type = 'community'
161
- v1.private_vlan_association = ['11']
162
-
163
- interface.switchport_mode_private_vlan_host = :host
164
- assert_equal(:host, interface.switchport_mode_private_vlan_host,
165
- 'Err: Switchport mode not as expected')
166
-
167
- input = %w(10 11)
168
-
169
- interface.switchport_mode_private_vlan_host_association = input
170
- assert_equal(input,
171
- interface.switchport_mode_private_vlan_host_association,
172
- 'Err: switchport private host_association not configured')
173
- end
174
90
 
175
- def test_interface_switchport_pvlan_host_assoc_change
176
- if validate_property_excluded?('interface',
177
- 'switchport_mode_private_vlan_host')
178
- assert_raises(Cisco::UnsupportedError) do
179
- interface.switchport_mode_private_vlan_host = :host
180
- end
181
- return
182
- end
183
- v1 = Vlan.new(10)
184
- v1.private_vlan_type = 'primary'
185
- v2 = Vlan.new(11)
186
- v2.private_vlan_type = 'community'
187
- v1.private_vlan_association = ['11']
188
-
189
- interface.switchport_mode_private_vlan_host = :host
190
- assert_equal(:host, interface.switchport_mode_private_vlan_host,
191
- 'Error: Switchport mode not as expected')
192
-
193
- input = %w(10 11)
194
-
195
- interface.switchport_mode_private_vlan_host_association = input
196
- assert_equal(input,
197
- interface.switchport_mode_private_vlan_host_association,
198
- 'Err: switchport private host_association not configured')
199
-
200
- v3 = Vlan.new(20)
201
- v3.private_vlan_type = 'primary'
202
-
203
- v4 = Vlan.new(21)
204
- v4.private_vlan_type = 'community'
205
- v3.private_vlan_association = ['21']
206
-
207
- input = %w(20 21)
208
- interface.switchport_mode_private_vlan_host_association = input
209
- assert_equal(input,
210
- interface.switchport_mode_private_vlan_host_association,
211
- 'Err: switchport private host_association not configured')
212
-
213
- input = []
214
- interface.switchport_mode_private_vlan_host_association = input
215
- assert_equal(input,
216
- interface.switchport_mode_private_vlan_host_association,
217
- 'Err: switchport private host_association not configured')
218
- end
91
+ assert_equal(i.default_switchport_pvlan_host,
92
+ i.switchport_pvlan_host)
219
93
 
220
- def test_interface_switchport_no_pvlan_host_assoc
221
- if validate_property_excluded?('interface',
222
- 'switchport_mode_private_vlan_host')
94
+ i.switchport_pvlan_host = true
95
+ assert(i.switchport_pvlan_host)
223
96
 
224
- assert_raises(Cisco::UnsupportedError) do
225
- interface.switchport_mode_private_vlan_host = :host
226
- end
227
- return
228
- end
229
- v1 = Vlan.new(10)
230
- v1.private_vlan_type = 'primary'
231
- v2 = Vlan.new(11)
232
- v2.private_vlan_type = 'community'
233
- v1.private_vlan_association = ['11']
234
-
235
- input = %w(10 11)
236
- interface.switchport_mode_private_vlan_host = :host
237
- assert_equal(:host, interface.switchport_mode_private_vlan_host,
238
- 'Err: Switchport mode not as expected')
239
- interface.switchport_mode_private_vlan_host_association = input
240
- assert_equal(input,
241
- interface.switchport_mode_private_vlan_host_association,
242
- 'Err: switchport private host_association not configured')
243
- input = []
244
- interface.switchport_mode_private_vlan_host_association = input
245
- assert_equal(input,
246
- interface.switchport_mode_private_vlan_host_association,
247
- 'Err: switchport private host_association not configured')
97
+ i.switchport_pvlan_host = false
98
+ refute(i.switchport_pvlan_host)
248
99
  end
249
100
 
250
- def test_interface_switchport_pvlan_host_assoc_default
101
+ def test_sw_pvlan_promiscuous
251
102
  if validate_property_excluded?('interface',
252
- 'switchport_mode_private_vlan_host')
253
-
103
+ 'switchport_pvlan_promiscuous')
254
104
  assert_raises(Cisco::UnsupportedError) do
255
- interface.switchport_mode_private_vlan_host = :host
105
+ i.switchport_pvlan_promiscuous = true
256
106
  end
257
107
  return
258
108
  end
259
- val = interface.default_switchport_mode_private_vlan_host_association
260
- assert_equal(val, interface.switchport_mode_private_vlan_host_association,
261
- 'Err: host association failed')
109
+
110
+ assert_equal(i.default_switchport_pvlan_promiscuous,
111
+ i.switchport_pvlan_promiscuous)
112
+
113
+ i.switchport_pvlan_promiscuous = true
114
+ assert(i.switchport_pvlan_promiscuous)
115
+
116
+ i.switchport_pvlan_promiscuous = false
117
+ refute(i.switchport_pvlan_promiscuous)
262
118
  end
263
119
 
264
- def test_interface_switchport_pvlan_host_assoc_bad_arg
120
+ def test_sw_pvlan_trunk_promiscuous
265
121
  if validate_property_excluded?('interface',
266
- 'switchport_mode_private_vlan_host')
267
-
122
+ 'switchport_pvlan_trunk_promiscuous')
268
123
  assert_raises(Cisco::UnsupportedError) do
269
- interface.switchport_mode_private_vlan_host = :host
124
+ i.switchport_pvlan_trunk_promiscuous = true
270
125
  end
271
126
  return
272
127
  end
273
- interface.switchport_mode_private_vlan_host = :host
274
- assert_equal(:host, interface.switchport_mode_private_vlan_host,
275
- 'Err: Switchport mode not as expected')
276
128
 
277
- input = %w(10)
278
- assert_raises(CliError) do
279
- interface.switchport_mode_private_vlan_host_association = input
280
- end
129
+ assert_equal(i.default_switchport_pvlan_trunk_promiscuous,
130
+ i.switchport_pvlan_trunk_promiscuous)
281
131
 
282
- input = %w(10 ten)
283
- assert_raises(CliError) do
284
- interface.switchport_mode_private_vlan_host_association = input
285
- end
132
+ i.switchport_pvlan_trunk_promiscuous = true
133
+ assert(i.switchport_pvlan_trunk_promiscuous)
286
134
 
287
- input = %w(10,12)
288
- assert_raises(CliError) do
289
- interface.switchport_mode_private_vlan_host_association = input
290
- end
291
-
292
- input = %w(10 10)
293
- assert_raises(RuntimeError,
294
- 'host association did not raise RuntimeError') do
295
- interface.switchport_mode_private_vlan_host_association = input
296
- end
135
+ i.switchport_pvlan_trunk_promiscuous = false
136
+ refute(i.switchport_pvlan_trunk_promiscuous)
297
137
  end
298
138
 
299
- def test_interface_switchport_pvlan_host_primisc_default
139
+ def test_sw_pvlan_trunk_secondary
300
140
  if validate_property_excluded?('interface',
301
- 'switchport_mode_private_vlan_host')
302
-
141
+ 'switchport_pvlan_trunk_secondary')
303
142
  assert_raises(Cisco::UnsupportedError) do
304
- interface.switchport_mode_private_vlan_host = :host
143
+ i.switchport_pvlan_trunk_secondary = true
305
144
  end
306
145
  return
307
146
  end
308
- val = interface.default_switchport_mode_private_vlan_host_promisc
309
- assert_equal(val, interface.switchport_mode_private_vlan_host_promisc,
310
- 'Err: promisc association failed')
147
+
148
+ assert_equal(i.default_switchport_pvlan_trunk_secondary,
149
+ i.switchport_pvlan_trunk_secondary)
150
+
151
+ i.switchport_pvlan_trunk_secondary = true
152
+ assert(i.switchport_pvlan_trunk_secondary)
153
+
154
+ i.switchport_pvlan_trunk_secondary = false
155
+ refute(i.switchport_pvlan_trunk_secondary)
311
156
  end
312
157
 
313
- def test_interface_switchport_private_host_promisc
314
- if validate_property_excluded?('interface',
315
- 'switchport_mode_private_vlan_host')
158
+ # Helper to setup vlan associations
159
+ def vlan_associate(pri, range)
160
+ Vlan.new(pri).pvlan_type = 'primary'
161
+ secondaries = Utils.dash_range_to_elements(range)
162
+ secondaries.each { |vlan| Vlan.new(vlan).pvlan_type = 'community' }
316
163
 
317
- assert_raises(Cisco::UnsupportedError) do
318
- interface.switchport_mode_private_vlan_host = :host
319
- end
320
- return
321
- end
322
- v1 = Vlan.new(10)
323
- v1.private_vlan_type = 'primary'
324
- v2 = Vlan.new(11)
325
- v2.private_vlan_type = 'community'
326
- v1.private_vlan_association = ['11']
327
-
328
- input = %w(10 11)
329
- interface.switchport_mode_private_vlan_host = :promiscuous
330
- assert_equal(:promiscuous,
331
- interface.switchport_mode_private_vlan_host,
332
- 'Error: Switchport mode not as expected')
333
- interface.switchport_mode_private_vlan_host_promisc = input
334
- assert_equal(input,
335
- interface.switchport_mode_private_vlan_host_promisc,
336
- 'Error: switchport private host promisc not configured')
337
-
338
- v3 = Vlan.new(12)
339
- v3.private_vlan_type = 'community'
340
-
341
- v1.private_vlan_association = ['12']
342
- input = %w(10 12)
343
- interface.switchport_mode_private_vlan_host_promisc = input
344
- assert_equal(input,
345
- interface.switchport_mode_private_vlan_host_promisc,
346
- 'Error: switchport private host promisc not configured')
347
-
348
- v4 = Vlan.new(12)
349
- v4.private_vlan_type = 'community'
350
-
351
- v5 = Vlan.new(13)
352
- v5.private_vlan_type = 'community'
353
-
354
- v6 = Vlan.new(18)
355
- v6.private_vlan_type = 'community'
356
-
357
- v7 = Vlan.new(30)
358
- v7.private_vlan_type = 'community'
359
-
360
- v1.private_vlan_association = ['12-13', '18', '30']
361
- input = %w(10 12-13,18,30)
362
- interface.switchport_mode_private_vlan_host_promisc = input
363
- assert_equal(input,
364
- interface.switchport_mode_private_vlan_host_promisc,
365
- 'Error: switchport private host promisc not configured')
164
+ Vlan.new(pri).pvlan_association = range
366
165
  end
367
166
 
368
- def test_interface_switchport_private_host_promisc_bad_arg
167
+ def test_sw_pvlan_host_association
168
+ # Supports single instance of [pri, sec]
369
169
  if validate_property_excluded?('interface',
370
- 'switchport_mode_private_vlan_host')
371
-
170
+ 'switchport_pvlan_host_association')
372
171
  assert_raises(Cisco::UnsupportedError) do
373
- interface.switchport_mode_private_vlan_host = :host
172
+ i.switchport_pvlan_host_association = %w(2 3)
374
173
  end
375
174
  return
376
175
  end
377
176
 
378
- input = %w(10)
379
- interface.switchport_mode_private_vlan_host = :promiscuous
380
- assert_equal(:promiscuous, interface.switchport_mode_private_vlan_host,
381
- 'Error: Switchport mode not as expected')
177
+ default = i.default_switchport_pvlan_host_association
178
+ assert_equal(default, i.switchport_pvlan_host_association)
382
179
 
383
- assert_raises(TypeError, 'private vlan host promisc raise typeError') do
384
- interface.switchport_mode_private_vlan_host_promisc = input
385
- end
386
-
387
- input = %w(10,)
388
- assert_raises(TypeError, 'private vlan host promisc raise typeError') do
389
- interface.switchport_mode_private_vlan_host_promisc = input
390
- end
391
-
392
- input = %w(10 11 12)
393
-
394
- assert_raises(TypeError, 'private vlan host promisc raise typeError') do
395
- interface.switchport_mode_private_vlan_host_promisc = input
396
- end
397
-
398
- input = %w(10 ten)
399
- assert_raises(CliError) do
400
- interface.switchport_mode_private_vlan_host_promisc = input
401
- end
180
+ # Setup prerequisites
181
+ vlan_associate('2', '3')
402
182
 
403
- input = %w(10 10)
404
- assert_raises(CliError) do
405
- interface.switchport_mode_private_vlan_host_promisc = input
406
- end
183
+ i.switchport_pvlan_host_association = %w(2 3)
184
+ assert_equal(%w(2 3), i.switchport_pvlan_host_association)
407
185
 
408
- input = %w(10 10)
409
- assert_raises(RuntimeError,
410
- 'promisc association did not raise RuntimeError') do
411
- interface.switchport_mode_private_vlan_host_promisc = input
412
- end
186
+ i.switchport_pvlan_host_association = default
187
+ assert_equal(default, i.switchport_pvlan_host_association)
413
188
  end
414
189
 
415
- def test_interface_no_switchport_private_host_promisc
190
+ def test_sw_pvlan_trunk_association
191
+ # Supports multiple instances of [[pri, sec], [pri2, sec2]]
416
192
  if validate_property_excluded?('interface',
417
- 'switchport_mode_private_vlan_host')
418
-
193
+ 'switchport_pvlan_trunk_association')
419
194
  assert_raises(Cisco::UnsupportedError) do
420
- interface.switchport_mode_private_vlan_host = :host
195
+ i.switchport_pvlan_trunk_association = %w(2 3)
421
196
  end
422
197
  return
423
198
  end
424
- v1 = Vlan.new(10)
425
- v1.private_vlan_type = 'primary'
426
-
427
- v2 = Vlan.new(11)
428
- v2.private_vlan_type = 'community'
429
- v1.private_vlan_association = ['11']
430
-
431
- input = %w(10 11)
432
- interface.switchport_mode_private_vlan_host = :promiscuous
433
- assert_equal(:promiscuous, interface.switchport_mode_private_vlan_host,
434
- 'Error: Switchport mode not as expected')
435
-
436
- interface.switchport_mode_private_vlan_host_promisc = input
437
- assert_equal(input, interface.switchport_mode_private_vlan_host_promisc,
438
- 'Error: switchport private host promisc not configured')
439
- input = []
440
- interface.switchport_mode_private_vlan_host_promisc = input
441
- assert_equal(input, interface.switchport_mode_private_vlan_host_promisc,
442
- 'Error: switchport private host promisc not configured')
443
- end
444
199
 
445
- def test_interface_switchport_pvlan_trunk_allow_default
446
- if validate_property_excluded?('interface',
447
- 'switchport_mode_private_vlan_host')
200
+ default = i.default_switchport_pvlan_trunk_association
201
+ assert_equal(default, i.switchport_pvlan_trunk_association)
448
202
 
449
- assert_raises(Cisco::UnsupportedError) do
450
- interface.switchport_mode_private_vlan_host = :host
451
- end
452
- return
453
- end
454
- val = interface.default_switchport_private_vlan_trunk_allowed_vlan
455
- assert_equal(val, interface.switchport_private_vlan_trunk_allowed_vlan,
456
- 'Err: trunk allowed vlan failed')
457
- end
203
+ pairs = %w(2 3)
204
+ i.switchport_pvlan_trunk_association = pairs
205
+ assert_equal([pairs], i.switchport_pvlan_trunk_association)
458
206
 
459
- def test_interface_switchport_pvlan_trunk_allow_bad_arg
460
- if validate_property_excluded?('interface',
461
- 'switchport_mode_private_vlan_host')
207
+ # Add a second pairs
208
+ pairs = [%w(2 3), %w(4 5)]
209
+ i.switchport_pvlan_trunk_association = pairs
210
+ assert_equal(pairs, i.switchport_pvlan_trunk_association)
462
211
 
463
- assert_raises(Cisco::UnsupportedError) do
464
- interface.switchport_mode_private_vlan_host = :host
465
- end
466
- return
467
- end
468
- input = %w(ten)
469
- assert_raises(CliError) do
470
- interface.switchport_private_vlan_trunk_allowed_vlan = input
471
- end
212
+ # New pair
213
+ pairs = [%w(6 7)]
214
+ i.switchport_pvlan_trunk_association = pairs
215
+ assert_equal(pairs, i.switchport_pvlan_trunk_association)
472
216
 
473
- input = %w(5000)
474
- assert_raises(CliError) do
475
- interface.switchport_private_vlan_trunk_allowed_vlan = input
476
- end
217
+ i.switchport_pvlan_trunk_association = default
218
+ assert_equal(default, i.switchport_pvlan_trunk_association)
477
219
  end
478
220
 
479
- def test_interface_switchport_pvlan_trunk_allow
480
- if validate_property_excluded?('interface',
481
- 'switchport_mode_private_vlan_host')
482
-
221
+ def test_sw_pvlan_mapping
222
+ if validate_property_excluded?('interface', 'switchport_pvlan_mapping')
483
223
  assert_raises(Cisco::UnsupportedError) do
484
- interface.switchport_mode_private_vlan_host = :host
224
+ i.switchport_pvlan_mapping = ['2', '10-11,4-7,8']
485
225
  end
486
226
  return
487
227
  end
488
- input = %w(10)
489
- interface.switchport_private_vlan_trunk_allowed_vlan = input
490
- assert_equal(input, interface.switchport_private_vlan_trunk_allowed_vlan,
491
- 'Error: switchport private trunk allow vlan not configured')
492
-
493
- input = %w(10-20)
494
- result = %w(10-20)
495
- interface.switchport_private_vlan_trunk_allowed_vlan = input
496
- assert_equal(result, interface.switchport_private_vlan_trunk_allowed_vlan,
497
- 'Error: switchport private trunk allow vlan not configured')
498
-
499
- input = %w(10 13-14 40)
500
- result = %w(10 13-14 40)
501
- interface.switchport_private_vlan_trunk_allowed_vlan = input
502
- assert_equal(result, interface.switchport_private_vlan_trunk_allowed_vlan,
503
- 'Error: switchport private trunk allow vlan not configured')
504
-
505
- input = []
506
- interface.switchport_private_vlan_trunk_allowed_vlan = input
507
- assert_equal(input, interface.switchport_private_vlan_trunk_allowed_vlan,
508
- 'Error: switchport private trunk allow vlan not configured')
509
- end
510
228
 
511
- def test_interface_switchport_pvlan_trunk_native_vlan_bad_arg
512
- if validate_property_excluded?('interface',
513
- 'switchport_mode_private_vlan_host')
229
+ default = i.default_switchport_pvlan_mapping
230
+ assert_equal(default, i.switchport_pvlan_mapping)
514
231
 
515
- assert_raises(Cisco::UnsupportedError) do
516
- interface.switchport_mode_private_vlan_host = :host
517
- end
518
- return
519
- end
520
- input = 'ten'
521
- assert_raises(CliError) do
522
- interface.switchport_private_vlan_trunk_native_vlan = input
523
- end
232
+ # Setup prerequisites
233
+ vlan_associate('2', '3-4')
524
234
 
525
- input = 5000
526
- assert_raises(CliError) do
527
- interface.switchport_private_vlan_trunk_native_vlan = input
528
- end
529
- end
235
+ i.switchport_pvlan_mapping = %w(2 3)
236
+ assert_equal(%w(2 3), i.switchport_pvlan_mapping)
530
237
 
531
- def test_interface_switchport_pvlan_trunk_native_default
532
- if validate_property_excluded?('interface',
533
- 'switchport_mode_private_vlan_host')
238
+ i.switchport_pvlan_mapping = %w(2 3-4)
239
+ assert_equal(%w(2 3-4), i.switchport_pvlan_mapping)
534
240
 
535
- assert_raises(Cisco::UnsupportedError) do
536
- interface.switchport_mode_private_vlan_host = :host
537
- end
538
- return
539
- end
540
- val = interface.default_switchport_private_vlan_trunk_native_vlan
541
- assert_equal(val, interface.switchport_private_vlan_trunk_native_vlan,
542
- 'Err: trunk native vlan failed')
241
+ i.switchport_pvlan_mapping = %w(2 3)
242
+ assert_equal(%w(2 3), i.switchport_pvlan_mapping)
243
+
244
+ i.switchport_pvlan_mapping = default
245
+ assert_equal(default, i.switchport_pvlan_mapping)
543
246
  end
544
247
 
545
- def test_interface_switchport_pvlan_trunk_native_vlan
248
+ def test_sw_pvlan_mapping_trunk
546
249
  if validate_property_excluded?('interface',
547
- 'switchport_mode_private_vlan_host')
548
-
250
+ 'switchport_pvlan_mapping_trunk')
549
251
  assert_raises(Cisco::UnsupportedError) do
550
- interface.switchport_mode_private_vlan_host = :host
252
+ i.switchport_pvlan_mapping_trunk = [['2', '10-11']]
551
253
  end
552
254
  return
553
255
  end
256
+ default = i.default_switchport_pvlan_mapping_trunk
257
+ assert_equal(default, i.switchport_pvlan_mapping_trunk)
554
258
 
555
- input = 10
556
- interface.switchport_private_vlan_trunk_native_vlan = input
557
-
558
- assert_equal(input, interface.switchport_private_vlan_trunk_native_vlan,
559
- 'Error: switchport private trunk native vlan not configured')
560
- input = 1
561
- interface.switchport_private_vlan_trunk_native_vlan = input
562
- assert_equal(input, interface.switchport_private_vlan_trunk_native_vlan,
563
- 'Error: switchport private trunk native vlan not configured')
564
- input = 40
565
- interface.switchport_private_vlan_trunk_native_vlan = input
566
- assert_equal(input, interface.switchport_private_vlan_trunk_native_vlan,
567
- 'Error: switchport private trunk native vlan not configured')
568
-
569
- input = 50
570
- interface.switchport_private_vlan_trunk_native_vlan = input
571
- assert_equal(input,
572
- interface.switchport_private_vlan_trunk_native_vlan,
573
- 'Error: switchport private trunk native vlan not configured')
574
- end
259
+ # Basic, non-nested array
260
+ i.switchport_pvlan_mapping_trunk = ['2', '10-11,4-7,8']
261
+ assert_equal([['2', '4-8,10-11']], i.switchport_pvlan_mapping_trunk)
575
262
 
576
- def test_interface_switchport_pvlan_association_trunk
577
- if validate_property_excluded?('interface',
578
- 'switchport_private_vlan_association_trunk')
579
- assert_nil(interface.switchport_private_vlan_association_trunk)
580
- return
581
- end
582
- input = %w(10 12)
583
- result = ['10 12']
584
- interface.switchport_private_vlan_association_trunk = input
585
- input = interface.switchport_private_vlan_association_trunk
586
- refute((result & input).empty?,
587
- 'Err: wrong config for switchport private trunk association')
588
- input = %w(20 30)
589
- result = ['20 30']
590
- interface.switchport_private_vlan_association_trunk = input
591
- input = interface.switchport_private_vlan_association_trunk
592
- refute((result & input).empty?,
593
- 'Err: wrong config for switchport private trunk association')
594
-
595
- input = %w(10 13)
596
- result = ['10 13']
597
- interface.switchport_private_vlan_association_trunk = input
598
- input = interface.switchport_private_vlan_association_trunk
599
- refute((result & input).empty?,
600
- 'Err: wrong config for switchport private trunk association')
601
-
602
- input = []
603
- interface.switchport_private_vlan_association_trunk = input
604
- assert_equal(input, interface.switchport_private_vlan_association_trunk,
605
- 'Err: wrong config for switchport private trunk association')
606
- end
263
+ # Same primary, but change range
607
264
 
608
- def test_interface_switchport_pvlan_trunk_assoc_vlan_bad_arg
609
- if validate_property_excluded?('interface',
610
- 'switchport_private_vlan_association_trunk')
611
- assert_nil(interface.switchport_private_vlan_association_trunk)
612
- return
613
- end
614
- input = %w(10 10)
615
- assert_raises(CliError) do
616
- interface.switchport_private_vlan_association_trunk = input
617
- end
265
+ i.switchport_pvlan_mapping_trunk = ['2', '11,4-6,8']
266
+ assert_equal([['2', '4-6,8,11']], i.switchport_pvlan_mapping_trunk)
618
267
 
619
- input = %w(10 5000)
620
- assert_raises(CliError) do
621
- interface.switchport_private_vlan_association_trunk = input
622
- end
268
+ # Change primary
269
+ array = ['3', '4-6,8,11']
270
+ i.switchport_pvlan_mapping_trunk = array
271
+ assert_equal([array], i.switchport_pvlan_mapping_trunk)
623
272
 
624
- input = %w(10)
625
- assert_raises(CliError) do
626
- interface.switchport_private_vlan_association_trunk = input
627
- end
273
+ # Multiple: basic
274
+ nest = Array[%w(4 14), %w(5 25)]
275
+ i.switchport_pvlan_mapping_trunk = nest
276
+ assert_equal(nest, i.switchport_pvlan_mapping_trunk)
628
277
 
629
- input = '10'
630
- assert_raises(TypeError,
631
- 'private vlan trunk association raise typeError') do
632
- interface.switchport_private_vlan_association_trunk = input
633
- end
634
- end
278
+ # Multiple: change only one range
279
+ nest = Array[%w(4 14), %w(5 7-9)]
280
+ i.switchport_pvlan_mapping_trunk = nest
281
+ assert_equal(nest, i.switchport_pvlan_mapping_trunk)
635
282
 
636
- def test_interface_switchport_pvlan_trunk_assocciation_default
637
- if validate_property_excluded?('interface',
638
- 'switchport_private_vlan_association_trunk')
639
- assert_nil(interface.switchport_private_vlan_association_trunk)
640
- return
641
- end
642
- val = interface.default_switchport_private_vlan_association_trunk
643
- assert_equal(val, interface.switchport_private_vlan_association_trunk,
644
- 'Err: association trunk failed')
645
- end
283
+ # Multiple: Move part of one range to a new primary
284
+ nest = Array[%w(4 14), %w(5 7,9), %w(6 8)]
285
+ i.switchport_pvlan_mapping_trunk = nest
286
+ assert_equal(nest, i.switchport_pvlan_mapping_trunk)
646
287
 
647
- def test_interface_switchport_pvlan_mapping_trunk_default
648
- if validate_property_excluded?('interface',
649
- 'switchport_private_vlan_mapping_trunk')
288
+ # Multiple: Move part of one range from one primary to an existing primary
289
+ nest = Array[%w(3 14), %w(5 7,9), %w(6 8)]
290
+ i.switchport_pvlan_mapping_trunk = nest
291
+ assert_equal(nest, i.switchport_pvlan_mapping_trunk)
650
292
 
651
- assert_nil(interface.switchport_private_vlan_mapping_trunk)
652
- return
653
- end
654
- val = interface.default_switchport_private_vlan_mapping_trunk
655
- assert_equal(val, interface.switchport_private_vlan_mapping_trunk,
656
- 'Err: mapping trunk failed')
293
+ # Multiple: Leave out a set while changing another
294
+ nest = Array[%w(5 7), %w(6 8-9,11)]
295
+ i.switchport_pvlan_mapping_trunk = nest
296
+ assert_equal(nest, i.switchport_pvlan_mapping_trunk)
297
+
298
+ # Explicitly set the default
299
+ i.switchport_pvlan_mapping_trunk = default
300
+ assert_equal(default, i.switchport_pvlan_mapping_trunk)
657
301
  end
658
302
 
659
- def test_interface_switchport_pvlan_mapping_trunk
303
+ def test_sw_pvlan_trunk_allowed_vlan
660
304
  if validate_property_excluded?('interface',
661
- 'switchport_private_vlan_mapping_trunk')
662
- assert_nil(interface.switchport_private_vlan_mapping_trunk)
305
+ 'switchport_pvlan_trunk_allowed_vlan')
306
+ assert_raises(Cisco::UnsupportedError) do
307
+ i.switchport_pvlan_trunk_allowed_vlan = '8-9,4,2-3'
308
+ end
663
309
  return
664
310
  end
665
- input = %w(10 11)
666
- result = '10 11'
667
- interface.switchport_private_vlan_mapping_trunk = input
668
- input = interface.switchport_private_vlan_mapping_trunk
669
- assert_includes(input, result,
670
- 'Err: wrong config for switchport private mapping trunk ')
671
-
672
- input = %w(10 12)
673
- result = '10 12'
674
- interface.switchport_private_vlan_mapping_trunk = input
675
- input = interface.switchport_private_vlan_mapping_trunk
676
- assert_includes(input, result,
677
- 'Err: wrong config for switchport private mapping trunk ')
678
-
679
- input = %w(20 21)
680
- result = '20 21'
681
- interface.switchport_private_vlan_mapping_trunk = input
682
- input = interface.switchport_private_vlan_mapping_trunk
683
- assert_includes(input, result,
684
- 'Err: wrong config for switchport private mapping trunk ')
685
-
686
- input = []
687
- interface.switchport_private_vlan_mapping_trunk = input
688
- assert_equal(input, interface.switchport_private_vlan_mapping_trunk)
311
+
312
+ default = i.default_switchport_pvlan_trunk_allowed_vlan
313
+ assert_equal(default, i.switchport_pvlan_trunk_allowed_vlan)
314
+
315
+ i.switchport_pvlan_trunk_allowed_vlan = '8-9,4,2-3'
316
+ assert_equal('2-4,8-9', i.switchport_pvlan_trunk_allowed_vlan)
317
+
318
+ # Change range
319
+ i.switchport_pvlan_trunk_allowed_vlan = '9-10,2'
320
+ assert_equal('2,9-10', i.switchport_pvlan_trunk_allowed_vlan)
321
+
322
+ i.switchport_pvlan_trunk_allowed_vlan = default
323
+ assert_equal(default, i.switchport_pvlan_trunk_allowed_vlan)
324
+
325
+ vlans = '500-528,530,532,534,587,590-593,597-598,600,602,604'
326
+ i.switchport_pvlan_trunk_allowed_vlan = vlans
327
+ assert_equal(vlans, i.switchport_pvlan_trunk_allowed_vlan)
689
328
  end
690
329
 
691
- def test_interface_switchport_pvlan_mapping_trunk_bad_arg
330
+ def test_sw_pvlan_trunk_native_vlan
692
331
  if validate_property_excluded?('interface',
693
- 'switchport_private_vlan_mapping_trunk')
694
- assert_nil(interface.switchport_private_vlan_mapping_trunk)
332
+ 'switchport_pvlan_trunk_native_vlan')
333
+ assert_raises(Cisco::UnsupportedError) do
334
+ i.switchport_pvlan_trunk_native_vlan = '2'
335
+ end
695
336
  return
696
337
  end
697
- input = %w(10 10)
698
- assert_raises(CliError) do
699
- interface.switchport_private_vlan_mapping_trunk = input
700
- end
701
-
702
- input = %w(10 5000)
703
- assert_raises(CliError) do
704
- interface.switchport_private_vlan_mapping_trunk = input
705
- end
706
338
 
707
- input = %w(10)
708
- assert_raises(CliError) do
709
- interface.switchport_private_vlan_mapping_trunk = input
710
- end
339
+ default = i.default_switchport_pvlan_trunk_native_vlan
340
+ assert_equal(default, i.switchport_pvlan_trunk_native_vlan)
711
341
 
712
- input = '10'
713
- assert_raises(TypeError,
714
- 'private vlan mapping trunk raise typeError') do
715
- interface.switchport_private_vlan_mapping_trunk = input
716
- end
342
+ i.switchport_pvlan_trunk_native_vlan = '2'
343
+ assert_equal('2', i.switchport_pvlan_trunk_native_vlan)
717
344
 
718
- input = %w(10 20-148)
719
- assert_raises(RuntimeError,
720
- 'mapping trunk did not raise RuntimeError') do
721
- interface.switchport_private_vlan_mapping_trunk = input
722
- end
345
+ i.switchport_pvlan_trunk_native_vlan = default
346
+ assert_equal(default, i.switchport_pvlan_trunk_native_vlan)
723
347
  end
724
348
  end