rbeapi 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ !