rbeapi 0.3.0 → 0.4.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.
Files changed (39) hide show
  1. data/CHANGELOG.md +16 -0
  2. data/Gemfile +3 -1
  3. data/Guardfile +2 -2
  4. data/README.md +35 -24
  5. data/Rakefile +48 -18
  6. data/gems/inifile/inifile.spec.tmpl +50 -14
  7. data/gems/net_http_unix/net_http_unix.spec.tmpl +48 -15
  8. data/gems/netaddr/netaddr.spec.tmpl +47 -14
  9. data/lib/rbeapi/api/bgp.rb +100 -4
  10. data/lib/rbeapi/api/interfaces.rb +4 -5
  11. data/lib/rbeapi/api/radius.rb +1 -1
  12. data/lib/rbeapi/api/routemaps.rb +405 -37
  13. data/lib/rbeapi/api/system.rb +21 -0
  14. data/lib/rbeapi/api/users.rb +361 -0
  15. data/lib/rbeapi/api/varp.rb +50 -22
  16. data/lib/rbeapi/api/vrrp.rb +1072 -0
  17. data/lib/rbeapi/client.rb +12 -4
  18. data/lib/rbeapi/eapilib.rb +1 -1
  19. data/lib/rbeapi/version.rb +1 -1
  20. data/rbeapi.spec.tmpl +57 -25
  21. data/spec/system/rbeapi/api/dns_spec.rb +2 -2
  22. data/spec/system/rbeapi/api/routemaps_spec.rb +344 -0
  23. data/spec/system/rbeapi/api/switchports_spec.rb +1 -1
  24. data/spec/system/rbeapi/api/system_spec.rb +44 -4
  25. data/spec/system/{api_varp_interfaces_spec.rb → rbeapi/api/varp_interfaces_spec.rb} +25 -16
  26. data/spec/system/rbeapi/api/varp_spec.rb +76 -0
  27. data/spec/unit/rbeapi/api/bgp/bgp_neighbors_spec.rb +2 -0
  28. data/spec/unit/rbeapi/api/bgp/bgp_spec.rb +54 -1
  29. data/spec/unit/rbeapi/api/interfaces/portchannel_spec.rb +1 -1
  30. data/spec/unit/rbeapi/api/routemaps/default_spec.rb +370 -0
  31. data/spec/unit/rbeapi/api/routemaps/fixture_routemaps.text +27 -0
  32. data/spec/unit/rbeapi/api/system/default_spec.rb +102 -0
  33. data/spec/unit/rbeapi/api/system/fixture_system.text +2 -0
  34. data/spec/unit/rbeapi/api/users/default_spec.rb +280 -0
  35. data/spec/unit/rbeapi/api/users/fixture_users.text +4 -0
  36. data/spec/unit/rbeapi/api/vrrp/default_spec.rb +582 -0
  37. data/spec/unit/rbeapi/api/vrrp/fixture_vrrp.text +186 -0
  38. metadata +28 -8
  39. data/spec/system/api_varp_spec.rb +0 -41
@@ -6,18 +6,21 @@ require 'rbeapi/api/varp'
6
6
  describe Rbeapi::Api::VarpInterfaces do
7
7
  subject { described_class.new(node) }
8
8
 
9
- let(:config) { Rbeapi::Client::Config.new(filename: get_fixture('dut.conf')) }
10
- let(:node) { Rbeapi::Client.connect_to('dut') }
9
+ let(:node) do
10
+ Rbeapi::Client.config.read(fixture_file('dut.conf'))
11
+ Rbeapi::Client.connect_to('dut')
12
+ end
11
13
 
12
14
  describe '#get' do
13
15
  before do
14
16
  node.config(['ip virtual-router mac-address aabb.ccdd.eeff',
15
- 'default interface vlan 100', 'interface vlan 100',
17
+ 'no interface Vlan99', 'no interface Vlan100',
18
+ 'default interface Vlan100', 'interface Vlan100',
16
19
  'ip address 99.99.99.99/24',
17
20
  'ip virtual-router address 99.99.99.98', 'exit'])
18
21
  end
19
22
 
20
- it 'returns an instance for vlan 100' do
23
+ it 'returns an instance for Vlan100' do
21
24
  expect(subject.get('Vlan100')).not_to be_nil
22
25
  end
23
26
 
@@ -29,12 +32,13 @@ describe Rbeapi::Api::VarpInterfaces do
29
32
  describe '#getall' do
