cisco_node_utils 1.9.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -0
  3. data/README.md +14 -0
  4. data/ext/mkrf_conf.rb +1 -1
  5. data/lib/cisco_node_utils/ace.rb +142 -7
  6. data/lib/cisco_node_utils/banner.rb +63 -0
  7. data/lib/cisco_node_utils/bridge_domain.rb +1 -1
  8. data/lib/cisco_node_utils/cisco_cmn_utils.rb +1 -1
  9. data/lib/cisco_node_utils/client/utils.rb +20 -10
  10. data/lib/cisco_node_utils/cmd_ref/acl.yaml +1 -1
  11. data/lib/cisco_node_utils/cmd_ref/banner.yaml +7 -0
  12. data/lib/cisco_node_utils/cmd_ref/fabricpath.yaml +2 -2
  13. data/lib/cisco_node_utils/cmd_ref/hostname.yaml +8 -0
  14. data/lib/cisco_node_utils/cmd_ref/interface.yaml +20 -12
  15. data/lib/cisco_node_utils/cmd_ref/interface_hsrp_group.yaml +3 -3
  16. data/lib/cisco_node_utils/cmd_ref/ip_multicast.yaml +6 -2
  17. data/lib/cisco_node_utils/cmd_ref/snmp_server.yaml +4 -1
  18. data/lib/cisco_node_utils/cmd_ref/syslog_facility.yaml +10 -0
  19. data/lib/cisco_node_utils/cmd_ref/syslog_server.yaml +3 -3
  20. data/lib/cisco_node_utils/cmd_ref/syslog_settings.yaml +16 -0
  21. data/lib/cisco_node_utils/cmd_ref/tacacs_server_host.yaml +2 -2
  22. data/lib/cisco_node_utils/environment.rb +8 -1
  23. data/lib/cisco_node_utils/hostname.rb +62 -0
  24. data/lib/cisco_node_utils/interface.rb +59 -2
  25. data/lib/cisco_node_utils/interface_DEPRECATED.rb +5 -0
  26. data/lib/cisco_node_utils/interface_hsrp_group.rb +17 -6
  27. data/lib/cisco_node_utils/ip_multicast.rb +13 -9
  28. data/lib/cisco_node_utils/node.rb +4 -1
  29. data/lib/cisco_node_utils/syslog_facility.rb +64 -0
  30. data/lib/cisco_node_utils/syslog_server.rb +18 -13
  31. data/lib/cisco_node_utils/syslog_settings.rb +43 -1
  32. data/lib/cisco_node_utils/version.rb +1 -1
  33. data/lib/cisco_node_utils/vlan.rb +1 -1
  34. data/lib/cisco_node_utils/vxlan_vtep_vni.rb +21 -8
  35. data/spec/environment_spec.rb +107 -0
  36. data/tests/ciscotest.rb +8 -1
  37. data/tests/test_ace.rb +60 -3
  38. data/tests/test_banner.rb +85 -0
  39. data/tests/test_bgp_af.rb +1 -1
  40. data/tests/test_hostname.rb +64 -0
  41. data/tests/test_interface.rb +22 -1
  42. data/tests/test_interface_hsrp_group.rb +12 -24
  43. data/tests/test_ip_multicast.rb +32 -21
  44. data/tests/test_nxapi.rb +8 -4
  45. data/tests/test_syslog_facility.rb +80 -0
  46. data/tests/test_syslog_server.rb +3 -2
  47. data/tests/test_syslog_settings.rb +16 -1
  48. data/tests/yum_package.yaml +5 -0
  49. metadata +12 -3
@@ -0,0 +1,7 @@
1
+ # banner
2
+ ---
3
+ motd:
4
+ default_value: "User Access Verification\n"
5
+ get_command: 'show banner motd'
6
+ get_value: '/^.*$/m'
7
+ set_value: '<state> banner motd <motd>'
@@ -82,7 +82,7 @@ loadbalance_multicast_has_vlan:
82
82
  _exclude: [N5k, N6k]
