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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +66 -0
- data/Gemfile +1 -0
- data/README.md +44 -43
- data/bin/.rubocop.yml +18 -0
- data/bin/show_running_yang.rb +233 -0
- data/cisco_node_utils.gemspec +1 -1
- data/docs/README-maintainers.md +1 -0
- data/docs/README-utilities.md +14 -0
- data/lib/.rubocop.yml +1 -1
- data/lib/cisco_node_utils/aaa_authentication_login_service.rb +8 -3
- data/lib/cisco_node_utils/aaa_authorization_service.rb +6 -0
- data/lib/cisco_node_utils/bfd_global.rb +300 -0
- data/lib/cisco_node_utils/bgp.rb +6 -4
- data/lib/cisco_node_utils/bgp_af.rb +2 -0
- data/lib/cisco_node_utils/bgp_neighbor.rb +14 -0
- data/lib/cisco_node_utils/bgp_neighbor_af.rb +4 -1
- data/lib/cisco_node_utils/cisco_cmn_utils.rb +126 -0
- data/lib/cisco_node_utils/client/client.rb +6 -2
- data/lib/cisco_node_utils/client/grpc/client.rb +120 -36
- data/lib/cisco_node_utils/client/nxapi/client.rb +6 -2
- data/lib/cisco_node_utils/cmd_ref/DEPRECATED.yaml +118 -0
- data/lib/cisco_node_utils/cmd_ref/aaa_authorization_service.yaml +14 -0
- data/lib/cisco_node_utils/cmd_ref/bfd_global.yaml +117 -0
- data/lib/cisco_node_utils/cmd_ref/bgp.yaml +7 -7
- data/lib/cisco_node_utils/cmd_ref/bgp_neighbor.yaml +7 -0
- data/lib/cisco_node_utils/cmd_ref/dhcp_relay_global.yaml +125 -0
- data/lib/cisco_node_utils/cmd_ref/feature.yaml +10 -0
- data/lib/cisco_node_utils/cmd_ref/interface.yaml +141 -49
- data/lib/cisco_node_utils/cmd_ref/interface_ospf.yaml +44 -0
- data/lib/cisco_node_utils/cmd_ref/interface_portchannel.yaml +6 -0
- data/lib/cisco_node_utils/cmd_ref/ospf.yaml +6 -0
- data/lib/cisco_node_utils/cmd_ref/ospf_area.yaml +91 -0
- data/lib/cisco_node_utils/cmd_ref/ospf_area_vlink.yaml +88 -0
- data/lib/cisco_node_utils/cmd_ref/overlay_global.yaml +0 -3
- data/lib/cisco_node_utils/cmd_ref/show_version.yaml +3 -3
- data/lib/cisco_node_utils/cmd_ref/snmp_community.yaml +39 -15
- data/lib/cisco_node_utils/cmd_ref/snmp_notification_receiver.yaml +43 -21
- data/lib/cisco_node_utils/cmd_ref/snmp_server.yaml +48 -19
- data/lib/cisco_node_utils/cmd_ref/snmp_user.yaml +0 -0
- data/lib/cisco_node_utils/cmd_ref/tacacs_global.yaml +30 -0
- data/lib/cisco_node_utils/cmd_ref/tacacs_server.yaml +18 -6
- data/lib/cisco_node_utils/cmd_ref/vdc.yaml +4 -0
- data/lib/cisco_node_utils/cmd_ref/virtual_service.yaml +1 -0
- data/lib/cisco_node_utils/cmd_ref/vlan.yaml +23 -10
- data/lib/cisco_node_utils/cmd_ref/vxlan_vtep.yaml +8 -2
- data/lib/cisco_node_utils/cmd_ref/yang.yaml +7 -0
- data/lib/cisco_node_utils/cmd_ref/yum.yaml +10 -1
- data/lib/cisco_node_utils/constants.rb +8 -1
- data/lib/cisco_node_utils/dhcp_relay_global.rb +302 -0
- data/lib/cisco_node_utils/exceptions.rb +29 -0
- data/lib/cisco_node_utils/feature.rb +28 -0
- data/lib/cisco_node_utils/interface.rb +493 -402
- data/lib/cisco_node_utils/interface_DEPRECATED.rb +513 -0
- data/lib/cisco_node_utils/interface_ospf.rb +126 -0
- data/lib/cisco_node_utils/interface_portchannel.rb +16 -0
- data/lib/cisco_node_utils/logger.rb +3 -0
- data/lib/cisco_node_utils/node.rb +29 -1
- data/lib/cisco_node_utils/overlay_global.rb +1 -12
- data/lib/cisco_node_utils/pim.rb +1 -0
- data/lib/cisco_node_utils/pim_group_list.rb +1 -0
- data/lib/cisco_node_utils/pim_rp_address.rb +1 -0
- data/lib/cisco_node_utils/platform.rb +9 -2
- data/lib/cisco_node_utils/router_ospf.rb +1 -1
- data/lib/cisco_node_utils/router_ospf_area.rb +416 -0
- data/lib/cisco_node_utils/router_ospf_area_vlink.rb +313 -0
- data/lib/cisco_node_utils/router_ospf_vrf.rb +17 -0
- data/lib/cisco_node_utils/snmp_notification_receiver.rb +27 -9
- data/lib/cisco_node_utils/snmpcommunity.rb +34 -8
- data/lib/cisco_node_utils/snmpserver.rb +4 -4
- data/lib/cisco_node_utils/snmpuser.rb +0 -0
- data/lib/cisco_node_utils/tacacs_global.rb +102 -0
- data/lib/cisco_node_utils/tacacs_server.rb +8 -7
- data/lib/cisco_node_utils/vdc.rb +25 -7
- data/lib/cisco_node_utils/version.rb +1 -1
- data/lib/cisco_node_utils/vlan.rb +30 -56
- data/lib/cisco_node_utils/vlan_DEPRECATED.rb +108 -0
- data/lib/cisco_node_utils/yang.rb +160 -0
- data/lib/cisco_node_utils/yum.rb +25 -32
- data/tests/.rubocop.yml +3 -0
- data/tests/ciscotest.rb +136 -19
- data/tests/cmd_config_invalid.yaml +1 -1
- data/tests/noop.rb +7 -0
- data/tests/tacacs_server.yaml.example +6 -0
- data/tests/test_aaa_authentication_login.rb +24 -1
- data/tests/test_aaa_authentication_login_service.rb +9 -16
- data/tests/test_aaa_authorization_service.rb +111 -84
- data/tests/test_bfd_global.rb +278 -0
- data/tests/test_bgp_neighbor.rb +20 -0
- data/tests/test_bridge_domain_vni.rb +2 -9
- data/tests/test_cmn_utils.rb +76 -0
- data/tests/test_dhcp_relay_global.rb +284 -0
- data/tests/test_dns_domain.rb +4 -4
- data/tests/test_domain_name.rb +2 -2
- data/tests/test_encapsulation.rb +2 -4
- data/tests/test_evpn_vni.rb +14 -7
- data/tests/test_fabricpath_global.rb +12 -13
- data/tests/test_feature.rb +35 -17
- data/tests/test_interface.rb +352 -127
- data/tests/test_interface_bdi.rb +2 -2
- data/tests/test_interface_channel_group.rb +1 -1
- data/tests/test_interface_ospf.rb +153 -23
- data/tests/test_interface_portchannel.rb +15 -6
- data/tests/test_interface_private_vlan.rb +200 -576
- data/tests/test_interface_svi.rb +5 -52
- data/tests/test_interface_switchport.rb +80 -240
- data/tests/test_itd_device_group.rb +2 -2
- data/tests/test_itd_device_group_node.rb +2 -2
- data/tests/test_itd_service.rb +1 -1
- data/tests/test_name_server.rb +3 -3
- data/tests/test_node_ext.rb +15 -17
- data/tests/test_ntp_config.rb +1 -1
- data/tests/test_ntp_server.rb +3 -3
- data/tests/test_nxapi.rb +1 -0
- data/tests/test_overlay_global.rb +15 -19
- data/tests/test_pim.rb +5 -5
- data/tests/test_pim_group_list.rb +1 -37
- data/tests/test_pim_rp_address.rb +1 -1
- data/tests/test_platform.rb +9 -11
- data/tests/test_portchannel_global.rb +43 -3
- data/tests/test_radius_server.rb +1 -1
- data/tests/test_radius_server_group.rb +1 -1
- data/tests/test_router_bgp.rb +17 -30
- data/tests/test_router_ospf_area.rb +433 -0
- data/tests/test_router_ospf_area_vlink.rb +298 -0
- data/tests/test_router_ospf_vrf.rb +17 -0
- data/tests/test_snmp_notification_receiver.rb +11 -11
- data/tests/test_snmpcommunity.rb +177 -69
- data/tests/test_snmpgroup.rb +7 -7
- data/tests/test_snmpserver.rb +164 -253
- data/tests/test_snmpuser.rb +73 -69
- data/tests/test_stp_global.rb +15 -15
- data/tests/test_syslog_settings.rb +1 -1
- data/tests/test_tacacs_global.rb +80 -0
- data/tests/test_tacacs_server.rb +129 -51
- data/tests/test_tacacs_server_group.rb +3 -29
- data/tests/test_tacacs_server_host.rb +24 -27
- data/tests/test_vlan.rb +57 -59
- data/tests/test_vlan_private.rb +271 -284
- data/tests/test_vpc.rb +10 -4
- data/tests/test_vrf.rb +2 -0
- data/tests/test_vrf_af.rb +2 -5
- data/tests/test_vtp.rb +5 -2
- data/tests/test_vxlan_vtep.rb +20 -44
- data/tests/test_vxlan_vtep_vni.rb +23 -16
- data/tests/test_yang.rb +369 -0
- data/tests/test_yum.rb +34 -42
- data/tests/yum_package.yaml +35 -0
- metadata +31 -4
- data/tests/test_vlan_mt_full.rb +0 -85
|
@@ -39,9 +39,9 @@ module Cisco
|
|
|
39
39
|
def location=(location)
|
|
40
40
|
fail TypeError unless location.is_a?(String)
|
|
41
41
|
if location.empty?
|
|
42
|
-
config_set('snmp_server', 'location', 'no', '')
|
|
42
|
+
config_set('snmp_server', 'location', state: 'no', location: '')
|
|
43
43
|
else
|
|
44
|
-
config_set('snmp_server', 'location', '', location)
|
|
44
|
+
config_set('snmp_server', 'location', state: '', location: location)
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
|
|
@@ -57,9 +57,9 @@ module Cisco
|
|
|
57
57
|
def contact=(contact)
|
|
58
58
|
fail TypeError unless contact.is_a?(String)
|
|
59
59
|
if contact.empty?
|
|
60
|
-
config_set('snmp_server', 'contact', 'no', '')
|
|
60
|
+
config_set('snmp_server', 'contact', state: 'no', contact: '')
|
|
61
61
|
else
|
|
62
|
-
config_set('snmp_server', 'contact', '', contact)
|
|
62
|
+
config_set('snmp_server', 'contact', state: '', contact: contact)
|
|
63
63
|
end
|
|
64
64
|
end
|
|
65
65
|
|
|
File without changes
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Tacacs Global provider class
|
|
2
|
+
|
|
3
|
+
# TP HONEY et al., June 2014-2016
|
|
4
|
+
|
|
5
|
+
# Copyright (c) 2014-2016 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
|
+
# Tacacs Global configuration management
|
|
22
|
+
module Cisco
|
|
23
|
+
TACACS_GLOVAL_ENC_NONE = 0
|
|
24
|
+
TACACS_GLOBAL_ENC_CISCO_TYPE_7 = 7
|
|
25
|
+
TACACS_GLOBAL_ENC_UNKNOWN = 8
|
|
26
|
+
|
|
27
|
+
# TacacsGlobal - node utility class for
|
|
28
|
+
class TacacsGlobal < NodeUtil
|
|
29
|
+
attr_reader :name
|
|
30
|
+
|
|
31
|
+
def initialize(name)
|
|
32
|
+
fail TypeError unless name.is_a?(String)
|
|
33
|
+
fail ArgumentError,
|
|
34
|
+
"This provider only accepts an id of 'default'" \
|
|
35
|
+
unless name.eql?('default')
|
|
36
|
+
Feature.tacacs_enable unless Feature.tacacs_enabled?
|
|
37
|
+
@name = name
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def self.tacacs_global
|
|
41
|
+
hash = {}
|
|
42
|
+
hash['default'] = TacacsGlobal.new('default')
|
|
43
|
+
hash
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def ==(other)
|
|
47
|
+
name == other.name
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def timeout
|
|
51
|
+
config_get('tacacs_global', 'timeout')
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def default_timeout
|
|
55
|
+
config_get_default('tacacs_global', 'timeout')
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def timeout=(val)
|
|
59
|
+
unless val.nil?
|
|
60
|
+
fail ArgumentError, 'timeout must be an Integer' \
|
|
61
|
+
unless val.is_a?(Integer)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
if val.nil?
|
|
65
|
+
config_set('tacacs_global',
|
|
66
|
+
'timeout',
|
|
67
|
+
state: 'no',
|
|
68
|
+
timeout: timeout)
|
|
69
|
+
else
|
|
70
|
+
config_set('tacacs_global',
|
|
71
|
+
'timeout',
|
|
72
|
+
state: '',
|
|
73
|
+
timeout: val)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def key_format
|
|
78
|
+
match = config_get('tacacs_global', 'key_format')
|
|
79
|
+
match.nil? ? TACACS_GLOBAL_ENC_UNKNOWN : match[0].to_i
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def key
|
|
83
|
+
match = config_get('tacacs_global', 'key')
|
|
84
|
+
match.empty? ? TacacsGlobal.default_key : match[1]
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Get default encryption password
|
|
88
|
+
def self.default_key
|
|
89
|
+
config_get_default('tacacs_global', 'key')
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def encryption_key_set(key_format, key)
|
|
93
|
+
if key_format == TACACS_GLOBAL_ENC_UNKNOWN
|
|
94
|
+
config_set('tacacs_server', 'encryption', state: 'no',
|
|
95
|
+
option: key_format, key: key)
|
|
96
|
+
else
|
|
97
|
+
config_set('tacacs_server', 'encryption', state: '', option: key_format,
|
|
98
|
+
key: key)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end # class
|
|
102
|
+
end # module
|
|
@@ -39,12 +39,12 @@ module Cisco
|
|
|
39
39
|
|
|
40
40
|
# Enable tacacs_server feature
|
|
41
41
|
def enable
|
|
42
|
-
config_set('tacacs_server', 'feature', '')
|
|
42
|
+
config_set('tacacs_server', 'feature', '') unless platform == :ios_xr
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
# Disable tacacs_server feature
|
|
46
46
|
def destroy
|
|
47
|
-
config_set('tacacs_server', 'feature', 'no')
|
|
47
|
+
config_set('tacacs_server', 'feature', 'no') unless platform == :ios_xr
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
# --------------------
|
|
@@ -55,7 +55,7 @@ module Cisco
|
|
|
55
55
|
def timeout=(timeout)
|
|
56
56
|
# 'no tacacs timeout' will fail.
|
|
57
57
|
# Just set it to the requested timeout value.
|
|
58
|
-
config_set('tacacs_server', 'timeout', '', timeout)
|
|
58
|
+
config_set('tacacs_server', 'timeout', state: '', timeout: timeout)
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
# Get timeout
|
|
@@ -162,12 +162,13 @@ module Cisco
|
|
|
162
162
|
# need to unset it. Otherwise the box is not configured with key, we
|
|
163
163
|
# don't need to do anything
|
|
164
164
|
if encryption_type != TACACS_SERVER_ENC_UNKNOWN
|
|
165
|
-
config_set('tacacs_server', 'encryption', 'no',
|
|
166
|
-
|
|
167
|
-
|
|
165
|
+
config_set('tacacs_server', 'encryption', state: 'no',
|
|
166
|
+
option: encryption_type,
|
|
167
|
+
key: encryption_password)
|
|
168
168
|
end
|
|
169
169
|
else
|
|
170
|
-
config_set('tacacs_server', 'encryption', '', enctype,
|
|
170
|
+
config_set('tacacs_server', 'encryption', state: '', option: enctype,
|
|
171
|
+
key: password)
|
|
171
172
|
end
|
|
172
173
|
end
|
|
173
174
|
end
|
data/lib/cisco_node_utils/vdc.rb
CHANGED
|
@@ -65,6 +65,12 @@ module Cisco
|
|
|
65
65
|
# PROPERTIES #
|
|
66
66
|
########################################################
|
|
67
67
|
|
|
68
|
+
def allocate_interface
|
|
69
|
+
# TBD: This property is only partially implemented because it is currently
|
|
70
|
+
# only used for minitest & beaker.
|
|
71
|
+
config_get('vdc', 'allocate_interface', vdc: @vdc)
|
|
72
|
+
end
|
|
73
|
+
|
|
68
74
|
def limit_resource_module_type
|
|
69
75
|
str = config_get('vdc', 'limit_resource_module_type', vdc: @vdc)
|
|
70
76
|
str.strip! unless str.nil?
|
|
@@ -72,13 +78,25 @@ module Cisco
|
|
|
72
78
|
|
|
73
79
|
def limit_resource_module_type=(mods)
|
|
74
80
|
state = mods.empty? ? 'no' : ''
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
81
|
+
begin
|
|
82
|
+
# limit-resource commands are time-consuming and process in the
|
|
83
|
+
# background. Back-to-back LR commands may fail if processed too
|
|
84
|
+
# quickly.
|
|
85
|
+
config_set('vdc', 'limit_resource_module_type',
|
|
86
|
+
state: state, vdc: @vdc, mods: mods)
|
|
87
|
+
|
|
88
|
+
# TBD: No interfaces are allocated after changing the module-type
|
|
89
|
+
# so 'allocate' is needed to make this useful. Consider moving
|
|
90
|
+
# this into it's own property.
|
|
91
|
+
config_set('vdc', 'allocate_interface_unallocated', vdc: @vdc)
|
|
92
|
+
|
|
93
|
+
rescue CliError => e
|
|
94
|
+
count ||= 1
|
|
95
|
+
if e.message[/VDC is not in active state/] && (count += 1) < 10
|
|
96
|
+
retry
|
|
97
|
+
end
|
|
98
|
+
raise
|
|
99
|
+
end
|
|
82
100
|
end
|
|
83
101
|
|
|
84
102
|
def default_limit_resource_module_type
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
# Container module for version number only.
|
|
16
16
|
module CiscoNodeUtils
|
|
17
|
-
VERSION = '1.
|
|
17
|
+
VERSION = '1.4.0'
|
|
18
18
|
gem_version = Gem::Version.new(Gem::VERSION)
|
|
19
19
|
min_gem_version = Gem::Version.new('2.1.0')
|
|
20
20
|
fail 'Required rubygems version >= 2.1.0' if gem_version < min_gem_version
|
|
@@ -19,13 +19,14 @@ require_relative 'node_util'
|
|
|
19
19
|
require_relative 'interface'
|
|
20
20
|
require_relative 'fabricpath_global'
|
|
21
21
|
require_relative 'feature'
|
|
22
|
+
require_relative 'vlan_DEPRECATED'
|
|
22
23
|
|
|
23
24
|
# Add some Vlan-specific constants to the Cisco namespace
|
|
24
25
|
module Cisco
|
|
25
26
|
VLAN_NAME_SIZE = 33
|
|
26
27
|
|
|
27
28
|
# Vlan - node utility class for VLAN configuration management
|
|
28
|
-
class Vlan <
|
|
29
|
+
class Vlan < Cisco::VlanDeprecated
|
|
29
30
|
attr_reader :vlan_id
|
|
30
31
|
|
|
31
32
|
def initialize(vlan_id, instantiate=true)
|
|
@@ -221,7 +222,13 @@ module Cisco
|
|
|
221
222
|
config_get('vlan', 'mapped_vni', vlan: @vlan_id)
|
|
222
223
|
end
|
|
223
224
|
|
|
225
|
+
def requires_nv_overlay?
|
|
226
|
+
config_get('vlan', 'mapped_vni_requires_nv_overlay')
|
|
227
|
+
end
|
|
228
|
+
|
|
224
229
|
def mapped_vni=(vni)
|
|
230
|
+
# Some platforms require feature nv_overlay to be enabled first.
|
|
231
|
+
Feature.nv_overlay_enable if requires_nv_overlay?
|
|
225
232
|
Feature.vn_segment_vlan_based_enable
|
|
226
233
|
# Remove the existing mapping first as cli doesn't support overwriting.
|
|
227
234
|
config_set('vlan', 'mapped_vni', vlan: @vlan_id,
|
|
@@ -236,93 +243,60 @@ module Cisco
|
|
|
236
243
|
config_get_default('vlan', 'mapped_vni')
|
|
237
244
|
end
|
|
238
245
|
|
|
239
|
-
def
|
|
246
|
+
def pvlan_type
|
|
240
247
|
return nil unless Feature.private_vlan_enabled?
|
|
241
|
-
config_get('vlan', '
|
|
248
|
+
config_get('vlan', 'pvlan_type', id: @vlan_id)
|
|
242
249
|
end
|
|
243
250
|
|
|
244
|
-
def
|
|
251
|
+
def pvlan_type=(type)
|
|
245
252
|
Feature.private_vlan_enable
|
|
246
253
|
fail TypeError unless type && type.is_a?(String)
|
|
247
254
|
|
|
248
|
-
if type ==
|
|
249
|
-
return if
|
|
250
|
-
set_args_keys(state: 'no', type:
|
|
255
|
+
if type == default_pvlan_type
|
|
256
|
+
return if pvlan_type.empty?
|
|
257
|
+
set_args_keys(state: 'no', type: pvlan_type)
|
|
251
258
|
ignore_msg = 'Warning: Private-VLAN CLI removed'
|
|
252
259
|
else
|
|
253
260
|
set_args_keys(state: '', type: type)
|
|
254
261
|
ignore_msg = 'Warning: Private-VLAN CLI entered'
|
|
255
262
|
end
|
|
256
|
-
result = config_set('vlan', '
|
|
263
|
+
result = config_set('vlan', 'pvlan_type', @set_args)
|
|
257
264
|
cli_error_check(result, ignore_msg)
|
|
258
265
|
end
|
|
259
266
|
|
|
260
|
-
def
|
|
261
|
-
config_get_default('vlan', '
|
|
267
|
+
def default_pvlan_type
|
|
268
|
+
config_get_default('vlan', 'pvlan_type')
|
|
262
269
|
end
|
|
263
270
|
|
|
264
|
-
def
|
|
271
|
+
def pvlan_association
|
|
265
272
|
return nil unless Feature.private_vlan_enabled?
|
|
266
|
-
config_get('vlan', '
|
|
273
|
+
range = config_get('vlan', 'pvlan_association', id: @vlan_id)
|
|
274
|
+
Utils.normalize_range_array(range)
|
|
267
275
|
end
|
|
268
276
|
|
|
269
|
-
def
|
|
277
|
+
def pvlan_association=(range)
|
|
270
278
|
Feature.private_vlan_enable
|
|
271
|
-
|
|
279
|
+
is = Utils.dash_range_to_elements(pvlan_association)
|
|
280
|
+
should = Utils.dash_range_to_elements(range)
|
|
281
|
+
association_delta(is, should)
|
|
272
282
|
end
|
|
273
283
|
|
|
274
284
|
def default_private_vlan_association
|
|
275
|
-
config_get_default('vlan', '
|
|
285
|
+
config_get_default('vlan', 'pvlan_association')
|
|
276
286
|
end
|
|
277
287
|
|
|
278
288
|
# --------------------------
|
|
279
|
-
#
|
|
289
|
+
# association_delta is a helper function for the pvlan_association
|
|
280
290
|
# property. It walks the delta hash and adds/removes each target private
|
|
281
291
|
# vlan.
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
# In the example above the returned array will be 10, 11, 12, 14. Prepare
|
|
286
|
-
# array is first splitting the input on ',' and the than expanding the vlan
|
|
287
|
-
# range element like 10-12 into a flat array. The final result will
|
|
288
|
-
# be a flat array.
|
|
289
|
-
# This way we can later used the lib utility to check the delta from
|
|
290
|
-
# the input vlan value and the vlan configured to apply the right config.
|
|
291
|
-
|
|
292
|
-
def vlan_list_delta(is_list, should_list)
|
|
293
|
-
new_list = []
|
|
294
|
-
should_list.each do |item|
|
|
295
|
-
if item.include?(',')
|
|
296
|
-
new_list.push(item.split(','))
|
|
297
|
-
else
|
|
298
|
-
new_list.push(item)
|
|
299
|
-
end
|
|
300
|
-
end
|
|
301
|
-
new_list.flatten!
|
|
302
|
-
new_list.sort!
|
|
303
|
-
|
|
304
|
-
new_list.each { |item| item.gsub!('-', '..') }
|
|
305
|
-
|
|
306
|
-
should_list_new = []
|
|
307
|
-
new_list.each do |elem|
|
|
308
|
-
if elem.include?('..')
|
|
309
|
-
elema = elem.split('..').map { |d| Integer(d) }
|
|
310
|
-
elema.sort!
|
|
311
|
-
tr = elema[0]..elema[1]
|
|
312
|
-
tr.to_a.each do |item|
|
|
313
|
-
should_list_new.push(item.to_s)
|
|
314
|
-
end
|
|
315
|
-
else
|
|
316
|
-
should_list_new.push(elem)
|
|
317
|
-
end
|
|
318
|
-
end
|
|
319
|
-
|
|
320
|
-
delta_hash = Utils.delta_add_remove(should_list_new, is_list)
|
|
292
|
+
def association_delta(is, should)
|
|
293
|
+
delta_hash = Utils.delta_add_remove(should, is)
|
|
294
|
+
Cisco::Logger.debug("association_delta: #{@vlan_id}: #{delta_hash}")
|
|
321
295
|
[:add, :remove].each do |action|
|
|
322
296
|
delta_hash[action].each do |vlans|
|
|
323
297
|
state = (action == :add) ? '' : 'no'
|
|
324
298
|
set_args_keys(state: state, vlans: vlans)
|
|
325
|
-
result = config_set('vlan', '
|
|
299
|
+
result = config_set('vlan', 'pvlan_association', @set_args)
|
|
326
300
|
cli_error_check(result)
|
|
327
301
|
end
|
|
328
302
|
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# rubocop: disable Style/FileName
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2016 Cisco and/or its affiliates.
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
###############################################################################
|
|
17
|
+
#
|
|
18
|
+
# WARNING! WARNING! WARNING!
|
|
19
|
+
#
|
|
20
|
+
# This file contains deprecated methods that will be removed with version 2.0.0
|
|
21
|
+
#
|
|
22
|
+
###############################################################################
|
|
23
|
+
|
|
24
|
+
require_relative 'node_util'
|
|
25
|
+
require 'logger'
|
|
26
|
+
|
|
27
|
+
module Cisco
|
|
28
|
+
# Vlan - node utility class for VLAN configuration management
|
|
29
|
+
class VlanDeprecated < NodeUtil
|
|
30
|
+
def deprecation_warning(method, new_prop=nil)
|
|
31
|
+
if new_prop.nil?
|
|
32
|
+
new_prop = ''
|
|
33
|
+
else
|
|
34
|
+
new_prop = "The new property name is '#{new_prop}'"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
warn "
|
|
38
|
+
#########################################################################
|
|
39
|
+
WARNING: Method '#{method.to_s.delete('=')}'
|
|
40
|
+
is deprecated and should not be used.
|
|
41
|
+
#{new_prop}
|
|
42
|
+
#########################################################################
|
|
43
|
+
"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def private_vlan_type
|
|
47
|
+
return nil unless Feature.private_vlan_enabled?
|
|
48
|
+
config_get('DEPRECATED', 'private_vlan_type', id: @vlan_id)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def private_vlan_type=(type)
|
|
52
|
+
deprecation_warning(__method__, 'pvlan_type')
|
|
53
|
+
Feature.private_vlan_enable
|
|
54
|
+
fail TypeError unless type && type.is_a?(String)
|
|
55
|
+
|
|
56
|
+
if type == default_private_vlan_type
|
|
57
|
+
return if private_vlan_type.empty?
|
|
58
|
+
set_args_keys(state: 'no', type: private_vlan_type)
|
|
59
|
+
ignore_msg = 'Warning: Private-VLAN CLI removed'
|
|
60
|
+
else
|
|
61
|
+
set_args_keys(state: '', type: type)
|
|
62
|
+
ignore_msg = 'Warning: Private-VLAN CLI entered'
|
|
63
|
+
end
|
|
64
|
+
result = config_set('DEPRECATED', 'private_vlan_type', @set_args)
|
|
65
|
+
cli_error_check(result, ignore_msg)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def default_private_vlan_type
|
|
69
|
+
config_get_default('DEPRECATED', 'private_vlan_type')
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def private_vlan_association
|
|
73
|
+
return nil unless Feature.private_vlan_enabled?
|
|
74
|
+
range = config_get('DEPRECATED', 'private_vlan_association', id: @vlan_id)
|
|
75
|
+
Utils.normalize_range_array(range)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def private_vlan_association=(range)
|
|
79
|
+
deprecation_warning(__method__, 'pvlan_association')
|
|
80
|
+
Feature.private_vlan_enable
|
|
81
|
+
is = Utils.dash_range_to_elements(private_vlan_association)
|
|
82
|
+
should = Utils.dash_range_to_elements(range)
|
|
83
|
+
association_delta(is, should)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def default_private_vlan_association
|
|
87
|
+
config_get_default('DEPRECATED', 'private_vlan_association')
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# --------------------------
|
|
91
|
+
# association_delta is a helper function for the private_vlan_association
|
|
92
|
+
# property. It walks the delta hash and adds/removes each target private
|
|
93
|
+
# vlan.
|
|
94
|
+
def association_delta(is, should)
|
|
95
|
+
delta_hash = Utils.delta_add_remove(should, is)
|
|
96
|
+
Cisco::Logger.debug("association_delta: #{@vlan_id}: #{delta_hash}")
|
|
97
|
+
[:add, :remove].each do |action|
|
|
98
|
+
delta_hash[action].each do |vlans|
|
|
99
|
+
state = (action == :add) ? '' : 'no'
|
|
100
|
+
set_args_keys(state: state, vlans: vlans)
|
|
101
|
+
result = config_set('DEPRECATED',
|
|
102
|
+
'private_vlan_association', @set_args)
|
|
103
|
+
cli_error_check(result)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end # Class
|
|
108
|
+
end # Module
|