rbeapi 0.4.0 → 0.5.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 (83) hide show
  1. data/.gitignore +3 -0
  2. data/CHANGELOG.md +20 -0
  3. data/Gemfile +1 -1
  4. data/README.md +11 -11
  5. data/Rakefile +19 -0
  6. data/guide/Makefile +177 -0
  7. data/guide/_static/arista_logo_11-trans-w.png +0 -0
  8. data/guide/_static/arista_logo_jpg-11.jpg +0 -0
  9. data/guide/_static/favicon.ico +0 -0
  10. data/guide/conf.py +279 -0
  11. data/guide/cookbook.rst +4 -0
  12. data/guide/developing.rst +4 -0
  13. data/guide/faq.rst +4 -0
  14. data/guide/index.rst +23 -0
  15. data/guide/installation.rst +4 -0
  16. data/guide/license.rst +5 -0
  17. data/guide/overview.rst +20 -0
  18. data/guide/quickstart.rst +4 -0
  19. data/guide/release-notes-0.5.0.rst +60 -0
  20. data/guide/release-notes.rst +6 -0
  21. data/guide/testing.rst +4 -0
  22. data/guide/troubleshooting.rst +1 -0
  23. data/lib/rbeapi/api/aaa.rb +54 -18
  24. data/lib/rbeapi/api/acl.rb +60 -2
  25. data/lib/rbeapi/api/bgp.rb +81 -0
  26. data/lib/rbeapi/api/dns.rb +48 -2
  27. data/lib/rbeapi/api/interfaces.rb +97 -32
  28. data/lib/rbeapi/api/ipinterfaces.rb +13 -2
  29. data/lib/rbeapi/api/logging.rb +11 -2
  30. data/lib/rbeapi/api/mlag.rb +20 -10
  31. data/lib/rbeapi/api/ntp.rb +4 -3
  32. data/lib/rbeapi/api/ospf.rb +102 -10
  33. data/lib/rbeapi/api/prefixlists.rb +47 -4
  34. data/lib/rbeapi/api/radius.rb +9 -9
  35. data/lib/rbeapi/api/routemaps.rb +7 -5
  36. data/lib/rbeapi/api/snmp.rb +13 -4
  37. data/lib/rbeapi/api/staticroutes.rb +1 -1
  38. data/lib/rbeapi/api/stp.rb +39 -14
  39. data/lib/rbeapi/api/switchports.rb +126 -2
  40. data/lib/rbeapi/api/system.rb +24 -3
  41. data/lib/rbeapi/api/tacacs.rb +9 -10
  42. data/lib/rbeapi/api/users.rb +12 -3
  43. data/lib/rbeapi/api/varp.rb +40 -8
  44. data/lib/rbeapi/api/vlans.rb +15 -5
  45. data/lib/rbeapi/client.rb +19 -11
  46. data/lib/rbeapi/eapilib.rb +8 -0
  47. data/lib/rbeapi/utils.rb +10 -0
  48. data/lib/rbeapi/version.rb +1 -1
  49. data/spec/fixtures/eapi.conf.yaml +6 -0
  50. data/spec/fixtures/empty.conf +0 -0
  51. data/spec/fixtures/env_path.conf +5 -0
  52. data/spec/fixtures/test.conf +39 -0
  53. data/spec/fixtures/wildcard.conf +43 -0
  54. data/spec/system/rbeapi/api/aaa_groups_spec.rb +122 -0
  55. data/spec/system/rbeapi/api/aaa_spec.rb +90 -0
  56. data/spec/system/{api_acl_spec.rb → rbeapi/api/acl_spec.rb} +0 -0
  57. data/spec/system/rbeapi/api/bgp_neighbors_spec.rb +354 -0
  58. data/spec/system/rbeapi/api/bgp_spec.rb +275 -0
  59. data/spec/system/rbeapi/api/dns_spec.rb +17 -1
  60. data/spec/system/rbeapi/api/interfaces_base_spec.rb +46 -5
  61. data/spec/system/rbeapi/api/interfaces_ethernet_spec.rb +14 -0
  62. data/spec/system/rbeapi/api/interfaces_portchannel_spec.rb +68 -0
  63. data/spec/system/rbeapi/api/interfaces_vxlan_spec.rb +0 -1
  64. data/spec/system/{api_ospf_interfaces_spec.rb → rbeapi/api/ospf_interfaces_spec.rb} +3 -2
  65. data/spec/system/{api_ospf_spec.rb → rbeapi/api/ospf_spec.rb} +11 -2
  66. data/spec/system/rbeapi/api/routemaps_spec.rb +3 -4
  67. data/spec/system/rbeapi/api/snmp_spec.rb +65 -0
  68. data/spec/system/rbeapi/api/staticroutes_spec.rb +177 -0
  69. data/spec/system/rbeapi/api/stp_instances_spec.rb +20 -0
  70. data/spec/system/rbeapi/api/stp_interfaces_spec.rb +7 -0
  71. data/spec/system/rbeapi/api/switchports_spec.rb +86 -16
  72. data/spec/system/rbeapi/api/users_spec.rb +324 -0
  73. data/spec/system/rbeapi/api/varp_interfaces_spec.rb +34 -0
  74. data/spec/system/rbeapi/api/vrrp_spec.rb +707 -0
  75. data/spec/system/rbeapi/client_spec.rb +367 -0
  76. data/spec/unit/rbeapi/api/aaa/aaa_groups_spec.rb +111 -0
  77. data/spec/unit/rbeapi/api/aaa/aaa_spec.rb +77 -0
  78. data/spec/unit/rbeapi/api/aaa/fixture_aaa.text +3 -0
  79. data/spec/unit/rbeapi/api/switchports/default_spec.rb +249 -0
  80. data/spec/unit/rbeapi/api/switchports/fixture_switchports.text +284 -0
  81. data/spec/unit/rbeapi/api/users/default_spec.rb +1 -1
  82. data/spec/unit/rbeapi/client_spec.rb +211 -0
  83. metadata +65 -10
