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
@@ -0,0 +1,74 @@
|
|
1
|
+
# Copyright (c) 2015-2016 Cisco and/or its affiliates.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require_relative 'ciscotest'
|
16
|
+
require_relative '../lib/cisco_node_utils/interface_channel_group'
|
17
|
+
|
18
|
+
# TestInterface - Minitest for general functionality of the Interface class.
|
19
|
+
class TestInterfaceChannelGroup < CiscoTestCase
|
20
|
+
@@clean = false # rubocop:disable Style/ClassVars
|
21
|
+
def setup
|
22
|
+
super
|
23
|
+
@intf = InterfaceChannelGroup.new(interfaces[1])
|
24
|
+
|
25
|
+
# Only pre-clean interface on initial setup
|
26
|
+
config("default interface #{@intf}") unless @@clean
|
27
|
+
@@clean = true # rubocop:disable Style/ClassVars
|
28
|
+
end
|
29
|
+
|
30
|
+
def teardown
|
31
|
+
config("default interface #{@intf}")
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_channel_group
|
35
|
+
i = @intf
|
36
|
+
group = 200
|
37
|
+
i.channel_group = group
|
38
|
+
assert_equal(group, i.channel_group)
|
39
|
+
|
40
|
+
group = 201
|
41
|
+
i.channel_group = group
|
42
|
+
assert_equal(group, i.channel_group)
|
43
|
+
|
44
|
+
group = i.default_channel_group
|
45
|
+
i.channel_group = group
|
46
|
+
assert_equal(group, i.channel_group)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_description
|
50
|
+
i = @intf
|
51
|
+
desc = 'test desc'
|
52
|
+
i.description = desc
|
53
|
+
assert_equal(desc, i.description)
|
54
|
+
|
55
|
+
desc = 'test desc changed'
|
56
|
+
i.description = desc
|
57
|
+
assert_equal(desc, i.description)
|
58
|
+
|
59
|
+
desc = i.default_description
|
60
|
+
i.description = desc
|
61
|
+
assert_equal(desc, i.description)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_shutdown
|
65
|
+
i = @intf
|
66
|
+
i.shutdown = true
|
67
|
+
assert(i.shutdown)
|
68
|
+
i.shutdown = false
|
69
|
+
refute(i.shutdown)
|
70
|
+
|
71
|
+
i.shutdown = i.default_shutdown
|
72
|
+
assert(i.shutdown)
|
73
|
+
end
|
74
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2014-
|
1
|
+
# Copyright (c) 2014-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.
|
@@ -40,7 +40,12 @@ class TestInterfaceOspf < CiscoTestCase
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def show_cmd(name)
|
43
|
-
|
43
|
+
case name
|
44
|
+
when /ort-channel/
|
45
|
+
"show run interface #{name} | no-more"
|
46
|
+
else
|
47
|
+
"show run interface #{name} all | no-more"
|
48
|
+
end
|
44
49
|
end
|
45
50
|
|
46
51
|
def create_routerospf(ospfname='ospfTest')
|
@@ -495,14 +500,14 @@ class TestInterfaceOspf < CiscoTestCase
|
|
495
500
|
assert_show_match(pattern: pattern,
|
496
501
|
msg: 'Error: message digest enable missing in CLI')
|
497
502
|
assert(interface.message_digest,
|
498
|
-
'Error: message digest
|
503
|
+
'Error: message digest is false but should be true')
|
499
504
|
|
500
505
|
# get default and set
|
501
506
|
interface.message_digest = interface.default_message_digest
|
502
507
|
refute_show_match(pattern: pattern,
|
503
508
|
msg: 'Error: default message digest set failed')
|
504
509
|
refute(interface.message_digest,
|
505
|
-
'Error: message digest
|
510
|
+
'Error: message digest is true but should be false (default)')
|
506
511
|
end
|
507
512
|
|
508
513
|
def test_interfaceospf_message_digest_key
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# Copyright (c) 2014-2016 Cisco and/or its affiliates.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require_relative 'ciscotest'
|
16
|
+
require_relative '../lib/cisco_node_utils/interface'
|
17
|
+
require_relative '../lib/cisco_node_utils/interface_portchannel'
|
18
|
+
|
19
|
+
# TestX__CLASS_NAME__X - Minitest for X__CLASS_NAME__X node utility class
|
20
|
+
class TestInterfacePortChannel < CiscoTestCase
|
21
|
+
# TESTS
|
22
|
+
|
23
|
+
DEFAULT_NAME = 'port-channel134'
|
24
|
+
|
25
|
+
def setup
|
26
|
+
super
|
27
|
+
config "no interface #{DEFAULT_NAME}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def teardown
|
31
|
+
config "no interface #{DEFAULT_NAME}"
|
32
|
+
super
|
33
|
+
end
|
34
|
+
|
35
|
+
def n6k_platform?
|
36
|
+
/N(5|6)/ =~ node.product_id
|
37
|
+
end
|
38
|
+
|
39
|
+
def create_port_channel(ifname=DEFAULT_NAME)
|
40
|
+
InterfacePortChannel.new(ifname)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_get_set_port_hash_distribution
|
44
|
+
skip('Platform does not support this property') if n6k_platform?
|
45
|
+
interface = create_port_channel
|
46
|
+
interface.port_hash_distribution = 'adaptive'
|
47
|
+
assert_equal('adaptive', interface.port_hash_distribution)
|
48
|
+
interface.port_hash_distribution = 'fixed'
|
49
|
+
assert_equal('fixed', interface.port_hash_distribution)
|
50
|
+
interface.port_hash_distribution =
|
51
|
+
interface.default_port_hash_distribution
|
52
|
+
assert_equal(interface.default_port_hash_distribution,
|
53
|
+
interface.port_hash_distribution)
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_get_set_lacp_graceful_convergence
|
57
|
+
interface = create_port_channel
|
58
|
+
interface.lacp_graceful_convergence = false
|
59
|
+
assert_equal(false, interface.lacp_graceful_convergence)
|
60
|
+
interface.lacp_graceful_convergence =
|
61
|
+
interface.default_lacp_graceful_convergence
|
62
|
+
assert_equal(interface.default_lacp_graceful_convergence,
|
63
|
+
interface.lacp_graceful_convergence)
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_get_set_lacp_min_links
|
67
|
+
interface = create_port_channel
|
68
|
+
interface.lacp_min_links = 5
|
69
|
+
assert_equal(5, interface.lacp_min_links)
|
70
|
+
interface.lacp_min_links = interface.default_lacp_min_links
|
71
|
+
assert_equal(interface.default_lacp_min_links,
|
72
|
+
interface.lacp_min_links)
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_get_set_lacp_max_bundle
|
76
|
+
interface = create_port_channel
|
77
|
+
interface.lacp_max_bundle = 10
|
78
|
+
assert_equal(10, interface.lacp_max_bundle)
|
79
|
+
interface.lacp_max_bundle =
|
80
|
+
interface.default_lacp_max_bundle
|
81
|
+
assert_equal(interface.default_lacp_max_bundle,
|
82
|
+
interface.lacp_max_bundle)
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_get_set_lacp_suspend_individual
|
86
|
+
interface = create_port_channel
|
87
|
+
interface.lacp_suspend_individual = false
|
88
|
+
assert_equal(false, interface.lacp_suspend_individual)
|
89
|
+
interface.lacp_suspend_individual =
|
90
|
+
interface.default_lacp_suspend_individual
|
91
|
+
assert_equal(interface.default_lacp_suspend_individual,
|
92
|
+
interface.lacp_suspend_individual)
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_get_set_port_load_defer
|
96
|
+
skip('Platform does not support this property') if n6k_platform?
|
97
|
+
interface = create_port_channel
|
98
|
+
interface.port_load_defer = true
|
99
|
+
assert_equal(true, interface.port_load_defer)
|
100
|
+
interface.port_load_defer =
|
101
|
+
interface.default_port_load_defer
|
102
|
+
assert_equal(interface.default_port_load_defer,
|
103
|
+
interface.port_load_defer)
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,232 @@
|
|
1
|
+
# Copyright (c) 2013-2016 Cisco and/or its affiliates.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require_relative 'ciscotest'
|
16
|
+
require_relative '../lib/cisco_node_utils/interface'
|
17
|
+
require_relative '../lib/cisco_node_utils/interface_service_vni'
|
18
|
+
require_relative '../lib/cisco_node_utils/vdc'
|
19
|
+
|
20
|
+
include Cisco
|
21
|
+
|
22
|
+
# TestInterfaceServiceVni - Minitest for the InterfaceServiceVni class.
|
23
|
+
#
|
24
|
+
# Example cli tested by this minitest:
|
25
|
+
#
|
26
|
+
# encapsulation profile vni vni_500_5000
|
27
|
+
# dot1q 500 vni 5000
|
28
|
+
# interface Ethernet9/1
|
29
|
+
# service instance 5 vni
|
30
|
+
# encapsulation profile vni_500_5000 default
|
31
|
+
# shutdown
|
32
|
+
# service instance 6 vni
|
33
|
+
# encapsulation profile vni_600_6000 default
|
34
|
+
#
|
35
|
+
class TestInterfaceServiceVni < CiscoTestCase
|
36
|
+
def setup
|
37
|
+
super
|
38
|
+
end
|
39
|
+
|
40
|
+
def teardown
|
41
|
+
# Reset the vdc module type back to default
|
42
|
+
v = Vdc.new('default')
|
43
|
+
v.limit_resource_module_type = '' if v.limit_resource_module_type == 'f3'
|
44
|
+
end
|
45
|
+
|
46
|
+
def compatible_interface?
|
47
|
+
# MT-full tests require a specific linecard; either because they need a
|
48
|
+
# compatible interface or simply to enable the features. Either way
|
49
|
+
# we will provide an appropriate interface name if the linecard is present.
|
50
|
+
# Example 'show mod' output to match against:
|
51
|
+
# '9 12 10/40 Gbps Ethernet Module N7K-F312FQ-25 ok'
|
52
|
+
sh_mod = @device.cmd("sh mod | i '^[0-9]+.*N7K-F3'")[/^(\d+)\s.*N7K-F3/]
|
53
|
+
slot = sh_mod.nil? ? nil : Regexp.last_match[1]
|
54
|
+
skip('Unable to find compatible interface in chassis') if slot.nil?
|
55
|
+
|
56
|
+
"ethernet#{slot}/1"
|
57
|
+
end
|
58
|
+
|
59
|
+
def mt_full_env_setup
|
60
|
+
skip('Platform does not support MT-full') unless Vni.mt_full_support
|
61
|
+
intf = compatible_interface?
|
62
|
+
v = Vdc.new('default')
|
63
|
+
v.limit_resource_module_type = 'f3' unless
|
64
|
+
v.limit_resource_module_type == 'f3'
|
65
|
+
config("default int #{intf}")
|
66
|
+
intf
|
67
|
+
end
|
68
|
+
|
69
|
+
def global_setup
|
70
|
+
# Reset feature to clean up switch
|
71
|
+
config('no feature vni', 'feature vni')
|
72
|
+
|
73
|
+
# Create a global encap config
|
74
|
+
config('encapsulation profile vni vni_500_5000', 'dot1q 500 vni 5000',
|
75
|
+
'encapsulation profile vni vni_600_6000', 'dot1q 600 vni 6000',
|
76
|
+
'encapsulation profile vni vni_700_7000', 'dot1q 700 vni 7000',
|
77
|
+
'encapsulation profile vni vni_800_8000', 'dot1q 800 vni 8000')
|
78
|
+
|
79
|
+
# Configure a bridge-domain
|
80
|
+
config('system bridge-domain 100-113', 'bridge-domain 100')
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_create_destroy
|
84
|
+
# This property has several dependencies:
|
85
|
+
# - VDC support
|
86
|
+
# - Specific linecard (F3 or newer)
|
87
|
+
# - Bridge Domain Configuration
|
88
|
+
# - Feature vni
|
89
|
+
|
90
|
+
intf = mt_full_env_setup
|
91
|
+
global_setup
|
92
|
+
|
93
|
+
# TEST Create / Destroy and svc_vni_ids hash builder
|
94
|
+
i5 = InterfaceServiceVni.new(intf, 5)
|
95
|
+
assert_equal(1, InterfaceServiceVni.svc_vni_ids[intf].count)
|
96
|
+
i6 = InterfaceServiceVni.new(intf, 6)
|
97
|
+
i7 = InterfaceServiceVni.new(intf, 7)
|
98
|
+
assert_equal(3, InterfaceServiceVni.svc_vni_ids[intf].count)
|
99
|
+
i6.destroy
|
100
|
+
assert_equal(2, InterfaceServiceVni.svc_vni_ids[intf].count)
|
101
|
+
i5.destroy
|
102
|
+
i7.destroy
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_shutdown
|
106
|
+
intf = mt_full_env_setup
|
107
|
+
global_setup
|
108
|
+
|
109
|
+
i5 = InterfaceServiceVni.new(intf, 5)
|
110
|
+
# Test shutdown
|
111
|
+
i5.shutdown = false
|
112
|
+
refute(i5.shutdown)
|
113
|
+
i5.shutdown = true
|
114
|
+
assert(i5.shutdown)
|
115
|
+
i5.shutdown = false
|
116
|
+
refute(i5.shutdown)
|
117
|
+
i5.shutdown = i5.default_shutdown
|
118
|
+
assert(i5.shutdown)
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_encapsulation_profile_vni
|
122
|
+
intf = mt_full_env_setup
|
123
|
+
global_setup
|
124
|
+
|
125
|
+
i5 = InterfaceServiceVni.new(intf, 5)
|
126
|
+
|
127
|
+
# Test removal when profile not present
|
128
|
+
i5.encapsulation_profile_vni = ''
|
129
|
+
assert_empty(i5.encapsulation_profile_vni)
|
130
|
+
|
131
|
+
# Add one
|
132
|
+
i5.encapsulation_profile_vni = 'vni_500_5000'
|
133
|
+
assert_equal('vni_500_5000', i5.encapsulation_profile_vni)
|
134
|
+
|
135
|
+
# Change it
|
136
|
+
i5.encapsulation_profile_vni = 'vni_700_7000'
|
137
|
+
assert_equal('vni_700_7000', i5.encapsulation_profile_vni)
|
138
|
+
|
139
|
+
# Test default when profile present
|
140
|
+
i5.encapsulation_profile_vni = 'vni_700_7000'
|
141
|
+
i5.encapsulation_profile_vni = i5.default_encapsulation_profile_vni
|
142
|
+
assert_equal(i5.default_encapsulation_profile_vni,
|
143
|
+
i5.encapsulation_profile_vni)
|
144
|
+
end
|
145
|
+
|
146
|
+
# interface vlan_mapping is not technically part of the interface service
|
147
|
+
# but it shares most of the same dependencies so it is tested here instead
|
148
|
+
# of test_interface.rb
|
149
|
+
def test_vlan_mapping
|
150
|
+
# This test covers two properties:
|
151
|
+
# vlan_mapping & vlan_mapping_enabled
|
152
|
+
#
|
153
|
+
# This property has several dependencies:
|
154
|
+
# - VDC support
|
155
|
+
# - Specific linecard (F3)
|
156
|
+
# - Bridge Domain Configuration
|
157
|
+
# - Feature vni
|
158
|
+
intf = mt_full_env_setup
|
159
|
+
global_setup
|
160
|
+
|
161
|
+
i = Interface.new(intf)
|
162
|
+
i.switchport_mode = :trunk
|
163
|
+
i.vlan_mapping = []
|
164
|
+
assert_equal([], i.vlan_mapping, 'Initial cleanup failed')
|
165
|
+
|
166
|
+
# Initial 'should' state
|
167
|
+
# rubocop:disable Style/WordArray
|
168
|
+
master = [['20', '21'],
|
169
|
+
['40', '41'],
|
170
|
+
['60', '61'],
|
171
|
+
['80', '81']]
|
172
|
+
# rubocop:enable Style/WordArray
|
173
|
+
|
174
|
+
# Test: Add all mappings when no cmds are present
|
175
|
+
should = master.clone
|
176
|
+
i.vlan_mapping = should
|
177
|
+
result = i.vlan_mapping
|
178
|
+
assert_equal(should.sort, result.sort,
|
179
|
+
'Test 1a. From empty, to all mappings')
|
180
|
+
i.vlan_mapping_enable = false
|
181
|
+
refute(i.vlan_mapping_enable,
|
182
|
+
'Test 1b. Initial test, set to disabled')
|
183
|
+
|
184
|
+
# Test: remove half of the mappings
|
185
|
+
should.shift(2)
|
186
|
+
i.vlan_mapping = should
|
187
|
+
result = i.vlan_mapping
|
188
|
+
assert_equal(should.sort, result.sort,
|
189
|
+
'Test 2a. Remove half of the mappings')
|
190
|
+
i.vlan_mapping_enable = true
|
191
|
+
assert(i.vlan_mapping_enable,
|
192
|
+
'Test 2b. Back to enabled')
|
193
|
+
|
194
|
+
# Test: restore the removed mappings
|
195
|
+
should = master.clone
|
196
|
+
i.vlan_mapping = should
|
197
|
+
result = i.vlan_mapping
|
198
|
+
assert_equal(should.sort, result.sort,
|
199
|
+
'Test 3a. Restore the removed mappings')
|
200
|
+
i.vlan_mapping_enable = false
|
201
|
+
refute(i.vlan_mapping_enable,
|
202
|
+
'Test 3b. Back to disabled')
|
203
|
+
|
204
|
+
# Test: Change original-vlan on existing commands
|
205
|
+
should = should.map do |original, translated|
|
206
|
+
[original + '1', translated]
|
207
|
+
end
|
208
|
+
i.vlan_mapping = should
|
209
|
+
result = i.vlan_mapping
|
210
|
+
assert_equal(should.sort, result.sort,
|
211
|
+
'Test 4. Change original-vlan on existing commands')
|
212
|
+
|
213
|
+
# Test: Change translated-vlan on existing commands
|
214
|
+
should = should.map do |original, translated|
|
215
|
+
[original, translated + '1']
|
216
|
+
end
|
217
|
+
i.vlan_mapping = should
|
218
|
+
result = i.vlan_mapping
|
219
|
+
assert_equal(should.sort, result.sort,
|
220
|
+
'Test 5. Change translated-vlan on existing commands')
|
221
|
+
|
222
|
+
# Test: 'default'
|
223
|
+
should = i.default_vlan_mapping
|
224
|
+
i.vlan_mapping = should
|
225
|
+
result = i.vlan_mapping
|
226
|
+
assert_equal(should.sort, result.sort,
|
227
|
+
"Test 6a. 'default'")
|
228
|
+
i.vlan_mapping_enable = i.default_vlan_mapping_enable
|
229
|
+
assert(i.vlan_mapping_enable,
|
230
|
+
"Test 6b. 'default'")
|
231
|
+
end
|
232
|
+
end
|