cisco_node_utils 1.7.0 → 1.8.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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +36 -0
  3. data/CONTRIBUTING.md +2 -2
  4. data/README.md +2 -1
  5. data/cisco_node_utils.gemspec +1 -0
  6. data/docs/README-develop-node-utils-APIs.md +2 -1
  7. data/lib/cisco_node_utils/aaa_authentication_login_service.rb +2 -2
  8. data/lib/cisco_node_utils/ace.rb +2 -0
  9. data/lib/cisco_node_utils/bgp.rb +34 -91
  10. data/lib/cisco_node_utils/bridge_domain.rb +8 -13
  11. data/lib/cisco_node_utils/client/nxapi/client.rb +10 -3
  12. data/lib/cisco_node_utils/cmd_ref/DEPRECATED.yaml +12 -12
  13. data/lib/cisco_node_utils/cmd_ref/README_YAML.md +2 -1
  14. data/lib/cisco_node_utils/cmd_ref/aaa_authorization_service.yaml +1 -0
  15. data/lib/cisco_node_utils/cmd_ref/bfd_global.yaml +3 -3
  16. data/lib/cisco_node_utils/cmd_ref/bgp.yaml +5 -15
  17. data/lib/cisco_node_utils/cmd_ref/bgp_af.yaml +1 -1
  18. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor_af.yaml +1 -0
  19. data/lib/cisco_node_utils/cmd_ref/bridge_domain.yaml +14 -36
  20. data/lib/cisco_node_utils/cmd_ref/bridge_domain_vni.yaml +1 -1
  21. data/lib/cisco_node_utils/cmd_ref/dhcp_relay_global.yaml +5 -3
  22. data/lib/cisco_node_utils/cmd_ref/encapsulation.yaml +1 -1
  23. data/lib/cisco_node_utils/cmd_ref/fabricpath.yaml +1 -1
  24. data/lib/cisco_node_utils/cmd_ref/fabricpath_topology.yaml +1 -1
  25. data/lib/cisco_node_utils/cmd_ref/feature.yaml +3 -3
  26. data/lib/cisco_node_utils/cmd_ref/interface.yaml +25 -15
  27. data/lib/cisco_node_utils/cmd_ref/interface_ospf.yaml +5 -0
  28. data/lib/cisco_node_utils/cmd_ref/interface_portchannel.yaml +6 -0
  29. data/lib/cisco_node_utils/cmd_ref/interface_service_vni.yaml +1 -1
  30. data/lib/cisco_node_utils/cmd_ref/inventory.yaml +9 -0
  31. data/lib/cisco_node_utils/cmd_ref/itd_device_group.yaml +1 -1
  32. data/lib/cisco_node_utils/cmd_ref/itd_service.yaml +1 -1
  33. data/lib/cisco_node_utils/cmd_ref/object_group.yaml +32 -0
  34. data/lib/cisco_node_utils/cmd_ref/ospf.yaml +1 -1
  35. data/lib/cisco_node_utils/cmd_ref/portchannel_global.yaml +9 -7
  36. data/lib/cisco_node_utils/cmd_ref/radius_global.yaml +7 -0
  37. data/lib/cisco_node_utils/cmd_ref/route_map.yaml +26 -25
  38. data/lib/cisco_node_utils/cmd_ref/show_version.yaml +11 -3
  39. data/lib/cisco_node_utils/cmd_ref/snmp_community.yaml +4 -0
  40. data/lib/cisco_node_utils/cmd_ref/snmp_server.yaml +5 -1
  41. data/lib/cisco_node_utils/cmd_ref/stp_global.yaml +8 -8
  42. data/lib/cisco_node_utils/cmd_ref/syslog_server.yaml +3 -2
  43. data/lib/cisco_node_utils/cmd_ref/syslog_settings.yaml +21 -1
  44. data/lib/cisco_node_utils/cmd_ref/tacacs_global.yaml +7 -0
  45. data/lib/cisco_node_utils/cmd_ref/vdc.yaml +1 -1
  46. data/lib/cisco_node_utils/cmd_ref/vlan.yaml +5 -4
  47. data/lib/cisco_node_utils/cmd_ref/vpc.yaml +9 -9
  48. data/lib/cisco_node_utils/cmd_ref/vrf.yaml +1 -0
  49. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep.yaml +1 -0
  50. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep_vni.yaml +3 -5
  51. data/lib/cisco_node_utils/command_reference.rb +11 -1
  52. data/lib/cisco_node_utils/interface.rb +46 -8
  53. data/lib/cisco_node_utils/interface_ospf.rb +2 -2
  54. data/lib/cisco_node_utils/interface_portchannel.rb +2 -2
  55. data/lib/cisco_node_utils/node.rb +9 -0
  56. data/lib/cisco_node_utils/ntp_auth_key.rb +1 -1
  57. data/lib/cisco_node_utils/object_group.rb +75 -0
  58. data/lib/cisco_node_utils/object_group_entry.rb +143 -0
  59. data/lib/cisco_node_utils/portchannel_global.rb +2 -2
  60. data/lib/cisco_node_utils/radius_global.rb +25 -1
  61. data/lib/cisco_node_utils/router_ospf.rb +3 -3
  62. data/lib/cisco_node_utils/syslog_server.rb +38 -42
  63. data/lib/cisco_node_utils/syslog_settings.rb +74 -3
  64. data/lib/cisco_node_utils/tacacs_global.rb +47 -14
  65. data/lib/cisco_node_utils/tacacs_server.rb +1 -5
  66. data/lib/cisco_node_utils/version.rb +1 -1
  67. data/lib/cisco_node_utils/vpc.rb +1 -4
  68. data/lib/cisco_node_utils/vtp.rb +4 -2
  69. data/spec/schema.yaml +3 -0
  70. data/tests/ciscotest.rb +16 -9
  71. data/tests/test_ace.rb +2 -0
  72. data/tests/test_bgp_af.rb +10 -2
  73. data/tests/test_bgp_neighbor_af.rb +6 -2
  74. data/tests/test_bridge_domain.rb +7 -0
  75. data/tests/test_feature.rb +2 -2
  76. data/tests/test_interface.rb +30 -4
  77. data/tests/test_node_ext.rb +2 -2
  78. data/tests/test_object_group.rb +122 -0
  79. data/tests/test_platform.rb +1 -1
  80. data/tests/test_portchannel_global.rb +1 -0
  81. data/tests/test_radius_global.rb +22 -2
  82. data/tests/test_route_map.rb +11 -8
  83. data/tests/test_router_bgp.rb +7 -132
  84. data/tests/test_router_ospf_area.rb +6 -6
  85. data/tests/test_snmpuser.rb +19 -11
  86. data/tests/test_syslog_server.rb +11 -31
  87. data/tests/test_syslog_settings.rb +46 -5
  88. data/tests/test_tacacs_global.rb +42 -18
  89. data/tests/test_vpc.rb +3 -0
  90. data/tests/test_vxlan_vtep_vni.rb +0 -3
  91. data/tests/yum_package.yaml +5 -0
  92. metadata +21 -3