@@ -114,11 +114,27 @@ describe Rbeapi::Api::Dns do
114
114
  expect(subject.get[:domain_list]).to be_empty
115
115
  end
116
116
 
117
- it 'default the name servers list' do
117
+ it 'default true the name servers list' do
118
118
  expect(subject.get[:domain_list]).to be_empty
119
+ expect(subject.set_domain_list(value: servers)).to be_truthy
119
120
  expect(subject.set_domain_list(default: true)).to be_truthy
120
121
  expect(subject.get[:domain_list]).to be_empty
121
122
  end
123
+
124
+ it 'default false the name servers list' do
125
+ expect(subject.get[:domain_list]).to be_empty
126
+ expect(subject.set_domain_list(default: false,
127
+ value: servers)).to be_truthy
128
+ expect(subject.get[:domain_list]).to eq(servers)
129
+ end
130
+
131
+ it 'default the name servers list with previous values' do
132
+ expect(subject.get[:domain_list]).to be_empty
133
+ expect(subject.set_domain_list(value: %w(foob bat))).to be_truthy
134
+ expect(subject.set_domain_list(default: false,
135
+ value: servers)).to be_truthy
136
+ expect(subject.get[:domain_list]).to eq(servers)
137
+ end
122
138
  end
123
139
 
124
140
  describe '#add_domain_list' do
@@ -11,15 +11,56 @@ describe Rbeapi::Api::Interfaces do
11
11
  Rbeapi::Client.connect_to('dut')
12
12
  end
13
13
 
14
+ describe '#respond_to?' do
15
+ it 'test to validate endpoint' do
16
+ expect(subject.respond_to?('get', 'Ethernet1')).to be_truthy
17
+ end
18
+ end
19
+
14
20
  describe '#get' do
15
- let(:entity) do
16
- { name: 'Loopback0', type: 'generic', description: '', shutdown: false }
21
+ context 'with interface Loopback' do
22
+ let(:entity) do
23
+ { name: 'Loopback0', type: 'generic', description: '', shutdown: false }
24
+ end
25
+
26
+ before { node.config(['no interface Loopback0', 'interface Loopback0']) }
27
+
28
+ it 'returns the interface resource' do
29
+ expect(subject.get('Loopback0')).to eq(entity)
30
+ end
17
31
  end
18
32
 
