cisco_node_utils 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/CHANGELOG.md +126 -1
- data/README.md +19 -12
- data/Rakefile +1 -0
- data/bin/git/hooks/commit-msg/enforce_style +8 -0
- data/cisco_node_utils.gemspec +4 -3
- data/docs/README-develop-best-practices.md +127 -109
- data/docs/README-develop-node-utils-APIs.md +47 -39
- data/docs/template-router.rb +3 -7
- data/lib/.rubocop.yml +4 -4
- data/lib/cisco_node_utils.rb +1 -1
- data/lib/cisco_node_utils/aaa_authentication_login.rb +96 -0
- data/lib/cisco_node_utils/aaa_authentication_login_service.rb +133 -0
- data/lib/cisco_node_utils/aaa_authorization_service.rb +150 -0
- data/lib/cisco_node_utils/ace.rb +196 -0
- data/lib/cisco_node_utils/acl.rb +100 -0
- data/lib/cisco_node_utils/bgp.rb +301 -163
- data/lib/cisco_node_utils/bgp_af.rb +187 -19
- data/lib/cisco_node_utils/bgp_neighbor.rb +18 -33
- data/lib/cisco_node_utils/bgp_neighbor_af.rb +25 -48
- data/lib/cisco_node_utils/cisco_cmn_utils.rb +23 -4
- data/lib/cisco_node_utils/cmd_ref/README_YAML.md +593 -0
- data/lib/cisco_node_utils/cmd_ref/aaa_auth_login_service.yaml +22 -0
- data/lib/cisco_node_utils/cmd_ref/aaa_authentication_login.yaml +31 -0
- data/lib/cisco_node_utils/cmd_ref/aaa_authorization_service.yaml +22 -0
- data/lib/cisco_node_utils/cmd_ref/acl.yaml +43 -0
- data/lib/cisco_node_utils/cmd_ref/bgp.yaml +242 -0
- data/lib/cisco_node_utils/cmd_ref/bgp_af.yaml +164 -0
- data/lib/cisco_node_utils/cmd_ref/bgp_neighbor.yaml +131 -0
- data/lib/cisco_node_utils/cmd_ref/bgp_neighbor_af.yaml +179 -0
- data/lib/cisco_node_utils/cmd_ref/dnsclient.yaml +34 -0
- data/lib/cisco_node_utils/cmd_ref/evpn_vni.yaml +42 -0
- data/lib/cisco_node_utils/cmd_ref/fabricpath.yaml +172 -0
- data/lib/cisco_node_utils/cmd_ref/fabricpath_topology.yaml +35 -0
- data/lib/cisco_node_utils/cmd_ref/feature.yaml +42 -0
- data/lib/cisco_node_utils/cmd_ref/fex.yaml +9 -0
- data/lib/cisco_node_utils/cmd_ref/images.yaml +7 -0
- data/lib/cisco_node_utils/cmd_ref/interface.yaml +339 -0
- data/lib/cisco_node_utils/cmd_ref/interface_channel_group.yaml +28 -0
- data/lib/cisco_node_utils/cmd_ref/interface_ospf.yaml +61 -0
- data/lib/cisco_node_utils/cmd_ref/interface_portchannel.yaml +54 -0
- data/lib/cisco_node_utils/cmd_ref/interface_service_vni.yaml +32 -0
- data/lib/cisco_node_utils/cmd_ref/inventory.yaml +45 -0
- data/lib/cisco_node_utils/cmd_ref/memory.yaml +13 -0
- data/lib/cisco_node_utils/cmd_ref/ntp_config.yaml +7 -0
- data/lib/cisco_node_utils/cmd_ref/ntp_server.yaml +14 -0
- data/lib/cisco_node_utils/cmd_ref/ospf.yaml +74 -0
- data/lib/cisco_node_utils/cmd_ref/overlay_global.yaml +33 -0
- data/lib/cisco_node_utils/cmd_ref/pim.yaml +40 -0
- data/lib/cisco_node_utils/cmd_ref/portchannel_global.yaml +69 -0
- data/lib/cisco_node_utils/cmd_ref/radius_global.yaml +25 -0
- data/lib/cisco_node_utils/cmd_ref/radius_server.yaml +64 -0
- data/lib/cisco_node_utils/cmd_ref/radius_server_group.yaml +14 -0
- data/lib/cisco_node_utils/cmd_ref/show_system.yaml +5 -0
- data/lib/cisco_node_utils/cmd_ref/show_version.yaml +72 -0
- data/lib/cisco_node_utils/cmd_ref/snmp_community.yaml +23 -0
- data/lib/cisco_node_utils/cmd_ref/snmp_group.yaml +7 -0
- data/lib/cisco_node_utils/cmd_ref/snmp_notification_receiver.yaml +50 -0
- data/lib/cisco_node_utils/cmd_ref/snmp_server.yaml +51 -0
- data/lib/cisco_node_utils/cmd_ref/snmp_user.yaml +55 -0
- data/lib/cisco_node_utils/cmd_ref/snmpnotification.yaml +11 -0
- data/lib/cisco_node_utils/cmd_ref/syslog_server.yaml +18 -0
- data/lib/cisco_node_utils/cmd_ref/syslog_settings.yaml +7 -0
- data/lib/cisco_node_utils/cmd_ref/system.yaml +6 -0
- data/lib/cisco_node_utils/cmd_ref/tacacs_server.yaml +49 -0
- data/lib/cisco_node_utils/cmd_ref/tacacs_server_group.yaml +33 -0
- data/lib/cisco_node_utils/cmd_ref/tacacs_server_host.yaml +35 -0
- data/lib/cisco_node_utils/cmd_ref/vdc.yaml +38 -0
- data/lib/cisco_node_utils/cmd_ref/virtual_service.yaml +6 -0
- data/lib/cisco_node_utils/cmd_ref/vlan.yaml +56 -0
- data/lib/cisco_node_utils/cmd_ref/vni.yaml +76 -0
- data/lib/cisco_node_utils/cmd_ref/vpc.yaml +197 -0
- data/lib/cisco_node_utils/cmd_ref/vrf.yaml +88 -0
- data/lib/cisco_node_utils/cmd_ref/vtp.yaml +38 -0
- data/lib/cisco_node_utils/cmd_ref/vxlan_vtep.yaml +60 -0
- data/lib/cisco_node_utils/cmd_ref/vxlan_vtep_vni.yaml +39 -0
- data/lib/cisco_node_utils/cmd_ref/yum.yaml +13 -0
- data/lib/cisco_node_utils/command_reference.rb +359 -187
- data/lib/cisco_node_utils/configparser_lib.rb +1 -1
- data/lib/cisco_node_utils/dns_domain.rb +19 -5
- data/lib/cisco_node_utils/domain_name.rb +4 -8
- data/lib/cisco_node_utils/evpn_vni.rb +157 -0
- data/lib/cisco_node_utils/fabricpath_global.rb +388 -0
- data/lib/cisco_node_utils/fabricpath_topology.rb +150 -0
- data/lib/cisco_node_utils/feature.rb +111 -0
- data/lib/cisco_node_utils/interface.rb +390 -97
- data/lib/cisco_node_utils/interface_channel_group.rb +124 -0
- data/lib/cisco_node_utils/interface_ospf.rb +11 -34
- data/lib/cisco_node_utils/interface_portchannel.rb +157 -0
- data/lib/cisco_node_utils/interface_service_vni.rb +132 -0
- data/lib/cisco_node_utils/name_server.rb +1 -1
- data/lib/cisco_node_utils/node.rb +55 -249
- data/lib/cisco_node_utils/node_util.rb +5 -1
- data/lib/cisco_node_utils/ntp_config.rb +2 -2
- data/lib/cisco_node_utils/ntp_server.rb +14 -5
- data/lib/cisco_node_utils/overlay_global.rb +153 -0
- data/lib/cisco_node_utils/pim.rb +124 -0
- data/lib/cisco_node_utils/pim_group_list.rb +108 -0
- data/lib/cisco_node_utils/pim_rp_address.rb +102 -0
- data/lib/cisco_node_utils/platform.rb +8 -9
- data/lib/cisco_node_utils/portchannel_global.rb +277 -0
- data/lib/cisco_node_utils/radius_global.rb +9 -19
- data/lib/cisco_node_utils/radius_server.rb +31 -41
- data/lib/cisco_node_utils/radius_server_group.rb +117 -0
- data/lib/cisco_node_utils/router_ospf.rb +1 -1
- data/lib/cisco_node_utils/router_ospf_vrf.rb +14 -19
- data/lib/cisco_node_utils/snmp_notification_receiver.rb +158 -0
- data/lib/cisco_node_utils/snmpcommunity.rb +3 -5
- data/lib/cisco_node_utils/snmpgroup.rb +1 -1
- data/lib/cisco_node_utils/snmpnotification.rb +57 -0
- data/lib/cisco_node_utils/snmpserver.rb +8 -17
- data/lib/cisco_node_utils/snmpuser.rb +67 -28
- data/lib/cisco_node_utils/syslog_server.rb +3 -9
- data/lib/cisco_node_utils/syslog_settings.rb +2 -10
- data/lib/cisco_node_utils/tacacs_server.rb +9 -14
- data/lib/cisco_node_utils/tacacs_server_group.rb +145 -0
- data/lib/cisco_node_utils/tacacs_server_host.rb +5 -9
- data/lib/cisco_node_utils/vdc.rb +88 -0
- data/lib/cisco_node_utils/version.rb +5 -2
- data/lib/cisco_node_utils/vlan.rb +71 -8
- data/lib/cisco_node_utils/vni.rb +227 -0
- data/lib/cisco_node_utils/vpc.rb +377 -0
- data/lib/cisco_node_utils/vrf.rb +60 -9
- data/lib/cisco_node_utils/vrf_af.rb +191 -0
- data/lib/cisco_node_utils/vtp.rb +8 -6
- data/lib/cisco_node_utils/vxlan_vtep.rb +151 -0
- data/lib/cisco_node_utils/vxlan_vtep_vni.rb +234 -0
- data/lib/cisco_node_utils/yum.rb +1 -1
- data/tests/.rubocop.yml +1 -1
- data/tests/basetest.rb +16 -7
- data/tests/ciscotest.rb +55 -13
- data/tests/cmd_config.yaml +2 -2
- data/tests/platform_info.rb +3 -2
- data/tests/test_aaa_authentication_login.rb +219 -0
- data/tests/test_aaa_authentication_login_service.rb +759 -0
- data/tests/test_aaa_authorization_service.rb +1041 -0
- data/tests/test_ace.rb +160 -0
- data/tests/test_acl.rb +176 -0
- data/tests/test_bgp_af.rb +269 -13
- data/tests/test_bgp_neighbor.rb +38 -40
- data/tests/test_bgp_neighbor_af.rb +92 -32
- data/tests/test_command_config.rb +5 -5
- data/tests/test_command_reference.rb +284 -101
- data/tests/test_dns_domain.rb +1 -1
- data/tests/test_domain_name.rb +1 -1
- data/tests/test_evpn_vni.rb +106 -0
- data/tests/test_fabricpath_global.rb +243 -0
- data/tests/test_fabricpath_topology.rb +98 -0
- data/tests/test_interface.rb +292 -74
- data/tests/test_interface_channel_group.rb +74 -0
- data/tests/test_interface_ospf.rb +9 -4
- data/tests/test_interface_portchannel.rb +105 -0
- data/tests/test_interface_service_vni.rb +232 -0
- data/tests/test_interface_svi.rb +77 -62
- data/tests/test_interface_switchport.rb +17 -5
- data/tests/test_name_server.rb +1 -1
- data/tests/test_node.rb +1 -1
- data/tests/test_node_ext.rb +10 -20
- data/tests/test_ntp_config.rb +1 -1
- data/tests/test_ntp_server.rb +18 -6
- data/tests/test_overlay_global.rb +102 -0
- data/tests/test_pim.rb +177 -0
- data/tests/test_pim_group_list.rb +181 -0
- data/tests/test_pim_rp_address.rb +153 -0
- data/tests/test_platform.rb +3 -3
- data/tests/test_portchannel_global.rb +202 -0
- data/tests/test_radius_global.rb +1 -1
- data/tests/test_radius_server.rb +92 -57
- data/tests/test_radius_server_group.rb +149 -0
- data/tests/test_router_bgp.rb +283 -112
- data/tests/test_router_ospf.rb +2 -2
- data/tests/test_router_ospf_vrf.rb +4 -4
- data/tests/test_snmp_notification_receiver.rb +167 -0
- data/tests/test_snmpcommunity.rb +1 -1
- data/tests/test_snmpgroup.rb +1 -1
- data/tests/test_snmpnotification.rb +72 -0
- data/tests/test_snmpserver.rb +29 -105
- data/tests/test_snmpuser.rb +32 -30
- data/tests/test_syslog_server.rb +36 -10
- data/tests/test_syslog_settings.rb +1 -1
- data/tests/test_tacacs_server.rb +1 -1
- data/tests/test_tacacs_server_group.rb +405 -0
- data/tests/test_tacacs_server_host.rb +1 -1
- data/tests/test_vdc.rb +78 -0
- data/tests/test_vlan.rb +74 -19
- data/tests/test_vlan_mt_full.rb +95 -0
- data/tests/test_vni.rb +106 -0
- data/tests/test_vpc.rb +361 -0
- data/tests/test_vrf.rb +172 -29
- data/tests/test_vtp.rb +1 -1
- data/tests/test_vxlan_vtep.rb +214 -0
- data/tests/test_vxlan_vtep_vni.rb +201 -0
- data/tests/test_yum.rb +1 -1
- metadata +120 -11
- data/lib/cisco_node_utils/README_YAML.md +0 -325
- data/lib/cisco_node_utils/command_reference_common.yaml +0 -1051
- data/lib/cisco_node_utils/command_reference_common_bgp.yaml +0 -535
- data/lib/cisco_node_utils/command_reference_n3064.yaml +0 -13
- data/lib/cisco_node_utils/command_reference_n7k.yaml +0 -52
- data/lib/cisco_node_utils/command_reference_n9k.yaml +0 -26
- data/tests/platform_info.yaml +0 -10
@@ -1,6 +1,6 @@
|
|
1
1
|
# Alex Hunsberger, March 2015
|
2
2
|
#
|
3
|
-
# Copyright (c) 2015 Cisco and/or its affiliates.
|
3
|
+
# Copyright (c) 2015-2016 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.
|
@@ -53,9 +53,7 @@ module Cisco
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def port
|
56
|
-
|
57
|
-
fail "unable to retrieve port information for #{@name}" if p.nil?
|
58
|
-
p.first.to_i
|
56
|
+
config_get('tacacs_server_host', 'port', @name)
|
59
57
|
end
|
60
58
|
|
61
59
|
def port=(n)
|
@@ -68,7 +66,7 @@ module Cisco
|
|
68
66
|
|
69
67
|
def encryption_type
|
70
68
|
type = config_get('tacacs_server_host', 'encryption_type', @name)
|
71
|
-
type.nil? ? TACACS_SERVER_ENC_UNKNOWN : type.
|
69
|
+
type.nil? ? TACACS_SERVER_ENC_UNKNOWN : type.to_i
|
72
70
|
end
|
73
71
|
|
74
72
|
def self.default_encryption_type
|
@@ -76,8 +74,7 @@ module Cisco
|
|
76
74
|
end
|
77
75
|
|
78
76
|
def encryption_password
|
79
|
-
|
80
|
-
pass.nil? ? TacacsServerHost.default_encryption_password : pass.first
|
77
|
+
config_get('tacacs_server_host', 'encryption_password', @name)
|
81
78
|
end
|
82
79
|
|
83
80
|
def self.default_encryption_password
|
@@ -107,8 +104,7 @@ module Cisco
|
|
107
104
|
end
|
108
105
|
|
109
106
|
def timeout
|
110
|
-
|
111
|
-
t.nil? ? TacacsServerHost.default_timeout : t.first.to_i
|
107
|
+
config_get('tacacs_server_host', 'timeout', @name)
|
112
108
|
end
|
113
109
|
|
114
110
|
def timeout=(t)
|
@@ -0,0 +1,88 @@
|
|
1
|
+
#
|
2
|
+
# NXAPI implementation of VDC class
|
3
|
+
#
|
4
|
+
# December 2015, Chris Van Heuveln
|
5
|
+
#
|
6
|
+
# Copyright (c) 2015-2016 Cisco and/or its affiliates.
|
7
|
+
#
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
9
|
+
# you may not use this file except in compliance with the License.
|
10
|
+
# You may obtain a copy of the License at
|
11
|
+
#
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
13
|
+
#
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
17
|
+
# See the License for the specific language governing permissions and
|
18
|
+
# limitations under the License.
|
19
|
+
|
20
|
+
require_relative 'node_util'
|
21
|
+
|
22
|
+
module Cisco
|
23
|
+
# node_utils class for vdc
|
24
|
+
class Vdc < NodeUtil
|
25
|
+
attr_reader :name
|
26
|
+
|
27
|
+
def initialize(name, instantiate=true)
|
28
|
+
@vdc = (name == 'default') ? Vdc.default_vdc_name : name
|
29
|
+
create if instantiate
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.vdcs
|
33
|
+
hash = {}
|
34
|
+
vdc_list = config_get('vdc', 'all_vdcs')
|
35
|
+
return hash if vdc_list.nil?
|
36
|
+
|
37
|
+
vdc_list.each do |vdc_name|
|
38
|
+
hash[vdc_name] = Vdc.new(vdc_name, false)
|
39
|
+
end
|
40
|
+
hash
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.vdc_support
|
44
|
+
config_get('vdc', 'vdc_support')
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.default_vdc_name
|
48
|
+
vdc = config_get('vdc', 'default_vdc_name')
|
49
|
+
fail RuntimeError if vdc.nil?
|
50
|
+
vdc
|
51
|
+
end
|
52
|
+
|
53
|
+
def create
|
54
|
+
fail ArgumentError,
|
55
|
+
'There is currently no support for non-default VDCs' unless
|
56
|
+
@vdc == Vdc.default_vdc_name
|
57
|
+
# noop for 'default' vdc
|
58
|
+
end
|
59
|
+
|
60
|
+
def ==(other)
|
61
|
+
name == other.name
|
62
|
+
end
|
63
|
+
|
64
|
+
########################################################
|
65
|
+
# PROPERTIES #
|
66
|
+
########################################################
|
67
|
+
|
68
|
+
def limit_resource_module_type
|
69
|
+
str = config_get('vdc', 'limit_resource_module_type', vdc: @vdc)
|
70
|
+
str.strip! unless str.nil?
|
71
|
+
end
|
72
|
+
|
73
|
+
def limit_resource_module_type=(mods)
|
74
|
+
state = mods.empty? ? 'no' : ''
|
75
|
+
config_set('vdc', 'limit_resource_module_type',
|
76
|
+
state: state, vdc: @vdc, mods: mods)
|
77
|
+
|
78
|
+
# TBD: No interfaces are allocated after changing the module-type
|
79
|
+
# so 'allocate' is needed to make this useful. Consider moving
|
80
|
+
# this into it's own property.
|
81
|
+
config_set('vdc', 'allocate_interface_unallocated', vdc: @vdc)
|
82
|
+
end
|
83
|
+
|
84
|
+
def default_limit_resource_module_type
|
85
|
+
config_get_default('vdc', 'limit_resource_module_type')
|
86
|
+
end
|
87
|
+
end # Class
|
88
|
+
end # Module
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2015 Cisco and/or its affiliates.
|
1
|
+
# Copyright (c) 2015-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.
|
@@ -14,5 +14,8 @@
|
|
14
14
|
|
15
15
|
# Container module for version number only.
|
16
16
|
module CiscoNodeUtils
|
17
|
-
VERSION = '1.
|
17
|
+
VERSION = '1.2.0'
|
18
|
+
gem_version = Gem::Version.new(Gem::VERSION)
|
19
|
+
min_gem_version = Gem::Version.new('2.1.0')
|
20
|
+
fail 'Required rubygems version >= 2.1.0' if gem_version < min_gem_version
|
18
21
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# Jie Yang, November 2014
|
2
2
|
#
|
3
|
-
# Copyright (c) 2014-
|
3
|
+
# Copyright (c) 2014-2016 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.
|
@@ -16,6 +16,7 @@
|
|
16
16
|
|
17
17
|
require_relative 'node_util'
|
18
18
|
require_relative 'interface'
|
19
|
+
require_relative 'fabricpath_global'
|
19
20
|
|
20
21
|
# Add some Vlan-specific constants to the Cisco namespace
|
21
22
|
module Cisco
|
@@ -57,13 +58,58 @@ module Cisco
|
|
57
58
|
# instead just displays a STDOUT error message; thus NXAPI does not detect
|
58
59
|
# the failure and we must catch it by inspecting the "body" hash entry
|
59
60
|
# returned by NXAPI. This vlan cli behavior is unlikely to change.
|
60
|
-
fail result[2]['body']
|
61
|
+
fail result[2]['body'] if
|
62
|
+
result[2].is_a?(Hash) &&
|
63
|
+
/(ERROR:|Warning:)/.match(result[2]['body'].to_s)
|
64
|
+
|
65
|
+
# Some test environments get result[2] as a string instead of a hash
|
66
|
+
fail result[2] if
|
67
|
+
result[2].is_a?(String) &&
|
68
|
+
/(ERROR:|Warning:)/.match(result[2])
|
69
|
+
end
|
70
|
+
|
71
|
+
def fabricpath_feature
|
72
|
+
FabricpathGlobal.fabricpath_feature
|
73
|
+
end
|
74
|
+
|
75
|
+
def fabricpath_feature_set(fabricpath_set)
|
76
|
+
FabricpathGlobal.fabricpath_feature_set(fabricpath_set)
|
77
|
+
end
|
78
|
+
|
79
|
+
def mode
|
80
|
+
result = config_get('vlan', 'mode', @vlan_id)
|
81
|
+
return default_mode if result.nil?
|
82
|
+
case result
|
83
|
+
when /fabricpath/i
|
84
|
+
return 'fabricpath'
|
85
|
+
when /ce/i
|
86
|
+
return 'ce'
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def mode=(str)
|
91
|
+
str = str.to_s
|
92
|
+
if str.empty?
|
93
|
+
result = config_set('vlan', 'mode', @vlan_id, 'no', '')
|
94
|
+
else
|
95
|
+
if 'fabricpath' == str
|
96
|
+
fabricpath_feature_set(:enabled) unless
|
97
|
+
:enabled == fabricpath_feature
|
98
|
+
end
|
99
|
+
result = config_set('vlan', 'mode', @vlan_id, '', str)
|
100
|
+
end
|
101
|
+
cli_error_check(result)
|
102
|
+
rescue CliError => e
|
103
|
+
raise "[vlan #{@vlan_id}] '#{e.command}' : #{e.clierror}"
|
104
|
+
end
|
105
|
+
|
106
|
+
def default_mode
|
107
|
+
config_get_default('vlan', 'mode')
|
61
108
|
end
|
62
109
|
|
63
110
|
def vlan_name
|
64
111
|
result = config_get('vlan', 'name', @vlan_id)
|
65
|
-
|
66
|
-
result.shift
|
112
|
+
result.nil? ? default_vlan_name : result
|
67
113
|
end
|
68
114
|
|
69
115
|
def vlan_name=(str)
|
@@ -84,8 +130,7 @@ module Cisco
|
|
84
130
|
|
85
131
|
def state
|
86
132
|
result = config_get('vlan', 'state', @vlan_id)
|
87
|
-
|
88
|
-
case result.first
|
133
|
+
case result
|
89
134
|
when /act/
|
90
135
|
return 'active'
|
91
136
|
when /sus/
|
@@ -111,9 +156,8 @@ module Cisco
|
|
111
156
|
|
112
157
|
def shutdown
|
113
158
|
result = config_get('vlan', 'shutdown', @vlan_id)
|
114
|
-
return default_shutdown if result.nil?
|
115
159
|
# Valid result is either: "active"(aka no shutdown) or "shutdown"
|
116
|
-
result
|
160
|
+
result[/shut/] ? true : false
|
117
161
|
end
|
118
162
|
|
119
163
|
def shutdown=(val)
|
@@ -146,5 +190,24 @@ module Cisco
|
|
146
190
|
end
|
147
191
|
interfaces
|
148
192
|
end
|
193
|
+
|
194
|
+
def mapped_vni
|
195
|
+
config_get('vlan', 'mapped_vni', vlan: @vlan_id)
|
196
|
+
end
|
197
|
+
|
198
|
+
def mapped_vni=(vni)
|
199
|
+
Feature.vn_segment_vlan_based_enable
|
200
|
+
# Remove the existing mapping first as cli doesn't support overwriting.
|
201
|
+
config_set('vlan', 'mapped_vni', vlan: @vlan_id,
|
202
|
+
state: 'no', vni: vni)
|
203
|
+
# Configure the new mapping
|
204
|
+
state = vni == default_mapped_vni ? 'no' : ''
|
205
|
+
config_set('vlan', 'mapped_vni', vlan: @vlan_id,
|
206
|
+
state: state, vni: vni)
|
207
|
+
end
|
208
|
+
|
209
|
+
def default_mapped_vni
|
210
|
+
config_get_default('vlan', 'mapped_vni')
|
211
|
+
end
|
149
212
|
end # class
|
150
213
|
end # module
|
@@ -0,0 +1,227 @@
|
|
1
|
+
# VNI provider class
|
2
|
+
#
|
3
|
+
# Deepak Cherian, September 2015
|
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
|
+
# ----
|
20
|
+
# This provider supports both MT-full (N7K) and MT-lite (N3K/N9K),
|
21
|
+
# each of which have their own feature requirements and clis.
|
22
|
+
#
|
23
|
+
# MT-full cli: MT-lite cli:
|
24
|
+
# feature nv overlay feature nv overlay
|
25
|
+
# feature nvi feature vn-segment-vlan-based
|
26
|
+
# system bridge-domain 100-113
|
27
|
+
# bridge-domain 100
|
28
|
+
# member vni 100
|
29
|
+
# vni 10001 vlan 100
|
30
|
+
# shutdown vn-segment 10001
|
31
|
+
#
|
32
|
+
require_relative 'node_util'
|
33
|
+
require_relative 'feature'
|
34
|
+
|
35
|
+
module Cisco
|
36
|
+
# node_utils class for Vni
|
37
|
+
class Vni < NodeUtil
|
38
|
+
attr_reader :name, :vni_id
|
39
|
+
|
40
|
+
def initialize(vni_id, instantiate=true)
|
41
|
+
@vni_id = vni_id.to_s
|
42
|
+
fail ArgumentError,
|
43
|
+
'Invalid value(non-numeric VNI id)' unless @vni_id[/^\d+$/]
|
44
|
+
create if instantiate
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.vnis
|
48
|
+
hash = {}
|
49
|
+
vni_list = config_get('vni', 'all_vnis')
|
50
|
+
return hash if vni_list.nil?
|
51
|
+
|
52
|
+
vni_list.each do |id|
|
53
|
+
hash[id] = Vni.new(id, false)
|
54
|
+
end
|
55
|
+
hash
|
56
|
+
end
|
57
|
+
|
58
|
+
# feature vni
|
59
|
+
def self.feature_vni_enabled
|
60
|
+
config_get('vni', 'feature')
|
61
|
+
rescue Cisco::CliError => e
|
62
|
+
# cmd will syntax reject when feature is not enabled
|
63
|
+
raise unless e.clierror =~ /Syntax error/
|
64
|
+
return false
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.feature_vni_enable # TBD: move this to feature.rb
|
68
|
+
Feature.nv_overlay_enable
|
69
|
+
config_set('vni', 'feature')
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.mt_full_support
|
73
|
+
config_get('vni', 'mt_full_support')
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.mt_lite_support
|
77
|
+
config_get('vni', 'mt_lite_support')
|
78
|
+
end
|
79
|
+
|
80
|
+
def create
|
81
|
+
Vni.feature_vni_enable unless Vni.feature_vni_enabled
|
82
|
+
config_set('vni', 'create', vni: @vni_id) if Vni.mt_full_support
|
83
|
+
end
|
84
|
+
|
85
|
+
def destroy
|
86
|
+
config_set('vni', 'destroy', vni: @vni_id)
|
87
|
+
end
|
88
|
+
|
89
|
+
def cli_error_check(result)
|
90
|
+
# The NXOS vni cli does not raise an exception in some conditions and
|
91
|
+
# instead just displays a STDOUT error message; thus NXAPI does not detect
|
92
|
+
# the failure and we must catch it by inspecting the "body" hash entry
|
93
|
+
# returned by NXAPI. This cli behavior is unlikely to change.
|
94
|
+
fail result[2]['body'] if /ERROR:/.match(result[2]['body'].to_s)
|
95
|
+
end
|
96
|
+
|
97
|
+
# TODO: This method will be refactored as part of US52662
|
98
|
+
# def encap_dot1q
|
99
|
+
# final_hash = {}
|
100
|
+
# show = show("sh encapsulation profile | inc 'vni [0-9,]*' p 1")
|
101
|
+
# debug("show class is #{show.class} and show op is #{show}")
|
102
|
+
# return final_hash if show == {}
|
103
|
+
# match_pat = /vni (\S+).*dot1q\s+([ 0-9,\-]+)vni ([ 0-9,\-]+)/m
|
104
|
+
# split_pat = /encapsulation profile /
|
105
|
+
# pair_arr = show.split(split_pat)
|
106
|
+
# pair_arr.each do |pair|
|
107
|
+
# match_arr = match_pat.match(pair)
|
108
|
+
# next if match_arr.nil?
|
109
|
+
# debug "match arr 1 : #{match_arr[1]} 2: #{match_arr[2]} " \
|
110
|
+
# "3: #{match_arr[3]}"
|
111
|
+
# key_arr = (match_arr[3].split(/,/)).map do |x|
|
112
|
+
# x.strip!
|
113
|
+
# if /-/.match(x)
|
114
|
+
# x.gsub!('-', '..')
|
115
|
+
# else
|
116
|
+
# x
|
117
|
+
# end
|
118
|
+
# end
|
119
|
+
# val_arr = (match_arr[2].split(/,/)).map do |x|
|
120
|
+
# x.strip!
|
121
|
+
# if /-/.match(x)
|
122
|
+
# x.gsub!('-', '..')
|
123
|
+
# else
|
124
|
+
# x
|
125
|
+
# end
|
126
|
+
# end
|
127
|
+
#
|
128
|
+
# debug "key_arr = #{key_arr} val_arr = #{val_arr}"
|
129
|
+
#
|
130
|
+
# index = 0
|
131
|
+
# value = nil
|
132
|
+
# key_arr.each do |key|
|
133
|
+
# # puts "checking |#{key}| against |#{@vni_id}|"
|
134
|
+
# # puts "checking #{key.class} against #{my_vni.class}"
|
135
|
+
# if /\.\./.match(key)
|
136
|
+
# range = eval(key) ###################### *MUSTFIX* REMOVE eval
|
137
|
+
# if range.include?(@vni_id.to_i)
|
138
|
+
# val_range = eval(val_arr[index]) ##### *MUSTFIX* REMOVE eval
|
139
|
+
# position = @vni_id.to_i - range.begin
|
140
|
+
# value = val_range.begin + position
|
141
|
+
# value = value.to_s
|
142
|
+
# debug "matched #{@vni_id} value is #{value}"
|
143
|
+
# break
|
144
|
+
# end
|
145
|
+
# elsif key == @vni_id
|
146
|
+
# value = val_arr[index]
|
147
|
+
# debug "matched #{key} value is #{value}"
|
148
|
+
# end
|
149
|
+
# index += 1
|
150
|
+
# end
|
151
|
+
# unless value.nil?
|
152
|
+
# # final_hash[match_arr[1]] = value.to_i
|
153
|
+
# final_hash[match_arr[1]] = value
|
154
|
+
# end
|
155
|
+
# end # pair.each
|
156
|
+
# final_hash
|
157
|
+
# end # end of encap_dot1q
|
158
|
+
|
159
|
+
def encap_dot1q=(val, prev_val=nil) # TBD REFACTOR
|
160
|
+
debug "val is of class #{val.class} and is #{val} prev is #{prev_val}"
|
161
|
+
# When prev_val is nil, HashDiff doesn't do a `+' on each element, so this
|
162
|
+
if prev_val.nil?
|
163
|
+
val.each do |fresh_profile, fresh_dot1q|
|
164
|
+
config_set('vni', 'encap_dot1q', fresh_profile, '',
|
165
|
+
fresh_dot1q, @vni_id)
|
166
|
+
end
|
167
|
+
return
|
168
|
+
end
|
169
|
+
require 'hashdiff'
|
170
|
+
hash_diff = HashDiff.diff(prev_val, val)
|
171
|
+
debug "hsh diff ; #{hash_diff}"
|
172
|
+
return if hash_diff == []
|
173
|
+
hash_diff.each do |diff|
|
174
|
+
result =
|
175
|
+
case diff[0]
|
176
|
+
when /\+/
|
177
|
+
config_set('vni', 'encap_dot1q', diff[1], '', diff[2], @vni_id)
|
178
|
+
when /\-/
|
179
|
+
config_set('vni', 'encap_dot1q', diff[1], 'no', diff[2], @vni_id)
|
180
|
+
when /~/
|
181
|
+
config_set('vni', 'encap_dot1q', diff[1], 'no', diff[2], @vni_id)
|
182
|
+
config_set('vni', 'encap_dot1q', diff[1], '', diff[3], @vni_id)
|
183
|
+
end
|
184
|
+
cli_error_check(result)
|
185
|
+
end
|
186
|
+
rescue CliError => e
|
187
|
+
raise "[vni #{@vni_id}] '#{e.command}' : #{e.clierror}"
|
188
|
+
end
|
189
|
+
|
190
|
+
def default_encap_dot1q
|
191
|
+
config_get_default('vni', 'encap_dot1q')
|
192
|
+
end
|
193
|
+
|
194
|
+
def bridge_domain
|
195
|
+
bd_arr = config_get('vni', 'bridge_domain', vni: @vni_id)
|
196
|
+
bd_arr.first.to_i
|
197
|
+
end
|
198
|
+
|
199
|
+
def bridge_domain=(domain)
|
200
|
+
# TBD: ACTIVATE SHOULD BE SEPARATE SETTER AND POSSIBLY RENAMED
|
201
|
+
state = (domain) ? '' : 'no'
|
202
|
+
config_set('vni', 'bridge_domain_activate', state: state, domain: domain)
|
203
|
+
config_set('vni', 'bridge_domain', state: state, domain: domain,
|
204
|
+
vni: @vni_id)
|
205
|
+
end
|
206
|
+
|
207
|
+
def default_bridge_domain
|
208
|
+
config_get_default('vni', 'bridge_domain')
|
209
|
+
end
|
210
|
+
|
211
|
+
def shutdown
|
212
|
+
config_get('vni', 'shutdown', vni: @vni_id)
|
213
|
+
end
|
214
|
+
|
215
|
+
def shutdown=(state)
|
216
|
+
state = (state) ? '' : 'no'
|
217
|
+
result = config_set('vni', 'shutdown', state: state, vni: @vni_id)
|
218
|
+
cli_error_check(result)
|
219
|
+
rescue CliError => e
|
220
|
+
raise "[vni #{@vni_id}] '#{e.command}' : #{e.clierror}"
|
221
|
+
end
|
222
|
+
|
223
|
+
def default_shutdown
|
224
|
+
config_get_default('vni', 'shutdown')
|
225
|
+
end
|
226
|
+
end # class
|
227
|
+
end # module
|