30
33
  before do
31
34
  node.config(['ip virtual-router mac-address aabb.ccdd.eeff',
32
- 'default interface vlan 100', 'interface vlan 100',
35
+ 'no interface Vlan99', 'no interface Vlan100',
36
+ 'default interface Vlan100', 'interface Vlan100',
33
37
  'ip address 99.99.99.99/24',
34
38
  'ip virtual-router address 99.99.99.98', 'exit'])
35
39
  end
36
40
 
37
- it 'returns a collection that includes vlan 100' do
41
+ it 'returns a collection that includes Vlan100' do
38
42
  expect(subject.getall).to include('Vlan100')
39
43
  end
40
44
 
@@ -46,40 +50,45 @@ describe Rbeapi::Api::VarpInterfaces do
46
50
  describe '#set_addresses' do
47
51
  before do
48
52
  node.config(['ip virtual-router mac-address aabb.ccdd.eeff',
49
- 'default interface vlan 100', 'interface vlan 100',
53
+ 'no interface Vlan99', 'no interface Vlan100',
54
+ 'default interface Vlan100', 'interface Vlan100',
50
55
  'ip address 99.99.99.99/24', 'exit'])
51
56
  end
52
57
 
53
58
  it 'adds new address to the list of addresses' do
54
- expect(subject.get('Vlan100')['addresses']).not_to include('99.99.99.98')
59
+ expect(subject.get('Vlan100')[:addresses]).not_to include('99.99.99.98')
55
60
  expect(subject.set_addresses('Vlan100', value: ['99.99.99.98']))
56
61
  .to be_truthy
57
- expect(subject.get('Vlan100')['addresses']).to include('99.99.99.98')
62
+ expect(subject.get('Vlan100')[:addresses]).to include('99.99.99.98')
58
63
  end
59
64
 
60
- it 'removes address to the list of addresses' do
65
+ it 'removes address from the list of addresses' do
61
66
  node.config(['interface vlan 100', 'ip address 99.99.99.99/24',
62
67
  'ip virtual-router address 99.99.99.98'])
63
- expect(subject.get('Vlan100')['addresses']).to include('99.99.99.98')
68
+ expect(subject.get('Vlan100')[:addresses]).to include('99.99.99.98')
64
69
  expect(subject.set_addresses('Vlan100', value: ['99.99.99.97']))
65
70
  .to be_truthy
66
- expect(subject.get('Vlan100')['addresses']).not_to include('99.99.99.98')
71
+ expect(subject.get('Vlan100')[:addresses]).not_to include('99.99.99.98')
67
72
  end
68
73
 
69
74
  it 'negate the list of addresses' do
70
75
  expect(subject.set_addresses('Vlan100', value: ['99.99.99.98']))
71
76
  .to be_truthy
72
- expect(subject.get('Vlan100')['addresses']).to include('99.99.99.98')
77
+ expect(subject.get('Vlan100')[:addresses]).to include('99.99.99.98')
73
78
  expect(subject.set_addresses('Vlan100', enable: false)).to be_truthy
74
- expect(subject.get('Vlan100')['addresses']).to be_empty
79
+ expect(subject.get('Vlan100')[:addresses]).to be_empty
75
80
  end
76
81
 
77
82
  it 'default the list of addresses' do
78
83
  expect(subject.set_addresses('Vlan100', value: ['99.99.99.98']))
79
84
  .to be_truthy
80
- expect(subject.get('Vlan100')['addresses']).to include('99.99.99.98')
85
+ expect(subject.get('Vlan100')[:addresses]).to include('99.99.99.98')
81
86
  expect(subject.set_addresses('Vlan100', default: true)).to be_truthy
82
- expect(subject.get('Vlan100')['addresses']).to be_empty
87
+ expect(subject.get('Vlan100')[:addresses]).to be_empty
88
+ end
89
+
90
+ it 'can not evaluate without addresses' do
91
+ expect { subject.set_addresses('Vlan100') }.to raise_error ArgumentError
83
92
  end
84
93
  end
85
94
  end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ require 'rbeapi/client'