19
- before { node.config(['no interface Loopback0', 'interface Loopback0']) }
33
+ context 'with interface Port-Channel' do
34
+ let(:entity) do
35
+ { name: 'Port-Channel1', type: 'portchannel', description: '',
36
+ shutdown: false, members: [], lacp_mode: 'on', minimum_links: '0',
37
+ lacp_fallback: 'disabled', lacp_timeout: '90' }
38
+ end
39
+
40
+ before do
41
+ node.config(['no interface Loopback0', 'no interface Port-Channel1',
42
+ 'interface Port-Channel1'])
43
+ end
44
+
45
+ it 'returns the interface resource' do
46
+ expect(subject.get('Port-Channel1')).to eq(entity)
47
+ end
48
+ end
49
+
50
+ context 'with interface Vxlan' do
51
+ let(:entity) do
52
+ { name: 'Vxlan1', type: 'vxlan', description: '',
53
+ shutdown: false, source_interface: '', multicast_group: '',
54
+ udp_port: 4789, flood_list: [], vlans: {} }
55
+ end
56
+
57
+ before do
58
+ node.config(['no interface Vxlan1', 'interface Vxlan1'])
59
+ end
20
60
 
21
- it 'returns the interface resource' do
22
- expect(subject.get('Loopback0')).to eq(entity)
61
+ it 'returns the interface resource' do
62
+ expect(subject.get('Vxlan1')).to eq(entity)
63
+ end
23
64
  end
24
65
  end
25
66
 
@@ -1,3 +1,4 @@
1
+
1
2
  require 'spec_helper'
2
3
 
3
4
  require 'rbeapi/client'
@@ -85,6 +86,19 @@ describe Rbeapi::Api::Interfaces do
85
86
  end
86
87
  end
87
88
 
89
+ describe '#set_speed' do
90
+ before { node.config(['default interface Ethernet1']) }
91
+
92
+ it 'sets default true' do
93
+ expect(subject.set_speed('Ethernet1', default: true)).to be_truthy
94
+ end
95
+
96
+ it 'sets enable true' do
97
+ expect(subject.set_speed('Ethernet1', default: false,
98
+ enable: true)).to be_falsy
99
+ end
100
+ end
101
+
88
102
  describe '#set_sflow' do
89
103
  it 'sets the sflow value to true' do
90
104
  node.config(['interface Ethernet1', 'no sflow enable'])
@@ -134,6 +134,74 @@ describe Rbeapi::Api::Interfaces do
134
134
  expect(subject.get('Port-Channel1')[:members]).to eq(%w(Ethernet1
135
135
  Ethernet3))
136
136
  end
137
+
138
+ it 'updates the member interfaces and mode on existing interface' do
139
+ node.config(['no interface Port-Channel1', 'interface Ethernet1-2',
140
+ 'channel-group 1 mode on'])
141
+ expect(subject.get('Port-Channel1')[:members]).to eq(%w(Ethernet1
142
+ Ethernet2))
143
+ expect(subject.get('Port-Channel1')[:lacp_mode]).to eq('on')
144
+ expect(subject.set_members('Port-Channel1',
145
+ %w(Ethernet1 Ethernet3),
146
+ 'active')).to be_truthy
147
+ expect(subject.get('Port-Channel1')[:members]).to eq(%w(Ethernet1
148
+ Ethernet3))
149
+ expect(subject.get('Port-Channel1')[:lacp_mode]).to eq('active')
150
+ end
151
+ end
152
+
153
+ describe '#add_member' do
154
+ before do
155
+ node.config(['no interface Port-Channel1',
156
+ 'interface Port-Channel1'])
157
+ end
158
+
159
+ it 'adds new members to the port-channel interface' do
160
+ node.config(['no interface Port-Channel1', 'interface Port-Channel1'])
161
+ expect(subject.get('Port-Channel1')[:members]).not_to include('Ethernet1')
162
+ expect(subject.add_member('Port-Channel1', 'Ethernet1')).to be_truthy
163
+ expect(subject.get('Port-Channel1')[:members]).to eq(['Ethernet1'])
164
+ end
165
+
166
+ it 'updates the member interfaces on existing interface' do
167
+ node.config(['no interface Port-Channel1', 'interface Ethernet1-2',
168
+ 'channel-group 1 mode on'])
169
+ expect(subject.get('Port-Channel1')[:members]).to eq(%w(Ethernet1
170
+ Ethernet2))
171
+ expect(subject.add_member('Port-Channel1', 'Ethernet3')).to be_truthy
172
+ expect(subject.get('Port-Channel1')[:members]).to eq(%w(Ethernet1
173
+ Ethernet2
174
+ Ethernet3))
175
+ expect(subject.get('Port-Channel1')[:lacp_mode]).to eq('on')
176
+ end
177
+
178
+ it 'no update to the member interfaces on existing interface' do
179
+ node.config(['no interface Port-Channel1', 'interface Ethernet1-2',
180
+ 'channel-group 1 mode active'])
181
+ expect(subject.get('Port-Channel1')[:members]).to eq(%w(Ethernet1
182
+ Ethernet2))
183
+ expect(subject.add_member('Port-Channel1', 'Ethernet2')).to be_truthy
184
+ expect(subject.get('Port-Channel1')[:members]).to eq(%w(Ethernet1
185
+ Ethernet2))
186
+ expect(subject.get('Port-Channel1')[:lacp_mode]).to eq('active')
187
+ end
188
+ end
189
+
190
+ describe '#remove_member' do
191
+ before do
192
+ node.config(['no interface Port-Channel1',
193
+ 'interface Port-Channel1'])
194
+ end
195
+
196
+ it 'removes the member interface on existing interface' do
197
+ node.config(['no interface Port-Channel1', 'interface Ethernet1-2',
198
+ 'channel-group 1 mode on'])
199
+ expect(subject.get('Port-Channel1')[:members]).to eq(%w(Ethernet1
200
+ Ethernet2))
201
+ expect(subject.remove_member('Port-Channel1', 'Ethernet1')).to be_truthy
202
+ expect(subject.get('Port-Channel1')[:members]).to eq(['Ethernet2'])
203
+ expect(subject.get('Port-Channel1')[:lacp_mode]).to eq('on')
204
+ end
137
205
  end
138
206
 
139
207
  describe '#set_lacp_mode' do
@@ -41,7 +41,6 @@ describe Rbeapi::Api::Interfaces do
41
41
  before { node.config('no interface Vxlan1') }
42
42
 
43
43
  it 'creates a new interface resource' do
44
- expect(subject.get('Vxlan1')).to be_nil
45
44
  expect(subject.create('Vxlan1')).to be_truthy
46
45
  expect(subject.get('Vxlan1')).not_to be_nil
47
46
  end
@@ -12,8 +12,9 @@ describe Rbeapi::Api::OspfInterfaces do
12
12
  describe '#get' do
13
13
  before do
14
14
  node.config(['default interface Ethernet1', 'interface Ethernet1',
15
- 'no switchport', 'ip address 88.99.99.99/24', 'exit',
16
- 'default interface Ethernet2'])
15
+ 'no switchport', 'ip address 88.99.99.99/24',
16
+ 'ip ospf network point-to-point',
17
+ 'exit', 'default interface Ethernet2'])
17
18
  end
18
19
 
19
20
  it 'returns an ospf interface resource instance' do
@@ -10,10 +10,19 @@ describe Rbeapi::Api::Ospf do
10
10
  let(:node) { Rbeapi::Client.connect_to('dut') }
11
11
 
12
12
  describe '#get' do
13
- before { node.config(['no router ospf 1', 'router ospf 1']) }
13
+ before do
14
+ node.config(['no router ospf 1',
15
+ 'router ospf 1',
16
+ 'router-id 1.1.1.1',
17
+ 'redistribute static route-map word',
18
+ 'network 192.168.10.10/24 area 0.0.0.0',
19
+ 'network 192.168.11.10/24 area 0.0.0.0'])
20
+ end
14
21
 
15
22
  let(:entity) do
16
- { 'router_id' => '', 'areas' => {}, 'redistribute' => {} }
23
+ { 'router_id' => '1.1.1.1',
24
+ 'areas' => { '0.0.0.0' => ['192.168.10.0/24', '192.168.11.0/24'] },
25
+ 'redistribute' => { 'static' => { 'route_map' => 'word' } } }
17
26
  end
18
27
 
19
28
  it 'returns an ospf resource instance' do
@@ -15,8 +15,7 @@ describe Rbeapi::Api::Routemaps do
15
15
  let(:resource) { subject.get }
16
16
 
17
17
  before do