@@ -63,7 +63,11 @@ packet_size:
63
63
  default_value: 0
64
64
  N6k: *n5k_default_packet_size
65
65
  N7k: *n5k_default_packet_size
66
- N9k-F: *n5k_default_packet_size
66
+ # On recent versions, packet size is fixed,
67
+ # so this change will take care of the fix but
68
+ # it could still fail in the older versions.
69
+ N9k-F: *n3k_default_packet_size
70
+ N3k-F: *n3k_default_packet_size
67
71
 
68
72
  protocol:
69
73
  _exclude: [ios_xr]
@@ -7,7 +7,7 @@ _template:
7
7
  get_command: "show running-config spanning-tree"
8
8
 
9
9
  bd_designated_priority:
10
- _exclude: [N3k, N5k, N6k, N9k-F, N9k]
10
+ _exclude: [N3k, N5k, N6k, N3k-F, N9k-F, N9k]
11
11
  multiple:
12
12
  get_context: ['/^spanning-tree pseudo-information$/']
13
13
  get_value: '/^bridge-domain (.*) designated priority (.*)$/'
@@ -16,40 +16,40 @@ bd_designated_priority:
16
16
  default_value: []
17
17
 
18
18
  bd_forward_time:
19
- _exclude: [N3k, N5k, N6k, N9k-F, N9k]
19
+ _exclude: [N3k, N5k, N6k, N3k-F, N9k-F, N9k]
20
20
  multiple:
21
21
  get_value: '/^spanning-tree bridge-domain (.*) forward-time (.*)$/'
22
22
  set_value: "<state> spanning-tree bridge-domain <range> forward-time <val>"
23
23
  default_value: []
24
24
 
25
25
  bd_hello_time:
26
- _exclude: [N3k, N5k, N6k, N9k-F, N9k]
26
+ _exclude: [N3k, N5k, N6k, N3k-F, N9k-F, N9k]
27
27
  multiple:
28
28
  get_value: '/^spanning-tree bridge-domain (.*) hello-time (.*)$/'
29
29
  set_value: "<state> spanning-tree bridge-domain <range> hello-time <val>"
30
30
  default_value: []
31
31
 
32
32
  bd_max_age:
33
- _exclude: [N3k, N5k, N6k, N9k-F, N9k]
33
+ _exclude: [N3k, N5k, N6k, N3k-F, N9k-F, N9k]
34
34
  multiple:
35
35
  get_value: '/^spanning-tree bridge-domain (.*) max-age (.*)$/'
36
36
  set_value: "<state> spanning-tree bridge-domain <range> max-age <val>"
37
37
  default_value: []
38
38
 
39
39
  bd_priority:
40
- _exclude: [N3k, N5k, N6k, N9k-F, N9k]
40
+ _exclude: [N3k, N5k, N6k, N3k-F, N9k-F, N9k]
41
41
  multiple:
42
42
  get_value: '/^spanning-tree bridge-domain (.*) priority (.*)$/'
43
43
  set_value: "<state> spanning-tree bridge-domain <range> priority <val>"
44
44
  default_value: []
45
45
 
46
46
  bd_range:
47
- _exclude: [N3k, N5k, N6k, N9k-F, N9k]
47
+ _exclude: [N3k, N5k, N6k, N3k-F, N9k-F, N9k]
48
48
  kind: string
49
49
  default_only: "2-3967"
50
50
 
51
51
  bd_root_priority:
52
- _exclude: [N3k, N5k, N6k, N9k-F, N9k]
52
+ _exclude: [N3k, N5k, N6k, N3k-F, N9k-F, N9k]
53
53
  multiple:
54
54
  get_context: ['/^spanning-tree pseudo-information$/']
55
55
  get_value: '/^bridge-domain (.*) root priority (.*)$/'
@@ -78,7 +78,7 @@ bridge_assurance:
78
78
  default_value: true
79
79
 
80
80
  domain:
81
- _exclude: [N9k-F]
81
+ _exclude: [N3k-F, N9k-F]
82
82
  os_version: 'N3k, N9k:7.0.3.I6.1'
83
83
  kind: int
84
84
  get_value: '/^spanning-tree domain (\d+)$/'
@@ -15,8 +15,9 @@ server:
15
15
  multiple: true
16
16
  nexus:
17
17
  get_command: "show running-config all | include '^logging server'"
18
- get_value: '/^logging server (\S+).*/'
19
- set_value: '<state> logging server <ip> <level> <vrf>'
18
+ # Returns <ip>, <level>, <port>, <vrf>
19
+ get_value: '/^(?:logging server )([^\s]+)(?: (\d+))?(?: port (\d+))?(?: use-vrf (\S+))?/'
20
+ set_value: '<state> logging server <ip> <level> <port> <vrf>'
20
21
  ios_xr:
21
22
  get_command: "show running-config logging"
22
23
  get_value: '/^logging (\S+).*/'
@@ -2,8 +2,28 @@
2
2
  ---
3
3
  _exclude: [ios_xr]
4
4
 
5
+ console:
6
+ default_value: 2
7
+ get_command: "show running-config all | include 'logging'"
8
+ # Returns <state> and <severity>
9
+ get_value: '/^(no)?\s*logging console\s*(\d)?/'
10
+ set_value: '<state> logging console <severity>'
11
+
12
+ monitor:
13
+ default_value: 5
14
+ get_command: "show running-config all | include 'logging'"
15
+ # Returns <state> and <severity>
16
+ get_value: '/^(no)?\s*logging monitor\s*(\d)?/'
17
+ set_value: '<state> logging monitor <severity>'
18
+
19
+ source_interface:
20
+ default_value: ~
21
+ get_command: "show running-config all | include 'logging'"
22
+ get_value: '/^logging source-interface\s+(.*)$/'
23
+ set_value: '<state> logging source-interface <source_interface>'
24
+
5
25
  timestamp:
6
- get_command: "show running-config all | include '^logging timestamp'"
26
+ get_command: "show running-config all | include 'logging'"
7
27
  get_value: '/^logging timestamp (.*)$/'
8
28
  set_value: '<state> logging timestamp <units>'
9
29
  default_value: 'seconds'
@@ -19,6 +19,13 @@ key_format:
19
19
  ios_xr:
20
20
  get_command: "show running-config tacacs-server"
21
21
 
22
+ source_interface:
23
+ default_value: ~
24
+ get_value: '/^ip tacacs source-interface\s+(.*)$/'
25
+ set_value: '<state> ip tacacs source-interface <source_interface>'
26
+ nexus:
27
+ get_command: "show running-config all | include '^ip tacacs source-interface'"
28
+
22
29
  timeout:
23
30
  kind: int
24
31
  get_value: '/tacacs-server timeout\s+(\d+)/'
@@ -3,7 +3,7 @@
3
3
  # The current simplified implementation assumes no admin-vdc and that the
4
4
  # default vdc name uses id 1. Full multi-vdc support is TBD.
5
5
  ---
6
- _exclude: [N3k, N5k, N6k, N9k-F, N9k, ios_xr]
6
+ _exclude: [N3k, N5k, N6k, N3k-F, N9k-F, N9k, ios_xr]
7
7
 
8
8
  _template:
9
9
  get_command: 'show run vdc all'
@@ -16,7 +16,7 @@ destroy:
16
16
  set_value: "no vlan %s"
17
17
 
18
18
  fabric_control:
19
- _exclude: [N3k, N5k, N6k, N9k-F, N9k]
19
+ _exclude: [N3k, N5k, N6k, N3k-F, N9k-F, N9k]
20
20
  kind: boolean
21
21
  get_command: "show running-config vlan"
22
22
  get_context: ['/^vlan <vlan>/']
@@ -30,6 +30,7 @@ mapped_vni:
30
30
  N3k: &mapped_vni_n3_8_9k
31
31
  get_command: 'show running vlan'
32
32
  N9k-F: *mapped_vni_n3_8_9k
33
+ N3k-F: *mapped_vni_n3_8_9k
33
34
  N9k: *mapped_vni_n3_8_9k
34
35
  N5k: &mapped_vni_n5_6k
35
36
  get_command: 'show running vlan 1-4094'
@@ -50,7 +51,7 @@ mapped_vni_requires_nv_overlay:
50
51
  default_only: false
51
52
 
52
53
  mode:
53
- _exclude: [N3k, N9k, N9k-F]
54
+ _exclude: [N3k, N3k-F, N9k, N9k-F]
54
55
  multiple: true
55
56
  get_command: "show vlan"