4
+ require 'rbeapi/api/varp'
5
+
6
+ describe Rbeapi::Api::Varp do
7
+ subject { described_class.new(node) }
8
+
9
+ let(:node) do
10
+ Rbeapi::Client.config.read(fixture_file('dut.conf'))
11
+ Rbeapi::Client.connect_to('dut')
12
+ end
13
+
14
+ describe '#get' do
15
+ let(:resource) { subject.get }
16
+
17
+ before do
18
+ node.config(['no ip virtual-router mac-address',
19
+ 'no interface Vlan99', 'no interface Vlan100',
20
+ 'ip virtual-router mac-address aa:bb:cc:dd:ee:ff',
21
+ 'interface Vlan99', 'interface Vlan100'])
22
+ end
23
+
24
+ it 'returns a varp resource instance' do
25
+ expect(subject.get).to be_a_kind_of(Hash)
26
+ end
27
+
28
+ it 'has a key for mac_address' do
29
+ expect(subject.get).to include(:mac_address)
30
+ end
31
+
32
+ it 'has a key for interfaces' do
33
+ expect(subject.get).to include(:interfaces)
34
+ end
35
+ end
36
+
37
+ describe '#interfaces' do
38
+ it 'is a kind of VarpInterfaces' do
39
+ expect(subject.interfaces).to be_a_kind_of(Rbeapi::Api::VarpInterfaces)
40
+ end
41
+ end
42
+
43
+ describe '#set_mac_address' do
44
+ before { node.config('no ip virtual-router mac-address') }
45
+
46
+ it 'set mac-address to aa:bb:cc:dd:ee:ff' do
47
+ expect(subject.get[:mac_address]).to be_empty
48
+ expect(subject.set_mac_address(value: 'aa:bb:cc:dd:ee:ff')).to be_truthy
49
+ expect(subject.get[:mac_address]).to eq('aa:bb:cc:dd:ee:ff')
50
+ end
51
+
52
+ it 'set mac-address to ff-ff-ff-ff-ff-ff' do
53
+ expect(subject.get[:mac_address]).to be_empty
54
+ expect(subject.set_mac_address(value: 'ff-ff-ff-ff-ff-ff')).to be_truthy
55
+ expect(subject.get[:mac_address]).to eq('ff:ff:ff:ff:ff:ff')
56
+ end
57
+
58
+ it 'set mac-address to ffff.ffff.ffff' do
59
+ expect(subject.get[:mac_address]).to be_empty
60
+ expect(subject.set_mac_address(value: 'ffff.ffff.ffff')).to be_truthy
61
+ expect(subject.get[:mac_address]).to eq('ff:ff:ff:ff:ff:ff')
62
+ end
63
+
64
+ it 'set mac-address to ffff:ffff:ffff fails' do
65
+ expect(subject.get[:mac_address]).to be_empty
66
+ expect(subject.set_mac_address(value: 'ffff:ffff:ffff')).to be_falsey
67
+ expect(subject.get[:mac_address]).to eq('')
68
+ end
69
+
70
+ it 'set mac-address to ff.ff.ff.ff.ff.ff fails' do
71
+ expect(subject.get[:mac_address]).to be_empty
72
+ expect(subject.set_mac_address(value: 'ff.ff.ff.ff.ff.ff')).to be_falsey
73
+ expect(subject.get[:mac_address]).to eq('')
74
+ end
75
+ end
76
+ end
@@ -44,6 +44,8 @@ describe Rbeapi::Api::BgpNeighbors do
44
44
  { bgp_as: '64600',
45
45
  router_id: '192.168.254.1',
46
46
  shutdown: false,
47
+ maximum_paths: 32,
48
+ maximum_ecmp_paths: 32,
47
49
  networks: [
48
50
  { prefix: '192.168.254.1', masklen: 32, route_map: nil },
49
51
  { prefix: '192.168.254.2', masklen: 32, route_map: 'rmap' },
@@ -44,6 +44,8 @@ describe Rbeapi::Api::Bgp do
44
44
  { bgp_as: '64600',
45
45
  router_id: '192.168.254.1',
46
46
  shutdown: false,
47
+ maximum_paths: 32,
48
+ maximum_ecmp_paths: 32,
47
49
  networks: [
48
50
  { prefix: '192.168.254.1', masklen: 32, route_map: nil },
49
51
  { prefix: '192.168.254.2', masklen: 32, route_map: 'rmap' },
@@ -88,9 +90,40 @@ describe Rbeapi::Api::Bgp do
88
90
 
89
91
  describe '#create' do
90
92
  it 'create a new BGP resource' do
91
- expect(node).to receive(:config).with('router bgp 1000')
93
+ expect(node).to receive(:config).with(['router bgp 1000'])
92
94
  expect(subject.create('1000')).to be_truthy
93
95
  end
96
+ it 'create with enable' do
97
+ expect(node).to receive(:config).with(['router bgp 1000', 'no shutdown'])
98
+ expect(subject.create('1000', enable: true)).to be_truthy
99
+ end
100
+ it 'create with router_id' do
101
+ expect(node).to receive(:config).with(['router bgp 1000', 'router-id 1'])
102
+ expect(subject.create('1000', router_id: 1)).to be_truthy
103
+ end
104
+ it 'create with maximum paths' do
105
+ expect(node).to receive(:config).with(['router bgp 1000',
106
+ 'maximum-paths 1'])
107
+ expect(subject.create('1000', maximum_paths: 1)).to be_truthy
108
+ end
109
+ it 'create with maximum paths and ecmp paths' do
110
+ expect(node).to receive(:config).with(['router bgp 1000',
111
+ 'maximum-paths 13 ecmp 13'])
112
+ expect(subject.create('1000', maximum_paths: 13,
113
+ maximum_ecmp_paths: 13)).to be_truthy
114
+ end
115
+ it 'raises ArgumentError for create with ecmp paths only' do
116
+ expect { subject.create('1000', maximum_ecmp_paths: 13) }.to \
117
+ raise_error ArgumentError
118
+ end
119
+ it 'create with all options set' do
120
+ expect(node).to receive(:config).with(['router bgp 1000', 'no shutdown',
121
+ 'router-id 1',
122
+ 'maximum-paths 13 ecmp 13'])
123
+ expect(subject.create('1000', enable: true, router_id: 1,
124
+ maximum_paths: 13,
125
+ maximum_ecmp_paths: 13)).to be_truthy
126
+ end
94
127
  end
95
128
 
96
129
  describe '#delete' do
@@ -162,6 +195,26 @@ describe Rbeapi::Api::Bgp do
162
195
  end
163
196
  end
164
197
 
198
+ describe '#set_maximum_paths' do
199
+ it 'set the maximum paths and ecmp paths' do
200
+ expect(node).to receive(:config).with(['router bgp 64600',
201
+ 'maximum-paths 13 ecmp 200'])
202
+ expect(subject.set_maximum_paths(13, 200)).to be_truthy
203
+ end
204
+
205
+ it 'remove the maximum paths' do
206
+ expect(node).to receive(:config).with(['router bgp 64600',
207
+ 'no maximum-paths'])
208
+ expect(subject.set_maximum_paths(0, 0, enable: false)).to be_truthy
209
+ end
210
+
211
+ it 'defaults the maximum paths' do
212
+ expect(node).to receive(:config).with(['router bgp 64600',
213
+ 'default maximum-paths'])
214
+ expect(subject.set_maximum_paths(0, 0, default: true)).to be_truthy
215
+ end
216
+ end
217
+
165
218
  describe '#add_network' do
166
219
  it 'add a BGP network with a route map' do
167
220
  expect(node).to receive(:config)
@@ -22,7 +22,7 @@ describe Rbeapi::Api::PortchannelInterface do
22
22
  describe '#get' do
23
23
  before :each do
24
24
  allow(subject.node).to receive(:enable)
25
- .with(include('show port-channel'), format: 'text')
25
+ .with(include('show port-channel'), encoding: 'text')
26
26
  .and_return([{ result:
27
27
  { 'output' => "Port Channel Port-Channel1:\n Active " \
28
28
  'Ports: Ethernet1 PeerEthernet1 ' \
@@ -0,0 +1,370 @@
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/routemaps'
35
+
36
+ include FixtureHelpers
37
+
38
+ describe Rbeapi::Api::Routemaps do
39
+ subject { described_class.new(node) }
40
+
41
+ let(:node) { double('node') }
42
+
43
+ let(:test) do
44
+ {
45
+ 'permit' => {
46
+ 10 => {
47
+ match: ['interface Loopback0',
48
+ 'ip address prefix-list MYLOOPBACK'],
49
+ set: ['community internet 5555:5555'],
50
+ description: 'description',
51
+ continue: 99
52
+ }
53
+ }
54
+ }
55
+ end
56
+ let(:name) { 'test1' }
57
+
58
+ def routemaps
59
+ routemaps = Fixtures[:routemaps]
60
+ return routemaps if routemaps
61
+ fixture('routemaps', format: :text, dir: File.dirname(__FILE__))
62
+ end
63
+
64
+ before :each do
65
+ allow(subject.node).to receive(:running_config).and_return(routemaps)
66
+ end
67
+
68
+ describe '#getall' do
69
+ let(:test1_entries) do
70
+ {
71
+ 'test1' => {
72
+ 'permit' => {
73
+ 10 => {
74
+ match: ['interface Loopback0',
75
+ 'ip address prefix-list MYLOOPBACK'],
76
+ set: ['community internet 5555:5555'],
77
+ description: 'description',
78
+ continue: 99
79
+ }
80
+ }
81
+ },
82
+ 'test' => {
83
+ 'permit' => {
84
+ 10 => {
85
+ match: ['interface Vlan100'],
86
+ description: 'description',
87
+ continue: 99
88
+ },
89
+ 20 => {
90
+ continue: 99,
91
+ description: 'description',
92
+ set: ['community internet 5555:5555']
93
+ }
94
+ },
95
+ 'deny' => {
96
+ 10 => {
97
+ match: ['interface Vlan100'],
98
+ description: 'description',
99
+ continue: 99
100
+ },
101
+ 20 => {
102
+ continue: 99,
103
+ description: 'description',
104
+ set: ['community internet 5555:5555']
105
+ }
106
+ }
107
+ }
108
+ }
109
+ end
110
+
111
+ it 'returns the routemap collection' do
112
+ expect(subject.getall).to include(test1_entries)
113
+ end
114
+
115
+ it 'returns a hash collection' do
116
+ expect(subject.getall).to be_a_kind_of(Hash)
117
+ end
118
+
119
+ it 'has two entries' do
120
+ expect(subject.getall.size).to eq(2)
121
+ end
122
+ end
123
+
124
+ describe '#get' do
125
+ it 'returns the routemap resource for given name' do
126
+ expect(subject.get(name)).to eq(test)
127
+ end
128
+
129
+ it 'returns a hash' do
130
+ expect(subject.get(name)).to be_a_kind_of(Hash)
131
+ end
132
+
133
+ it 'has two entries' do
134
+ expect(subject.get(name).size).to eq(1)
135
+ end
136
+ end
137
+
138
+ describe '#create' do
139
+ it 'create an existing routemap test1 permit 10' do
140
+ expect(node).to receive(:config).with(['route-map test1 permit 10'])
141
+ expect(subject.create('test1', 'permit', 10)).to be_truthy
142
+ end
143
+
144
+ it 'create an existing routemap test deny 20' do
145
+ expect(node).to receive(:config).with(['route-map test deny 20'])
146
+ expect(subject.create('test', 'deny', 20)).to be_truthy
147
+ end
148
+
149
+ it 'create a new routemap test4 permit 20' do
150
+ expect(node).to receive(:config).with(['route-map test4 permit 20'])
151
+ expect(subject.create('test4', 'permit', 20)).to be_truthy
152
+ end
153
+
154
+ it 'create a new routemap test4 permit 20 with enable false' do
155
+ expect(node).to receive(:config).with(['no route-map test4 permit 20'])
156
+ expect(subject.create('test4', 'permit', 20, enable: false)).to be_truthy
157
+ end
158
+
159
+ it 'create a new routemap test4 permit 20 with enable true' do
160
+ expect(node).to receive(:config).with(['route-map test4 permit 20'])
161
+ expect(subject.create('test4', 'permit', 20, enable: true)).to be_truthy
162
+ end
163
+
164
+ it 'add description to routemap test1 permit 10 with create' do
165
+ expect(node).to receive(:config)
166
+ .with(['route-map test1 permit 10', 'no description',
167
+ 'description description'])
168
+ expect(subject.create('test1', 'permit', 10,
169
+ description: 'description')).to be_truthy
170
+ end
171
+
172
+ it 'add description to routemap test deny 20 with create' do
173
+ expect(node).to receive(:config)
174
+ .with(['route-map test deny 20', 'no description',
175
+ 'description description'])
176
+ expect(subject.create('test', 'deny', 20,
177
+ description: 'description')).to be_truthy
178
+ end
179
+
180
+ it 'add match statements to routemap test1 permit 10 with create' do
181
+ expect(node).to receive(:config)
182
+ .with(['route-map test1 permit 10',
183
+ 'no match interface Loopback0',
184
+ 'no match ip address prefix-list MYLOOPBACK',
185
+ 'match ip address prefix-list MYLOOPBACK',
186
+ 'match interface Loopback0'])
187
+ expect(subject.create('test1', 'permit', 10,
188
+ match: ['ip address prefix-list MYLOOPBACK',
189
+ 'interface Loopback0'])).to be_truthy
190
+ end
191
+
192
+ it 'add match statements to routemap test deny 20 with create' do
193
+ expect(node).to receive(:config)
194
+ .with(['route-map test deny 20',
195
+ 'match ip address prefix-list MYLOOPBACK',
196
+ 'match interface Loopback0'])
197
+ expect(subject.create('test', 'deny', 20,
198
+ match: ['ip address prefix-list MYLOOPBACK',
199
+ 'interface Loopback0'])).to be_truthy
200
+ end
201
+
202
+ it 'add set statements to routemap test1 permit 10 with create' do
203
+ expect(node).to receive(:config)
204
+ .with(['route-map test1 permit 10',
205
+ 'no set community internet 5555:5555',
206
+ 'set community internet 5555:5555'])
207
+ expect(subject.create('test1', 'permit', 10,
208
+ set: ['community internet 5555:5555'])).to be_truthy
209
+ end
210
+
211
+ it 'add set statements to routemap test deny 20 with create' do
212
+ expect(node).to receive(:config)
213
+ .with(['route-map test deny 20',
214
+ 'no set community internet 5555:5555',
215
+ 'set community internet 5555:5555'])
216
+ expect(subject.create('test', 'deny', 20,
217
+ set: ['community internet 5555:5555'])).to be_truthy
218
+ end
219
+
220
+ it 'add continue to routemap test1 permit 10 with create' do
221
+ expect(node).to receive(:config)
222
+ .with(['route-map test1 permit 10', 'no continue', 'continue 99'])
223
+ expect(subject.create('test1', 'permit', 10,
224
+ continue: 99)).to be_truthy
225
+ end
226
+
227
+ it 'add continue to routemap test deny 20 with create' do
228
+ expect(node).to receive(:config)
229
+ .with(['route-map test deny 20', 'no continue', 'continue 99'])
230
+ expect(subject.create('test', 'deny', 20,
231
+ continue: 99)).to be_truthy
232
+ end
233
+
234
+ it 'default routemap test permit 10 with create' do
235
+ expect(node).to receive(:config)
236
+ .with(['default route-map test1 permit 10'])
237
+ expect(subject.create('test1', 'permit', 10,
238
+ default: true)).to be_truthy
239
+ end
240
+
241
+ it 'default routemap test deny 20 with create' do
242
+ expect(node).to receive(:config)
243
+ .with(['default route-map test deny 20'])
244
+ expect(subject.create('test', 'deny', 20,
245
+ default: true)).to be_truthy
246
+ end
247
+ end
248
+
249
+ describe '#delete' do
250
+ it 'delete test1 permit 10 routemap resource' do
251
+ expect(node).to receive(:config).with(['no route-map test1 permit 10'])
252
+ expect(subject.delete('test1', 'permit', 10)).to be_truthy
253
+ end
254
+
255
+ it 'delete test deny 20 routemap resource' do
256
+ expect(node).to receive(:config).with(['no route-map test deny 20'])
257
+ expect(subject.delete('test', 'deny', 20)).to be_truthy
258
+ end
259
+
260
+ it 'delete non existent routemap' do
261
+ expect(node).to receive(:config).with(['no route-map blah deny 30'])
262
+ expect(subject.delete('blah', 'deny', 30)).to be_truthy
263
+ end
264
+ end
265
+
266
+ describe '#default' do
267
+ it 'default test1 permit 10 routemap resource' do
268
+ expect(node).to receive(:config)
269
+ .with(['default route-map test1 permit 10'])
270
+ expect(subject.default('test1', 'permit', 10)).to be_truthy
271
+ end
272
+ end
273
+
274
+ describe '#set_match_statements' do
275
+ it 'set the match statements on exsiting routemap' do
276
+ expect(node).to receive(:config)
277
+ .with(['route-map test1 permit 10',
278
+ 'no match interface Loopback0',
279
+ 'no match ip address prefix-list MYLOOPBACK',
280
+ 'match ip address prefix-list MYLOOPBACK',
281
+ 'match interface Loopback0'])
282
+ expect(
283
+ subject
284
+ .set_match_statements('test1', 'permit', 10,
285
+ ['ip address prefix-list MYLOOPBACK',
286
+ 'interface Loopback0'])
287
+ ).to be_truthy
288
+ expect(subject.get('test1').assoc('permit')[1].assoc(10)[1][:match])
289
+ .to include('ip address prefix-list MYLOOPBACK',
290
+ 'interface Loopback0')
291
+ end
292
+
293
+ it 'set the match statements on a new routemap' do
294
+ expect(node).to receive(:config)
295
+ .with(['route-map test4 permit 20',
296
+ 'match ip address prefix-list MYLOOPBACK',
297
+ 'match interface Loopback0'])
298
+ expect(
299
+ subject
300
+ .set_match_statements('test4', 'permit', 20,
301
+ ['ip address prefix-list MYLOOPBACK',
302
+ 'interface Loopback0'])
303
+ ).to be_truthy
304
+ end
305
+ end
306
+
307
+ describe '#set_set_statements' do
308
+ it 'set the set statements on existing routemap' do
309
+ expect(node).to receive(:config)
310
+ .with(['route-map test1 permit 10',
311
+ 'no set community internet 5555:5555',
312
+ 'set community internet 5555:5555'])
313
+ expect(
314
+ subject.set_set_statements('test1', 'permit', 10,
315
+ ['community internet 5555:5555'])
316
+ ).to be_truthy
317
+ expect(subject.get('test1').assoc('permit')[1].assoc(10)[1][:set])
318
+ .to include('community internet 5555:5555')
319
+ end
320
+
321
+ it 'set the set statements on new routemap' do
322
+ expect(node).to receive(:config)
323
+ .with(['route-map test4 permit 20',
324
+ 'set community internet 5555:5555'])
325
+ expect(
326
+ subject.set_set_statements('test4', 'permit', 20,
327
+ ['community internet 5555:5555'])
328
+ ).to be_truthy
329
+ end
330
+ end
331
+
332
+ describe '#set_continue' do
333
+ it 'set the continue statement on existing routemap' do
334
+ expect(node).to receive(:config).with(['route-map test1 permit 10',
335
+ 'no continue',
336
+ 'continue 99'])
337
+ expect(subject.set_continue('test1', 'permit', 10, 99)).to be_truthy
338
+ expect(subject.get('test1').assoc('permit')[1]
339
+ .assoc(10)[1][:continue]).to eq(99)
340
+ end
341
+
342
+ it 'set the continue statement on new routemap' do
343
+ expect(node).to receive(:config).with(['route-map test4 permit 10',
344
+ 'no continue',
345
+ 'continue 99'])
346
+ expect(subject.set_continue('test4', 'permit', 10, 99)).to be_truthy
347
+ end
348
+ end
349
+
350
+ describe '#set_description' do
351
+ it 'set the description statement on existing routemap' do
352
+ expect(node).to receive(:config).with(['route-map test1 permit 10',
353
+ 'no description',
354
+ 'description description'])
355
+ expect(subject.set_description('test1', 'permit', 10,
356
+ 'description')).to be_truthy
357
+ expect(subject.get('test1')
358
+ .assoc('permit')[1].assoc(10)[1][:description])
359
+ .to eq('description')
360
+ end
361
+
362
+ it 'set the description statement on new routemap' do
363
+ expect(node).to receive(:config).with(['route-map test4 permit 20',
364
+ 'no description',
365
+ 'description description'])
366
+ expect(subject.set_description('test4', 'permit', 20,
367
+ 'description')).to be_truthy
368
+ end
369
+ end
370
+ end
@@ -0,0 +1,27 @@
1
+ route-map test1 permit 10
2
+ description description
3
+ match interface Loopback0
4
+ match ip address prefix-list MYLOOPBACK
5
+ continue 99
6
+ set community internet 5555:5555
7
+ !
8
+ route-map test permit 10
9
+ description description
10
+ match interface Vlan100
11
+ continue 99
12
+ !
13
+ route-map test permit 20
14
+ description description
15
+ continue 99
16
+ set community internet 5555:5555
17
+ !
18
+ route-map test deny 10
19
+ description description
20
+ match interface Vlan100
21
+ continue 99
22
+ !
23
+ route-map test deny 20
24
+ description description
25
+ continue 99
26
+ set community internet 5555:5555
27
+ !