cisco_node_utils 1.1.0 → 1.2.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 +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
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# Fabricpath Topology provider class
|
|
2
|
+
#
|
|
3
|
+
# Deepak Cherian, November 2015
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2015-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
|
+
require_relative 'fabricpath_global'
|
|
21
|
+
|
|
22
|
+
module Cisco
|
|
23
|
+
# node_utils class for fabricpath_topology
|
|
24
|
+
class FabricpathTopo < NodeUtil
|
|
25
|
+
attr_reader :topo_id
|
|
26
|
+
|
|
27
|
+
def initialize(topo_id, instantiate=true)
|
|
28
|
+
@topo_id = topo_id.to_s
|
|
29
|
+
@set_params = {}
|
|
30
|
+
fail ArgumentError, "Invalid value(non-numeric
|
|
31
|
+
Topo id #{@topo_id})" unless @topo_id[/^\d+$/]
|
|
32
|
+
|
|
33
|
+
create if instantiate
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def self.topos
|
|
37
|
+
hash = {}
|
|
38
|
+
fabricpath = config_get('fabricpath', 'feature')
|
|
39
|
+
return hash if (:enabled != fabricpath.to_sym)
|
|
40
|
+
topo_list = config_get('fabricpath_topology', 'all_topos')
|
|
41
|
+
return hash if topo_list.nil?
|
|
42
|
+
|
|
43
|
+
topo_list.each do |id|
|
|
44
|
+
hash[id] = FabricpathTopo.new(id, false)
|
|
45
|
+
end
|
|
46
|
+
hash
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def create
|
|
50
|
+
fabricpath_feature_set(:enabled) unless :enabled == fabricpath_feature
|
|
51
|
+
config_set('fabricpath_topology', 'create',
|
|
52
|
+
topo: @topo_id) unless @topo_id == '0'
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def cli_error_check(result)
|
|
56
|
+
# The NXOS vlan cli does not raise an exception in some conditions and
|
|
57
|
+
# instead just displays a STDOUT error message; thus NXAPI does not detect
|
|
58
|
+
# the failure and we must catch it by inspecting the "body" hash entry
|
|
59
|
+
# returned by NXAPI. This vlan cli behavior is unlikely to change.
|
|
60
|
+
fail result[2]['body'] unless result[2]['body'].empty?
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def destroy
|
|
64
|
+
config_set('fabricpath_topology', 'destroy', topo: @topo_id)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def fabricpath_feature
|
|
68
|
+
FabricpathGlobal.fabricpath_feature
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def fabricpath_feature_set(fabricpath_set)
|
|
72
|
+
FabricpathGlobal.fabricpath_feature_set(fabricpath_set)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def state
|
|
76
|
+
result = config_get('fabricpath_topology', 'state', @topo_id)
|
|
77
|
+
return default_state if result.nil?
|
|
78
|
+
case result
|
|
79
|
+
when /Up/
|
|
80
|
+
return 'up'
|
|
81
|
+
when /Down/
|
|
82
|
+
return 'default'
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def default_state
|
|
87
|
+
config_get_default('fabricpath_topology', 'state')
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def member_vlans
|
|
91
|
+
str = config_get('fabricpath_topology', 'member_vlans', @topo_id)
|
|
92
|
+
return [] if str == '--'
|
|
93
|
+
str.gsub!('-', '..')
|
|
94
|
+
if /,/.match(str)
|
|
95
|
+
str.split(/\s*,\s*/)
|
|
96
|
+
else
|
|
97
|
+
str.lines.to_a
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def member_vlans=(str)
|
|
102
|
+
debug "str is #{str} whose class is #{str.class}"
|
|
103
|
+
@set_params = {}
|
|
104
|
+
str = str.join(',') unless str.empty?
|
|
105
|
+
if str.empty?
|
|
106
|
+
@set_params[:topo] = @topo_id
|
|
107
|
+
@set_params[:state] = 'no'
|
|
108
|
+
@set_params[:vlan_range] = ''
|
|
109
|
+
else
|
|
110
|
+
str.gsub!('..', '-')
|
|
111
|
+
@set_params[:topo] = @topo_id
|
|
112
|
+
@set_params[:state] = ''
|
|
113
|
+
@set_params[:vlan_range] = str
|
|
114
|
+
end
|
|
115
|
+
result = config_set('fabricpath_topology', 'member_vlans', @set_params)
|
|
116
|
+
cli_error_check(result)
|
|
117
|
+
rescue CliError => e
|
|
118
|
+
raise "[topo #{@topo_id}] '#{e.command}' : #{e.clierror}"
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def default_member_vlans
|
|
122
|
+
[]
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def topo_name
|
|
126
|
+
config_get('fabricpath_topology', 'description', @topo_id)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def topo_name=(desc)
|
|
130
|
+
fail TypeError unless desc.is_a?(String)
|
|
131
|
+
@set_params = {}
|
|
132
|
+
if desc.empty?
|
|
133
|
+
@set_params[:topo] = @topo_id
|
|
134
|
+
@set_params[:state] = 'no'
|
|
135
|
+
@set_params[:name] = ''
|
|
136
|
+
else
|
|
137
|
+
@set_params[:topo] = @topo_id
|
|
138
|
+
@set_params[:state] = ''
|
|
139
|
+
@set_params[:name] = desc
|
|
140
|
+
end
|
|
141
|
+
config_set('fabricpath_topology', 'description', @set_params)
|
|
142
|
+
rescue Cisco::CliError => e
|
|
143
|
+
raise "[#{@name}] '#{e.command}' : #{e.clierror}"
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def default_topo_name
|
|
147
|
+
config_get_default('fabricpath_topology', 'description')
|
|
148
|
+
end
|
|
149
|
+
end # class
|
|
150
|
+
end # module
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# January 2016, Robert W Gries
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2015-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
|
+
require_relative 'node_util'
|
|
18
|
+
|
|
19
|
+
module Cisco
|
|
20
|
+
# Feature - node util class for managing common features
|
|
21
|
+
class Feature < NodeUtil
|
|
22
|
+
# Note that in most cases the enable methods should only enable;
|
|
23
|
+
# however, for test purposes it is sometimes convenient to support
|
|
24
|
+
# feature disablement for cleanup purposes.
|
|
25
|
+
# ---------------------------
|
|
26
|
+
def self.bgp_enable
|
|
27
|
+
return if bgp_enabled?
|
|
28
|
+
config_set('feature', 'bgp')
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.bgp_enabled?
|
|
32
|
+
config_get('feature', 'bgp')
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# ---------------------------
|
|
36
|
+
def self.fabric_enable
|
|
37
|
+
# install feature-set and enable it
|
|
38
|
+
return if fabric_enabled?
|
|
39
|
+
config_set('feature', 'fabric', state: 'install') unless fabric_installed?
|
|
40
|
+
config_set('feature', 'fabric', state: '')
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.fabric_enabled?
|
|
44
|
+
config_get('feature', 'fabric') =~ /^enabled/
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def self.fabric_installed?
|
|
48
|
+
config_get('feature', 'fabric') !~ /^uninstalled/
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def self.fabric_supported?
|
|
52
|
+
config_get('feature', 'fabric')
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# ---------------------------
|
|
56
|
+
def self.fabric_forwarding_enable
|
|
57
|
+
return if fabric_forwarding_enabled?
|
|
58
|
+
Feature.fabric_enable if Feature.fabric_supported?
|
|
59
|
+
# The feature fabric-forwarding cli is required in some older nxos images
|
|
60
|
+
# but is not present in newer images because nv_overlay_evpn handles
|
|
61
|
+
# both features; therefore feature fabric-forwarding is best-effort
|
|
62
|
+
# and ignored on cli failure.
|
|
63
|
+
begin
|
|
64
|
+
config_set('feature', 'fabric_forwarding')
|
|
65
|
+
rescue Cisco::CliError
|
|
66
|
+
CiscoLogger.debug '"feature fabric forwarding" CLI was rejected'
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def self.fabric_forwarding_enabled?
|
|
71
|
+
config_get('feature', 'fabric_forwarding')
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# ---------------------------
|
|
75
|
+
def self.nv_overlay_enable
|
|
76
|
+
# Note: vdc platforms restrict this feature to F3 or newer linecards
|
|
77
|
+
return if nv_overlay_enabled?
|
|
78
|
+
config_set('feature', 'nv_overlay')
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def self.nv_overlay_enabled?
|
|
82
|
+
config_get('feature', 'nv_overlay')
|
|
83
|
+
rescue Cisco::CliError => e
|
|
84
|
+
# cmd will syntax reject when feature is not enabled.
|
|
85
|
+
raise unless e.clierror =~ /Syntax error/
|
|
86
|
+
return false
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# ---------------------------
|
|
90
|
+
def self.nv_overlay_evpn_enable
|
|
91
|
+
return if nv_overlay_evpn_enabled?
|
|
92
|
+
config_set('feature', 'nv_overlay_evpn')
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def self.nv_overlay_evpn_enabled?
|
|
96
|
+
config_get('feature', 'nv_overlay_evpn')
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# ---------------------------
|
|
100
|
+
def self.vn_segment_vlan_based_enable
|
|
101
|
+
return if vn_segment_vlan_based_enabled?
|
|
102
|
+
config_set('feature', 'vn_segment_vlan_based')
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def self.vn_segment_vlan_based_enabled?
|
|
106
|
+
config_get('feature', 'vn_segment_vlan_based')
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# ---------------------------
|
|
110
|
+
end
|
|
111
|
+
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# November 2015, Chris Van Heuveln
|
|
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.
|
|
@@ -14,7 +14,12 @@
|
|
|
14
14
|
# See the License for the specific language governing permissions and
|
|
15
15
|
# limitations under the License.
|
|
16
16
|
|
|
17
|
+
require_relative 'cisco_cmn_utils'
|
|
17
18
|
require_relative 'node_util'
|
|
19
|
+
require_relative 'pim'
|
|
20
|
+
require_relative 'vrf'
|
|
21
|
+
require_relative 'vni'
|
|
22
|
+
require_relative 'overlay_global'
|
|
18
23
|
|
|
19
24
|
# Add some interface-specific constants to the Cisco namespace
|
|
20
25
|
module Cisco
|
|
@@ -24,6 +29,7 @@ module Cisco
|
|
|
24
29
|
trunk: 'trunk',
|
|
25
30
|
fex_fabric: 'fex-fabric',
|
|
26
31
|
tunnel: 'dot1q-tunnel',
|
|
32
|
+
fabricpath: 'fabricpath',
|
|
27
33
|
}
|
|
28
34
|
|
|
29
35
|
# Interface - node utility class for general interface config management
|
|
@@ -64,9 +70,7 @@ module Cisco
|
|
|
64
70
|
########################################################
|
|
65
71
|
|
|
66
72
|
def access_vlan
|
|
67
|
-
|
|
68
|
-
return default_access_vlan if vlan.nil?
|
|
69
|
-
vlan.shift.to_i
|
|
73
|
+
config_get('interface', 'access_vlan', @name)
|
|
70
74
|
end
|
|
71
75
|
|
|
72
76
|
def access_vlan=(vlan)
|
|
@@ -75,14 +79,90 @@ module Cisco
|
|
|
75
79
|
raise "[#{@name}] '#{e.command}' : #{e.clierror}"
|
|
76
80
|
end
|
|
77
81
|
|
|
82
|
+
def ipv4_acl_in
|
|
83
|
+
config_get('interface', 'ipv4_acl_in', @name)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def ipv4_acl_in=(val)
|
|
87
|
+
if val != ''
|
|
88
|
+
state = ''
|
|
89
|
+
else
|
|
90
|
+
state = 'no'
|
|
91
|
+
val = ipv4_acl_in
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
return unless val && val != ''
|
|
95
|
+
config_set('interface', 'ipv4_acl_in', @name, state, val)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def default_ipv4_acl_in
|
|
99
|
+
config_get_default('interface', 'ipv4_acl_in')
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def ipv4_acl_out
|
|
103
|
+
config_get('interface', 'ipv4_acl_out', @name)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def ipv4_acl_out=(val)
|
|
107
|
+
if val != ''
|
|
108
|
+
state = ''
|
|
109
|
+
else
|
|
110
|
+
state = 'no'
|
|
111
|
+
val = ipv4_acl_out
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
return unless val && val != ''
|
|
115
|
+
config_set('interface', 'ipv4_acl_out', @name, state, val)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def default_ipv4_acl_out
|
|
119
|
+
config_get_default('interface', 'ipv4_acl_out')
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def ipv6_acl_in
|
|
123
|
+
config_get('interface', 'ipv6_acl_in', @name)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def ipv6_acl_in=(val)
|
|
127
|
+
if val != ''
|
|
128
|
+
state = ''
|
|
129
|
+
else
|
|
130
|
+
state = 'no'
|
|
131
|
+
val = ipv6_acl_in
|
|
132
|
+
end
|
|
133
|
+
return unless val && val != ''
|
|
134
|
+
config_set('interface', 'ipv6_acl_in', @name, state, val)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def default_ipv6_acl_in
|
|
138
|
+
config_get_default('interface', 'ipv6_acl_in')
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def ipv6_acl_out
|
|
142
|
+
config_get('interface', 'ipv6_acl_out', @name)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def ipv6_acl_out=(val)
|
|
146
|
+
if val != ''
|
|
147
|
+
state = ''
|
|
148
|
+
else
|
|
149
|
+
state = 'no'
|
|
150
|
+
val = ipv6_acl_out
|
|
151
|
+
end
|
|
152
|
+
return unless val && val != ''
|
|
153
|
+
config_set('interface', 'ipv6_acl_out', @name, state, val)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def default_ipv6_acl_out
|
|
157
|
+
config_get_default('interface', 'ipv6_acl_out')
|
|
158
|
+
end
|
|
159
|
+
|
|
78
160
|
def default_access_vlan
|
|
79
161
|
config_get_default('interface', 'access_vlan')
|
|
80
162
|
end
|
|
81
163
|
|
|
82
164
|
def description
|
|
83
|
-
|
|
84
|
-
return '' if desc.nil?
|
|
85
|
-
desc.shift.strip
|
|
165
|
+
config_get('interface', 'description', @name)
|
|
86
166
|
end
|
|
87
167
|
|
|
88
168
|
def description=(desc)
|
|
@@ -101,9 +181,7 @@ module Cisco
|
|
|
101
181
|
end
|
|
102
182
|
|
|
103
183
|
def encapsulation_dot1q
|
|
104
|
-
|
|
105
|
-
return default_encapsulation_dot1q if val.nil?
|
|
106
|
-
val.shift.strip.to_i
|
|
184
|
+
config_get('interface', 'encapsulation_dot1q', @name)
|
|
107
185
|
end
|
|
108
186
|
|
|
109
187
|
def encapsulation_dot1q=(val)
|
|
@@ -120,10 +198,43 @@ module Cisco
|
|
|
120
198
|
config_get_default('interface', 'encapsulation_dot1q')
|
|
121
199
|
end
|
|
122
200
|
|
|
201
|
+
def fabricpath_feature
|
|
202
|
+
FabricpathGlobal.fabricpath_feature
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def fabricpath_feature_set(fabricpath_set)
|
|
206
|
+
FabricpathGlobal.fabricpath_feature_set(fabricpath_set)
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def fabric_forwarding_anycast_gateway
|
|
210
|
+
config_get('interface', 'fabric_forwarding_anycast_gateway', @name)
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def fabric_forwarding_anycast_gateway=(state)
|
|
214
|
+
no_cmd = (state ? '' : 'no')
|
|
215
|
+
config_set('interface',
|
|
216
|
+
'fabric_forwarding_anycast_gateway', @name, no_cmd)
|
|
217
|
+
fail if fabric_forwarding_anycast_gateway.to_s != state.to_s
|
|
218
|
+
rescue Cisco::CliError => e
|
|
219
|
+
info = "[#{@name}] '#{e.command}' : #{e.clierror}"
|
|
220
|
+
raise "#{info} 'fabric_forwarding_anycast_gateway' can only be " \
|
|
221
|
+
'configured on a vlan interface' unless /vlan/.match(@name)
|
|
222
|
+
anycast_gateway_mac = OverlayGlobal.new.anycast_gateway_mac
|
|
223
|
+
if anycast_gateway_mac.nil? || anycast_gateway_mac.empty?
|
|
224
|
+
raise "#{info} Anycast gateway mac must be configured " \
|
|
225
|
+
'before configuring forwarding mode under interface'
|
|
226
|
+
end
|
|
227
|
+
raise info
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def default_fabric_forwarding_anycast_gateway
|
|
231
|
+
config_get_default('interface', 'fabric_forwarding_anycast_gateway')
|
|
232
|
+
end
|
|
233
|
+
|
|
123
234
|
def fex_feature
|
|
124
235
|
fex = config_get('fex', 'feature')
|
|
125
236
|
fail 'fex_feature not found' if fex.nil?
|
|
126
|
-
fex.
|
|
237
|
+
fex.to_sym
|
|
127
238
|
end
|
|
128
239
|
|
|
129
240
|
def fex_feature_set(fex_set)
|
|
@@ -147,47 +258,127 @@ module Cisco
|
|
|
147
258
|
raise "[#{@name}] '#{e.command}' : #{e.clierror}"
|
|
148
259
|
end
|
|
149
260
|
|
|
150
|
-
def
|
|
151
|
-
config_get('interface', 'ipv4_addr_mask', @name)
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
def ipv4_addr_mask_set(addr, mask)
|
|
261
|
+
def ipv4_addr_mask_set(addr, mask, secondary=false)
|
|
155
262
|
check_switchport_disabled
|
|
263
|
+
sec = secondary ? 'secondary' : ''
|
|
156
264
|
if addr.nil? || addr == default_ipv4_address
|
|
157
|
-
|
|
265
|
+
state = 'no'
|
|
266
|
+
if secondary
|
|
267
|
+
return if ipv4_address_secondary == default_ipv4_address_secondary
|
|
268
|
+
# We need address and mask to remove.
|
|
269
|
+
am = "#{ipv4_address_secondary}/#{ipv4_netmask_length_secondary}"
|
|
270
|
+
else
|
|
271
|
+
return if ipv4_address == default_ipv4_address
|
|
272
|
+
am = "#{ipv4_address}/#{ipv4_netmask_length}"
|
|
273
|
+
end
|
|
158
274
|
else
|
|
159
|
-
|
|
160
|
-
|
|
275
|
+
state = ''
|
|
276
|
+
am = "#{addr}/#{mask}"
|
|
161
277
|
end
|
|
278
|
+
config_set('interface', 'ipv4_addr_mask', @name, state, am, sec)
|
|
162
279
|
rescue Cisco::CliError => e
|
|
163
280
|
raise "[#{@name}] '#{e.command}' : #{e.clierror}"
|
|
164
281
|
end
|
|
165
282
|
|
|
283
|
+
def ipv4_addr_mask
|
|
284
|
+
config_get('interface', 'ipv4_addr_mask', @name)
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def select_ipv4_attribute(attribute)
|
|
288
|
+
d = ipv4_addr_mask.flatten unless ipv4_addr_mask.nil?
|
|
289
|
+
# (d)ata format after flatten: ['addr', 'mask', 'addr', 'mask secondary']
|
|
290
|
+
case attribute
|
|
291
|
+
when :v4_addr
|
|
292
|
+
v = d.nil? ? default_ipv4_address : d[0]
|
|
293
|
+
when :v4_mask
|
|
294
|
+
v = d.nil? ? default_ipv4_netmask_length : d[1].to_i
|
|
295
|
+
when :v4_addr_secondary
|
|
296
|
+
v = (d.nil? || d.size < 4) ? default_ipv4_address : d[2]
|
|
297
|
+
when :v4_mask_secondary
|
|
298
|
+
if d.nil? || d.size < 4
|
|
299
|
+
v = default_ipv4_netmask_length
|
|
300
|
+
else
|
|
301
|
+
v = d[3][0, 2].to_i
|
|
302
|
+
end
|
|
303
|
+
end
|
|
304
|
+
v
|
|
305
|
+
end
|
|
306
|
+
|
|
166
307
|
def ipv4_address
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
308
|
+
select_ipv4_attribute(:v4_addr)
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
def ipv4_address_secondary
|
|
312
|
+
select_ipv4_attribute(:v4_addr_secondary)
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
def ipv4_netmask_length
|
|
316
|
+
select_ipv4_attribute(:v4_mask)
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
def ipv4_netmask_length_secondary
|
|
320
|
+
select_ipv4_attribute(:v4_mask_secondary)
|
|
171
321
|
end
|
|
172
322
|
|
|
173
323
|
def default_ipv4_address
|
|
174
324
|
config_get_default('interface', 'ipv4_address')
|
|
175
325
|
end
|
|
176
326
|
|
|
177
|
-
def
|
|
178
|
-
|
|
179
|
-
return default_ipv4_netmask_length if val.nil?
|
|
180
|
-
# val is [[addr, mask]] - we just want the mask
|
|
181
|
-
val.shift.last.to_i
|
|
327
|
+
def default_ipv4_address_secondary
|
|
328
|
+
default_ipv4_address
|
|
182
329
|
end
|
|
183
330
|
|
|
184
331
|
def default_ipv4_netmask_length
|
|
185
332
|
config_get_default('interface', 'ipv4_netmask_length')
|
|
186
333
|
end
|
|
187
334
|
|
|
335
|
+
def default_ipv4_netmask_length_secondary
|
|
336
|
+
default_ipv4_netmask_length
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
def ipv4_arp_timeout_lookup_string
|
|
340
|
+
case @name
|
|
341
|
+
when /vlan/i
|
|
342
|
+
return 'ipv4_arp_timeout'
|
|
343
|
+
else
|
|
344
|
+
return 'ipv4_arp_timeout_non_vlan_interfaces'
|
|
345
|
+
end
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
def ipv4_arp_timeout
|
|
349
|
+
config_get('interface', ipv4_arp_timeout_lookup_string, @name)
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
def ipv4_arp_timeout=(timeout)
|
|
353
|
+
fail "'ipv4 arp timeout' can ony be configured on a vlan interface" unless
|
|
354
|
+
/vlan/.match(@name)
|
|
355
|
+
state = (timeout == default_ipv4_arp_timeout) ? 'no' : ''
|
|
356
|
+
config_set('interface', 'ipv4_arp_timeout', @name, state, timeout)
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
def default_ipv4_arp_timeout
|
|
360
|
+
config_get_default('interface', ipv4_arp_timeout_lookup_string)
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
def ipv4_pim_sparse_mode
|
|
364
|
+
config_get('interface', 'ipv4_pim_sparse_mode', @name)
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
def ipv4_pim_sparse_mode=(state)
|
|
368
|
+
check_switchport_disabled
|
|
369
|
+
Pim.feature_enable unless Pim.feature_enabled
|
|
370
|
+
config_set('interface', 'ipv4_pim_sparse_mode', @name,
|
|
371
|
+
state ? '' : 'no')
|
|
372
|
+
rescue Cisco::CliError => e
|
|
373
|
+
raise "[#{@name}] '#{e.command}' : #{e.clierror}"
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
def default_ipv4_pim_sparse_mode
|
|
377
|
+
config_get_default('interface', 'ipv4_pim_sparse_mode')
|
|
378
|
+
end
|
|
379
|
+
|
|
188
380
|
def ipv4_proxy_arp
|
|
189
|
-
|
|
190
|
-
state.nil? ? false : true
|
|
381
|
+
config_get('interface', 'ipv4_proxy_arp', @name)
|
|
191
382
|
end
|
|
192
383
|
|
|
193
384
|
def ipv4_proxy_arp=(proxy_arp)
|
|
@@ -210,24 +401,13 @@ module Cisco
|
|
|
210
401
|
end
|
|
211
402
|
|
|
212
403
|
def ipv4_redirects
|
|
213
|
-
|
|
214
|
-
state = config_get('interface',
|
|
215
|
-
ipv4_redirects_lookup_string, @name)
|
|
216
|
-
rescue IndexError
|
|
217
|
-
state = nil
|
|
218
|
-
end
|
|
219
|
-
# We return default state for the platform if the platform doesn't support
|
|
220
|
-
# the command
|
|
221
|
-
return default_ipv4_redirects if state.nil? || state.empty?
|
|
222
|
-
state.shift[/^ip redirects$/] ? true : false
|
|
404
|
+
config_get('interface', ipv4_redirects_lookup_string, @name)
|
|
223
405
|
end
|
|
224
406
|
|
|
225
407
|
def ipv4_redirects=(redirects)
|
|
226
408
|
check_switchport_disabled
|
|
227
409
|
no_cmd = (redirects ? '' : 'no')
|
|
228
410
|
config_set('interface', ipv4_redirects_lookup_string, @name, no_cmd)
|
|
229
|
-
rescue IndexError
|
|
230
|
-
raise "ipv4 redirects not supported on #{@name}"
|
|
231
411
|
end
|
|
232
412
|
|
|
233
413
|
def default_ipv4_redirects
|
|
@@ -235,7 +415,7 @@ module Cisco
|
|
|
235
415
|
end
|
|
236
416
|
|
|
237
417
|
def feature_lacp?
|
|
238
|
-
|
|
418
|
+
config_get('interface', 'feature_lacp')
|
|
239
419
|
end
|
|
240
420
|
|
|
241
421
|
def feature_lacp_set(val)
|
|
@@ -244,9 +424,7 @@ module Cisco
|
|
|
244
424
|
end
|
|
245
425
|
|
|
246
426
|
def mtu
|
|
247
|
-
|
|
248
|
-
return default_mtu if mtu.nil?
|
|
249
|
-
mtu.shift.strip.to_i
|
|
427
|
+
config_get('interface', 'mtu', @name)
|
|
250
428
|
end
|
|
251
429
|
|
|
252
430
|
def mtu=(val)
|
|
@@ -260,6 +438,40 @@ module Cisco
|
|
|
260
438
|
config_get_default('interface', 'mtu')
|
|
261
439
|
end
|
|
262
440
|
|
|
441
|
+
def speed
|
|
442
|
+
config_get('interface', 'speed', @name)
|
|
443
|
+
end
|
|
444
|
+
|
|
445
|
+
def speed=(val)
|
|
446
|
+
if node.product_id =~ /C31\d\d/
|
|
447
|
+
fail 'Changing interface speed is not permitted on this platform'
|
|
448
|
+
end
|
|
449
|
+
config_set('interface', 'speed', @name, val)
|
|
450
|
+
rescue Cisco::CliError => e
|
|
451
|
+
raise "[#{@name}] '#{e.command}' : #{e.clierror}"
|
|
452
|
+
end
|
|
453
|
+
|
|
454
|
+
def default_speed
|
|
455
|
+
config_get_default('interface', 'speed')
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
def duplex
|
|
459
|
+
config_get('interface', 'duplex', @name)
|
|
460
|
+
end
|
|
461
|
+
|
|
462
|
+
def duplex=(val)
|
|
463
|
+
if node.product_id =~ /C31\d\d/
|
|
464
|
+
fail 'Changing interface duplex is not permitted on this platform'
|
|
465
|
+
end
|
|
466
|
+
config_set('interface', 'duplex', @name, val)
|
|
467
|
+
rescue Cisco::CliError => e
|
|
468
|
+
raise "[#{@name}] '#{e.command}' : #{e.clierror}"
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
def default_duplex
|
|
472
|
+
config_get_default('interface', 'duplex')
|
|
473
|
+
end
|
|
474
|
+
|
|
263
475
|
def negotiate_auto_lookup_string
|
|
264
476
|
case @name
|
|
265
477
|
when /Ethernet/i
|
|
@@ -272,29 +484,13 @@ module Cisco
|
|
|
272
484
|
end
|
|
273
485
|
|
|
274
486
|
def negotiate_auto
|
|
275
|
-
|
|
276
|
-
begin
|
|
277
|
-
state = config_get('interface', lookup, @name)
|
|
278
|
-
rescue IndexError
|
|
279
|
-
# We return default state even if the config_get is not supported
|
|
280
|
-
# for this platform / interface type. This is done so that we can set
|
|
281
|
-
# the manifest to 'default' so there is a 'workaround' for the
|
|
282
|
-
# unsupported attribute
|
|
283
|
-
return default_negotiate_auto
|
|
284
|
-
end
|
|
285
|
-
state.nil? ? false : true
|
|
487
|
+
config_get('interface', negotiate_auto_lookup_string, @name)
|
|
286
488
|
end
|
|
287
489
|
|
|
288
490
|
def negotiate_auto=(negotiate_auto)
|
|
289
491
|
lookup = negotiate_auto_lookup_string
|
|
290
492
|
no_cmd = (negotiate_auto ? '' : 'no')
|
|
291
|
-
|
|
292
|
-
config_set('interface', lookup, @name, no_cmd)
|
|
293
|
-
rescue Cisco::CliError => e
|
|
294
|
-
raise "[#{@name}] '#{e.command}' : #{e.clierror}"
|
|
295
|
-
rescue IndexError
|
|
296
|
-
raise "[#{@name}] negotiate_auto is not supported on this interface"
|
|
297
|
-
end
|
|
493
|
+
config_set('interface', lookup, @name, no_cmd)
|
|
298
494
|
end
|
|
299
495
|
|
|
300
496
|
def default_negotiate_auto
|
|
@@ -302,8 +498,7 @@ module Cisco
|
|
|
302
498
|
end
|
|
303
499
|
|
|
304
500
|
def shutdown
|
|
305
|
-
|
|
306
|
-
state ? true : false
|
|
501
|
+
config_get('interface', 'shutdown', @name)
|
|
307
502
|
end
|
|
308
503
|
|
|
309
504
|
def shutdown=(state)
|
|
@@ -348,8 +543,7 @@ module Cisco
|
|
|
348
543
|
|
|
349
544
|
def switchport
|
|
350
545
|
# This is "switchport", not "switchport mode"
|
|
351
|
-
|
|
352
|
-
sw.nil? ? false : true
|
|
546
|
+
config_get('interface', 'switchport', @name)
|
|
353
547
|
end
|
|
354
548
|
|
|
355
549
|
def switchport_enable(val=true)
|
|
@@ -358,8 +552,8 @@ module Cisco
|
|
|
358
552
|
|
|
359
553
|
# switchport_autostate_exclude is exclusive to switchport interfaces
|
|
360
554
|
def switchport_autostate_exclude
|
|
361
|
-
|
|
362
|
-
|
|
555
|
+
config_get('interface',
|
|
556
|
+
'switchport_autostate_exclude', @name)
|
|
363
557
|
end
|
|
364
558
|
|
|
365
559
|
def switchport_autostate_exclude=(val)
|
|
@@ -389,7 +583,7 @@ module Cisco
|
|
|
389
583
|
def switchport_mode
|
|
390
584
|
mode = config_get('interface', switchport_mode_lookup_string, @name)
|
|
391
585
|
|
|
392
|
-
return mode.nil? ? :disabled : IF_SWITCHPORT_MODE.key(mode
|
|
586
|
+
return mode.nil? ? :disabled : IF_SWITCHPORT_MODE.key(mode)
|
|
393
587
|
|
|
394
588
|
rescue IndexError
|
|
395
589
|
# Assume this is an interface that doesn't support switchport.
|
|
@@ -401,8 +595,10 @@ module Cisco
|
|
|
401
595
|
def switchport_enable_and_mode(mode_set)
|
|
402
596
|
switchport_enable unless switchport
|
|
403
597
|
|
|
404
|
-
if
|
|
405
|
-
|
|
598
|
+
if :fabricpath == mode_set
|
|
599
|
+
fabricpath_feature_set(:enabled) unless :enabled == fabricpath_feature
|
|
600
|
+
elsif :fex_fabric == mode_set
|
|
601
|
+
fex_feature_set(:enabled) unless :enabled == fex_feature
|
|
406
602
|
end
|
|
407
603
|
config_set('interface', switchport_mode_lookup_string, @name, '',
|
|
408
604
|
IF_SWITCHPORT_MODE[mode_set])
|
|
@@ -447,10 +643,7 @@ module Cisco
|
|
|
447
643
|
end
|
|
448
644
|
|
|
449
645
|
def switchport_trunk_allowed_vlan
|
|
450
|
-
|
|
451
|
-
'interface', 'switchport_trunk_allowed_vlan', @name)
|
|
452
|
-
return default_switchport_trunk_allowed_vlan if val.nil?
|
|
453
|
-
val.shift.strip
|
|
646
|
+
config_get('interface', 'switchport_trunk_allowed_vlan', @name)
|
|
454
647
|
end
|
|
455
648
|
|
|
456
649
|
def switchport_trunk_allowed_vlan=(val)
|
|
@@ -470,10 +663,7 @@ module Cisco
|
|
|
470
663
|
end
|
|
471
664
|
|
|
472
665
|
def switchport_trunk_native_vlan
|
|
473
|
-
|
|
474
|
-
'interface', 'switchport_trunk_native_vlan', @name)
|
|
475
|
-
return default_switchport_trunk_native_vlan if val.nil?
|
|
476
|
-
val.shift.strip.to_i
|
|
666
|
+
config_get('interface', 'switchport_trunk_native_vlan', @name)
|
|
477
667
|
end
|
|
478
668
|
|
|
479
669
|
def switchport_trunk_native_vlan=(val)
|
|
@@ -488,28 +678,103 @@ module Cisco
|
|
|
488
678
|
raise "[#{@name}] '#{e.command}' : #{e.clierror}"
|
|
489
679
|
end
|
|
490
680
|
|
|
681
|
+
# vlan_mapping & vlan_mapping_enable
|
|
682
|
+
# Hardware & Cli Dependencies:
|
|
683
|
+
# - F3 linecards only
|
|
684
|
+
# - vdc
|
|
685
|
+
# - limit-resource
|
|
686
|
+
# - bridge-domain
|
|
687
|
+
# - feature vni
|
|
688
|
+
# - switchport mode
|
|
689
|
+
|
|
690
|
+
# Getter: Builds an array of vlan_mapping commands currently
|
|
691
|
+
# on the device.
|
|
692
|
+
# cli: switchport vlan mapping 2 200
|
|
693
|
+
# switchport vlan mapping 4 400
|
|
694
|
+
# array: [['2', '200'], ['4', '400']]
|
|
695
|
+
#
|
|
696
|
+
def default_vlan_mapping
|
|
697
|
+
config_get_default('interface', 'vlan_mapping')
|
|
698
|
+
end
|
|
699
|
+
|
|
700
|
+
def vlan_mapping
|
|
701
|
+
match = config_get('interface', 'vlan_mapping', @name)
|
|
702
|
+
match.each(&:compact!) unless match.nil?
|
|
703
|
+
match
|
|
704
|
+
end
|
|
705
|
+
|
|
706
|
+
def vlan_mapping=(should_list)
|
|
707
|
+
Vni.feature_vni_enable unless Vni.feature_vni_enabled
|
|
708
|
+
|
|
709
|
+
# Process a hash of vlan_mapping cmds from delta_add_remove().
|
|
710
|
+
# The vlan_mapping cli does not allow commands to be updated, they must
|
|
711
|
+
# first be removed if there is a change.
|
|
712
|
+
delta_hash = Utils.delta_add_remove(should_list, vlan_mapping,
|
|
713
|
+
:updates_not_allowed)
|
|
714
|
+
return if delta_hash.values.flatten.empty?
|
|
715
|
+
# Process :remove first to ensure "update" commands will not fail.
|
|
716
|
+
[:remove, :add].each do |action|
|
|
717
|
+
CiscoLogger.debug("vlan_mapping delta #{@get_args}\n"\
|
|
718
|
+
"#{action}: #{delta_hash[action]}")
|
|
719
|
+
delta_hash[action].each do |original, translated|
|
|
720
|
+
state = (action == :add) ? '' : 'no'
|
|
721
|
+
config_set('interface', 'vlan_mapping', @name,
|
|
722
|
+
state, original, translated)
|
|
723
|
+
end
|
|
724
|
+
end
|
|
725
|
+
rescue Cisco::CliError => e
|
|
726
|
+
raise "[#{@name}] '#{e.command}' : #{e.clierror}"
|
|
727
|
+
end
|
|
728
|
+
|
|
729
|
+
# cli: switchport vlan mapping enable
|
|
730
|
+
def default_vlan_mapping_enable
|
|
731
|
+
config_get_default('interface', 'vlan_mapping_enable')
|
|
732
|
+
end
|
|
733
|
+
|
|
734
|
+
def vlan_mapping_enable
|
|
735
|
+
config_get('interface', 'vlan_mapping_enable', @name)
|
|
736
|
+
end
|
|
737
|
+
|
|
738
|
+
def vlan_mapping_enable=(state)
|
|
739
|
+
config_set('interface', 'vlan_mapping_enable', @name,
|
|
740
|
+
state ? '' : 'no')
|
|
741
|
+
end
|
|
742
|
+
|
|
491
743
|
def default_switchport_trunk_native_vlan
|
|
492
744
|
config_get_default('interface', 'switchport_trunk_native_vlan')
|
|
493
745
|
end
|
|
494
746
|
|
|
495
747
|
def system_default_switchport
|
|
496
748
|
# This command is a user-configurable system default.
|
|
497
|
-
|
|
498
|
-
|
|
749
|
+
#
|
|
750
|
+
# Note: This is a simple boolean state but there is a bug on some
|
|
751
|
+
# platforms that causes the cli to nvgen twice; this causes config_get to
|
|
752
|
+
# raise an error when it encounters the multiple. Therefore we define it
|
|
753
|
+
# as a multiple to avoid the raise and handle the array if necessary.
|
|
754
|
+
#
|
|
755
|
+
val = config_get('interface', 'system_default_switchport')
|
|
756
|
+
return (val[0][/^no /] ? false : true) if val.is_a?(Array)
|
|
757
|
+
val
|
|
499
758
|
end
|
|
500
759
|
|
|
501
760
|
def system_default_switchport_shutdown
|
|
502
761
|
# This command is a user-configurable system default.
|
|
503
|
-
|
|
504
|
-
'system_default_switchport_shutdown')
|
|
505
|
-
sys_def.nil? ? false : true
|
|
762
|
+
config_get('interface', 'system_default_switchport_shutdown')
|
|
506
763
|
end
|
|
507
764
|
|
|
508
765
|
def system_default_svi_autostate
|
|
509
766
|
# This command is a user-configurable system default.
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
767
|
+
#
|
|
768
|
+
# This property behaves differently on an n7k vs ni(3|9)k and therefore
|
|
769
|
+
# needs special handling.
|
|
770
|
+
# N7K: When enabled, does not nvgen.
|
|
771
|
+
# When disabled, does nvgen, but differently then n(3|9)k.
|
|
772
|
+
# Return true for the disabled case, false otherwise.
|
|
773
|
+
# N(3|9)K: When enabled, does nvgen.
|
|
774
|
+
# When disabled, does nvgen.
|
|
775
|
+
# Return true for the enabled case, false otherwise.
|
|
776
|
+
result = config_get('interface', 'system_default_svi_autostate')
|
|
777
|
+
/N7K/.match(node.product_id) ? !result : result
|
|
513
778
|
end
|
|
514
779
|
|
|
515
780
|
def switchport_vtp_mode_capable?
|
|
@@ -518,8 +783,7 @@ module Cisco
|
|
|
518
783
|
|
|
519
784
|
def switchport_vtp
|
|
520
785
|
return false unless switchport_vtp_mode_capable?
|
|
521
|
-
|
|
522
|
-
vtp.nil? ? false : true
|
|
786
|
+
config_get('interface', 'vtp', @name)
|
|
523
787
|
end
|
|
524
788
|
|
|
525
789
|
def switchport_vtp=(vtp_set)
|
|
@@ -538,7 +802,7 @@ module Cisco
|
|
|
538
802
|
# svi_autostate is exclusive to svi interfaces
|
|
539
803
|
def svi_autostate
|
|
540
804
|
return nil unless @name[/^vlan/i]
|
|
541
|
-
|
|
805
|
+
config_get('interface', 'svi_autostate', @name)
|
|
542
806
|
end
|
|
543
807
|
|
|
544
808
|
def svi_autostate=(val)
|
|
@@ -552,7 +816,7 @@ module Cisco
|
|
|
552
816
|
end
|
|
553
817
|
|
|
554
818
|
def feature_vlan?
|
|
555
|
-
|
|
819
|
+
config_get('interface', 'feature_vlan')
|
|
556
820
|
end
|
|
557
821
|
|
|
558
822
|
def feature_vlan_set(val)
|
|
@@ -563,7 +827,7 @@ module Cisco
|
|
|
563
827
|
# svi_management is exclusive to svi interfaces
|
|
564
828
|
def svi_management
|
|
565
829
|
return nil unless @name[/^vlan/i]
|
|
566
|
-
|
|
830
|
+
config_get('interface', 'svi_management', @name)
|
|
567
831
|
end
|
|
568
832
|
|
|
569
833
|
def svi_management=(val)
|
|
@@ -589,10 +853,39 @@ module Cisco
|
|
|
589
853
|
' is disabled' unless switchport_mode == :disabled
|
|
590
854
|
end
|
|
591
855
|
|
|
856
|
+
def vpc_id
|
|
857
|
+
config_get('interface', 'vpc_id', @name)
|
|
858
|
+
end
|
|
859
|
+
|
|
860
|
+
def vpc_id=(num)
|
|
861
|
+
if num
|
|
862
|
+
config_set('interface', 'vpc_id', @name, '', num)
|
|
863
|
+
else
|
|
864
|
+
# 'no vpc' doesn't work for phy ports, so do a get
|
|
865
|
+
num = vpc_id
|
|
866
|
+
config_set('interface', 'vpc_id', @name, 'no', num)
|
|
867
|
+
end
|
|
868
|
+
end
|
|
869
|
+
|
|
870
|
+
def default_vpc_id
|
|
871
|
+
config_get_default('interface', 'vpc_id')
|
|
872
|
+
end
|
|
873
|
+
|
|
874
|
+
def vpc_peer_link
|
|
875
|
+
config_get('interface', 'vpc_peer_link', @name)
|
|
876
|
+
end
|
|
877
|
+
|
|
878
|
+
def vpc_peer_link=(state)
|
|
879
|
+
no_cmd = (state ? '' : 'no')
|
|
880
|
+
config_set('interface', 'vpc_peer_link', @name, no_cmd)
|
|
881
|
+
end
|
|
882
|
+
|
|
883
|
+
def default_vpc_peer_link
|
|
884
|
+
config_get_default('interface', 'vpc_peer_link')
|
|
885
|
+
end
|
|
886
|
+
|
|
592
887
|
def vrf
|
|
593
|
-
|
|
594
|
-
return '' if vrf.nil?
|
|
595
|
-
vrf.shift.strip
|
|
888
|
+
config_get('interface', 'vrf', @name)
|
|
596
889
|
end
|
|
597
890
|
|
|
598
891
|
def vrf=(vrf)
|