rbeapi 0.5.1 → 1.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.
- data/CHANGELOG.md +211 -76
- data/Gemfile +14 -3
- data/README.md +74 -38
- data/Rakefile +38 -17
- data/gems/inifile/inifile.spec.tmpl +31 -4
- data/gems/net_http_unix/net_http_unix.spec.tmpl +34 -8
- data/gems/netaddr/netaddr.spec.tmpl +31 -5
- data/guide/getting-started.rst +95 -64
- data/guide/installation.rst +27 -6
- data/guide/release-notes.rst +5 -1
- data/guide/testing.rst +5 -2
- data/guide/upgrading.rst +2 -0
- data/lib/rbeapi/api/dns.rb +8 -2
- data/lib/rbeapi/api/interfaces.rb +107 -21
- data/lib/rbeapi/api/ipinterfaces.rb +48 -0
- data/lib/rbeapi/api/prefixlists.rb +53 -23
- data/lib/rbeapi/api/routemaps.rb +11 -0
- data/lib/rbeapi/api/stp.rb +6 -3
- data/lib/rbeapi/api/switchports.rb +5 -11
- data/lib/rbeapi/api/system.rb +1 -1
- data/lib/rbeapi/api/users.rb +2 -0
- data/lib/rbeapi/api/varp.rb +6 -0
- data/lib/rbeapi/api/vlans.rb +44 -0
- data/lib/rbeapi/api/vrrp.rb +13 -0
- data/lib/rbeapi/client.rb +19 -4
- data/lib/rbeapi/switchconfig.rb +330 -0
- data/lib/rbeapi/version.rb +1 -1
- data/rbeapi.gemspec +2 -0
- data/rbeapi.spec.tmpl +30 -3
- data/spec/fixtures/.gitignore +1 -0
- data/spec/support/matchers/switch_config_sections.rb +80 -0
- data/spec/system/rbeapi/api/interfaces_base_spec.rb +32 -3
- data/spec/system/rbeapi/api/interfaces_ethernet_spec.rb +56 -8
- data/spec/system/rbeapi/api/interfaces_portchannel_spec.rb +33 -1
- data/spec/system/rbeapi/api/interfaces_vxlan_spec.rb +27 -0
- data/spec/system/rbeapi/api/ipinterfaces_spec.rb +34 -1
- data/spec/system/rbeapi/api/prefixlists_spec.rb +198 -0
- data/spec/system/rbeapi/api/stp_instances_spec.rb +49 -5
- data/spec/system/rbeapi/api/switchports_spec.rb +15 -9
- data/spec/system/rbeapi/api/vlans_spec.rb +46 -0
- data/spec/unit/rbeapi/api/interfaces/base_spec.rb +1 -1
- data/spec/unit/rbeapi/api/interfaces/ethernet_spec.rb +1 -1
- data/spec/unit/rbeapi/api/interfaces/portchannel_spec.rb +9 -2
- data/spec/unit/rbeapi/api/interfaces/vxlan_spec.rb +1 -1
- data/spec/unit/rbeapi/api/prefixlists/default_spec.rb +202 -0
- data/spec/unit/rbeapi/api/prefixlists/fixture_prefixlists.text +11 -0
- data/spec/unit/rbeapi/api/routemaps/default_spec.rb +5 -0
- data/spec/unit/rbeapi/api/switchports/default_spec.rb +4 -4
- data/spec/unit/rbeapi/api/system/default_spec.rb +5 -0
- data/spec/unit/rbeapi/api/system/fixture_system.text +1 -0
- data/spec/unit/rbeapi/api/vlans/default_spec.rb +30 -0
- data/spec/unit/rbeapi/api/vrrp/default_spec.rb +10 -0
- data/spec/unit/rbeapi/client_spec.rb +42 -0
- data/spec/unit/rbeapi/switchconfig2_spec.rb +119 -0
- data/spec/unit/rbeapi/switchconfig3_spec.rb +125 -0
- data/spec/unit/rbeapi/switchconfig_spec.rb +335 -0
- metadata +21 -7
@@ -23,7 +23,7 @@ describe Rbeapi::Api::VxlanInterface do
|
|
23
23
|
let(:resource) { subject.get('Vxlan1') }
|
24
24
|
|
25
25
|
let(:keys) do
|
26
|
-
[:type, :shutdown, :description, :name, :source_interface,
|
26
|
+
[:type, :shutdown, :load_interval, :description, :name, :source_interface,
|
27
27
|
:multicast_group, :udp_port, :flood_list, :vlans]
|
28
28
|
end
|
29
29
|
|
@@ -0,0 +1,202 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2016, Arista Networks, Inc.
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are
|
7
|
+
# met:
|
8
|
+
#
|
9
|
+
# Redistributions of source code must retain the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer.
|
11
|
+
#
|
12
|
+
# Redistributions in binary form must reproduce the above copyright
|
13
|
+
# notice, this list of conditions and the following disclaimer in the
|
14
|
+
# documentation and/or other materials provided with the distribution.
|
15
|
+
#
|
16
|
+
# Neither the name of Arista Networks nor the names of its
|
17
|
+
# contributors may be used to endorse or promote products derived from
|
18
|
+
# this software without specific prior written permission.
|
19
|
+
#
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
21
|
+
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
22
|
+
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
23
|
+
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARISTA NETWORKS
|
24
|
+
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
27
|
+
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
28
|
+
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
29
|
+
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
30
|
+
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
#
|
32
|
+
require 'spec_helper'
|
33
|
+
|
34
|
+
require 'rbeapi/api/prefixlists'
|
35
|
+
|
36
|
+
include FixtureHelpers
|
37
|
+
|
38
|
+
describe Rbeapi::Api::Prefixlists do
|
39
|
+
subject { described_class.new(node) }
|
40
|
+
|
41
|
+
let(:node) { double('node') }
|
42
|
+
|
43
|
+
def prefixlists
|
44
|
+
prefixlists = Fixtures[:prefixlists]
|
45
|
+
return prefixlists if prefixlists
|
46
|
+
fixture('prefixlists', format: :text, dir: File.dirname(__FILE__))
|
47
|
+
end
|
48
|
+
|
49
|
+
before :each do
|
50
|
+
allow(subject.node).to receive(:running_config).and_return(prefixlists)
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#get' do
|
54
|
+
let(:resource) { subject.get('test1') }
|
55
|
+
|
56
|
+
let(:prefixlist) do
|
57
|
+
[{
|
58
|
+
'seq' => '10',
|
59
|
+
'action' => 'permit',
|
60
|
+
'prefix' => '1.2.3.0/24'
|
61
|
+
},
|
62
|
+
{
|
63
|
+
'seq' => '20',
|
64
|
+
'action' => 'permit',
|
65
|
+
'prefix' => '2.3.4.0/24 le 30'
|
66
|
+
},
|
67
|
+
{
|
68
|
+
'seq' => '30',
|
69
|
+
'action' => 'permit',
|
70
|
+
'prefix' => '3.4.5.0/24 ge 26 le 30'
|
71
|
+
}]
|
72
|
+
end
|
73
|
+
|
74
|
+
let(:keys) { ['seq', 'action', 'prefix'] }
|
75
|
+
|
76
|
+
it 'returns the prefix list for an existing name' do
|
77
|
+
expect(resource).to eq(prefixlist)
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'returns an array of prefixes' do
|
81
|
+
expect(resource).to be_a_kind_of(Array)
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'has three prefixes' do
|
85
|
+
expect(resource.size).to eq(3)
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'has all keys' do
|
89
|
+
resource.each do |prefix|
|
90
|
+
expect(prefix.keys).to match_array(keys)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
let(:nonexistent) { subject.get('nonexistent') }
|
95
|
+
it 'returns nil for a non-existing name' do
|
96
|
+
expect(nonexistent).to eq(nil)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe '#getall' do
|
101
|
+
let(:resource) { subject.getall }
|
102
|
+
|
103
|
+
let(:plists) do
|
104
|
+
{
|
105
|
+
"test1" => [
|
106
|
+
{
|
107
|
+
"seq" => "10",
|
108
|
+
"action" => "permit",
|
109
|
+
"prefix" => "1.2.3.0/24"
|
110
|
+
},
|
111
|
+
{
|
112
|
+
"seq" => "20",
|
113
|
+
"action" => "permit",
|
114
|
+
"prefix" => "2.3.4.0/24 le 30"
|
115
|
+
},
|
116
|
+
{
|
117
|
+
"seq" => "30",
|
118
|
+
"action" => "permit",
|
119
|
+
"prefix" => "3.4.5.0/24 ge 26 le 30"
|
120
|
+
}
|
121
|
+
],
|
122
|
+
"test2" => [
|
123
|
+
{
|
124
|
+
"seq" => "10",
|
125
|
+
"action" => "permit",
|
126
|
+
"prefix" => "10.11.0.0/16"
|
127
|
+
},
|
128
|
+
{
|
129
|
+
"seq" => "20",
|
130
|
+
"action" => "permit",
|
131
|
+
"prefix" => "10.12.0.0/16 le 24"
|
132
|
+
}
|
133
|
+
],
|
134
|
+
"test3" => []
|
135
|
+
}
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'returns all prefix lists' do
|
139
|
+
expect(resource).to eq(plists)
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'returns a hash' do
|
143
|
+
expect(resource).to be_a_kind_of(Hash)
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'has three prefix lists' do
|
147
|
+
expect(resource.size).to eq(3)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe '#create' do
|
152
|
+
it 'creates a new prefix list' do
|
153
|
+
expect(node).to receive(:config).with('ip prefix-list plist1')
|
154
|
+
expect(subject.create('plist1')).to be_truthy
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'creates an existing prefix list' do
|
158
|
+
expect(node).to receive(:config).with('ip prefix-list test1')
|
159
|
+
expect(subject.create('test1')).to be_truthy
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
describe '#add_rule' do
|
164
|
+
it 'adds rule to existing prefix list' do
|
165
|
+
expect(node).to receive(:config).with('ip prefix-list test1 seq 25 permit 9.8.7.0/24')
|
166
|
+
expect(subject.add_rule('test1', 'permit','9.8.7.0/24', '25')).to be_truthy
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'adds rule to existing prefix list w/o seq' do
|
170
|
+
expect(node).to receive(:config).with('ip prefix-list test1 permit 8.7.6.0/24')
|
171
|
+
expect(subject.add_rule('test1', 'permit', '8.7.6.0/24')).to be_truthy
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'adds rule to non-existing prefix list' do
|
175
|
+
expect(node).to receive(:config).with('ip prefix-list plist2 seq 10 permit 6.5.4.128/25')
|
176
|
+
expect(subject.add_rule('plist2', 'permit', '6.5.4.128/25', '10')).to be_truthy
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'adds rule to non-existing prefix list w/o seq' do
|
180
|
+
expect(node).to receive(:config).with('ip prefix-list plist2 deny 5.4.3.0/25')
|
181
|
+
expect(subject.add_rule('plist2', 'deny', '5.4.3.0/25')).to be_truthy
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'overwrites existing rule' do
|
185
|
+
expect(node).to receive(:config).with('ip prefix-list test1 seq 20 permit 2.3.5.0/24 le 28')
|
186
|
+
expect(subject.add_rule('test1', 'permit', '2.3.5.0/24 le 28', '20')).to be_truthy
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
describe '#delete' do
|
191
|
+
it 'deletes a prefix-list' do
|
192
|
+
expect(node).to receive(:config).with('no ip prefix-list test1')
|
193
|
+
expect(subject.delete('test1'))
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'deletes a rule from a prefix-list' do
|
197
|
+
expect(node).to receive(:config).with('no ip prefix-list test2 seq 10')
|
198
|
+
expect(subject.delete('test2', '10'))
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
@@ -244,6 +244,11 @@ describe Rbeapi::Api::Routemaps do
|
|
244
244
|
expect(subject.create('test', 'deny', 20,
|
245
245
|
default: true)).to be_truthy
|
246
246
|
end
|
247
|
+
|
248
|
+
it 'raises an ArgumentError if opts match is not an array' do
|
249
|
+
expect { subject.create('test', 'permit', 10, match: '123') }
|
250
|
+
.to raise_error(ArgumentError)
|
251
|
+
end
|
247
252
|
end
|
248
253
|
|
249
254
|
describe '#delete' do
|
@@ -195,11 +195,11 @@ describe Rbeapi::Api::Switchports do
|
|
195
195
|
.to raise_error(ArgumentError)
|
196
196
|
end
|
197
197
|
|
198
|
-
it 'sets vlan 8 and
|
198
|
+
it 'sets vlan 8-10 and 100 to the trunk allowed vlans' do
|
199
199
|
expect(node).to receive(:config)
|
200
|
-
.with(['interface Ethernet1', 'switchport trunk allowed vlan
|
201
|
-
|
202
|
-
|
200
|
+
.with(['interface Ethernet1', 'switchport trunk allowed vlan 8-10,100'])
|
201
|
+
expect(subject.set_trunk_allowed_vlans('Ethernet1',
|
202
|
+
value: ['8-10', '100']))
|
203
203
|
.to be_truthy
|
204
204
|
end
|
205
205
|
|
@@ -68,6 +68,11 @@ describe Rbeapi::Api::System do
|
|
68
68
|
it 'has four entries' do
|
69
69
|
expect(subject.get.size).to eq(4)
|
70
70
|
end
|
71
|
+
|
72
|
+
it 'retrieves only global ip routing' do
|
73
|
+
expect(subject.get.size).to eq(4)
|
74
|
+
expect(subject.get[:iprouting]).to eq(true)
|
75
|
+
end
|
71
76
|
end
|
72
77
|
|
73
78
|
describe '#set_hostname' do
|
@@ -132,4 +132,34 @@ describe Rbeapi::Api::Vlans do
|
|
132
132
|
expect(subject.remove_trunk_group('1', 'foo')).to be_truthy
|
133
133
|
end
|
134
134
|
end
|
135
|
+
|
136
|
+
describe '#set_trunk_groups' do
|
137
|
+
it 'raises an ArgumentError if value is not an array' do
|
138
|
+
expect { subject.set_trunk_groups('vlan 1', value: 'foo') }
|
139
|
+
.to raise_error(ArgumentError)
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'sets trunk group to foo bar bang' do
|
143
|
+
expect(node).to receive(:config)
|
144
|
+
.with(['vlan 1', 'trunk group foo',
|
145
|
+
'trunk group bar', 'trunk group bang', 'no trunk group mlag_ctl',
|
146
|
+
'no trunk group test'])
|
147
|
+
expect(subject.set_trunk_groups('1', value: %w(foo bar bang)))
|
148
|
+
.to be_truthy
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'negate switchport trunk group' do
|
152
|
+
expect(node).to receive(:config)
|
153
|
+
.with(['vlan 1', 'no trunk group'])
|
154
|
+
expect(subject.set_trunk_groups('1', enable: false))
|
155
|
+
.to be_truthy
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'default switchport trunk group' do
|
159
|
+
expect(node).to receive(:config)
|
160
|
+
.with(['vlan 1', 'default trunk group'])
|
161
|
+
expect(subject.set_trunk_groups('1', default: true))
|
162
|
+
.to be_truthy
|
163
|
+
end
|
164
|
+
end
|
135
165
|
end
|
@@ -169,6 +169,16 @@ describe Rbeapi::Api::Vrrp do
|
|
169
169
|
expect { subject.create('Vlan100', 9) }.to \
|
170
170
|
raise_error ArgumentError
|
171
171
|
end
|
172
|
+
|
173
|
+
it 'raises an ArgumentError if secondary_ip is not an array' do
|
174
|
+
expect { subject.create('Ethernet1', 9, secondary_ip: '123') }
|
175
|
+
.to raise_error(ArgumentError)
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'raises an ArgumentError if track is not an array' do
|
179
|
+
expect { subject.create('Ethernet1', 9, track: '123') }
|
180
|
+
.to raise_error(ArgumentError)
|
181
|
+
end
|
172
182
|
end
|
173
183
|
|
174
184
|
describe '#delete' do
|
@@ -209,4 +209,46 @@ describe Rbeapi::Client do
|
|
209
209
|
host: 'test2')
|
210
210
|
end
|
211
211
|
end
|
212
|
+
|
213
|
+
describe '#get_config' do
|
214
|
+
def startup_config
|
215
|
+
"! Command: show running-config\n! device: jere-debug-agent1 (vEOS, EOS-4.14.9.1M)\n!\n! boot system flash:/vEOS-4.14.9.1M.swi\n!\nip routing vrf MGMT\n!\nmanagement api http-commands\n no protocol https\n protocol unix-socket\n no shutdown\n vrf MGMT\n no shutdown\n!\nmanagement ssh\n vrf MGMT\n no shutdown\n!\n!\nend\n"
|
216
|
+
end
|
217
|
+
|
218
|
+
def startup_config_response
|
219
|
+
[{"output"=>startup_config}]
|
220
|
+
end
|
221
|
+
|
222
|
+
let(:node) do
|
223
|
+
subject.config.read(fixture_file('dut.conf'))
|
224
|
+
subject.connect_to('dut')
|
225
|
+
end
|
226
|
+
|
227
|
+
before(:each) do
|
228
|
+
allow(node).to receive(:run_commands) { startup_config_response }
|
229
|
+
end
|
230
|
+
|
231
|
+
it 'with no arguments returns the startup-config' do
|
232
|
+
expect(node.get_config()).to eq(startup_config.strip.split("\n"))
|
233
|
+
end
|
234
|
+
|
235
|
+
it 'with no arguments and an empty startup-config returns the startup-config' do
|
236
|
+
allow(node).to receive(:run_commands) { [{"output"=>""}] }
|
237
|
+
expect(node.get_config()).to eq([])
|
238
|
+
end
|
239
|
+
|
240
|
+
it 'with no arguments and no startup-config returns nil' do
|
241
|
+
msg = "CLI command 2 of 2 'show startup-config' failed: could not run command"
|
242
|
+
allow(node).to receive(:run_commands).and_raise(Rbeapi::Eapilib::CommandError.new(msg, 1000))
|
243
|
+
expect(node.get_config()).to be_nil
|
244
|
+
end
|
245
|
+
|
246
|
+
it 'raises invalid command error' do
|
247
|
+
msg = "CLI command 2 of 2 'show startup-configurations' failed: invalid command"
|
248
|
+
allow(node).to receive(:run_commands).and_raise(Rbeapi::Eapilib::CommandError.new(msg, 1000))
|
249
|
+
expect { node.get_config(config: 'running-configurations') }
|
250
|
+
.to raise_error Rbeapi::Eapilib::CommandError
|
251
|
+
end
|
252
|
+
|
253
|
+
end
|
212
254
|
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2016, Arista Networks, Inc.
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are
|
7
|
+
# met:
|
8
|
+
#
|
9
|
+
# Redistributions of source code must retain the above copyright notice,
|
10
|
+
# this list of conditions and the following disclaimer.
|
11
|
+
#
|
12
|
+
# Redistributions in binary form must reproduce the above copyright
|
13
|
+
# notice, this list of conditions and the following disclaimer in the
|
14
|
+
# documentation and/or other materials provided with the distribution.
|
15
|
+
#
|
16
|
+
# Neither the name of Arista Networks nor the names of its
|
17
|
+
# contributors may be used to endorse or promote products derived from
|
18
|
+
# this software without specific prior written permission.
|
19
|
+
#
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
21
|
+
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
22
|
+
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
23
|
+
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARISTA NETWORKS
|
24
|
+
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
27
|
+
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
28
|
+
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
29
|
+
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
30
|
+
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
#
|
32
|
+
require 'spec_helper'
|
33
|
+
|
34
|
+
require 'rbeapi/switchconfig'
|
35
|
+
|
36
|
+
include FixtureHelpers
|
37
|
+
include Rbeapi::SwitchConfig
|
38
|
+
|
39
|
+
describe Rbeapi::SwitchConfig::SwitchConfig do
|
40
|
+
test_config = <<-EOS
|
41
|
+
! Test on multi-level children sections
|
42
|
+
management api http-commands
|
43
|
+
no shutdown
|
44
|
+
vrf cloud-mgmt
|
45
|
+
no shutdown
|
46
|
+
EOS
|
47
|
+
test_config_global = ['management api http-commands']
|
48
|
+
cmds = [[' no shutdown',
|
49
|
+
' vrf cloud-mgmt'],
|
50
|
+
[' no shutdown']]
|
51
|
+
|
52
|
+
subject { described_class.new(test_config) }
|
53
|
+
|
54
|
+
# SwitchConfig class methods
|
55
|
+
describe '#initialize' do
|
56
|
+
it 'returns the processed configuration' do
|
57
|
+
sc = subject.global
|
58
|
+
# Validate the global section
|
59
|
+
expect(sc.line).to eq('')
|
60
|
+
expect(sc.parent).to eq(nil)
|
61
|
+
expect(sc.cmds).to eq(test_config_global)
|
62
|
+
expect(sc.children.length).to eq(1)
|
63
|
+
|
64
|
+
# Validate the child of global
|
65
|
+
expect(sc.children[0].line).to eq(test_config_global[0])
|
66
|
+
expect(sc.children[0].parent).to eq(sc)
|
67
|
+
expect(sc.children[0].cmds).to eq(cmds[0])
|
68
|
+
expect(sc.children[0].children.length).to eq(1)
|
69
|
+
|
70
|
+
# Validate the child of global
|
71
|
+
child = sc.children[0].children
|
72
|
+
expect(child[0].line).to eq(cmds[0][1])
|
73
|
+
expect(child[0].parent).to eq(sc.children[0])
|
74
|
+
expect(child[0].cmds).to eq(cmds[1])
|
75
|
+
expect(child[0].children.length).to eq(0)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe '#compare' do
|
80
|
+
it 'Verify compare returns array of 2 Sections' do
|
81
|
+
expect(subject.compare(subject)).to be_instance_of(Array)
|
82
|
+
expect(subject.compare(subject)[0]).to be_instance_of(Section)
|
83
|
+
expect(subject.compare(subject)[1]).to be_instance_of(Section)
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'Verify compare of same switch configs' do
|
87
|
+
expect(subject.compare(subject)[0].line).to eq('')
|
88
|
+
expect(subject.compare(subject)[0].cmds).to eq([])
|
89
|
+
expect(subject.compare(subject)[0].children).to eq([])
|
90
|
+
expect(subject.compare(subject)[1].line).to eq('')
|
91
|
+
expect(subject.compare(subject)[1].cmds).to eq([])
|
92
|
+
expect(subject.compare(subject)[1].children).to eq([])
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'Verify compare of shutdown management vrf' do
|
96
|
+
new_conf = <<-EOS
|
97
|
+
management api http-commands
|
98
|
+
no shutdown
|
99
|
+
vrf cloud-mgmt
|
100
|
+
shutdown
|
101
|
+
EOS
|
102
|
+
org_new_diff = <<-EOS
|
103
|
+
management api http-commands
|
104
|
+
vrf cloud-mgmt
|
105
|
+
no shutdown
|
106
|
+
EOS
|
107
|
+
new_org_diff = <<-EOS
|
108
|
+
management api http-commands
|
109
|
+
vrf cloud-mgmt
|
110
|
+
shutdown
|
111
|
+
EOS
|
112
|
+
swc_new = Rbeapi::SwitchConfig::SwitchConfig.new(new_conf)
|
113
|
+
swc_org_new = Rbeapi::SwitchConfig::SwitchConfig.new(org_new_diff)
|
114
|
+
swc_new_org = Rbeapi::SwitchConfig::SwitchConfig.new(new_org_diff)
|
115
|
+
expect(subject.compare(swc_new)[0]).to section_equal(swc_org_new.global)
|
116
|
+
expect(subject.compare(swc_new)[1]).to section_equal(swc_new_org.global)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|