56
57
  # TBD: 'show vlan' is problematic and should be converted to use show run
@@ -70,7 +71,7 @@ name:
70
71
  set_value: "%s name %s ; end"
71
72
 
72
73
  pvlan_association:
73
- _exclude: [N9k-F]
74
+ _exclude: [N3k-F, N9k-F]
74
75
  multiple: true
75
76
  get_command: "show vlan private-vlan"
76
77
  get_value: '/^<id>\s+(\d+)/'
@@ -79,7 +80,7 @@ pvlan_association:
79
80
  default_value: []
80
81
 
81
82
  pvlan_type:
82
- _exclude: [N9k-F]
83
+ _exclude: [N3k-F, N9k-F]
83
84
  kind: string
84
85
  get_command: 'show vlan private-vlan type'
85
86
  get_value: '/^<id>\s+(\S+)/'
@@ -1,6 +1,6 @@
1
1
  # vpc
2
2
  ---
3
- _exclude: [ios_xr, N9k-F]
3
+ _exclude: [ios_xr, N3k-F, N9k-F]
4
4
 
5
5
  _template:
6
6
  get_command: 'show running-config vpc all'
@@ -64,7 +64,7 @@ dual_active_exclude_interface_vlan_bridge_domain:
64
64
  default_value: 'none'
65
65
 
66
66
  fabricpath_emulated_switch_id:
67
- _exclude: [N3k, N5k, N6k, N9k-F, N9k]
67
+ _exclude: [N3k, N5k, N6k, N3k-F, N9k-F, N9k]
68
68
  kind: int
69
69
  set_context: ['terminal dont-ask', 'vpc domain <domain>']
70
70
  get_value: '/^fabricpath switch-id\s+(\d+)$/'
@@ -72,7 +72,7 @@ fabricpath_emulated_switch_id:
72
72
  default_value: false
73
73
 
74
74
  fabricpath_multicast_load_balance:
75
- _exclude: [N3k, N5k, N6k, N9k-F, N9k]
75
+ _exclude: [N3k, N5k, N6k, N3k-F, N9k-F, N9k]
76
76
  kind: boolean
77
77
  get_value: '/^fabricpath multicast load-balance$/'
78
78
  set_value: "<state> fabricpath multicast load-balance"
@@ -118,14 +118,14 @@ peer_gateway:
118
118
  # Exclude everyone for now till the BD command is fully supported
119
119
  peer_gateway_exclude_bridge_domain:
120
120
  kind: string
121
- _exclude: [N3k, N5k, N6k, N7k, N9k-F, N9k]
121
+ _exclude: [N3k, N5k, N6k, N7k, N3k-F, N9k-F, N9k]
122
122
  set_context: ['terminal dont-ask', 'vpc domain <domain>']
123
123
  get_value: '/^peer-gateway exclude bridge-domain\s+(\S+)/'
124
124
  set_value: "peer-gateway exclude-bridge-domain <range>"
125
125
  default_value: ''
126
126
 
127
127
  peer_gateway_exclude_vlan:
128
- _exclude: [N3k, N9k-F, N9k]
128
+ _exclude: [N3k, N3k-F, N9k-F, N9k]
129
129
  kind: string
130
130
  set_context: ['terminal dont-ask', 'vpc domain <domain>']
131
131
  get_value: '/^peer-gateway exclude-vlan\s(\S+)/'
@@ -181,11 +181,11 @@ peer_switch:
181
181
  default_value: false
182
182
 
183
183
  phy_port_vpc_module_pids:
184
- _exclude: [N3k, N5k, N6k, N9k-F, N9k]
184
+ _exclude: [N3k, N5k, N6k, N3k-F, N9k-F, N9k]
185
185
  default_only: 'N7[K7]-(?:F2|F3|F4|M3)'
186
186
 
187
187
  port_channel_limit:
188
- _exclude: [N3k, N5k, N6k, N9k-F, N9k]
188
+ _exclude: [N3k, N5k, N6k, N3k-F, N9k-F, N9k]
189
189
  auto_default: false