83
83
  kind: boolean
84
84
  auto_default: false
85
- get_command: "show fabricpath load-balance | begin Ftag"
85
+ get_command: "show fabricpath load-balance | begin ignore-case Ftag"
86
86
  get_value: '/^Use VLAN: TRUE/'
87
87
  default_value: true
88
88
 
@@ -93,7 +93,7 @@ loadbalance_multicast_reset:
93
93
  loadbalance_multicast_rotate:
94
94
  _exclude: [N5k, N6k]
95
95
  kind: int
96
- get_command: "show fabricpath load-balance | begin Ftag"
96
+ get_command: "show fabricpath load-balance | begin ignore-case Ftag"
97
97
  get_value: '/^Rotate amount: (\d+)/'
98
98
  # default_value: n/a. The default rotate amount is randomized to avoid polarization.
99
99
 
@@ -0,0 +1,8 @@
1
+ # hostname
2
+ ---
3
+
4
+ name:
5
+ get_command: "show running-config all | include 'hostname '"
6
+ get_value: '/^hostname (\S+)$/'
7
+ set_value: "<state> hostname <name>"
8
+ default_value: ""
@@ -127,7 +127,7 @@ hsrp_mac_refresh:
127
127
  kind: int
128
128
  get_value: '/^hsrp mac-refresh (\d+)$/'
129
129
  set_value: '<state> hsrp mac-refresh <timeout>'
130
- default_value: false
130
+ default_value: ~
131
131
 
132
132
  hsrp_use_bia:
133
133
  _exclude: [ios_xr, N5k, N6k]
@@ -137,7 +137,7 @@ hsrp_use_bia:
137
137
  # optional match to get the whole config
138
138
  get_value: '/^hsrp use-bia(?:\s+\S+\s+\S+)?$/'
139
139
  set_value: '<state> hsrp use-bia<scope>'
140
- default_value: false
140
+ default_value: ~
141
141
 
142
142
  hsrp_version:
143
143
  _exclude: [ios_xr, N5k, N6k]
@@ -211,7 +211,7 @@ ipv4_dhcp_relay_src_intf:
211
211
  _exclude: [ios_xr]
212
212
  get_value: '/^ip dhcp relay source-interface (.*)$/'
213
213
  set_value: "<state> ip dhcp relay source-interface <intf>"
214
- default_value: false
214
+ default_value: ~
215
215
 
216
216
  ipv4_dhcp_relay_subnet_broadcast:
217
217
  _exclude: [ios_xr]
@@ -258,7 +258,7 @@ ipv4_proxy_arp:
258
258
  ipv4_redirects_loopback:
259
259
  kind: boolean
260
260
  nexus:
261
- default_only: false
261
+ default_only: ~
262
262
  ios_xr:
263
263
  get_value: '/^((?:no )?ipv4 redirects)$/'
264
264
  set_value: "<state> ipv4 redirects"
@@ -304,7 +304,14 @@ ipv6_dhcp_relay_src_intf:
304
304
  _exclude: [ios_xr]
305
305
  get_value: '/^ipv6 dhcp relay source-interface (.*)$/'
306
306
  set_value: "<state> ipv6 dhcp relay source-interface <intf>"
307
- default_value: false
307
+ default_value: ~
308
+
309
+ ipv6_redirects:
310
+ _exclude: [ios_xr]
311
+ kind: boolean
312
+ get_value: '/^((?:no )?ipv6 redirects)$/'
313
+ set_value: "<state> ipv6 redirects"
314
+ default_value: true
308
315
 
309
316
  load_interval_counter_1_delay:
310
317
  _exclude: [ios_xr]
@@ -329,7 +336,7 @@ load_interval_counter_3_delay:
329
336
  kind: int
330
337
  get_value: '/^load-interval counter 3 (\d+)$/'
331
338
  set_value: "<state> load-interval counter 3 <delay>"
332
- default_value: false
339
+ default_value: ~
333
340
 