18
- node.config(['no route-map test', 'no route-map test1',
19
- 'no route-map test2', 'no route-map test3',
18
+ node.config(['no route-map test',
20
19
  'route-map test permit 10',
21
20
  'route-map test permit 20', 'description descript',
22
21
  'match ip address prefix-list MYLOOPBACK',
@@ -90,8 +89,8 @@ describe Rbeapi::Api::Routemaps do
90
89
  expect(subject.getall).to be_a_kind_of(Hash)
91
90
  end
92
91
 
93
- it 'has a key for description' do
94
- expect(subject.getall.count).to eq(2)
92
+ it 'has at least two entries' do
93
+ expect(subject.getall.count).to be >= 2
95
94
  end
96
95
 
97
96
  it 'returns the routemap collection' do
@@ -23,6 +23,30 @@ describe Rbeapi::Api::Snmp do
23
23
  end
24
24
  end
25
25
 
26
+ describe '#set_notification' do
27
+ before { node.config(['default snmp-server']) }
28
+
29
+ it 'configures the snmp notification value to on' do
30
+ expect(subject.set_notification(state: 'on',
31
+ name: 'bgp')).to be_truthy
32
+ expect(subject.get[:notifications][0]).to eq(name: 'bgp',
33
+ state: 'on')
34
+ end
35
+
36
+ it 'configures the snmp notification value to off' do
37
+ expect(subject.set_notification(state: 'off',
38
+ name: 'bgp')).to be_truthy
39
+ expect(subject.get[:notifications][0]).to eq(name: 'bgp',
40
+ state: 'off')
41
+ end
42
+
43
+ it 'configures the snmp notification value to default' do
44
+ expect(subject.set_notification(state: 'default',
45
+ name: 'all')).to be_truthy
46
+ expect(subject.get).to include(:notifications)
47
+ end
48
+ end
49
+
26
50
  describe '#set_location' do
27
51
  before { node.config(['no snmp-server location']) }
28
52
 
@@ -119,6 +143,47 @@ describe Rbeapi::Api::Snmp do
119
143
  end
120
144
  end
121
145
 
146
+ describe '#add_community' do
147
+ before { node.config('no snmp-server community foo') }
148
+
149
+ it 'adds the specified community' do
150
+ expect(subject.add_community('foo')).to be_truthy
151
+ expect(subject.get[:communities]['foo'][:access]).to eq('ro')
152
+ end
153
+
154
+ it 'adds the specified community ro' do
155
+ expect(subject.add_community('foo', 'ro')).to be_truthy
156
+ expect(subject.get[:communities]['foo'][:access]).to eq('ro')
157
+ end
158
+
159
+ it 'adds the specified community rw' do
160
+ expect(subject.add_community('foo', 'rw')).to be_truthy
161
+ expect(subject.get[:communities]['foo'][:access]).to eq('rw')
162
+ end
163
+ end
164
+
165
+ describe '#remove_community' do
166
+ before { node.config('default snmp-server community foo') }
167
+
168
+ it 'removes the specified community foo' do
169
+ expect(subject.remove_community('foo')).to be_truthy
170
+ end
171
+ end
172
+
173
+ describe '#set_community_access' do
174
+ before { node.config('default snmp-server community foo') }
175
+
176
+ it 'sets the community access to ro' do
177
+ expect(subject.set_community_access('foo', 'ro')).to be_truthy
178
+ expect(subject.get[:communities]['foo'][:access]).to eq('ro')
179
+ end
180
+
181
+ it 'sets the community access to rw' do
182
+ expect(subject.set_community_access('foo', 'rw')).to be_truthy
183
+ expect(subject.get[:communities]['foo'][:access]).to eq('rw')
184
+ end
185
+ end
186
+
122
187
  describe '#set_community_acl' do
123
188
  before do
124
189
  node.config(['no snmp-server community foo',
@@ -0,0 +1,177 @@
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/client'
35
+ require 'rbeapi/api/staticroutes'
36
+
37
+ describe Rbeapi::Api::Staticroutes do
38
+ subject { described_class.new(node) }
39
+
40
+ let(:node) do
41
+ Rbeapi::Client.config.read(fixture_file('dut.conf'))
42
+ Rbeapi::Client.connect_to('dut')
43
+ end
44
+
45
+ describe '#getall' do
46
+ let(:resource) { subject.getall }
47
+
48
+ before do
49
+ node.config(['no ip route 1.2.3.4/32',
50
+ 'no ip route 192.0.2.0/24',
51
+ 'no ip route 192.0.3.0/24',
52
+ 'ip route 1.2.3.4/32 Ethernet7 4 tag 3 name frank',
53
+ 'ip route 1.2.3.4/32 Null0 32 tag 3 name fred',
54
+ 'ip route 192.0.2.0/24 Ethernet7 3 tag 0 name dummy1',
55
+ 'ip route 192.0.3.0/24 192.0.3.1 1 tag 0 name dummy2'])
56
+ end
57
+
58
+ it 'returns the staticroute collection' do
59
+ expect(subject.getall).to include(destination: '1.2.3.4/32',
60
+ nexthop: 'Ethernet7',
61
+ distance: '4',
62
+ tag: '3',
63
+ name: 'frank')
64
+ expect(subject.getall).to include(destination: '1.2.3.4/32',
65
+ nexthop: 'Null0',
66
+ distance: '32',
67
+ tag: '3',
68
+ name: 'fred')
69
+ expect(subject.getall).to include(destination: '192.0.2.0/24',
70
+ nexthop: 'Ethernet7',
71
+ distance: '3',
72
+ tag: '0',
73
+ name: 'dummy1')
74
+ expect(subject.getall).to include(destination: '192.0.3.0/24',
75
+ nexthop: '192.0.3.1',
76
+ distance: '1',
77
+ tag: '0',
78
+ name: 'dummy2')
79
+ end
80
+
81
+ it 'returns a hash collection' do
82
+ expect(subject.getall).to be_a_kind_of(Array)
83
+ end
84
+
85
+ it 'has four entries' do
86
+ expect(subject.getall.size).to eq(4)
87
+ end
88
+ end
89
+
90
+ describe '#create' do
91
+ let(:resource) { subject.getall }
92
+
93
+ before(:each) do
94
+ node.config(['no ip route 1.2.3.4/32',
95
+ 'no ip route 192.0.2.0/24',
96
+ 'no ip route 192.0.3.0/24'])
97
+ end
98
+
99
+ context 'creates a new staticroute resoure' do
100
+ it 'with minimum input' do
101
+ expect(subject.getall).to eq([])
102
+ expect(subject.create('192.0.2.0/24', 'Ethernet1')).to be_truthy
103
+ expect(subject.getall).to eq(resource)
104
+ end
105
+
106
+ it 'with a router_ip' do
107
+ node.config(['ip route 192.0.2.0/24 Ethernet1'])
108
+ expect(subject.getall).to eq(resource)
109
+
110
+ expect(subject.create('192.0.2.0/24', 'Ethernet1',
111
+ router_ip: '192.168.1.1')).to be_truthy
112
+ expect(subject.getall).to eq(resource)
113
+ end
114
+
115
+ it 'with distance (metric)' do
116
+ node.config(['ip route 192.0.2.0/24 Ethernet1'])
117
+ expect(subject.getall).to eq(resource)
118
+
119
+ expect(subject.create('192.0.2.0/24', 'Ethernet1', distance: 254))
120
+ .to be_truthy
121
+ expect(subject.getall).to include(destination: '192.0.2.0/24',
122
+ nexthop: 'Ethernet1',
123
+ distance: '254',
124
+ tag: '0',
125
+ name: nil)
126
+ end
127
+
128
+ it 'with a tag' do
129
+ node.config(['ip route 192.0.2.0/24 Ethernet1'])
130
+ expect(subject.getall).to eq(resource)
131
+
132
+ expect(subject.create('192.0.2.0/24', 'Ethernet1', tag: 3))
133
+ .to be_truthy
134
+ expect(subject.getall).to include(destination: '192.0.2.0/24',
135
+ nexthop: 'Ethernet1',
136
+ distance: '1',
137
+ tag: '3',
138
+ name: nil)
139
+ end
140
+
141
+ it 'with a name' do
142
+ node.config(['ip route 192.0.2.0/24 Ethernet1'])
143
+ expect(subject.getall).to eq(resource)
144
+
145
+ expect(subject.create('192.0.2.0/24', 'Ethernet1', name: 'my_route'))
146
+ .to be_truthy
147
+ expect(subject.getall).to include(destination: '192.0.2.0/24',
148
+ nexthop: 'Ethernet1',
149
+ distance: '1',
150
+ tag: '0',
151
+ name: 'my_route')
152
+ end
153
+ end
154
+ end
155
+
156
+ describe '#delete' do
157
+ let(:resource) { subject.getall }
158
+
159
+ before do
160
+ node.config(['ip route 192.0.2.0/24 Ethernet1'])
161
+ end
162
+
163
+ context 'deletes a staticroute resource' do
164
+ it 'given only a destination network' do
165
+ expect(subject.getall).to eq(resource)
166
+ expect(subject.delete('192.0.2.0/24')).to be_truthy
167
+ expect(subject.getall).to eq([])
168
+ end
169
+
170
+ it 'given a destination and nexthop' do
171
+ expect(subject.getall).to eq(resource)
172
+ expect(subject.delete('192.0.2.0/24', 'Ethernet1')).to be_truthy
173
+ expect(subject.getall).to eq([])
174
+ end
175
+ end
176
+ end
177
+ end