190
190
  kind: boolean
191
191
  get_value: '/^port-channel limit/'
@@ -200,7 +200,7 @@ role_priority:
200
200
 
201
201
  self_isolation:
202
202
  kind: boolean
203
- _exclude: [N3k, N5k, N6k, N9k-F, N9k]
203
+ _exclude: [N3k, N5k, N6k, N3k-F, N9k-F, N9k]
204
204
  get_value: '/^self-isolation/'
205
205
  set_value: "<state> self-isolation"
206
206
  default_value: false
@@ -227,7 +227,7 @@ system_priority:
227
227
  # Exclude everyone for now till the track command is fully supported
228
228
  track:
229
229
  kind: int
230
- _exclude: [N3k, N5k, N6k, N7k, N9k-F, N9k]
230
+ _exclude: [N3k, N5k, N6k, N7k, N3k-F, N9k-F, N9k]
231
231
  get_value: '/^track\s+(\d+)/'
232
232
  set_value: "<state> track <val>"
233
233
  default_value: 0
@@ -76,6 +76,7 @@ vni: # TBD Should this move to the vni provider as vrf_vni?
76
76
  set_value: '<state> vni <id>'
77
77
  default_value: false
78
78
  N9k-F: *vni9k
79
+ N3k-F: *vni9k
79
80
 
80
81
  vpn_id:
81
82
  _exclude: [nexus]
@@ -32,6 +32,7 @@ mt_lite_support:
32
32
  N9k: &mt_lite_default
33
33
  default_only: true
34
34
  N9k-F: *mt_lite_default
35
+ N3k-F: *mt_lite_default
35
36
  N6k: *mt_lite_default
36
37
  N5k: *mt_lite_default
37
38
  else:
@@ -16,8 +16,7 @@ all_vnis:
16
16
  get_value: '/^member vni (\d+|\d+-\d+) ?(associate-vrf)?$/'
17
17
 
18
18
  ingress_replication:
19
- _exclude: [N5k, N6k]
20
- os_version: 'N7k:8.1.1'
19
+ _exclude: [N5k, N6k, N7k]
21
20
  kind: string
22
21
  get_value: '/^ingress-replication protocol (\S+)$/'
23
22
  set_value: '<state> ingress-replication protocol <protocol>'
@@ -29,8 +28,7 @@ multicast_group:
29
28
  default_value: ''
30
29
 
31
30
  peer_list:
32
- _exclude: [N5k, N6k]
33
- os_version: 'N7k:8.1.1'
31
+ _exclude: [N5k, N6k, N7k]
34
32
  multiple:
35
33
  get_context:
36
34
  - '/^interface <name>$/i'
@@ -51,7 +49,7 @@ suppress_arp:
51
49
  default_value: false
52
50
 
53
51
  suppress_uuc:
54
- _exclude: [N9k-F, N9k]
52
+ _exclude: [N3k-F, N9k-F, N9k]
55
53
  os_version: 'N7k:8.1.1'
56
54
  kind: boolean
57
55
  get_value: '/^suppress-unknown-unicast$/'
@@ -437,13 +437,16 @@ module Cisco
437
437
  puts "DEBUG: #{text}" if @@debug
438
438
  end
439
439
 
440
- KNOWN_PLATFORMS = %w(C3064 C3132 C3172 N3k N5k N6k N7k N9k N9k-F XRv9k)
440
+ KNOWN_PLATFORMS = %w(C3064 C3132 C3172 N35 N3k N3k-F N5k N6k N7k N9k N9k-F
441
+ XRv9k)
441
442
 
442
443
  def self.platform_to_filter(platform)
443
444
  if KNOWN_PLATFORMS.include?(platform)
444
445
  case platform
445
446
  when 'XRv9k'
446
447
  /XRV9/
448
+ when 'N35'
449
+ /N3K-C35/
447
450
  when 'N9k'
