rbeapi 0.1.0 → 0.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.
- data/.gitignore +5 -0
- data/.rubocop.yml +21 -0
- data/CHANGELOG.md +24 -0
- data/Gemfile +3 -1
- data/Guardfile +3 -3
- data/README.md +92 -17
- data/Rakefile +99 -4
- data/gems/README.rst +4 -0
- data/gems/inifile/.gitignore +2 -0
- data/gems/inifile/README.rst +5 -0
- data/gems/inifile/inifile.spec.tmpl +84 -0
- data/gems/net_http_unix/.gitignore +2 -0
- data/gems/net_http_unix/README.rst +5 -0
- data/gems/net_http_unix/net_http_unix.spec.tmpl +54 -0
- data/gems/netaddr/README.rst +5 -0
- data/gems/netaddr/netaddr.spec.tmpl +50 -0
- data/lib/rbeapi/api/aaa.rb +14 -17
- data/lib/rbeapi/api/acl.rb +276 -0
- data/lib/rbeapi/api/dns.rb +7 -4
- data/lib/rbeapi/api/interfaces.rb +239 -239
- data/lib/rbeapi/api/ipinterfaces.rb +5 -3
- data/lib/rbeapi/api/logging.rb +8 -5
- data/lib/rbeapi/api/mlag.rb +45 -127
- data/lib/rbeapi/api/ntp.rb +1 -4
- data/lib/rbeapi/api/ospf.rb +16 -13
- data/lib/rbeapi/api/prefixlists.rb +4 -4
- data/lib/rbeapi/api/radius.rb +34 -25
- data/lib/rbeapi/api/routemaps.rb +16 -10
- data/lib/rbeapi/api/snmp.rb +26 -13
- data/lib/rbeapi/api/staticroutes.rb +6 -5
- data/lib/rbeapi/api/stp.rb +77 -18
- data/lib/rbeapi/api/switchports.rb +20 -12
- data/lib/rbeapi/api/system.rb +6 -6
- data/lib/rbeapi/api/tacacs.rb +9 -6
- data/lib/rbeapi/api/varp.rb +15 -10
- data/lib/rbeapi/api/vlans.rb +5 -6
- data/lib/rbeapi/api.rb +56 -16
- data/lib/rbeapi/client.rb +85 -50
- data/lib/rbeapi/eapilib.rb +95 -56
- data/lib/rbeapi/netdev/snmp.rb +7 -16
- data/lib/rbeapi/utils.rb +3 -5
- data/lib/rbeapi/version.rb +1 -1
- data/rbeapi.gemspec +4 -2
- data/rbeapi.spec.tmpl +72 -0
- data/spec/support/fixtures.rb +6 -4
- data/spec/support/shared_examples_for_api_modules.rb +3 -18
- data/spec/system/api_acl_spec.rb +128 -0
- data/spec/system/api_ospf_interfaces_spec.rb +17 -14
- data/spec/system/api_ospf_spec.rb +8 -8
- data/spec/system/api_varp_interfaces_spec.rb +22 -13
- data/spec/system/api_varp_spec.rb +1 -4
- data/spec/system/rbeapi/api/interfaces_base_spec.rb +3 -4
- data/spec/system/rbeapi/api/interfaces_ethernet_spec.rb +13 -9
- data/spec/system/rbeapi/api/interfaces_portchannel_spec.rb +43 -26
- data/spec/system/rbeapi/api/interfaces_vxlan_spec.rb +7 -6
- data/spec/system/rbeapi/api/ipinterfaces_spec.rb +34 -21
- data/spec/system/rbeapi/api/mlag_interfaces_spec.rb +15 -38
- data/spec/system/rbeapi/api/mlag_spec.rb +26 -30
- data/spec/system/rbeapi/api/snmp_spec.rb +0 -3
- data/spec/system/rbeapi/api/stp_instances_spec.rb +20 -12
- data/spec/system/rbeapi/api/stp_interfaces_spec.rb +1 -3
- data/spec/system/rbeapi/api/switchports_spec.rb +14 -12
- data/spec/system/rbeapi/api/system_spec.rb +0 -3
- data/spec/system/rbeapi/api/vlans_spec.rb +19 -9
- data/spec/unit/rbeapi/api/acl/default_spec.rb +158 -0
- data/spec/unit/rbeapi/api/acl/fixture_acl_standard.text +22 -0
- data/spec/unit/rbeapi/api/interfaces/base_spec.rb +123 -0
- data/spec/unit/rbeapi/api/interfaces/ethernet_spec.rb +89 -0
- data/spec/unit/rbeapi/api/interfaces/fixture_interfaces.text +219 -0
- data/spec/unit/rbeapi/api/interfaces/portchannel_spec.rb +149 -0
- data/spec/unit/rbeapi/api/interfaces/vxlan_spec.rb +243 -0
- data/spec/unit/rbeapi/api/mlag/default_spec.rb +218 -0
- data/spec/unit/rbeapi/api/mlag/fixture_mlag.text +238 -0
- data/spec/unit/rbeapi/api/vlans/default_spec.rb +135 -0
- data/spec/unit/rbeapi/api/vlans/fixture_vlans.text +5 -0
- metadata +79 -4
- data/lib/rbeapi/api/radius.rb.old +0 -399
@@ -12,9 +12,11 @@ describe Rbeapi::Api::StpInstances do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
describe '#get' do
|
15
|
-
before
|
16
|
-
|
17
|
-
|
15
|
+
before do
|
16
|
+
node.config(['spanning-tree mode mstp',
|
17
|
+
'spanning-tree mst configuration',
|
18
|
+
'instance 1 vlans 1', 'exit'])
|
19
|
+
end
|
18
20
|
|
19
21
|
it 'returns the stp instance resource as a hash' do
|
20
22
|
expect(subject.get('1')).to be_a_kind_of(Hash)
|
@@ -26,8 +28,9 @@ describe Rbeapi::Api::StpInstances do
|
|
26
28
|
end
|
27
29
|
|
28
30
|
describe '#getall' do
|
29
|
-
before
|
30
|
-
|
31
|
+
before do
|
32
|
+
node.config(['no spanning-tree mode mstp', 'spanning-tree mode mstp'])
|
33
|
+
end
|
31
34
|
|
32
35
|
it 'returns a kind of hash' do
|
33
36
|
expect(subject.getall).to be_a_kind_of(Hash)
|
@@ -35,9 +38,11 @@ describe Rbeapi::Api::StpInstances do
|
|
35
38
|
end
|
36
39
|
|
37
40
|
describe '#delete' do
|
38
|
-
before
|
39
|
-
|
40
|
-
|
41
|
+
before do
|
42
|
+
node.config(['spanning-tree mode mstp',
|
43
|
+
'spanning-tree mst configuration',
|
44
|
+
'instance 1 vlans 1', 'exit'])
|
45
|
+
end
|
41
46
|
|
42
47
|
it 'deletes the mst instance' do
|
43
48
|
expect(subject.get('1')).not_to be_nil
|
@@ -47,10 +52,13 @@ describe Rbeapi::Api::StpInstances do
|
|
47
52
|
end
|
48
53
|
|
49
54
|
describe '#set_priority' do
|
50
|
-
before
|
51
|
-
|
52
|
-
|
53
|
-
|
55
|
+
before do
|
56
|
+
node.config(['default spanning-tree mst 1 priority',
|
57
|
+
'spanning-tree mode mstp',
|
58
|
+
'default spanning-tree mst configuration',
|
59
|
+
'spanning-tree mst configuration',
|
60
|
+
'instance 1 vlans 1', 'exit'])
|
61
|
+
end
|
54
62
|
|
55
63
|
it 'set the instance priority' do
|
56
64
|
expect(subject.get('1')[:priority]).to eq('32768')
|
@@ -12,9 +12,8 @@ describe Rbeapi::Api::StpInterfaces do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
describe '#get' do
|
15
|
-
|
16
15
|
let(:entity) do
|
17
|
-
{ portfast: false, bpduguard: false }
|
16
|
+
{ portfast: false, portfast_type: 'normal', bpduguard: false }
|
18
17
|
end
|
19
18
|
|
20
19
|
before { node.config('default interface Ethernet1') }
|
@@ -25,7 +24,6 @@ describe Rbeapi::Api::StpInterfaces do
|
|
25
24
|
end
|
26
25
|
|
27
26
|
describe '#getall' do
|
28
|
-
|
29
27
|
before { node.config('default interface Ethernet1') }
|
30
28
|
|
31
29
|
it 'includes interface ethernet1' do
|
@@ -12,13 +12,14 @@ describe Rbeapi::Api::Switchports do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
describe '#get' do
|
15
|
-
|
16
15
|
let(:keys) do
|
17
|
-
[
|
16
|
+
[:mode, :access_vlan, :trunk_native_vlan, :trunk_allowed_vlans]
|
18
17
|
end
|
19
18
|
|
20
|
-
before
|
21
|
-
|
19
|
+
before do
|
20
|
+
node.config(['default interface Ethernet1', 'interface Ethernet2',
|
21
|
+
'no switchport'])
|
22
|
+
end
|
22
23
|
|
23
24
|
it 'returns the switchport resource' do
|
24
25
|
expect(subject.get('Ethernet1')).not_to be_nil
|
@@ -33,7 +34,8 @@ describe Rbeapi::Api::Switchports do
|
|
33
34
|
end
|
34
35
|
|
35
36
|
it 'returns allowed_vlans as an array' do
|
36
|
-
expect(subject.get('Ethernet1')[:trunk_allowed_vlans])
|
37
|
+
expect(subject.get('Ethernet1')[:trunk_allowed_vlans])
|
38
|
+
.to be_a_kind_of(Array)
|
37
39
|
end
|
38
40
|
end
|
39
41
|
|
@@ -47,7 +49,7 @@ describe Rbeapi::Api::Switchports do
|
|
47
49
|
it 'returns a hash collection' do
|
48
50
|
expect(subject.getall).to be_a_kind_of(Hash)
|
49
51
|
end
|
50
|
-
|
52
|
+
end
|
51
53
|
|
52
54
|
describe '#create' do
|
53
55
|
before { node.config(['interface Ethernet1', 'no switchport']) }
|
@@ -110,7 +112,8 @@ describe Rbeapi::Api::Switchports do
|
|
110
112
|
|
111
113
|
it 'sets the trunk native vlan to 100' do
|
112
114
|
expect(subject.get('Ethernet1')[:trunk_native_vlan]).to eq('1')
|
113
|
-
expect(subject.set_trunk_native_vlan('Ethernet1', value: '100'))
|
115
|
+
expect(subject.set_trunk_native_vlan('Ethernet1', value: '100'))
|
116
|
+
.to be_truthy
|
114
117
|
expect(subject.get('Ethernet1')[:trunk_native_vlan]).to eq('100')
|
115
118
|
end
|
116
119
|
end
|
@@ -119,17 +122,16 @@ describe Rbeapi::Api::Switchports do
|
|
119
122
|
before { node.config(['default interface Ethernet1', 'vlan 100']) }
|
120
123
|
|
121
124
|
it 'raises an ArgumentError if value is not an array' do
|
122
|
-
expect {
|
123
|
-
|
124
|
-
}.to raise_error(ArgumentError)
|
125
|
+
expect { subject.set_trunk_allowed_vlans('Ethernet1', value: '1-100') }
|
126
|
+
.to raise_error(ArgumentError)
|
125
127
|
end
|
126
128
|
|
127
129
|
it 'sets vlan 100 to the trunk allowed vlans' do
|
128
130
|
node.config(['interface Ethernet1', 'switchport trunk allowed vlan none'])
|
129
131
|
expect(subject.get('Ethernet1')[:trunk_allowed_vlans]).to be_empty
|
130
|
-
expect(subject.set_trunk_allowed_vlans('Ethernet1', value: [100]))
|
132
|
+
expect(subject.set_trunk_allowed_vlans('Ethernet1', value: [100]))
|
133
|
+
.to be_truthy
|
131
134
|
expect(subject.get('Ethernet1')[:trunk_allowed_vlans]).to include(100)
|
132
135
|
end
|
133
136
|
end
|
134
137
|
end
|
135
|
-
|
@@ -11,16 +11,29 @@ describe Rbeapi::Api::Vlans do
|
|
11
11
|
Rbeapi::Client.connect_to('dut')
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
context '#get' do
|
15
|
+
describe 'with defaults' do
|
16
|
+
let(:entity) do
|
17
|
+
{ name: 'default', state: 'active', trunk_groups: [] }
|
18
|
+
end
|
15
19
|
|
16
|
-
|
17
|
-
|
20
|
+
before { node.config(['no vlan 1-4094', 'vlan 1']) }
|
21
|
+
|
22
|
+
it 'returns the vlan resource' do
|
23
|
+
expect(subject.get('1')).to eq(entity)
|
24
|
+
end
|
18
25
|
end
|
19
26
|
|
20
|
-
|
27
|
+
describe 'validate name parser' do
|
28
|
+
let(:entity) do
|
29
|
+
{ name: 'test-vlan', state: 'active', trunk_groups: [] }
|
30
|
+
end
|
31
|
+
|
32
|
+
before { node.config(['no vlan 1-4094', 'vlan 1', 'name test-vlan']) }
|
21
33
|
|
22
|
-
|
23
|
-
|
34
|
+
it 'returns the vlan resource' do
|
35
|
+
expect(subject.get('1')).to eq(entity)
|
36
|
+
end
|
24
37
|
end
|
25
38
|
end
|
26
39
|
|
@@ -81,7 +94,6 @@ describe Rbeapi::Api::Vlans do
|
|
81
94
|
end
|
82
95
|
|
83
96
|
describe '#set_state' do
|
84
|
-
|
85
97
|
it 'sets vlan 1 state to suspend' do
|
86
98
|
node.config(['default vlan 1', 'vlan 1'])
|
87
99
|
expect(subject.get('1')[:state]).to eq('active')
|
@@ -117,5 +129,3 @@ describe Rbeapi::Api::Vlans do
|
|
117
129
|
end
|
118
130
|
end
|
119
131
|
end
|
120
|
-
|
121
|
-
|
@@ -0,0 +1,158 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2015, 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/acl'
|
35
|
+
|
36
|
+
include FixtureHelpers
|
37
|
+
|
38
|
+
describe Rbeapi::Api::Acl do
|
39
|
+
subject { described_class.new(node) }
|
40
|
+
|
41
|
+
let(:node) { double('node') }
|
42
|
+
|
43
|
+
def acls
|
44
|
+
acls = Fixtures[:acls]
|
45
|
+
return acls if acls
|
46
|
+
fixture('acl_standard', format: :text, dir: File.dirname(__FILE__))
|
47
|
+
end
|
48
|
+
|
49
|
+
before :each do
|
50
|
+
allow(subject.node).to receive(:running_config).and_return(acls)
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#get' do
|
54
|
+
let(:test1_entries) do
|
55
|
+
{ '10' => { seqno: '10', action: 'permit', srcaddr: '1.2.3.4',
|
56
|
+
srcprefixlen: '255.255.255.255', log: 'log' },
|
57
|
+
'20' => { seqno: '20', action: 'permit', srcaddr: '1.2.3.4',
|
58
|
+
srcprefixlen: '255.255.0.0', log: 'log' },
|
59
|
+
'30' => { seqno: '30', action: 'deny', srcaddr: '0.0.0.0',
|
60
|
+
srcprefixlen: '255.255.255.255', log: nil },
|
61
|
+
'40' => { seqno: '40', action: 'permit', srcaddr: '5.6.7.0',
|
62
|
+
srcprefixlen: '24', log: nil },
|
63
|
+
'50' => { seqno: '50', action: 'permit', srcaddr: '16.0.0.0',
|
64
|
+
srcprefixlen: '8', log: nil },
|
65
|
+
'60' => { seqno: '60', action: 'permit', srcaddr: '9.10.11.0',
|
66
|
+
srcprefixlen: '255.255.255.0', log: 'log' }
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'returns the ACL resource' do
|
71
|
+
expect(subject.get('test1')).to eq(test1_entries)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe '#getall' do
|
76
|
+
it 'returns the ACL collection' do
|
77
|
+
expect(subject.getall).to include('test1')
|
78
|
+
expect(subject.getall).to include('test2')
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'returns a hash collection' do
|
82
|
+
expect(subject.getall).to be_a_kind_of(Hash)
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'has two entries' do
|
86
|
+
expect(subject.getall.size).to eq(2)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe '#create' do
|
91
|
+
it 'creates a new ACL resource' do
|
92
|
+
expect(node).to receive(:config).with('ip access-list standard abc')
|
93
|
+
expect(subject.create('abc')).to be_truthy
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe '#delete' do
|
98
|
+
it 'deletes an ACL resource' do
|
99
|
+
expect(node).to receive(:config).with('no ip access-list standard abc')
|
100
|
+
expect(subject.delete('abc')).to be_truthy
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe '#default' do
|
105
|
+
it 'sets ACL abc to default value' do
|
106
|
+
expect(node).to receive(:config)
|
107
|
+
.with('default ip access-list standard abc')
|
108
|
+
expect(subject.default('abc')).to be_truthy
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe '#update_entry' do
|
113
|
+
let(:update_entry) do
|
114
|
+
{ seqno: '60', action: 'permit', srcaddr: '0.0.0.0',
|
115
|
+
srcprefixlen: '255.255.255.255', log: nil }
|
116
|
+
end
|
117
|
+
|
118
|
+
let(:update_cmd) do
|
119
|
+
['ip access-list standard test2', 'no 60',
|
120
|
+
'60 permit 0.0.0.0/255.255.255.255', 'exit']
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'Change entry 60 to values in update_entry' do
|
124
|
+
expect(subject.get('test2')['60'][:action]).to eq('deny')
|
125
|
+
expect(node).to receive(:config).with(update_cmd)
|
126
|
+
expect(subject.update_entry('test2', update_entry)).to be_truthy
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe '#add_entry' do
|
131
|
+
let(:new_entry) do
|
132
|
+
{ seqno: '90', action: 'deny', srcaddr: '1.2.3.0',
|
133
|
+
srcprefixlen: '255.255.255.0', log: nil }
|
134
|
+
end
|
135
|
+
|
136
|
+
let(:new_cmd) do
|
137
|
+
['ip access-list standard test2', '90 deny 1.2.3.0/255.255.255.0',
|
138
|
+
'exit']
|
139
|
+
end
|
140
|
+
|
141
|
+
it 'Add entry 90 to the test2 ACL' do
|
142
|
+
expect(subject.get('test2')['90']).to be_falsy
|
143
|
+
expect(node).to receive(:config).with(new_cmd)
|
144
|
+
expect(subject.add_entry('test2', new_entry)).to be_truthy
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe '#remove_entry' do
|
149
|
+
let(:delete_cmd) do
|
150
|
+
['ip access-list standard test2', 'no 30', 'exit']
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'Remove entry 30 from the test2 ACL' do
|
154
|
+
expect(node).to receive(:config).with(delete_cmd)
|
155
|
+
expect(subject.remove_entry('test2', '30')).to be_truthy
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
ip access-list standard test1
|
2
|
+
no statistics per-entry
|
3
|
+
fragment-rules
|
4
|
+
10 permit host 1.2.3.4 log
|
5
|
+
20 permit 1.2.3.4 255.255.0.0 log
|
6
|
+
30 deny any
|
7
|
+
40 permit 5.6.7.0/24
|
8
|
+
50 permit 16.0.0.0/8
|
9
|
+
60 permit 9.10.11.0 255.255.255.0 log
|
10
|
+
!
|
11
|
+
ip access-list standard test2
|
12
|
+
no statistics per-entry
|
13
|
+
fragment-rules
|
14
|
+
10 permit 100.1.1.0 255.255.0.0
|
15
|
+
20 permit 100.2.1.0 255.255.0.0
|
16
|
+
30 permit 100.3.1.0 255.255.0.0
|
17
|
+
40 permit 100.4.1.0 255.255.0.0
|
18
|
+
50 permit 100.5.1.0 255.255.0.0
|
19
|
+
60 deny 100.6.1.0 255.255.0.0 log
|
20
|
+
70 permit 11.12.13.14
|
21
|
+
80 permit 15.16.17.18
|
22
|
+
!
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'rbeapi/api/interfaces'
|
4
|
+
|
5
|
+
include FixtureHelpers
|
6
|
+
|
7
|
+
describe Rbeapi::Api::BaseInterface do
|
8
|
+
subject { described_class.new(node) }
|
9
|
+
|
10
|
+
let(:node) { double('node') }
|
11
|
+
|
12
|
+
def interfaces
|
13
|
+
interfaces = Fixtures[:interfaces]
|
14
|
+
return interfaces if interfaces
|
15
|
+
fixture('interfaces', format: :text, dir: File.dirname(__FILE__))
|
16
|
+
end
|
17
|
+
|
18
|
+
before :each do
|
19
|
+
allow(subject.node).to receive(:running_config).and_return(interfaces)
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#get' do
|
23
|
+
let(:resource) { subject.get('Loopback0') }
|
24
|
+
|
25
|
+
let(:keys) do
|
26
|
+
[:type, :shutdown, :description, :name]
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'returns an ethernet resource as a hash' do
|
30
|
+
expect(resource).to be_a_kind_of(Hash)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'returns an interface type of generic' do
|
34
|
+
expect(resource[:type]).to eq('generic')
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'has all keys' do
|
38
|
+
expect(resource.keys).to match_array(keys)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#create' do
|
43
|
+
it 'creates the interface in the config' do
|
44
|
+
expect(node).to receive(:config).with('interface Loopback0')
|
45
|
+
expect(subject.create('Loopback0')).to be_truthy
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#delete' do
|
50
|
+
it 'deletes the interface in the config' do
|
51
|
+
expect(node).to receive(:config).with('no interface Loopback0')
|
52
|
+
expect(subject.delete('Loopback0')).to be_truthy
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '#default' do
|
57
|
+
it 'defaults the interface config' do
|
58
|
+
expect(node).to receive(:config).with('default interface Loopback0')
|
59
|
+
expect(subject.default('Loopback0')).to be_truthy
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe '#set_description' do
|
64
|
+
it 'sets the interface description' do
|
65
|
+
expect(node).to receive(:config).with(['interface Loopback0',
|
66
|
+
'description test string'])
|
67
|
+
expect(subject.set_description('Loopback0', value: 'test string'))
|
68
|
+
.to be_truthy
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'negates the interface description' do
|
72
|
+
expect(node).to receive(:config).with(['interface Loopback0',
|
73
|
+
'no description'])
|
74
|
+
expect(subject.set_description('Loopback0')).to be_truthy
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'defaults the interface description' do
|
78
|
+
expect(node).to receive(:config).with(['interface Loopback0',
|
79
|
+
'default description'])
|
80
|
+
expect(subject.set_description('Loopback0', default: true)).to be_truthy
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'default is preferred over value' do
|
84
|
+
expect(node).to receive(:config).with(['interface Loopback0',
|
85
|
+
'default description'])
|
86
|
+
expect(subject.set_description('Loopback0', value: 'test',
|
87
|
+
default: true)).to be_truthy
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '#set_shutdown' do
|
92
|
+
it 'enables the interface' do
|
93
|
+
expect(node).to receive(:config).with(['interface Loopback0',
|
94
|
+
'no shutdown'])
|
95
|
+
expect(subject.set_shutdown('Loopback0', value: false)).to be_truthy
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'disables the interface' do
|
99
|
+
expect(node).to receive(:config).with(['interface Loopback0',
|
100
|
+
'shutdown'])
|
101
|
+
expect(subject.set_shutdown('Loopback0', value: true)).to be_truthy
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'negates the interface description' do
|
105
|
+
expect(node).to receive(:config).with(['interface Loopback0',
|
106
|
+
'no shutdown'])
|
107
|
+
expect(subject.set_shutdown('Loopback0')).to be_truthy
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'defaults the interface state' do
|
111
|
+
expect(node).to receive(:config).with(['interface Loopback0',
|
112
|
+
'default shutdown'])
|
113
|
+
expect(subject.set_shutdown('Loopback0', default: true)).to be_truthy
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'default is preferred over value' do
|
117
|
+
expect(node).to receive(:config).with(['interface Loopback0',
|
118
|
+
'default shutdown'])
|
119
|
+
expect(subject.set_shutdown('Loopback0', value: 'test',
|
120
|
+
default: true)).to be_truthy
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'rbeapi/api/interfaces'
|
4
|
+
|
5
|
+
include FixtureHelpers
|
6
|
+
|
7
|
+
describe Rbeapi::Api::EthernetInterface do
|
8
|
+
subject { described_class.new(node) }
|
9
|
+
|
10
|
+
let(:node) { double('node') }
|
11
|
+
|
12
|
+
def interfaces
|
13
|
+
interfaces = Fixtures[:interfaces]
|
14
|
+
return interfaces if interfaces
|
15
|
+
fixture('interfaces', format: :text, dir: File.dirname(__FILE__))
|
16
|
+
end
|
17
|
+
|
18
|
+
before :each do
|
19
|
+
allow(subject.node).to receive(:running_config).and_return(interfaces)
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#get' do
|
23
|
+
let(:resource) { subject.get('Ethernet1') }
|
24
|
+
|
25
|
+
let(:keys) do
|
26
|
+
[:type, :speed, :sflow, :flowcontrol_send, :flowcontrol_receive,
|
27
|
+
:forced, :shutdown, :description, :name]
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'returns an ethernet resource as a hash' do
|
31
|
+
expect(resource).to be_a_kind_of(Hash)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'returns an interface type of ethernet' do
|
35
|
+
expect(resource[:type]).to eq('ethernet')
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'has all keys' do
|
39
|
+
expect(resource.keys).to match_array(keys)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '#create' do
|
44
|
+
it 'raises a NotImplementedError on create' do
|
45
|
+
expect { subject.create('Ethernet1') }.to raise_error(NotImplementedError)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#delete' do
|
50
|
+
it 'raises a NotImplementedError on delete' do
|
51
|
+
expect { subject.delete('Ethernet1') }.to raise_error(NotImplementedError)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe '#default' do
|
56
|
+
it 'defaults the interface config' do
|
57
|
+
expect(node).to receive(:config).with('default interface Ethernet1')
|
58
|
+
expect(subject.default('Ethernet1')).to be_truthy
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '#set_description' do
|
63
|
+
it 'sets the interface description' do
|
64
|
+
expect(node).to receive(:config).with(['interface Ethernet1',
|
65
|
+
'description test string'])
|
66
|
+
expect(subject.set_description('Ethernet1', value: 'test string'))
|
67
|
+
.to be_truthy
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'negates the interface description' do
|
71
|
+
expect(node).to receive(:config).with(['interface Ethernet1',
|
72
|
+
'no description'])
|
73
|
+
expect(subject.set_description('Ethernet1')).to be_truthy
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'defaults the interface description' do
|
77
|
+
expect(node).to receive(:config).with(['interface Ethernet1',
|
78
|
+
'default description'])
|
79
|
+
expect(subject.set_description('Ethernet1', default: true)).to be_truthy
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'default is preferred over value' do
|
83
|
+
expect(node).to receive(:config).with(['interface Ethernet1',
|
84
|
+
'default description'])
|
85
|
+
expect(subject.set_description('Ethernet1', value: 'test',
|
86
|
+
default: true)).to be_truthy
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|