334
341
  mtu_loopback:
335
342
  kind: boolean
@@ -377,6 +384,7 @@ purge_config:
377
384
  set_value: "default interface <name>"
378
385
  get_command: "show running interface"
379
386
  get_value: '/(.*)/'
387
+ default_value: ~
380
388
 
381
389
  pvlan_any:
382
390
  multiple:
@@ -462,13 +470,13 @@ stp_bpdufilter:
462
470
  kind: string
463
471
  get_value: '/^spanning-tree bpdufilter (.*)$/'
464
472
  set_value: "<state> spanning-tree bpdufilter <filter>"
465
- default_value: false
473
+ default_value: ~
466
474
 
467
475
  stp_bpduguard:
468
476
  kind: string
469
477
  get_value: '/^spanning-tree bpduguard (.*)$/'
470
478
  set_value: "<state> spanning-tree bpduguard <guard>"
471
- default_value: false
479
+ default_value: ~
472
480
 
473
481
  stp_cost:
474
482
  kind: string
@@ -480,7 +488,7 @@ stp_guard:
480
488
  kind: string
481
489
  get_value: '/^spanning-tree guard (.*)$/'
482
490
  set_value: "<state> spanning-tree guard <guard>"
483
- default_value: false
491
+ default_value: ~
484
492
 
485
493
  stp_link_type:
486
494
  kind: string
@@ -517,7 +525,7 @@ stp_port_type:
517
525
  get_command: "show running interface"
518
526
  get_value: '/^spanning-tree port type (.*)$/'
519
527
  set_value: "<state> spanning-tree port type <type>"
520
- default_value: false
528
+ default_value: ~
521
529
 
522
530
  stp_vlan_cost:
523
531
  multiple:
@@ -625,7 +633,7 @@ switchport_pvlan_trunk_allowed_vlan:
625
633
  multiple: true
626
634
  get_value: '/^switchport private-vlan trunk allowed vlan (?:add )?(\S+)$/'
627
635
  set_value: "switchport private-vlan trunk allowed vlan <range>"
628
- default_value: 'none'
636
+ default_value: none
629
637
 
630
638
  switchport_pvlan_trunk_association:
631
639
  _exclude: [ios_xr, N3k, N3k-F, N9k-F]
@@ -728,7 +736,7 @@ vpc_id:
728
736
  kind: int
729
737
  get_value: '/^vpc (\d+)$/'
730
738
  set_value: '<state> vpc <id>'
731
- default_value: false
739
+ default_value: ~
732
740
 
733
741
  vpc_peer_link:
734
742
  kind: boolean
@@ -23,14 +23,14 @@ authentication_enc_type:
23
23
  default_value: '0'
24
24
 
25
25
  authentication_key_type:
26
- default_value: 'key-chain'
26
+ default_value: ~
27
27
 
28
28
  authentication_string:
29
- default_value: ''
29
+ default_value: ~
30
30
 
31
31
  authentication_timeout:
32
32
  kind: int
33
- default_value: 0
33
+ default_value: ~
34
34
 
35
35
  group_name:
36
36
  get_value: '/^name (\S+)/'
@@ -7,12 +7,16 @@ _template:
7
7
 
8
8
  overlay_distributed_dr:
9
9
  context: ~
10
+ kind: boolean
10
11
  get_value: '^ip multicast overlay-distributed-dr$'
11
12
  set_value: "<state> ip multicast overlay-distributed-dr"
12
13
  default_value: false
13
14
 
14
15
  overlay_spt_only:
15
16
  context: ~
16
- get_value: '^ip multicast overlay-spt-only$'
17
+ kind: boolean
18
+ auto_default: false
19
+ get_command: "show fabric multicast globals"
20
+ get_value: '^Overlay spt-only:\s+TRUE$'
17
21
  set_value: "<state> ip multicast overlay-spt-only"
18
- default_value: false
22
+ default_value: true
@@ -62,7 +62,10 @@ packet_size:
62
62
  # the n3|9k behavior when the issue is resolved.
