rbeapi 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +4 -0
- data/Gemfile +1 -1
- data/README.md +17 -12
- data/guide/.gitignore +2 -0
- data/guide/api.rst +5894 -0
- data/guide/conf.py +5 -5
- data/guide/contributing.rst +6 -0
- data/guide/getting-started.rst +134 -0
- data/guide/index.rst +3 -5
- data/guide/installation.rst +56 -1
- data/guide/license.rst +13 -2
- data/guide/overview.rst +2 -5
- data/guide/testing.rst +5 -1
- data/guide/upgrading.rst +10 -0
- data/lib/rbeapi/api.rb +37 -36
- data/lib/rbeapi/api/aaa.rb +90 -90
- data/lib/rbeapi/api/acl.rb +70 -53
- data/lib/rbeapi/api/bgp.rb +186 -163
- data/lib/rbeapi/api/dns.rb +51 -45
- data/lib/rbeapi/api/interfaces.rb +344 -328
- data/lib/rbeapi/api/ipinterfaces.rb +92 -92
- data/lib/rbeapi/api/logging.rb +32 -32
- data/lib/rbeapi/api/mlag.rb +97 -97
- data/lib/rbeapi/api/ntp.rb +39 -39
- data/lib/rbeapi/api/ospf.rb +58 -58
- data/lib/rbeapi/api/prefixlists.rb +22 -22
- data/lib/rbeapi/api/radius.rb +77 -49
- data/lib/rbeapi/api/routemaps.rb +110 -64
- data/lib/rbeapi/api/snmp.rb +104 -100
- data/lib/rbeapi/api/staticroutes.rb +27 -20
- data/lib/rbeapi/api/stp.rb +100 -84
- data/lib/rbeapi/api/switchports.rb +98 -77
- data/lib/rbeapi/api/system.rb +93 -25
- data/lib/rbeapi/api/tacacs.rb +54 -35
- data/lib/rbeapi/api/users.rb +68 -68
- data/lib/rbeapi/api/varp.rb +56 -47
- data/lib/rbeapi/api/vlans.rb +86 -86
- data/lib/rbeapi/api/vrrp.rb +210 -173
- data/lib/rbeapi/client.rb +142 -108
- data/lib/rbeapi/eapilib.rb +73 -62
- data/lib/rbeapi/utils.rb +8 -8
- data/lib/rbeapi/version.rb +2 -2
- data/spec/fixtures/test.conf +3 -3
- data/spec/system/rbeapi/api/system_spec.rb +46 -2
- data/spec/system/rbeapi/api/vlans_spec.rb +5 -2
- data/spec/system/rbeapi/client_spec.rb +4 -4
- data/spec/unit/rbeapi/api/system/default_spec.rb +40 -4
- data/spec/unit/rbeapi/api/system/fixture_system.text +14 -0
- data/spec/unit/rbeapi/api/vlans/default_spec.rb +1 -1
- data/spec/unit/rbeapi/api/vlans/fixture_vlans.text +2 -0
- data/spec/unit/rbeapi/client_spec.rb +1 -0
- metadata +9 -9
- data/guide/cookbook.rst +0 -4
- data/guide/developing.rst +0 -4
- data/guide/faq.rst +0 -4
- data/guide/quickstart.rst +0 -4
- data/guide/troubleshooting.rst +0 -1
data/lib/rbeapi/eapilib.rb
CHANGED
@@ -58,8 +58,8 @@ module Rbeapi
|
|
58
58
|
# The EapiError class provides one property for holding the set of
|
59
59
|
# commands issued when the error was generated.
|
60
60
|
#
|
61
|
-
# @param [String]
|
62
|
-
# the exception
|
61
|
+
# @param message [String] The error message to return from raising
|
62
|
+
# the exception.
|
63
63
|
def initalize(message)
|
64
64
|
@message = message
|
65
65
|
@commands = nil
|
@@ -77,12 +77,14 @@ module Rbeapi
|
|
77
77
|
##
|
78
78
|
# The exception contains the eAPI error code and error text.
|
79
79
|
#
|
80
|
-
# @param [String]
|
81
|
-
# this exception
|
82
|
-
#
|
83
|
-
#
|
84
|
-
#
|
85
|
-
#
|
80
|
+
# @param message [String] The error message to return from raising
|
81
|
+
# this exception.
|
82
|
+
#
|
83
|
+
# @param code [Integer] The error code associated with the error
|
84
|
+
# message to be raised.
|
85
|
+
#
|
86
|
+
# @param commands [Array] The list of commands that were used in the
|
87
|
+
# eAPI request message.
|
86
88
|
def initialize(message, code, commands = nil)
|
87
89
|
@error_code = code
|
88
90
|
@error_text = message
|
@@ -101,12 +103,14 @@ module Rbeapi
|
|
101
103
|
##
|
102
104
|
# The exception contains the eAPI error code and error text.
|
103
105
|
#
|
104
|
-
# @param [String]
|
105
|
-
# this exception
|
106
|
-
#
|
107
|
-
#
|
108
|
-
#
|
109
|
-
#
|
106
|
+
# @param message [String] The error message to return from raising
|
107
|
+
# this exception.
|
108
|
+
#
|
109
|
+
# @param connection_type [String] The optional connection_type of
|
110
|
+
# the instance.
|
111
|
+
#
|
112
|
+
# @param commands [Array] The list of commands that were used in the
|
113
|
+
# eAPI request message.
|
110
114
|
def initialize(message, connection_type = nil, commands = nil)
|
111
115
|
@connection_type = connection_type
|
112
116
|
@commands = commands
|
@@ -117,16 +121,18 @@ module Rbeapi
|
|
117
121
|
##
|
118
122
|
# The EapiConnection provides a base class for building eAPI connection
|
119
123
|
# instances with a specific transport for connecting to Arista EOS
|
120
|
-
# devices.
|
121
|
-
# JSON-RPC.
|
124
|
+
# devices. This class handles sending and receiving eAPI calls using
|
125
|
+
# JSON-RPC. This class should not need to be directly instantiated.
|
122
126
|
class EapiConnection
|
123
127
|
attr_reader :error
|
128
|
+
attr_reader :open_timeout
|
129
|
+
attr_reader :read_timeout
|
124
130
|
|
125
131
|
##
|
126
132
|
# The connection contains the transport.
|
127
133
|
#
|
128
|
-
# @param [Net::HTTP]
|
129
|
-
# and receive eAPI request and response messages
|
134
|
+
# @param transport [Net::HTTP] The HTTP transport to use for sending
|
135
|
+
# and receive eAPI request and response messages.
|
130
136
|
def initialize(transport)
|
131
137
|
@transport = transport
|
132
138
|
@error = nil
|
@@ -134,13 +140,16 @@ module Rbeapi
|
|
134
140
|
|
135
141
|
##
|
136
142
|
# Configures the connection authentication values (username and
|
137
|
-
# password).
|
138
|
-
# the eAPI connection.
|
139
|
-
# connections that use Http or Https transports
|
143
|
+
# password). The authentication values are used to authenticate
|
144
|
+
# the eAPI connection. Using authentication is only required for
|
145
|
+
# connections that use Http or Https transports.
|
146
|
+
#
|
147
|
+
# @param opts [Hash] The authentication parameters.
|
140
148
|
#
|
141
|
-
# @
|
149
|
+
# @option opts username [String] The username to use to
|
142
150
|
# authenticate with eAPI. Default is 'admin'.
|
143
|
-
#
|
151
|
+
#
|
152
|
+
# @option opts password [String] The password to use to
|
144
153
|
# authenticate with eAPI. Default is ''.
|
145
154
|
def authentication(opts = {})
|
146
155
|
@username = opts.fetch(:username, 'admin')
|
@@ -149,12 +158,13 @@ module Rbeapi
|
|
149
158
|
|
150
159
|
##
|
151
160
|
# Configures the connection timeout values (open_timeout and
|
152
|
-
# read_timeout).
|
161
|
+
# read_timeout). The timeout values are used for the eAPI
|
153
162
|
# connection.
|
154
163
|
#
|
155
|
-
# @option
|
164
|
+
# @option opts open_timeout [Float] Number of seconds to wait for the
|
156
165
|
# eAPI connection to open. Default is DEFAULT_HTTP_OPEN_TIMEOUT.
|
157
|
-
#
|
166
|
+
#
|
167
|
+
# @option opts read_timeout [Float] Number of seconds to wait for one
|
158
168
|
# block of eAPI results to be read (via one read(2) call). Default
|
159
169
|
# is DEFAULT_HTTP_READ_TIMEOUT.
|
160
170
|
def timeouts(opts = {})
|
@@ -162,14 +172,6 @@ module Rbeapi
|
|
162
172
|
@read_timeout = opts.fetch(:read_timeout, DEFAULT_HTTP_READ_TIMEOUT)
|
163
173
|
end
|
164
174
|
|
165
|
-
##
|
166
|
-
# Gets values for open_timeout and read_timeout
|
167
|
-
#
|
168
|
-
# @return [Hash] open_timeout and read_timeout
|
169
|
-
def get_timeouts
|
170
|
-
{ open_timeout: @open_timeout, read_timeout: @read_timeout }
|
171
|
-
end
|
172
|
-
|
173
175
|
##
|
174
176
|
# Generates the eAPI JSON request message.
|
175
177
|
#
|
@@ -187,18 +189,21 @@ module Rbeapi
|
|
187
189
|
# "id": <reqid>
|
188
190
|
# }
|
189
191
|
#
|
190
|
-
# @param [Array]
|
191
|
-
# be included in the eAPI request
|
192
|
-
#
|
193
|
-
# @
|
194
|
-
#
|
195
|
-
#
|
196
|
-
#
|
197
|
-
#
|
198
|
-
#
|
192
|
+
# @param commands [Array] The ordered set of commands that should
|
193
|
+
# be included in the eAPI request.
|
194
|
+
#
|
195
|
+
# @param opts [Hash] Optional keyword arguments.
|
196
|
+
#
|
197
|
+
# @option opts id [String] The value to use for the eAPI request
|
198
|
+
# id. If not provided,the object_id for the connection instance
|
199
|
+
# will be used.
|
200
|
+
#
|
201
|
+
# @option opts format [String] The encoding formation to pass in
|
202
|
+
# the eAPI request. Valid values are json or text. The default
|
203
|
+
# value is json.
|
199
204
|
#
|
200
205
|
# @return [Hash] Returns a Ruby hash of the request message that is
|
201
|
-
# suitable to be JSON encoded and sent to the destination node
|
206
|
+
# suitable to be JSON encoded and sent to the destination node.
|
202
207
|
def request(commands, opts = {})
|
203
208
|
id = opts.fetch(:reqid, object_id)
|
204
209
|
format = opts.fetch(:format, 'json')
|
@@ -211,7 +216,7 @@ module Rbeapi
|
|
211
216
|
##
|
212
217
|
# This method will send the request to the node over the specified
|
213
218
|
# transport and return a response message with the contents from
|
214
|
-
# the eAPI response.
|
219
|
+
# the eAPI response. eAPI responds to request messages with either
|
215
220
|
# a success message or failure message.
|
216
221
|
#
|
217
222
|
# @example eAPI Response - success
|
@@ -248,16 +253,18 @@ module Rbeapi
|
|
248
253
|
# "id": <reqid>
|
249
254
|
# }
|
250
255
|
#
|
251
|
-
# @param [Hash]
|
252
|
-
# message.
|
253
|
-
#
|
256
|
+
# @param data [Hash] A hash containing the body of the request
|
257
|
+
# message. This should be a valid eAPI request message.
|
258
|
+
#
|
259
|
+
# @option opts open_timeout [Float] Number of seconds to wait for the
|
254
260
|
# eAPI connection to open.
|
255
|
-
#
|
261
|
+
#
|
262
|
+
# @option opts read_timeout [Float] Number of seconds to wait for one
|
256
263
|
# block of eAPI results to be read (via one read(2) call).
|
257
264
|
#
|
258
|
-
# @return [Hash]
|
265
|
+
# @return [Hash] Returns the response message as a Ruby hash object.
|
259
266
|
#
|
260
|
-
# @
|
267
|
+
# @raise [CommandError] Raised if an eAPI failure response is return
|
261
268
|
# from the destination node.
|
262
269
|
def send(data, opts)
|
263
270
|
request = Net::HTTP::Post.new('/command-api')
|
@@ -289,24 +296,28 @@ module Rbeapi
|
|
289
296
|
# Executes the commands on the destination node and returns the
|
290
297
|
# response from the node.
|
291
298
|
#
|
292
|
-
# @param [Array]
|
299
|
+
# @param commands [Array] The ordered list of commands to execute
|
293
300
|
# on the destination node.
|
294
|
-
#
|
295
|
-
# @
|
296
|
-
#
|
297
|
-
# @option
|
301
|
+
#
|
302
|
+
# @param opts [Hash] Optional keyword arguments.
|
303
|
+
#
|
304
|
+
# @option opts encoding [String] Used to specify the encoding to be
|
305
|
+
# used for the response. Valid encoding values are json or text.
|
306
|
+
#
|
307
|
+
# @option opts open_timeout [Float] Number of seconds to wait for the
|
298
308
|
# eAPI connection to open.
|
299
|
-
#
|
309
|
+
#
|
310
|
+
# @option opts read_timeout [Float] Number of seconds to wait for one
|
300
311
|
# block of eAPI results to be read (via one read(2) call).
|
301
312
|
#
|
302
|
-
# @
|
313
|
+
# @return [Array<Hash>] This method will return the array of responses
|
303
314
|
# for each command executed on the node.
|
304
315
|
#
|
305
|
-
# @
|
306
|
-
# send method and adds the list of commands to the exception message
|
316
|
+
# @raise [CommandError] Raises a CommandError if rescued from the
|
317
|
+
# send method and adds the list of commands to the exception message.
|
307
318
|
#
|
308
|
-
# @
|
309
|
-
# adds the list of commands to the exception message
|
319
|
+
# @raise [ConnectionError] Raises a ConnectionError if rescued and
|
320
|
+
# adds the list of commands to the exception message.
|
310
321
|
def execute(commands, opts = {})
|
311
322
|
@error = nil
|
312
323
|
request = request(commands, opts)
|
data/lib/rbeapi/utils.rb
CHANGED
@@ -33,19 +33,19 @@
|
|
33
33
|
require 'syslog'
|
34
34
|
|
35
35
|
##
|
36
|
-
# Rbeapi toplevel namespace
|
36
|
+
# Rbeapi toplevel namespace.
|
37
37
|
module Rbeapi
|
38
38
|
##
|
39
|
-
# Utils module
|
39
|
+
# Utils module.
|
40
40
|
module Utils
|
41
41
|
##
|
42
42
|
# Iterates through a hash structure and converts all of the keys
|
43
43
|
# to symbols.
|
44
44
|
#
|
45
|
-
# @param [Hash]
|
45
|
+
# @param value [Hash] The hash structure to convert the keys.
|
46
46
|
#
|
47
47
|
# @return [Hash] An updated hash structure with all keys converted to
|
48
|
-
# symboles
|
48
|
+
# symboles.
|
49
49
|
def self.transform_keys_to_symbols(value)
|
50
50
|
return value unless value.is_a?(Hash)
|
51
51
|
hash = value.each_with_object({}) do |(k, v), hsh|
|
@@ -56,11 +56,11 @@ module Rbeapi
|
|
56
56
|
end
|
57
57
|
|
58
58
|
##
|
59
|
-
# Returns a class object from a string capable of being instatiated
|
59
|
+
# Returns a class object from a string capable of being instatiated.
|
60
60
|
#
|
61
|
-
# @param [String]
|
61
|
+
# @param name [String] The name of the class to return a constant for.
|
62
62
|
#
|
63
|
-
# @return [Object] Returns a a class object that can be instatiated
|
63
|
+
# @return [Object] Returns a a class object that can be instatiated.
|
64
64
|
def self.class_from_string(name)
|
65
65
|
name.split('::').inject(Object) do |mod, cls|
|
66
66
|
mod.const_get(cls)
|
@@ -70,7 +70,7 @@ module Rbeapi
|
|
70
70
|
##
|
71
71
|
# Syslogs a warning message.
|
72
72
|
#
|
73
|
-
# @param [String]
|
73
|
+
# @param message [String] The message to log.
|
74
74
|
def self.syslog_warning(message)
|
75
75
|
Syslog.open('rbeapi', Syslog::LOG_PID) { |s| s.warning message }
|
76
76
|
end
|
data/lib/rbeapi/version.rb
CHANGED
data/spec/fixtures/test.conf
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
-
[
|
1
|
+
[DEFAULT]
|
2
2
|
username: eapi
|
3
3
|
password: password
|
4
|
+
|
5
|
+
[connection:veos01]
|
4
6
|
transport: http
|
5
7
|
host: veos01
|
6
8
|
|
@@ -14,8 +16,6 @@ host: veos03
|
|
14
16
|
|
15
17
|
[connection:veos04]
|
16
18
|
host: 172.16.10.1
|
17
|
-
username: eapi
|
18
|
-
password: password
|
19
19
|
enablepwd: itsasecret
|
20
20
|
port: 1234
|
21
21
|
transport: https
|
@@ -13,10 +13,14 @@ describe Rbeapi::Api::System do
|
|
13
13
|
|
14
14
|
describe '#get' do
|
15
15
|
let(:entity) do
|
16
|
-
{ hostname: 'localhost', iprouting: true
|
16
|
+
{ hostname: 'localhost', iprouting: true, banner_motd: '',
|
17
|
+
banner_login: '' }
|
17
18
|
end
|
18
19
|
|
19
|
-
before
|
20
|
+
before do
|
21
|
+
node.config(['hostname localhost', 'ip routing', 'no banner motd',
|
22
|
+
'no banner login'])
|
23
|
+
end
|
20
24
|
|
21
25
|
it 'returns the snmp resource' do
|
22
26
|
expect(subject.get).to eq(entity)
|
@@ -88,4 +92,44 @@ describe Rbeapi::Api::System do
|
|
88
92
|
end
|
89
93
|
end
|
90
94
|
end
|
95
|
+
|
96
|
+
describe '#set_banner' do
|
97
|
+
before { node.config(['no banner login', 'no banner motd']) }
|
98
|
+
|
99
|
+
it 'configures the login value' do
|
100
|
+
expect(subject.get[:banner_login]).to eq('')
|
101
|
+
expect(subject.set_banner('login', value: 'foo')).to be_truthy
|
102
|
+
expect(subject.get[:banner_login]).to eq('foo')
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'negates the login value' do
|
106
|
+
expect(subject.get[:banner_login]).to eq('')
|
107
|
+
expect(subject.set_banner('login', enable: false)).to be_truthy
|
108
|
+
expect(subject.get[:banner_login]).to eq('')
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'defaults the login value' do
|
112
|
+
expect(subject.get[:banner_login]).to eq('')
|
113
|
+
expect(subject.set_banner('login', default: true)).to be_truthy
|
114
|
+
expect(subject.get[:banner_login]).to eq('')
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'configures the motd value' do
|
118
|
+
expect(subject.get[:banner_motd]).to eq('')
|
119
|
+
expect(subject.set_banner('motd', value: 'foo')).to be_truthy
|
120
|
+
expect(subject.get[:banner_motd]).to eq('foo')
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'negates the motd value' do
|
124
|
+
expect(subject.get[:banner_motd]).to eq('')
|
125
|
+
expect(subject.set_banner('motd', enable: false)).to be_truthy
|
126
|
+
expect(subject.get[:banner_motd]).to eq('')
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'defaults the motd value' do
|
130
|
+
expect(subject.get[:banner_motd]).to eq('')
|
131
|
+
expect(subject.set_banner('motd', default: true)).to be_truthy
|
132
|
+
expect(subject.get[:banner_motd]).to eq('')
|
133
|
+
end
|
134
|
+
end
|
91
135
|
end
|
@@ -14,10 +14,13 @@ describe Rbeapi::Api::Vlans do
|
|
14
14
|
context '#get' do
|
15
15
|
describe 'with defaults' do
|
16
16
|
let(:entity) do
|
17
|
-
{ name: 'default', state: 'active', trunk_groups:
|
17
|
+
{ name: 'default', state: 'active', trunk_groups: %w(mlag test) }
|
18
18
|
end
|
19
19
|
|
20
|
-
before
|
20
|
+
before do
|
21
|
+
node.config(['no vlan 1-4094', 'vlan 1', 'trunk group mlag',
|
22
|
+
'trunk group test'])
|
23
|
+
end
|
21
24
|
|
22
25
|
it 'returns the vlan resource' do
|
23
26
|
expect(subject.get('1')).to eq(entity)
|
@@ -348,8 +348,8 @@ describe Rbeapi::Client do
|
|
348
348
|
|
349
349
|
describe 'test timeouts' do
|
350
350
|
it 'loads default timeout values' do
|
351
|
-
expect(node.connection.
|
352
|
-
|
351
|
+
expect(node.connection.open_timeout).to eq(10)
|
352
|
+
expect(node.connection.read_timeout).to eq(10)
|
353
353
|
end
|
354
354
|
|
355
355
|
describe 'loads veos05' do
|
@@ -359,8 +359,8 @@ describe Rbeapi::Client do
|
|
359
359
|
end
|
360
360
|
|
361
361
|
it 'loads timeout values from conf file' do
|
362
|
-
expect(node.connection.
|
363
|
-
|
362
|
+
expect(node.connection.open_timeout).to eq(12)
|
363
|
+
expect(node.connection.read_timeout).to eq(12)
|
364
364
|
end
|
365
365
|
end
|
366
366
|
end
|
@@ -41,7 +41,9 @@ describe Rbeapi::Api::System do
|
|
41
41
|
let(:node) { double('node') }
|
42
42
|
|
43
43
|
let(:test) do
|
44
|
-
{ hostname: 'localhost', iprouting: true
|
44
|
+
{ hostname: 'localhost', iprouting: true,
|
45
|
+
banner_motd: "MOTD Banner\nSecond Line\nEOF \n*\\v1?",
|
46
|
+
banner_login: "Login Banner\nSecond Line\n123456\n EOF" }
|
45
47
|
end
|
46
48
|
|
47
49
|
def system
|
@@ -56,15 +58,15 @@ describe Rbeapi::Api::System do
|
|
56
58
|
|
57
59
|
describe '#get' do
|
58
60
|
it 'returns the username collection' do
|
59
|
-
expect(subject.get).to
|
61
|
+
expect(subject.get).to eq(test)
|
60
62
|
end
|
61
63
|
|
62
64
|
it 'returns a hash collection' do
|
63
65
|
expect(subject.get).to be_a_kind_of(Hash)
|
64
66
|
end
|
65
67
|
|
66
|
-
it 'has
|
67
|
-
expect(subject.get.size).to eq(
|
68
|
+
it 'has four entries' do
|
69
|
+
expect(subject.get.size).to eq(4)
|
68
70
|
end
|
69
71
|
end
|
70
72
|
|
@@ -99,4 +101,38 @@ describe Rbeapi::Api::System do
|
|
99
101
|
expect(subject.set_iprouting(enable: false)).to be_truthy
|
100
102
|
end
|
101
103
|
end
|
104
|
+
|
105
|
+
describe '#set_banner' do
|
106
|
+
it 'sets the login banner' do
|
107
|
+
expect(node).to receive(:config).with([{ cmd: 'banner login',
|
108
|
+
input: "login banner\n" }])
|
109
|
+
expect(subject.set_banner('login', value: 'login banner')).to be_truthy
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'negates the login banner' do
|
113
|
+
expect(node).to receive(:config).with('no banner login')
|
114
|
+
expect(subject.set_banner('login', enable: false)).to be_truthy
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'defaults the login banner' do
|
118
|
+
expect(node).to receive(:config).with('default banner login')
|
119
|
+
expect(subject.set_banner('login', default: true)).to be_truthy
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'sets the motd banner' do
|
123
|
+
expect(node).to receive(:config).with([{ cmd: 'banner motd',
|
124
|
+
input: "motd banner\n" }])
|
125
|
+
expect(subject.set_banner('motd', value: 'motd banner')).to be_truthy
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'negates the motd banner' do
|
129
|
+
expect(node).to receive(:config).with('no banner motd')
|
130
|
+
expect(subject.set_banner('motd', enable: false)).to be_truthy
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'defaults the motd banner' do
|
134
|
+
expect(node).to receive(:config).with('default banner motd')
|
135
|
+
expect(subject.set_banner('motd', default: true)).to be_truthy
|
136
|
+
end
|
137
|
+
end
|
102
138
|
end
|