448
451
  # For non-fretta n9k platforms we need to
449
452
  # match everything except the trailing -F
@@ -451,6 +454,13 @@ module Cisco
451
454
  when 'N9k-F'
452
455
  # For fretta n9k we need to include the trailing -F
453
456
  /^N9.*-F$/
457
+ when 'N3k'
458
+ # For non-fretta n3k platforms we need to
459
+ # match everything except the trailing -F
460
+ /^N3...(?!.*-F)/
461
+ when 'N3k-F'
462
+ # For fretta n3k we need to include the trailing -F
463
+ /^N3.*-F$/
454
464
  else
455
465
  Regexp.new platform.tr('k', '')
456
466
  end
@@ -1,6 +1,6 @@
1
1
  # November 2015, Chris Van Heuveln
2
2
  #
3
- # Copyright (c) 2015-2016 Cisco and/or its affiliates.
3
+ # Copyright (c) 2015-2017 Cisco and/or its affiliates.
4
4
  #
5
5
  # Licensed under the Apache License, Version 2.0 (the "License");
6
6
  # you may not use this file except in compliance with the License.
@@ -51,15 +51,22 @@ module Cisco
51
51
  # Regexp to match various link bundle interface variants
52
52
  PORTCHANNEL = Regexp.new('(port-channel|Bundle-Ether)', Regexp::IGNORECASE)
53
53
 
54
- attr_reader :name
54
+ attr_reader :name, :state_default
55
55
 
56
- def initialize(name, instantiate=true)
56
+ def initialize(name, instantiate=true, default_state=false)
57
57
  fail TypeError unless name.is_a?(String)
58
58
  fail ArgumentError unless name.length > 0
59
59
  @name = name.downcase
60
60
  @smr = config_get('interface', 'stp_mst_range')
61
61
  @svr = config_get('interface', 'stp_vlan_range')
62
62
  @match_found = false
63
+ # Keep track of default vs non-default state for
64
+ # interfaces that cannot be created/destroyed.
65
+ @state_default = nil
66
+ # Track ethernet but not sub-interfaces
67
+ if @name[/ethernet/] && !@name[/ethernet.*\.\d+/]
68
+ @state_default = default_state
69
+ end
63
70
  create if instantiate
64
71
  end
65
72
 
@@ -72,10 +79,23 @@ module Cisco
72
79
  intf_list = config_get('interface', 'all_interfaces')
73
80
  return hash if intf_list.nil?
74
81
 
82
+ # Massage intf_list data into an array that is easy
83
+ # to work with.
84
+ intf_list.collect! { |x| x.strip || x }
85
+ intf_list.delete('')
86
+ intf_list = intf_list.join(' ').split('interface')
87
+ intf_list.delete('')
88
+
75
89
  intf_list.each do |id|
76
- id = id.downcase
90
+ int_data = id.strip.split(' ')
91
+ next if int_data[0].nil?
92
+ id = int_data[0].downcase
77
93
  next if opt && filter(opt, id)
78
- hash[id] = Interface.new(id, false)
94
+ # If there are any additional options associated
95
+ # with this interface then it's in a non-default
96
+ # state.
97
+ default_state = int_data.size > 1 ? false : true
98
+ hash[id] = Interface.new(id, false, default_state)
79
99
  end
80
100
  hash
81
101
  end
@@ -141,7 +161,16 @@ module Cisco
141
161
  end
142
162
 
143
163
  def destroy
144
- config_set('interface', 'destroy', name: @name)
164
+ if @name[/ethernet/] && !@name[/ethernet.*\.\d+/]
165
+ config_set('interface', 'default', name: @name)
166
+ else
167
+ config_set('interface', 'destroy', name: @name)
168
+ end
169
+ end
170
+
171
+ def default?
172
+ state = config_get('interface', 'default', name: @name)
173
+ state.nil? ? true : false
145
174
  end
146
175
 
147
176
  def pvlan_enable