63
63
  default_value: 0
64
64
  N6k: *n5k_default_packet_size
65
- N7k: *n5k_default_packet_size
65
+ # On recent versions, packet size is fixed,
66
+ # so this change will take care of the fix but
67
+ # it could still fail in the older versions.
68
+ N7k: *n3k_default_packet_size
66
69
  # On recent versions, packet size is fixed,
67
70
  # so this change will take care of the fix but
68
71
  # it could still fail in the older versions.
@@ -0,0 +1,10 @@
1
+ # syslog_facility
2
+ ---
3
+ _exclude: [ios_xr]
4
+
5
+ facility:
6
+ multiple: true
7
+ get_command: "show running-config | include '^logging level'"
8
+ # Returns <facility>, <level>
9
+ get_value: '/^(?:logging level)\s+(.*)\s+([0-7])/'
10
+ set_value: '<state> logging level <facility> <level>'
@@ -15,9 +15,9 @@ server:
15
15
  multiple: true
16
16
  nexus:
17
17
  get_command: "show running-config all | include '^logging server'"
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>'
18
+ # Returns <ip>, <level>, <port>, <vrf>, <facility>
19
+ get_value: '/^(?:logging server )([^\s]+)(?: (\d+))?(?: port (\d+))?(?: use-vrf (\S+))?(?: facility (\S+))?/'
20
+ set_value: '<state> logging server <ip> <level> <port> <vrf> <facility>'
21
21
  ios_xr:
22
22
  get_command: "show running-config logging"
23
23
  get_value: '/^logging (\S+).*/'
@@ -9,6 +9,22 @@ console:
9
9
  get_value: '/^(no)?\s*logging console\s*(\d)?/'
10
10
  set_value: '<state> logging console <severity>'
11
11
 
12
+ logfile_name:
13
+ get_command: "show running-config all | include 'logging'"
14
+ # Returns <state> and <name>
15
+ get_value: '/^(no)?\s*logging logfile\s(\S*)\s*?/'
16
+ set_value: '<state> logging logfile <logname> <severity> <size>'
17
+
18
+ logfile_severity_level:
19
+ get_command: "show running-config all | include 'logging'"
20
+ # Returns <state> and <severity>
21
+ get_value: '/^(no)?\s*logging logfile\s\S*\s*(\d)?/'
22
+
23
+ logfile_size:
24
+ get_command: "show running-config all | include 'logging'"
25
+ # Returns <state> and <size>
26
+ get_value: '/^(no)?\s*logging logfile.*size\s(\d*)/'
27
+
12
28
  monitor:
13
29
  default_value: 5
14
30
  get_command: "show running-config all | include 'logging'"
@@ -48,7 +48,7 @@ hosts:
48
48
  port:
49
49
  default_value: 49
50
50
  kind: int
51
- get_value: '/^tacacs-server host <ip>.* port (\d+).*$/'
51
+ get_value: '/^tacacs-server host <ip>\s.*port (\d+).*$/'
52
52
  nexus:
53
53
  set_value: "tacacs-server host <ip> port <port>"
54
54
 
@@ -56,7 +56,7 @@ timeout:
56
56
  default_value: 0
57
57
  kind: int
58
58
  nexus:
59
- get_value: '/^tacacs-server host <ip> .*timeout (\d+)/'
59
+ get_value: '/^tacacs-server host <ip>\s.*timeout (\d+)/'
60
60
  set_value: "<state> tacacs-server host <ip> timeout <timeout>"
61
61
  ios_xr:
62
62
  context: ["tacacs-server host <ip> port <port>"]
@@ -1,6 +1,7 @@
1
+ # August 2018
1
2
  # March 2016, Glenn F. Matthews
2
3
  #
3
- # Copyright (c) 2016 Cisco and/or its affiliates.
4
+ # Copyright (c) 2016-2018 Cisco and/or its affiliates.
4
5
  #
5
6
  # Licensed under the Apache License, Version 2.0 (the "License");
