cisco_node_utils 0.9.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +22 -0
- data/CONTRIBUTING.md +33 -31
- data/SUPPORT.md +3 -0
- data/cisco_node_utils.gemspec +1 -1
- data/docs/.rubocop.yml +13 -0
- data/docs/README-develop-node-utils-APIs.md +659 -0
- data/docs/README-maintainers.md +78 -0
- data/docs/agent_files.png +0 -0
- data/docs/template-feature.rb +45 -0
- data/docs/template-router.rb +125 -0
- data/docs/template-test_feature.rb +51 -0
- data/docs/template-test_router.rb +107 -0
- data/lib/cisco_node_utils/command_reference_common.yaml +42 -1
- data/lib/cisco_node_utils/interface.rb +106 -0
- data/lib/cisco_node_utils/interface_ospf.rb +17 -3
- data/lib/cisco_node_utils/node.rb +2 -2
- data/lib/cisco_node_utils/router_ospf_vrf.rb +12 -0
- data/lib/cisco_node_utils/version.rb +1 -1
- data/lib/cisco_node_utils/vtp.rb +21 -12
- data/lib/cisco_node_utils/yum.rb +16 -6
- data/tests/n9000_sample-1.0.0-7.0.3.x86_64.rpm +0 -0
- data/tests/test_interface.rb +149 -7
- data/tests/test_interface_ospf.rb +33 -1
- data/tests/test_interface_switchport.rb +104 -1
- data/tests/test_router_ospf_vrf.rb +12 -0
- data/tests/test_snmpuser.rb +1 -1
- data/tests/test_vtp.rb +64 -48
- data/tests/test_yum.rb +11 -7
- metadata +32 -22
@@ -101,6 +101,24 @@ module Cisco
|
|
101
101
|
@@node.config_get_default("interface", "description")
|
102
102
|
end
|
103
103
|
|
104
|
+
def encapsulation_dot1q
|
105
|
+
val = @@node.config_get("interface", "encapsulation_dot1q", @name)
|
106
|
+
return default_encapsulation_dot1q if val.nil?
|
107
|
+
val.shift.strip.to_i
|
108
|
+
end
|
109
|
+
|
110
|
+
def encapsulation_dot1q=(val)
|
111
|
+
val.nil? ?
|
112
|
+
@@node.config_set("interface", "encapsulation_dot1q", @name, "no", "") :
|
113
|
+
@@node.config_set("interface", "encapsulation_dot1q", @name, "", val)
|
114
|
+
rescue Cisco::CliError => e
|
115
|
+
raise "[#{@name}] '#{e.command}' : #{e.clierror}"
|
116
|
+
end
|
117
|
+
|
118
|
+
def default_encapsulation_dot1q
|
119
|
+
@@node.config_get_default("interface", "encapsulation_dot1q")
|
120
|
+
end
|
121
|
+
|
104
122
|
def fex_feature
|
105
123
|
fex = @@node.config_get("fex", "feature")
|
106
124
|
raise "fex_feature not found" if fex.nil?
|
@@ -215,6 +233,33 @@ module Cisco
|
|
215
233
|
@@node.config_get_default("interface", ipv4_redirects_lookup_string)
|
216
234
|
end
|
217
235
|
|
236
|
+
def feature_lacp?
|
237
|
+
not @@node.config_get("interface", "feature_lacp").nil?
|
238
|
+
end
|
239
|
+
|
240
|
+
def feature_lacp_set(val)
|
241
|
+
return if feature_lacp? == val
|
242
|
+
@@node.config_set("interface", "feature_lacp", val ? "" : "no")
|
243
|
+
end
|
244
|
+
|
245
|
+
def mtu
|
246
|
+
mtu = @@node.config_get("interface", "mtu", @name)
|
247
|
+
return default_mtu if mtu.nil?
|
248
|
+
mtu.shift.strip.to_i
|
249
|
+
end
|
250
|
+
|
251
|
+
def mtu=(mtu)
|
252
|
+
mtu.nil? ?
|
253
|
+
@@node.config_set("interface", "mtu", @name, "no", "") :
|
254
|
+
@@node.config_set("interface", "mtu", @name, "", mtu)
|
255
|
+
rescue Cisco::CliError => e
|
256
|
+
raise "[#{@name}] '#{e.command}' : #{e.clierror}"
|
257
|
+
end
|
258
|
+
|
259
|
+
def default_mtu
|
260
|
+
@@node.config_get_default("interface", "mtu")
|
261
|
+
end
|
262
|
+
|
218
263
|
def negotiate_auto_lookup_string
|
219
264
|
case @name
|
220
265
|
when /Ethernet/i
|
@@ -401,6 +446,48 @@ module Cisco
|
|
401
446
|
@@node.config_get_default("interface", switchport_mode_lookup_string))
|
402
447
|
end
|
403
448
|
|
449
|
+
def switchport_trunk_allowed_vlan
|
450
|
+
val = @@node.config_get(
|
451
|
+
"interface", "switchport_trunk_allowed_vlan", @name)
|
452
|
+
return default_switchport_trunk_allowed_vlan if val.nil?
|
453
|
+
val.shift.strip
|
454
|
+
end
|
455
|
+
|
456
|
+
def switchport_trunk_allowed_vlan=(val)
|
457
|
+
val.nil? ?
|
458
|
+
@@node.config_set(
|
459
|
+
"interface", "switchport_trunk_allowed_vlan", @name, "no", "") :
|
460
|
+
@@node.config_set(
|
461
|
+
"interface", "switchport_trunk_allowed_vlan", @name, "", val)
|
462
|
+
rescue Cisco::CliError => e
|
463
|
+
raise "[#{@name}] '#{e.command}' : #{e.clierror}"
|
464
|
+
end
|
465
|
+
|
466
|
+
def default_switchport_trunk_allowed_vlan
|
467
|
+
@@node.config_get_default("interface", "switchport_trunk_allowed_vlan")
|
468
|
+
end
|
469
|
+
|
470
|
+
def switchport_trunk_native_vlan
|
471
|
+
val = @@node.config_get(
|
472
|
+
"interface", "switchport_trunk_native_vlan", @name)
|
473
|
+
return default_switchport_trunk_native_vlan if val.nil?
|
474
|
+
val.shift.strip.to_i
|
475
|
+
end
|
476
|
+
|
477
|
+
def switchport_trunk_native_vlan=(val)
|
478
|
+
val.nil? ?
|
479
|
+
@@node.config_set(
|
480
|
+
"interface", "switchport_trunk_native_vlan", @name, "no", "") :
|
481
|
+
@@node.config_set(
|
482
|
+
"interface", "switchport_trunk_native_vlan", @name, "", val)
|
483
|
+
rescue Cisco::CliError => e
|
484
|
+
raise "[#{@name}] '#{e.command}' : #{e.clierror}"
|
485
|
+
end
|
486
|
+
|
487
|
+
def default_switchport_trunk_native_vlan
|
488
|
+
@@node.config_get_default("interface", "switchport_trunk_native_vlan")
|
489
|
+
end
|
490
|
+
|
404
491
|
def system_default_switchport
|
405
492
|
# This command is a user-configurable system default.
|
406
493
|
sys_def = @@node.config_get("interface", "system_default_switchport")
|
@@ -497,5 +584,24 @@ module Cisco
|
|
497
584
|
raise "#{caller[0][/`.*'/][1..-2]} cannot be set unless switchport mode" +
|
498
585
|
" is disabled" unless switchport_mode == :disabled
|
499
586
|
end
|
587
|
+
|
588
|
+
def vrf
|
589
|
+
vrf = @@node.config_get("interface", "vrf", @name)
|
590
|
+
return "" if vrf.nil?
|
591
|
+
vrf.shift.strip
|
592
|
+
end
|
593
|
+
|
594
|
+
def vrf=(vrf)
|
595
|
+
raise TypeError unless vrf.is_a?(String)
|
596
|
+
vrf.empty? ?
|
597
|
+
@@node.config_set("interface", "vrf", @name, "no", "") :
|
598
|
+
@@node.config_set("interface", "vrf", @name, "", vrf)
|
599
|
+
rescue Cisco::CliError => e
|
600
|
+
raise "[#{@name}] '#{e.command}' : #{e.clierror}"
|
601
|
+
end
|
602
|
+
|
603
|
+
def default_vrf
|
604
|
+
@@node.config_get_default("interface", "vrf")
|
605
|
+
end
|
500
606
|
end # Class
|
501
607
|
end # Module
|
@@ -17,6 +17,7 @@
|
|
17
17
|
# See the License for the specific language governing permissions and
|
18
18
|
# limitations under the License.
|
19
19
|
|
20
|
+
require 'ipaddr'
|
20
21
|
require File.join(File.dirname(__FILE__), 'node')
|
21
22
|
require File.join(File.dirname(__FILE__), 'interface')
|
22
23
|
# Interestingly enough, interface OSPF configuration can exist completely
|
@@ -24,7 +25,7 @@ require File.join(File.dirname(__FILE__), 'interface')
|
|
24
25
|
|
25
26
|
module Cisco
|
26
27
|
class InterfaceOspf
|
27
|
-
attr_reader :interface, :ospf_name
|
28
|
+
attr_reader :interface, :ospf_name
|
28
29
|
|
29
30
|
@@node = Node.instance
|
30
31
|
|
@@ -42,7 +43,6 @@ module Cisco
|
|
42
43
|
raise "interface #{int_name} does not exist" if @interface.nil?
|
43
44
|
|
44
45
|
@ospf_name = ospf_name
|
45
|
-
@area = area
|
46
46
|
|
47
47
|
if create
|
48
48
|
# enable feature ospf if it isn't
|
@@ -76,9 +76,23 @@ module Cisco
|
|
76
76
|
ints
|
77
77
|
end
|
78
78
|
|
79
|
+
def area
|
80
|
+
match = @@node.config_get("interface_ospf", "area", @interface.name)
|
81
|
+
return nil if match.nil?
|
82
|
+
val = match[0][1]
|
83
|
+
# Coerce numeric area to the expected dot-decimal format.
|
84
|
+
val = IPAddr.new(val.to_i, Socket::AF_INET).to_s unless val.match(/\./)
|
85
|
+
val
|
86
|
+
end
|
87
|
+
|
88
|
+
def area=(a)
|
89
|
+
@@node.config_set("interface_ospf", "area", @interface.name,
|
90
|
+
"", @ospf_name, a)
|
91
|
+
end
|
92
|
+
|
79
93
|
def destroy
|
80
94
|
@@node.config_set("interface_ospf", "area", @interface.name,
|
81
|
-
"no", @ospf_name,
|
95
|
+
"no", @ospf_name, area)
|
82
96
|
# Reset everything else back to default as well:
|
83
97
|
self.message_digest = default_message_digest
|
84
98
|
message_digest_key_set(default_message_digest_key_id, "", "", "")
|
@@ -33,11 +33,11 @@ module Cisco
|
|
33
33
|
attr_reader :command, :clierror, :previous
|
34
34
|
def initialize(command, clierror, previous)
|
35
35
|
@command = command
|
36
|
-
@clierror = clierror
|
36
|
+
@clierror = clierror.rstrip
|
37
37
|
@previous = previous
|
38
38
|
end
|
39
39
|
|
40
|
-
def
|
40
|
+
def to_s
|
41
41
|
"CliError: '#{@command}' rejected with message:\n'#{@clierror}'"
|
42
42
|
end
|
43
43
|
end
|
@@ -201,6 +201,12 @@ class RouterOspfVrf
|
|
201
201
|
set_args_keys_delete([:start, :hold, :max])
|
202
202
|
end
|
203
203
|
|
204
|
+
def default_timer_throttle_lsa
|
205
|
+
[default_timer_throttle_lsa_start,
|
206
|
+
default_timer_throttle_lsa_hold,
|
207
|
+
default_timer_throttle_lsa_max]
|
208
|
+
end
|
209
|
+
|
204
210
|
def default_timer_throttle_lsa_start
|
205
211
|
@@node.config_get_default("ospf", "timer_throttle_lsa_start")
|
206
212
|
end
|
@@ -243,6 +249,12 @@ class RouterOspfVrf
|
|
243
249
|
set_args_keys_delete([:start, :hold, :max])
|
244
250
|
end
|
245
251
|
|
252
|
+
def default_timer_throttle_spf
|
253
|
+
[default_timer_throttle_spf_start,
|
254
|
+
default_timer_throttle_spf_hold,
|
255
|
+
default_timer_throttle_spf_max]
|
256
|
+
end
|
257
|
+
|
246
258
|
def default_timer_throttle_spf_start
|
247
259
|
@@node.config_get_default("ospf", "timer_throttle_spf_start")
|
248
260
|
end
|
data/lib/cisco_node_utils/vtp.rb
CHANGED
@@ -47,7 +47,7 @@ class Vtp
|
|
47
47
|
|
48
48
|
# Get vtp domain name
|
49
49
|
def Vtp.domain
|
50
|
-
@@node.config_get("vtp", "domain")
|
50
|
+
enabled ? @@node.config_get("vtp", "domain") : ""
|
51
51
|
end
|
52
52
|
|
53
53
|
def domain
|
@@ -55,11 +55,12 @@ class Vtp
|
|
55
55
|
end
|
56
56
|
|
57
57
|
# Set vtp domain name
|
58
|
-
def domain=(
|
59
|
-
raise ArgumentError unless
|
60
|
-
|
58
|
+
def domain=(d)
|
59
|
+
raise ArgumentError unless d and d.is_a? String and
|
60
|
+
d.length.between?(1, MAX_VTP_DOMAIN_NAME_SIZE)
|
61
|
+
enable unless Vtp.enabled
|
61
62
|
begin
|
62
|
-
@@node.config_set("vtp", "domain",
|
63
|
+
@@node.config_set("vtp", "domain", d)
|
63
64
|
rescue Cisco::CliError => e
|
64
65
|
# cmd will syntax reject when setting name to same name
|
65
66
|
raise unless e.clierror =~ /ERROR: Domain name already set to /
|
@@ -69,9 +70,9 @@ class Vtp
|
|
69
70
|
# Get vtp password
|
70
71
|
def password
|
71
72
|
# Unfortunately nxapi returns "\\" when the password is not set
|
72
|
-
password = @@node.config_get("vtp", "password")
|
73
|
-
return '' if password.nil?
|
74
|
-
password
|
73
|
+
password = @@node.config_get("vtp", "password") if Vtp.enabled
|
74
|
+
return '' if password.nil? or password == "\\"
|
75
|
+
password
|
75
76
|
end
|
76
77
|
|
77
78
|
# Set vtp password
|
@@ -79,9 +80,15 @@ class Vtp
|
|
79
80
|
raise TypeError if password.nil?
|
80
81
|
raise TypeError unless password.is_a? String
|
81
82
|
raise ArgumentError if password.length > MAX_VTP_PASSWORD_SIZE
|
82
|
-
|
83
|
-
|
84
|
-
|
83
|
+
enable unless Vtp.enabled
|
84
|
+
begin
|
85
|
+
password == default_password ?
|
86
|
+
@@node.config_set("vtp", "password", "no", "") :
|
87
|
+
@@node.config_set("vtp", "password", "", password)
|
88
|
+
rescue Cisco::CliError => e
|
89
|
+
raise unless e.clierror =~ /password cannot be set for NULL domain/
|
90
|
+
raise "Setting VTP password requires first setting VTP domain" unless password == default_password
|
91
|
+
end
|
85
92
|
end
|
86
93
|
|
87
94
|
# Get default vtp password
|
@@ -98,6 +105,7 @@ class Vtp
|
|
98
105
|
# Set vtp filename
|
99
106
|
def filename=(uri)
|
100
107
|
raise TypeError if uri.nil?
|
108
|
+
enable unless Vtp.enabled
|
101
109
|
uri.empty? ?
|
102
110
|
@@node.config_set("vtp", "filename", "no", "") :
|
103
111
|
@@node.config_set("vtp", "filename", "", uri)
|
@@ -110,12 +118,13 @@ class Vtp
|
|
110
118
|
|
111
119
|
# Get vtp version
|
112
120
|
def version
|
113
|
-
match = @@node.config_get("vtp", "version")
|
121
|
+
match = @@node.config_get("vtp", "version") if Vtp.enabled
|
114
122
|
match.nil? ? default_version : match.first.to_i
|
115
123
|
end
|
116
124
|
|
117
125
|
# Set vtp version
|
118
126
|
def version=(version)
|
127
|
+
enable unless Vtp.enabled
|
119
128
|
@@node.config_set("vtp", "version", "#{version}")
|
120
129
|
end
|
121
130
|
|
data/lib/cisco_node_utils/yum.rb
CHANGED
@@ -28,7 +28,7 @@ module Cisco
|
|
28
28
|
# ex: chef-12.0.0alpha.2+20150319.git.1.b6f-1.el5.x86_64.rpm
|
29
29
|
name_ver_arch_regex = /^([\w\-\+]+)-(\d+\..*)\.(\w{4,})(?:\.rpm)?$/
|
30
30
|
|
31
|
-
# ex n9000_sample-1.0.0-7.0.3.x86_64.rpm
|
31
|
+
# ex n9000_sample-1.0.0-7.0.3.x86_64.rpm
|
32
32
|
name_ver_arch_regex_nx = /^(.*)-([\d\.]+-[\d\.]+)\.(\w{4,})\.rpm$/
|
33
33
|
|
34
34
|
# ex: b+z-ip2.x64_64
|
@@ -52,20 +52,30 @@ module Cisco
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
should_ver = pkg_info[2] if pkg_info && pkg_info[3]
|
55
|
-
ver =
|
55
|
+
ver = query(query_name)
|
56
56
|
if ver.nil? || (!should_ver.nil? && should_ver != ver)
|
57
|
-
raise
|
57
|
+
raise "Failed to install the requested rpm"
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
-
def self.
|
62
|
-
|
61
|
+
def self.get_vrf
|
62
|
+
# Detect current namespace from agent environment
|
63
|
+
inode = File::Stat.new("/proc/self/ns/net").ino
|
64
|
+
# -L reqd for guestshell's find command
|
65
|
+
vrfname = File.basename(`find -L /var/run/netns/ -inum #{inode}`.chop)
|
66
|
+
vrf = "vrf " + vrfname unless vrfname.empty?
|
67
|
+
vrf
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.install(pkg, vrf = nil)
|
71
|
+
vrf = vrf.nil? ? get_vrf : "vrf #{vrf}"
|
72
|
+
@@node.config_set("yum", "install", pkg, vrf)
|
63
73
|
|
64
74
|
# HACK: The current nxos host installer is a multi-part command
|
65
75
|
# which may fail at a later stage yet return a false positive;
|
66
76
|
# therefore a post-validation check is needed here to verify the
|
67
77
|
# actual outcome.
|
68
|
-
|
78
|
+
validate(pkg)
|
69
79
|
end
|
70
80
|
|
71
81
|
# returns version of package, or false if package doesn't exist
|
Binary file
|
data/tests/test_interface.rb
CHANGED
@@ -28,6 +28,7 @@ class TestInterface < CiscoTestCase
|
|
28
28
|
@@debug_validate_ipv4_address = "validate_ipv4_address"
|
29
29
|
@@debug_validate_ipv4_proxy_arp = "validate_ipv4_proxy_arp"
|
30
30
|
@@debug_validate_ipv4_redirects = "validate_ipv4_redirects"
|
31
|
+
@@debug_validate_vrf = "validate_vrf"
|
31
32
|
@@debug_test_interface_ipv4_all_interfaces = "test_interface_ipv4_all_interfaces"
|
32
33
|
|
33
34
|
# Debug flags, globally defined
|
@@ -63,7 +64,9 @@ SWITCHPORT_SHUTDOWN_HASH = {
|
|
63
64
|
DEFAULT_IF_IP_NETMASK_LEN = nil
|
64
65
|
DEFAULT_IF_IP_PROXY_ARP = false
|
65
66
|
DEFAULT_IF_IP_REDIRECTS = true
|
67
|
+
DEFAULT_IF_VRF = ""
|
66
68
|
IF_DESCRIPTION_SIZE = 243 # SIZE = VSH Max 255 - "description " keyword
|
69
|
+
IF_VRF_MAX_LENGTH = 32
|
67
70
|
|
68
71
|
def interface_ipv4_config(ifname, address, length,
|
69
72
|
config = true, secip = false)
|
@@ -225,16 +228,16 @@ SWITCHPORT_SHUTDOWN_HASH = {
|
|
225
228
|
|
226
229
|
# check of description
|
227
230
|
assert_equal(v[:description], interface.description,
|
228
|
-
"Error: Description not configured")
|
231
|
+
"Error: [#{interface.name}] Description is not configured")
|
229
232
|
|
230
233
|
# change description
|
231
234
|
interface.description = v[:description_new]
|
232
235
|
assert_equal(v[:description_new], interface.description,
|
233
|
-
"Error: Description not
|
236
|
+
"Error: [#{interface.name}] Description is not changed")
|
234
237
|
|
235
238
|
# get_default check
|
236
239
|
assert_equal(v[:default_description], interface.default_description,
|
237
|
-
"Error:
|
240
|
+
"Error: [#{interface.name}] Default description is not configured")
|
238
241
|
end
|
239
242
|
end
|
240
243
|
|
@@ -413,6 +416,31 @@ SWITCHPORT_SHUTDOWN_HASH = {
|
|
413
416
|
end
|
414
417
|
end
|
415
418
|
|
419
|
+
def validate_vrf(inttype_h)
|
420
|
+
# Validate the vrf
|
421
|
+
inttype_h.each do | k, v |
|
422
|
+
CiscoTestCase.debug(@@debug_validate_vrf,
|
423
|
+
@@debug_group_ipv4_all_interfaces,
|
424
|
+
2,
|
425
|
+
"Interface: #{k}")
|
426
|
+
interface = v[:interface]
|
427
|
+
|
428
|
+
CiscoTestCase.debug_detail(@@debug_validate_vrf,
|
429
|
+
@@debug_group_ipv4_all_interfaces,
|
430
|
+
4,
|
431
|
+
"Value - #{v[:vrf]}")
|
432
|
+
|
433
|
+
# change vrf
|
434
|
+
interface.vrf = v[:vrf_new]
|
435
|
+
assert_equal(v[:vrf_new], interface.vrf,
|
436
|
+
"Error: [#{interface.name}] vrf is not changed")
|
437
|
+
|
438
|
+
# set to default vrf
|
439
|
+
assert_equal(v[:default_vrf], interface.default_vrf,
|
440
|
+
"Error: [#{interface.name}] vrf config found. Should be default vrf")
|
441
|
+
end
|
442
|
+
end
|
443
|
+
|
416
444
|
def test_interface_create_name_nil
|
417
445
|
assert_raises(TypeError) do
|
418
446
|
Interface.new(nil)
|
@@ -473,6 +501,62 @@ SWITCHPORT_SHUTDOWN_HASH = {
|
|
473
501
|
interface_ethernet_default(interfaces_id[0])
|
474
502
|
end
|
475
503
|
|
504
|
+
def test_interface_encapsulation_dot1q_change
|
505
|
+
interface = Interface.new(interfaces[0])
|
506
|
+
interface.switchport_mode = :disabled
|
507
|
+
subif = Interface.new(interfaces[0] + ".1")
|
508
|
+
|
509
|
+
subif.encapsulation_dot1q = 20
|
510
|
+
assert_equal(20, subif.encapsulation_dot1q)
|
511
|
+
subif.encapsulation_dot1q = 25
|
512
|
+
assert_equal(25, subif.encapsulation_dot1q)
|
513
|
+
interface_ethernet_default(interfaces_id[0])
|
514
|
+
end
|
515
|
+
|
516
|
+
def test_interface_encapsulation_dot1q_invalid
|
517
|
+
interface = Interface.new(interfaces[0])
|
518
|
+
interface.switchport_mode = :disabled
|
519
|
+
subif = Interface.new(interfaces[0] + ".1")
|
520
|
+
|
521
|
+
assert_raises(RuntimeError) {
|
522
|
+
subif.encapsulation_dot1q = "hello"
|
523
|
+
}
|
524
|
+
interface_ethernet_default(interfaces_id[0])
|
525
|
+
end
|
526
|
+
|
527
|
+
def test_interface_encapsulation_dot1q_valid
|
528
|
+
interface = Interface.new(interfaces[0])
|
529
|
+
interface.switchport_mode = :disabled
|
530
|
+
subif = Interface.new(interfaces[0] + ".1")
|
531
|
+
|
532
|
+
subif.encapsulation_dot1q = 20
|
533
|
+
assert_equal(20, subif.encapsulation_dot1q)
|
534
|
+
interface_ethernet_default(interfaces_id[0])
|
535
|
+
end
|
536
|
+
|
537
|
+
def test_interface_mtu_change
|
538
|
+
interface = Interface.new(interfaces[0])
|
539
|
+
interface.mtu = 1490
|
540
|
+
assert_equal(1490, interface.mtu)
|
541
|
+
interface.mtu = 580
|
542
|
+
assert_equal(580, interface.mtu)
|
543
|
+
interface_ethernet_default(interfaces_id[0])
|
544
|
+
end
|
545
|
+
|
546
|
+
def test_interface_mtu_invalid
|
547
|
+
interface = Interface.new(interfaces[0])
|
548
|
+
assert_raises(RuntimeError) {
|
549
|
+
interface.mtu = "hello"
|
550
|
+
}
|
551
|
+
end
|
552
|
+
|
553
|
+
def test_interface_mtu_valid
|
554
|
+
interface = Interface.new(interfaces[0])
|
555
|
+
interface.mtu = 1490
|
556
|
+
assert_equal(1490, interface.mtu)
|
557
|
+
interface_ethernet_default(interfaces_id[0])
|
558
|
+
end
|
559
|
+
|
476
560
|
def test_interface_shutdown_valid
|
477
561
|
interface = Interface.new(interfaces[0])
|
478
562
|
interface.shutdown = true
|
@@ -906,7 +990,9 @@ SWITCHPORT_SHUTDOWN_HASH = {
|
|
906
990
|
:switchport => :disabled,
|
907
991
|
:default_switchport => :disabled,
|
908
992
|
:access_vlan => DEFAULT_IF_ACCESS_VLAN,
|
909
|
-
:default_access_vlan => DEFAULT_IF_ACCESS_VLAN
|
993
|
+
:default_access_vlan => DEFAULT_IF_ACCESS_VLAN,
|
994
|
+
:vrf_new => "test2",
|
995
|
+
:default_vrf => DEFAULT_IF_VRF,
|
910
996
|
}
|
911
997
|
inttype_h["Vlan45"] = {
|
912
998
|
:address_len => "9.7.1.1/15",
|
@@ -921,7 +1007,9 @@ SWITCHPORT_SHUTDOWN_HASH = {
|
|
921
1007
|
:switchport => :disabled,
|
922
1008
|
:default_switchport => :disabled,
|
923
1009
|
:access_vlan => DEFAULT_IF_ACCESS_VLAN,
|
924
|
-
:default_access_vlan => DEFAULT_IF_ACCESS_VLAN
|
1010
|
+
:default_access_vlan => DEFAULT_IF_ACCESS_VLAN,
|
1011
|
+
:vrf_new => "test2",
|
1012
|
+
:default_vrf => DEFAULT_IF_VRF,
|
925
1013
|
}
|
926
1014
|
inttype_h["port-channel48"] = {
|
927
1015
|
:address_len => "10.7.1.1/15",
|
@@ -936,7 +1024,9 @@ SWITCHPORT_SHUTDOWN_HASH = {
|
|
936
1024
|
:switchport => :disabled,
|
937
1025
|
:default_switchport => :disabled,
|
938
1026
|
:access_vlan => DEFAULT_IF_ACCESS_VLAN,
|
939
|
-
:default_access_vlan => DEFAULT_IF_ACCESS_VLAN
|
1027
|
+
:default_access_vlan => DEFAULT_IF_ACCESS_VLAN,
|
1028
|
+
:vrf_new => "test2",
|
1029
|
+
:default_vrf => DEFAULT_IF_VRF,
|
940
1030
|
}
|
941
1031
|
inttype_h["loopback0"] = {
|
942
1032
|
:address_len => "11.7.1.1/15",
|
@@ -950,7 +1040,9 @@ SWITCHPORT_SHUTDOWN_HASH = {
|
|
950
1040
|
:switchport => :disabled,
|
951
1041
|
:default_switchport => :disabled,
|
952
1042
|
:access_vlan => DEFAULT_IF_ACCESS_VLAN,
|
953
|
-
:default_access_vlan => DEFAULT_IF_ACCESS_VLAN
|
1043
|
+
:default_access_vlan => DEFAULT_IF_ACCESS_VLAN,
|
1044
|
+
:vrf_new => "test2",
|
1045
|
+
:default_vrf => DEFAULT_IF_VRF,
|
954
1046
|
}
|
955
1047
|
# Skipping mgmt0 interface since that interface is our 'path' to
|
956
1048
|
# master should revisit this later
|
@@ -999,6 +1091,7 @@ SWITCHPORT_SHUTDOWN_HASH = {
|
|
999
1091
|
validate_ipv4_proxy_arp(inttype_h)
|
1000
1092
|
validate_ipv4_redirects(inttype_h)
|
1001
1093
|
validate_interface_shutdown(inttype_h)
|
1094
|
+
validate_vrf(inttype_h)
|
1002
1095
|
|
1003
1096
|
# Cleanup the preload configuration
|
1004
1097
|
s = @device.cmd("configure terminal")
|
@@ -1014,4 +1107,53 @@ SWITCHPORT_SHUTDOWN_HASH = {
|
|
1014
1107
|
s = @device.cmd("end")
|
1015
1108
|
node.cache_flush
|
1016
1109
|
end
|
1110
|
+
|
1111
|
+
def test_interface_vrf_default
|
1112
|
+
@device.cmd("conf t ; interface loopback1 ; vrf member foo")
|
1113
|
+
node.cache_flush
|
1114
|
+
interface = Interface.new("loopback1")
|
1115
|
+
interface.vrf = interface.default_vrf
|
1116
|
+
assert_equal(DEFAULT_IF_VRF, interface.vrf)
|
1117
|
+
end
|
1118
|
+
|
1119
|
+
def test_interface_vrf_empty
|
1120
|
+
@device.cmd("conf t ; interface loopback1 ; vrf member foo")
|
1121
|
+
node.cache_flush
|
1122
|
+
interface = Interface.new("loopback1")
|
1123
|
+
interface.vrf = DEFAULT_IF_VRF
|
1124
|
+
assert_equal(DEFAULT_IF_VRF, interface.vrf)
|
1125
|
+
end
|
1126
|
+
|
1127
|
+
def test_interface_vrf_invalid_type
|
1128
|
+
interface = Interface.new("loopback1")
|
1129
|
+
assert_raises(TypeError) {
|
1130
|
+
interface.vrf = 1
|
1131
|
+
}
|
1132
|
+
end
|
1133
|
+
|
1134
|
+
def test_interface_vrf_exceeds_max_length
|
1135
|
+
interface = Interface.new("loopback1")
|
1136
|
+
long_string = "a" * (IF_VRF_MAX_LENGTH + 1)
|
1137
|
+
assert_raises(RuntimeError) {
|
1138
|
+
interface.vrf = long_string
|
1139
|
+
}
|
1140
|
+
end
|
1141
|
+
|
1142
|
+
def test_interface_vrf_override
|
1143
|
+
interface = Interface.new("loopback1")
|
1144
|
+
vrf1 = "test1"
|
1145
|
+
vrf2 = "test2"
|
1146
|
+
interface.vrf = vrf1
|
1147
|
+
interface.vrf = vrf2
|
1148
|
+
assert_equal(vrf2, interface.vrf)
|
1149
|
+
interface.destroy
|
1150
|
+
end
|
1151
|
+
|
1152
|
+
def test_interface_vrf_valid
|
1153
|
+
interface = Interface.new("loopback1")
|
1154
|
+
vrf = "test"
|
1155
|
+
interface.vrf = vrf
|
1156
|
+
assert_equal(vrf, interface.vrf)
|
1157
|
+
interface.destroy
|
1158
|
+
end
|
1017
1159
|
end
|