@@ -579,6 +608,7 @@ module Cisco
579
608
  end
580
609
 
581
610
  def ipv4_dhcp_relay_info_trust=(state)
611
+ return false if !state && !Feature.dhcp_enabled?
582
612
  Feature.dhcp_enable if state
583
613
  config_set('interface', 'ipv4_dhcp_relay_info_trust',
584
614
  name: @name, state: state ? '' : 'no')
@@ -593,6 +623,7 @@ module Cisco
593
623
  end
594
624
 
595
625
  def ipv4_dhcp_relay_src_addr_hsrp=(state)
626
+ return false if !state && !Feature.dhcp_enabled?
596
627
  Feature.dhcp_enable if state
597
628
  config_set('interface', 'ipv4_dhcp_relay_src_addr_hsrp',
598
629
  name: @name, state: state ? '' : 'no')
@@ -611,8 +642,9 @@ module Cisco
611
642
 
612
643
  def ipv4_dhcp_relay_src_intf=(val)
613
644
  state = val == default_ipv4_dhcp_relay_src_intf ? 'no' : ''
614
- intf = val == default_ipv4_dhcp_relay_src_intf ? '' : val
645
+ return false if state == 'no' && !Feature.dhcp_enabled?
615
646
  Feature.dhcp_enable if state.empty?
647
+ intf = val == default_ipv4_dhcp_relay_src_intf ? '' : val
616
648
  config_set('interface', 'ipv4_dhcp_relay_src_intf',
617
649
  name: @name, state: state, intf: intf)
618
650
  end
@@ -626,6 +658,7 @@ module Cisco
626
658
  end
627
659
 
628
660
  def ipv4_dhcp_relay_subnet_broadcast=(state)
661
+ return false if !state && !Feature.dhcp_enabled?
629
662
  Feature.dhcp_enable if state
630
663
  config_set('interface', 'ipv4_dhcp_relay_subnet_broadcast',
631
664
  name: @name, state: state ? '' : 'no')
@@ -640,6 +673,7 @@ module Cisco
640
673
  end
641
674
 
642
675
  def ipv4_dhcp_smart_relay=(state)
676
+ return false if !state && !Feature.dhcp_enabled?
643
677
  Feature.dhcp_enable if state
644
678
  config_set('interface', 'ipv4_dhcp_smart_relay',
645
679
  name: @name, state: state ? '' : 'no')
@@ -654,6 +688,7 @@ module Cisco
654
688
  end
655
689
 
656
690
  def ipv4_forwarding=(state)
691
+ return if state == ipv4_forwarding
657
692
  config_set('interface', 'ipv4_forwarding',
658
693
  name: @name, state: state ? '' : 'no')
659
694
  end
@@ -788,8 +823,9 @@ module Cisco
788
823
 
789
824
  def ipv6_dhcp_relay_src_intf=(val)
790
825
  state = val == default_ipv6_dhcp_relay_src_intf ? 'no' : ''
791
- intf = val == default_ipv6_dhcp_relay_src_intf ? '' : val
826
+ return false if state == 'no' && !Feature.dhcp_enabled?
792
827
  Feature.dhcp_enable if state.empty?
828
+ intf = val == default_ipv6_dhcp_relay_src_intf ? '' : val
793
829
  config_set('interface', 'ipv6_dhcp_relay_src_intf',
794
830
  name: @name, state: state, intf: intf)
795
831
  end
@@ -1831,6 +1867,8 @@ module Cisco
1831
1867
  def switchport_vtp=(vtp_set)
1832
1868
  # TODO: throw UnsupportedError instead of returning false?
1833
1869
  return false unless switchport_vtp_mode_capable?
1870
+ return false if !vtp_set && !Feature.vtp_enabled?
1871
+ Feature.vtp_enable if vtp_set
1834
1872
  no_cmd = (vtp_set) ? '' : 'no'
1835
1873
  config_set('interface', 'vtp', name: @name, state: no_cmd)
1836
1874
  end