6
7
  # you may not use this file except in compliance with the License.
@@ -90,6 +91,12 @@ module Cisco
90
91
  {}
91
92
  end
92
93
 
94
+ def self.add_env(env_name, env_hash)
95
+ fail ArgumentError, 'empty environment name' if env_name.empty?
96
+ fail TypeError, 'invalid environment hash' unless env_hash.is_a?(Hash)
97
+ @environments[env_name] = env_hash
98
+ end
99
+
93
100
  def self.strings_to_symbols(hash)
94
101
  Hash[hash.map { |k, v| [k.to_sym, v] }]
95
102
  end
@@ -0,0 +1,62 @@
1
+ # Hostname provider class
2
+ #
3
+ # September 2018
4
+ #
5
+ # Copyright (c) 2014-2018 Cisco and/or its affiliates.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require_relative 'node_util'
20
+
21
+ module Cisco
22
+ # Hostname- node utility class for hostname configuration
23
+ class HostName < NodeUtil
24
+ attr_reader :name
25
+
26
+ def initialize(name, instantiate=true)
27
+ @name = name
28
+ create if instantiate
29
+ end
30
+
31
+ def self.hostname
32
+ hash = {}
33
+ hostname = config_get('hostname', 'name')
34
+ hash[hostname] = HostName.new(hostname, false)
35
+ hash
36
+ end
37
+
38
+ def hostname=(host)
39
+ if host
40
+ config_set(
41
+ 'hostname', 'name',
42
+ state: '', name: host)
43
+ else
44
+ config_set(
45
+ 'hostname', 'name',
46
+ state: 'no', name: '')
47
+ end
48
+ end
49
+
50
+ def ==(other)
51
+ name == other.name
52
+ end
53
+
54
+ def create
55
+ config_set('hostname', 'name', state: '', name: @name)
56
+ end
57
+
58
+ def destroy
59
+ config_set('hostname', 'name', state: 'no', name: @name)
60
+ end
61
+ end # class
62
+ end # module
@@ -1,6 +1,6 @@
1
1
  # November 2015, Chris Van Heuveln
2
2
  #
3
- # Copyright (c) 2015-2017 Cisco and/or its affiliates.
3
+ # Copyright (c) 2015-2018 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.
@@ -192,6 +192,7 @@ module Cisco
192
192
  # are left untouched.
193
193
 
194
194
  def access_vlan
195
+ return nil if switchport_mode == :disabled
195
196
  config_get('interface', 'access_vlan', name: @name)
196
197
  end
197
198
 
@@ -275,6 +276,7 @@ module Cisco
275
276
  end
276
277
 
277
278
  def fabric_forwarding_anycast_gateway=(state)
279
+ return if fabric_forwarding_anycast_gateway == state
278
280
  no_cmd = (state ? '' : 'no')
279
281
  config_set('interface',
280
282
  'fabric_forwarding_anycast_gateway',
@@ -325,6 +327,7 @@ module Cisco
325
327
  end
326
328
 
327
329
  def hsrp_delay_minimum
330
+ return nil if switchport_mode != :disabled || @name[/loop/i]
328
331
  minimum, _reload = hsrp_delay
329
332
  minimum.nil? ? default_hsrp_delay_minimum : minimum
330
333
  end
@@ -342,6 +345,7 @@ module Cisco
342
345
  end
343
346
 
344
347
  def hsrp_delay_reload
348
+ return nil if switchport_mode != :disabled || @name[/loop/i]
345
349
  _minimum, reload = hsrp_delay
346
350
  reload.nil? ? default_hsrp_delay_reload : reload
347
351
  end
@@ -413,6 +417,7 @@ module Cisco
413
417
  end
414
418
 
415
419
  def hsrp_version
420
+ return nil if switchport_mode != :disabled || @name[/loop/i]
416
421
  config_get('interface', 'hsrp_version', name: @name)
417
422
  end
418
423
 
@@ -604,6 +609,7 @@ module Cisco
604
609
  end
605
610
 
606
611
  def ipv4_dhcp_relay_info_trust
612
+ return nil if @name[/loop/i] || switchport_mode != :disabled
607
613
  config_get('interface', 'ipv4_dhcp_relay_info_trust', name: @name)
608
614
  end
609
615
 
@@ -654,6 +660,7 @@ module Cisco
654
660
  end
655
661
 
656
662
  def ipv4_dhcp_relay_subnet_broadcast
663
+ return nil if @name[/loop/i] || switchport_mode != :disabled
657
664
  config_get('interface', 'ipv4_dhcp_relay_subnet_broadcast', name: @name)
658
665
  end
659
666
 
@@ -669,6 +676,7 @@ module Cisco
669
676
  end
670
677
 
671
678
  def ipv4_dhcp_smart_relay
679
+ return nil if @name[/loop/i] || switchport_mode != :disabled
672
680
  config_get('interface', 'ipv4_dhcp_smart_relay', name: @name)
673
681
  end
674
682
 
@@ -698,6 +706,7 @@ module Cisco
698
706
  end
699
707
 
700
708
  def ipv4_pim_sparse_mode
709
+ return nil unless switchport_mode == :disabled
701
710
  config_get('interface', 'ipv4_pim_sparse_mode', name: @name)
702
711
  end
703
712
 
@@ -713,6 +722,7 @@ module Cisco
713
722
  end
714
723
 
715
724
  def ipv4_proxy_arp
725
+ return nil if @name[/loop/i] || switchport_mode != :disabled
716
726
  config_get('interface', 'ipv4_proxy_arp', name: @name)
717
727
  end
718
728
 
@@ -736,6 +746,7 @@ module Cisco
736
746
  end
737
747
 
738
748
  def ipv4_redirects
749
+ return nil unless switchport_mode == :disabled
739
750
  config_get('interface', ipv4_redirects_lookup_string, name: @name)
740
751
  end
741
752
 
@@ -834,6 +845,22 @@ module Cisco
834
845
  config_get_default('interface', 'ipv6_dhcp_relay_src_intf')
835
846
  end
836
847
 
848
+ def ipv6_redirects
849
+ return nil if @name[/loop/i] || switchport_mode != :disabled
850
+ config_get('interface', 'ipv6_redirects', name: @name)
851
+ end
852
+
853
+ def ipv6_redirects=(redirects)
854
+ check_switchport(:disabled)
855
+ no_cmd = (redirects ? '' : 'no')
856
+ config_set('interface', 'ipv6_redirects',
857
+ name: @name, state: no_cmd)
858
+ end
859
+
860
+ def default_ipv6_redirects
861
+ config_get_default('interface', 'ipv6_redirects')
862
+ end
863
+
837
864
  def feature_lacp?
838
865
  config_get('interface', 'feature_lacp')
839
866
  end
@@ -913,6 +940,7 @@ module Cisco
913
940
  end
914
941
 
915
942
  def mtu=(val)
943
+ return if mtu == val
916
944
  check_switchport(:disabled)
917
945
  config_set('interface', mtu_lookup_string,
918
946
  name: @name, state: '', mtu: val)
@@ -923,6 +951,7 @@ module Cisco
923
951
  end
924
952
 
925
953
  def speed
954
+ return nil if @name[/loop|vlan/i]
926
955
  config_get('interface', 'speed', name: @name)
927
956
  end
928
957
 
@@ -935,6 +964,7 @@ module Cisco
935
964
  end
936
965
 
937
966
  def duplex
967
+ return nil if @name[/loop|vlan/i]
938
968
  config_get('interface', 'duplex', name: @name)
939
969
  end
940
970
 
@@ -958,6 +988,7 @@ module Cisco
958
988
  end
959
989
 
960
990
  def negotiate_auto
991
+ return nil if @name[/loop|vlan/]
961
992
  config_get('interface', negotiate_auto_lookup_string, name: @name)
962
993
  end
963
994
 
@@ -1032,10 +1063,12 @@ module Cisco
1032
1063
  end
1033
1064
 
1034
1065
  def storm_control_broadcast
1066
+ return nil if @name[/loop|vlan/i]
1035
1067
  config_get('interface', 'storm_control_broadcast', name: @name)
1036
1068
  end
1037
1069
 
1038
1070
  def storm_control_broadcast=(val)
1071
+ return if val == storm_control_broadcast
1039
1072
  state = val == default_storm_control_broadcast ? 'no' : ''
1040
1073
  level = val == default_storm_control_broadcast ? '' : val
1041
1074
  config_set('interface', 'storm_control_broadcast',
@@ -1047,10 +1080,12 @@ module Cisco
1047
1080
  end
1048
1081
 
1049
1082
  def storm_control_multicast
1083
+ return nil if @name[/loop|vlan/i]
1050
1084
  config_get('interface', 'storm_control_multicast', name: @name)
1051
1085
  end
1052
1086
 
1053
1087
  def storm_control_multicast=(val)
1088
+ return if val == storm_control_broadcast
1054
1089
  state = val == default_storm_control_multicast ? 'no' : ''
1055
1090
  level = val == default_storm_control_multicast ? '' : val
1056
1091
  config_set('interface', 'storm_control_multicast',
@@ -1062,10 +1097,12 @@ module Cisco
1062
1097
  end
1063
1098
 
1064
1099
  def storm_control_unicast
1100
+ return nil if @name[/loop|vlan/i]
1065
1101
  config_get('interface', 'storm_control_unicast', name: @name)
1066
1102
  end
1067
1103
 
1068
1104
  def storm_control_unicast=(val)
1105
+ return if val == storm_control_broadcast
1069
1106
  state = val == default_storm_control_unicast ? 'no' : ''
1070
1107
  level = val == default_storm_control_unicast ? '' : val
1071
1108
  config_set('interface', 'storm_control_unicast',
@@ -1116,6 +1153,7 @@ module Cisco
1116
1153
  end
1117
1154
 
1118
1155
  def stp_cost
1156
+ return nil if switchport_mode == :disabled
1119
1157
  cost = config_get('interface', 'stp_cost', name: @name)
1120
1158
  cost == 'auto' ? cost : cost.to_i
1121
1159
  end
@@ -1150,6 +1188,7 @@ module Cisco
1150
1188
  end
1151
1189
 
1152
1190
  def stp_link_type
1191
+ return nil if switchport_mode == :disabled
1153
1192
  config_get('interface', 'stp_link_type', name: @name)
1154
1193
  end
1155
1194
 
@@ -1163,6 +1202,7 @@ module Cisco
1163
1202
  end
1164
1203
 
1165
1204
  def stp_port_priority
1205
+ return nil if switchport_mode == :disabled
1166
1206
  config_get('interface', 'stp_port_priority', name: @name)
1167
1207
  end
1168
1208
 
@@ -1294,6 +1334,7 @@ module Cisco
1294
1334
 
1295
1335
  # switchport_autostate_exclude is exclusive to switchport interfaces
1296
1336
  def switchport_autostate_exclude
1337
+ return nil if switchport_mode == :disabled
1297
1338
  config_get('interface',
1298
1339
  'switchport_autostate_exclude', name: @name)
1299
1340
  end
@@ -1384,6 +1425,7 @@ module Cisco
1384
1425
  end
1385
1426
 
1386
1427
  def switchport_trunk_allowed_vlan
1428
+ return nil if switchport_mode == :disabled
1387
1429
  vlans = config_get('interface', 'switchport_trunk_allowed_vlan',
1388
1430
  name: @name)
1389
1431
  vlans = vlans.join(',') if vlans.is_a?(Array)
@@ -1406,6 +1448,7 @@ module Cisco
1406
1448
  end
1407
1449
 
1408
1450
  def switchport_trunk_native_vlan
1451
+ return nil if switchport_mode == :disabled
1409
1452
  config_get('interface', 'switchport_trunk_native_vlan', name: @name)
1410
1453
  end
1411
1454
 
@@ -1442,6 +1485,7 @@ module Cisco
1442
1485
  # --------------------------
1443
1486
  # <state> switchport mode private-vlan host
1444
1487
  def switchport_pvlan_host
1488
+ return nil if switchport_mode == :disabled
1445
1489
  config_get('interface', 'switchport_pvlan_host', name: @name)
1446
1490
  end
1447
1491
 
@@ -1458,6 +1502,7 @@ module Cisco
1458
1502
  # --------------------------
1459
1503
  # <state> switchport mode private-vlan promiscuous
1460
1504
  def switchport_pvlan_promiscuous
1505
+ return nil if switchport_mode == :disabled
1461
1506
  config_get('interface', 'switchport_pvlan_promiscuous', name: @name)
1462
1507
  end
1463
1508
 
@@ -1650,6 +1695,7 @@ module Cisco
1650
1695
  # --------------------------
1651
1696
  # <state> switchport mode private-vlan trunk promiscuous
1652
1697
  def switchport_pvlan_trunk_promiscuous
1698
+ return nil if switchport_mode == :disabled
1653
1699
  config_get('interface', 'switchport_pvlan_trunk_promiscuous', name: @name)
1654
1700
  end
1655
1701
 
@@ -1666,6 +1712,7 @@ module Cisco
1666
1712
  # --------------------------
1667
1713
  # <state> switchport mode private-vlan trunk secondary
1668
1714
  def switchport_pvlan_trunk_secondary
1715
+ return nil if switchport_mode == :disabled
1669
1716
  config_get('interface', 'switchport_pvlan_trunk_secondary', name: @name)
1670
1717
  end
1671
1718
 
@@ -1684,6 +1731,7 @@ module Cisco
1684
1731
  # Note that range is handled as a string because the entire range is
1685
1732
  # replaced instead of individually adding or removing vlans from the range.
1686
1733
  def switchport_pvlan_trunk_allowed_vlan
1734
+ return nil if switchport_mode == :disabled
1687
1735
  vlans = config_get('interface', 'switchport_pvlan_trunk_allowed_vlan',
1688
1736
  name: @name)
1689
1737
  vlans = vlans.join(',') if vlans.is_a?(Array)
@@ -1708,6 +1756,7 @@ module Cisco
1708
1756
  # --------------------------
1709
1757
  # <state> switchport trunk native vlan <vlan>
1710
1758
  def switchport_pvlan_trunk_native_vlan
1759
+ return nil if switchport_mode == :disabled
1711
1760
  config_get('interface', 'switchport_pvlan_trunk_native_vlan', name: @name)
1712
1761
  end
1713
1762
 
@@ -1971,10 +2020,12 @@ module Cisco
1971
2020
  end
1972
2021
 
1973
2022
  def vpc_peer_link
2023
+ return nil unless @name[/port-channel/i] && switchport_mode != :disabled
1974
2024
  config_get('interface', 'vpc_peer_link', name: @name)
1975
2025
  end
1976
2026
 
1977
2027
  def vpc_peer_link=(state)
2028
+ return if vpc_peerlink == state
1978
2029
  no_cmd = (state ? '' : 'no')
1979
2030
  config_set('interface', 'vpc_peer_link', name: @name, state: no_cmd)
1980
2031
  end
@@ -2037,8 +2088,14 @@ module Cisco
2037
2088
  end
2038
2089
 
2039
2090
  def purge_config
2091
+ # This getter is only supported on ethernet interfaces
2092
+ return nil unless @name[/ethernet/]
2040
2093
  state = config_get('interface', 'purge_config', name: @name)
2041
- state.nil? ? true : false
2094
+ state.nil? ? true : default_purge_config
2095
+ end
2096
+
2097
+ def default_purge_config
2098
+ config_get_default('interface', 'purge_config')
2042
2099
  end
2043
2100
  end # Class
2044
2101
  end # Module