beaker 2.7.1 → 2.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/HISTORY.md +121 -2
- data/lib/beaker/dsl.rb +2 -2
- data/lib/beaker/dsl/helpers.rb +13 -1429
- data/lib/beaker/dsl/helpers/facter_helpers.rb +48 -0
- data/lib/beaker/dsl/helpers/hiera_helpers.rb +71 -0
- data/lib/beaker/dsl/helpers/host_helpers.rb +506 -0
- data/lib/beaker/dsl/helpers/puppet_helpers.rb +698 -0
- data/lib/beaker/dsl/helpers/tk_helpers.rb +101 -0
- data/lib/beaker/dsl/helpers/web_helpers.rb +115 -0
- data/lib/beaker/dsl/install_utils.rb +8 -1570
- data/lib/beaker/dsl/install_utils/ezbake_utils.rb +256 -0
- data/lib/beaker/dsl/install_utils/module_utils.rb +237 -0
- data/lib/beaker/dsl/install_utils/pe_utils.rb +518 -0
- data/lib/beaker/dsl/install_utils/puppet_utils.rb +722 -0
- data/lib/beaker/dsl/outcomes.rb +0 -4
- data/lib/beaker/dsl/roles.rb +0 -3
- data/lib/beaker/dsl/structure.rb +127 -4
- data/lib/beaker/dsl/wrappers.rb +0 -4
- data/lib/beaker/host.rb +23 -0
- data/lib/beaker/host/unix/pkg.rb +4 -4
- data/lib/beaker/host_prebuilt_steps.rb +11 -5
- data/lib/beaker/hypervisor/vagrant.rb +1 -0
- data/lib/beaker/hypervisor/vmpooler.rb +38 -0
- data/lib/beaker/logger.rb +10 -4
- data/lib/beaker/network_manager.rb +5 -4
- data/lib/beaker/options/command_line_parser.rb +7 -0
- data/lib/beaker/shared.rb +2 -1
- data/lib/beaker/shared/semvar.rb +41 -0
- data/lib/beaker/test_suite.rb +20 -6
- data/lib/beaker/version.rb +1 -1
- data/spec/beaker/dsl/helpers/facter_helpers_spec.rb +59 -0
- data/spec/beaker/dsl/helpers/hiera_helpers_spec.rb +96 -0
- data/spec/beaker/dsl/helpers/host_helpers_spec.rb +413 -0
- data/spec/beaker/dsl/{helpers_spec.rb → helpers/puppet_helpers_spec.rb} +2 -611
- data/spec/beaker/dsl/helpers/tk_helpers_spec.rb +83 -0
- data/spec/beaker/dsl/helpers/web_helpers_spec.rb +60 -0
- data/spec/beaker/dsl/install_utils/module_utils_spec.rb +241 -0
- data/spec/beaker/dsl/install_utils/pe_utils_spec.rb +475 -0
- data/spec/beaker/dsl/install_utils/puppet_utils_spec.rb +523 -0
- data/spec/beaker/dsl/structure_spec.rb +108 -0
- data/spec/beaker/host_prebuilt_steps_spec.rb +44 -0
- data/spec/beaker/host_spec.rb +41 -0
- data/spec/beaker/hypervisor/vagrant_spec.rb +2 -1
- data/spec/beaker/logger_spec.rb +9 -2
- data/spec/beaker/network_manager_spec.rb +7 -1
- data/spec/beaker/options/command_line_parser_spec.rb +3 -2
- data/spec/beaker/shared/semvar_spec.rb +36 -0
- data/spec/beaker/test_suite_spec.rb +48 -0
- data/spec/mocks.rb +10 -0
- metadata +23 -5
- data/lib/beaker/dsl/ezbake_utils.rb +0 -259
- data/spec/beaker/dsl/install_utils_spec.rb +0 -1242
@@ -25,288 +25,6 @@ describe ClassMixedWithDSLHelpers do
|
|
25
25
|
let( :db ) { make_host( 'db', :roles => %w( database agent ) ) }
|
26
26
|
let( :hosts ) { [ master, agent, dash, db, custom ] }
|
27
27
|
|
28
|
-
describe '#on' do
|
29
|
-
|
30
|
-
before :each do
|
31
|
-
result.stdout = 'stdout'
|
32
|
-
result.stderr = 'stderr'
|
33
|
-
result.exit_code = 0
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'allows the environment the command is run within to be specified' do
|
37
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
38
|
-
|
39
|
-
expect( Beaker::Command ).to receive( :new ).
|
40
|
-
with( 'ls ~/.bin', [], {'ENV' => { :HOME => '/tmp/test_home' }} )
|
41
|
-
|
42
|
-
subject.on( host, 'ls ~/.bin', :environment => {:HOME => '/tmp/test_home' } )
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'if the host is a String Object, finds the matching hosts with that String as role' do
|
46
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
47
|
-
|
48
|
-
expect( master ).to receive( :exec ).once
|
49
|
-
|
50
|
-
subject.on( 'master', 'echo hello')
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'if the host is a Symbol Object, finds the matching hsots with that Symbol as role' do
|
55
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
56
|
-
|
57
|
-
expect( master ).to receive( :exec ).once
|
58
|
-
|
59
|
-
subject.on( :master, 'echo hello')
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'delegates to itself for each host passed' do
|
64
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
65
|
-
expected = []
|
66
|
-
hosts.each_with_index do |host, i|
|
67
|
-
expected << i
|
68
|
-
expect( host ).to receive( :exec ).and_return( i )
|
69
|
-
end
|
70
|
-
|
71
|
-
results = subject.on( hosts, command )
|
72
|
-
expect( results ).to be == expected
|
73
|
-
end
|
74
|
-
|
75
|
-
context 'upon command completion' do
|
76
|
-
before :each do
|
77
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
78
|
-
expect( host ).to receive( :exec ).and_return( result )
|
79
|
-
@res = subject.on( host, command )
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'returns the result of the action' do
|
83
|
-
expect( @res ).to be == result
|
84
|
-
end
|
85
|
-
|
86
|
-
it 'provides access to stdout' do
|
87
|
-
expect( @res.stdout ).to be == 'stdout'
|
88
|
-
end
|
89
|
-
|
90
|
-
it 'provides access to stderr' do
|
91
|
-
expect( @res.stderr ).to be == 'stderr'
|
92
|
-
end
|
93
|
-
|
94
|
-
it 'provides access to exit_code' do
|
95
|
-
expect( @res.exit_code ).to be == 0
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
context 'when passed a block with arity of 1' do
|
100
|
-
before :each do
|
101
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
102
|
-
expect( host ).to receive( :exec ).and_return( result )
|
103
|
-
end
|
104
|
-
|
105
|
-
it 'yields result' do
|
106
|
-
subject.on host, command do |containing_class|
|
107
|
-
expect( containing_class ).
|
108
|
-
to be_an_instance_of( Beaker::Result )
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
it 'provides access to stdout' do
|
113
|
-
subject.on host, command do |containing_class|
|
114
|
-
expect( containing_class.stdout ).to be == 'stdout'
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
it 'provides access to stderr' do
|
119
|
-
subject.on host, command do |containing_class|
|
120
|
-
expect( containing_class.stderr ).to be == 'stderr'
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
it 'provides access to exit_code' do
|
125
|
-
subject.on host, command do |containing_class|
|
126
|
-
expect( containing_class.exit_code ).to be == 0
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
context 'when passed a block with arity of 0' do
|
132
|
-
before :each do
|
133
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
134
|
-
expect( host ).to receive( :exec ).and_return( result )
|
135
|
-
end
|
136
|
-
|
137
|
-
it 'yields self' do
|
138
|
-
subject.on host, command do
|
139
|
-
expect( subject ).
|
140
|
-
to be_an_instance_of( ClassMixedWithDSLHelpers )
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
it 'provides access to stdout' do
|
145
|
-
subject.on host, command do
|
146
|
-
expect( subject.stdout ).to be == 'stdout'
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
it 'provides access to stderr' do
|
151
|
-
subject.on host, command do
|
152
|
-
expect( subject.stderr ).to be == 'stderr'
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
it 'provides access to exit_code' do
|
157
|
-
subject.on host, command do
|
158
|
-
expect( subject.exit_code ).to be == 0
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
end
|
164
|
-
|
165
|
-
describe "#retry_on" do
|
166
|
-
it 'fails correctly when command never succeeds' do
|
167
|
-
result.stdout = 'stdout'
|
168
|
-
result.stderr = 'stderr'
|
169
|
-
result.exit_code = 1
|
170
|
-
|
171
|
-
retries = 5
|
172
|
-
|
173
|
-
opts = {
|
174
|
-
:max_retries => retries,
|
175
|
-
:retry_interval => 0.0001,
|
176
|
-
}
|
177
|
-
|
178
|
-
allow( subject ).to receive(:on).and_return(result)
|
179
|
-
expect( subject ).to receive(:on).exactly(retries+2)
|
180
|
-
expect { subject.retry_on(host, command, opts) }.to raise_error(RuntimeError)
|
181
|
-
end
|
182
|
-
|
183
|
-
it 'will return success correctly if it succeeds the first time' do
|
184
|
-
result.stdout = 'stdout'
|
185
|
-
result.stderr = 'stderr'
|
186
|
-
result.exit_code = 0
|
187
|
-
|
188
|
-
opts = {
|
189
|
-
:max_retries => 5,
|
190
|
-
:retry_interval => 0.0001,
|
191
|
-
}
|
192
|
-
|
193
|
-
allow( subject ).to receive(:on).and_return(result)
|
194
|
-
expect( subject ).to receive(:on).once
|
195
|
-
|
196
|
-
result_given = subject.retry_on(host, command, opts)
|
197
|
-
expect(result_given.exit_code).to be === 0
|
198
|
-
end
|
199
|
-
|
200
|
-
it 'will return success correctly if it succeeds after failing a few times' do
|
201
|
-
result.stdout = 'stdout'
|
202
|
-
result.stderr = 'stderr'
|
203
|
-
|
204
|
-
opts = {
|
205
|
-
:max_retries => 10,
|
206
|
-
:retry_interval => 0.1,
|
207
|
-
}
|
208
|
-
|
209
|
-
reps_num = 4
|
210
|
-
count = 0
|
211
|
-
allow( subject ).to receive(:on) do
|
212
|
-
result.exit_code = count > reps_num ? 0 : 1
|
213
|
-
count += 1
|
214
|
-
result
|
215
|
-
end
|
216
|
-
expect( subject ).to receive(:on).exactly(reps_num + 2)
|
217
|
-
|
218
|
-
result_given = subject.retry_on(host, command, opts)
|
219
|
-
expect(result_given.exit_code).to be === 0
|
220
|
-
end
|
221
|
-
end
|
222
|
-
|
223
|
-
describe "shell" do
|
224
|
-
it 'delegates to #on with the default host' do
|
225
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
226
|
-
|
227
|
-
expect( subject ).to receive( :on ).with( master, "echo hello", {}).once
|
228
|
-
|
229
|
-
subject.shell( "echo hello" )
|
230
|
-
end
|
231
|
-
end
|
232
|
-
|
233
|
-
describe '#scp_from' do
|
234
|
-
it 'delegates to the host' do
|
235
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
236
|
-
expect( subject ).to receive( :logger ).exactly( hosts.length ).times
|
237
|
-
expect( result ).to receive( :log ).exactly( hosts.length ).times
|
238
|
-
|
239
|
-
hosts.each do |host|
|
240
|
-
expect( host ).to receive( :do_scp_from ).and_return( result )
|
241
|
-
end
|
242
|
-
|
243
|
-
subject.scp_from( hosts, '/var/log/my.log', 'log/my.log' )
|
244
|
-
end
|
245
|
-
end
|
246
|
-
|
247
|
-
describe '#scp_to' do
|
248
|
-
it 'delegates to the host' do
|
249
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
250
|
-
expect( subject ).to receive( :logger ).exactly( hosts.length ).times
|
251
|
-
expect( result ).to receive( :log ).exactly( hosts.length ).times
|
252
|
-
|
253
|
-
hosts.each do |host|
|
254
|
-
expect( host ).to receive( :do_scp_to ).and_return( result )
|
255
|
-
end
|
256
|
-
|
257
|
-
subject.scp_to( hosts, '/var/log/my.log', 'log/my.log' )
|
258
|
-
end
|
259
|
-
end
|
260
|
-
|
261
|
-
describe '#rsync_to' do
|
262
|
-
it 'delegates to the host' do
|
263
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
264
|
-
|
265
|
-
hosts.each do |host|
|
266
|
-
expect( host ).to receive( :do_rsync_to ).and_return( result )
|
267
|
-
end
|
268
|
-
|
269
|
-
subject.rsync_to( hosts, '/var/log/my.log', 'log/my.log' )
|
270
|
-
end
|
271
|
-
end
|
272
|
-
|
273
|
-
describe '#create_remote_file using scp' do
|
274
|
-
it 'scps the contents passed in to the hosts' do
|
275
|
-
my_opts = { :silent => true }
|
276
|
-
tmpfile = double
|
277
|
-
|
278
|
-
expect( tmpfile ).to receive( :path ).exactly( 2 ).times.
|
279
|
-
and_return( '/local/path/to/blah' )
|
280
|
-
|
281
|
-
expect( Tempfile ).to receive( :open ).and_yield( tmpfile )
|
282
|
-
|
283
|
-
expect( File ).to receive( :open )
|
284
|
-
|
285
|
-
expect( subject ).to receive( :scp_to ).
|
286
|
-
with( hosts, '/local/path/to/blah', '/remote/path', my_opts )
|
287
|
-
|
288
|
-
subject.create_remote_file( hosts, '/remote/path', 'blah', my_opts )
|
289
|
-
end
|
290
|
-
end
|
291
|
-
|
292
|
-
describe '#create_remote_file using rsync' do
|
293
|
-
it 'scps the contents passed in to the hosts' do
|
294
|
-
my_opts = { :silent => true, :protocol => 'rsync' }
|
295
|
-
tmpfile = double
|
296
|
-
|
297
|
-
expect( tmpfile ).to receive( :path ).exactly( 2 ).times.
|
298
|
-
and_return( '/local/path/to/blah' )
|
299
|
-
|
300
|
-
expect( Tempfile ).to receive( :open ).and_yield( tmpfile )
|
301
|
-
|
302
|
-
expect( File ).to receive( :open )
|
303
|
-
|
304
|
-
expect( subject ).to receive( :rsync_to ).
|
305
|
-
with( hosts, '/local/path/to/blah', '/remote/path', my_opts )
|
306
|
-
|
307
|
-
subject.create_remote_file( hosts, '/remote/path', 'blah', my_opts )
|
308
|
-
end
|
309
|
-
end
|
310
28
|
|
311
29
|
describe '#create_tmpdir_for_user' do
|
312
30
|
let(:host) { {} }
|
@@ -337,9 +55,7 @@ describe ClassMixedWithDSLHelpers do
|
|
337
55
|
cmd = "the command"
|
338
56
|
expect(Beaker::Command).to receive(:new).with(/puppet master --configprint user/, [], {"ENV"=>{}, :cmdexe=>true}).and_return(cmd)
|
339
57
|
expect(subject).to receive(:on).with(host, cmd).and_return(result)
|
340
|
-
expect(subject).to receive(:
|
341
|
-
expect(host).to receive(:tmpdir).with(/\/tmp\/beaker.*/)
|
342
|
-
expect(subject).to receive(:on).with(host, /chown puppet.puppet.*/)
|
58
|
+
expect(subject).to receive(:create_tmpdir_on).with(host, /\/tmp\/beaker/, /puppet/)
|
343
59
|
subject.create_tmpdir_for_user(host)
|
344
60
|
end
|
345
61
|
end
|
@@ -350,162 +66,15 @@ describe ClassMixedWithDSLHelpers do
|
|
350
66
|
cmd = "the command"
|
351
67
|
expect(Beaker::Command).to receive(:new).with(/puppet master --configprint user/, [], {"ENV"=>{}, :cmdexe=>true}).and_return(cmd)
|
352
68
|
expect(subject).to receive(:on).with(host, cmd).and_return(result)
|
353
|
-
expect(subject).to receive(:
|
354
|
-
expect(host).to receive(:tmpdir).with(/\/tmp\/bogus.*/).and_return("/tmp/bogus")
|
355
|
-
expect(subject).to receive(:on).with(host, /chown puppet.puppet \/tmp\/bogus.*/)
|
69
|
+
expect(subject).to receive(:create_tmpdir_on).with(host, /\/tmp\/bogus/, /puppet/)
|
356
70
|
subject.create_tmpdir_for_user(host, "/tmp/bogus")
|
357
71
|
end
|
358
72
|
end
|
359
73
|
|
360
74
|
end
|
361
75
|
|
362
|
-
context 'with an invalid user argument' do
|
363
|
-
it 'executes chown once' do
|
364
|
-
allow(result).to receive(:stdout).and_return('curiousgeorge')
|
365
|
-
expect(subject).to receive(:on).with(host, /^getent passwd curiousgeorge/).and_return(result)
|
366
|
-
expect(host).to receive(:tmpdir).with(/\/tmp\/bogus.*/).and_return("/tmp/bogus")
|
367
|
-
expect(subject).to receive(:on).with(host, /chown curiousgeorge.curiousgeorge \/tmp\/bogus.*/)
|
368
|
-
subject.create_tmpdir_for_user(host, "/tmp/bogus", "curiousgeorge")
|
369
|
-
end
|
370
|
-
end
|
371
|
-
|
372
|
-
context 'with a valid user argument' do
|
373
|
-
it 'executes chown once' do
|
374
|
-
allow(result).to receive(:exit_code).and_return(1)
|
375
|
-
expect(subject).to receive(:on).with(host, /^getent passwd curiousgeorge/).and_return(result)
|
376
|
-
expect{
|
377
|
-
subject.create_tmpdir_for_user(host, "/tmp/bogus", "curiousgeorge")
|
378
|
-
}.to raise_error(RuntimeError, /User curiousgeorge does not exist on/)
|
379
|
-
end
|
380
|
-
end
|
381
|
-
|
382
76
|
end
|
383
77
|
|
384
|
-
describe '#run_script_on' do
|
385
|
-
it 'scps the script to a tmpdir and executes it on host(s)' do
|
386
|
-
expect( subject ).to receive( :scp_to )
|
387
|
-
expect( subject ).to receive( :on )
|
388
|
-
subject.run_script_on( 'host', '~/.bin/make-enterprisy' )
|
389
|
-
end
|
390
|
-
end
|
391
|
-
|
392
|
-
describe '#run_script' do
|
393
|
-
it 'delegates to #run_script_on with the default host' do
|
394
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
395
|
-
|
396
|
-
expect( subject ).to receive( :run_script_on ).with( master, "/tmp/test.sh", {}).once
|
397
|
-
|
398
|
-
subject.run_script( '/tmp/test.sh' )
|
399
|
-
end
|
400
|
-
end
|
401
|
-
|
402
|
-
describe 'confine' do
|
403
|
-
let(:logger) { double.as_null_object }
|
404
|
-
before do
|
405
|
-
allow( subject ).to receive( :logger ).and_return( logger )
|
406
|
-
end
|
407
|
-
|
408
|
-
it 'skips the test if there are no applicable hosts' do
|
409
|
-
allow( subject ).to receive( :hosts ).and_return( [] )
|
410
|
-
allow( subject ).to receive( :hosts= )
|
411
|
-
expect( logger ).to receive( :warn )
|
412
|
-
expect( subject ).to receive( :skip_test ).
|
413
|
-
with( 'No suitable hosts found' )
|
414
|
-
|
415
|
-
subject.confine( :to, {} )
|
416
|
-
end
|
417
|
-
|
418
|
-
it 'raises when given mode is not :to or :except' do
|
419
|
-
allow( subject ).to receive( :hosts )
|
420
|
-
allow( subject ).to receive( :hosts= )
|
421
|
-
|
422
|
-
expect {
|
423
|
-
subject.confine( :regardless, {:thing => 'value'} )
|
424
|
-
}.to raise_error( 'Unknown option regardless' )
|
425
|
-
end
|
426
|
-
|
427
|
-
it 'rejects hosts that do not meet simple hash criteria' do
|
428
|
-
hosts = [ {'thing' => 'foo'}, {'thing' => 'bar'} ]
|
429
|
-
|
430
|
-
expect( subject ).to receive( :hosts ).and_return( hosts )
|
431
|
-
expect( subject ).to receive( :hosts= ).
|
432
|
-
with( [ {'thing' => 'foo'} ] )
|
433
|
-
|
434
|
-
subject.confine :to, :thing => 'foo'
|
435
|
-
end
|
436
|
-
|
437
|
-
it 'rejects hosts that match a list of criteria' do
|
438
|
-
hosts = [ {'thing' => 'foo'}, {'thing' => 'bar'}, {'thing' => 'baz'} ]
|
439
|
-
|
440
|
-
expect( subject ).to receive( :hosts ).and_return( hosts )
|
441
|
-
expect( subject ).to receive( :hosts= ).
|
442
|
-
with( [ {'thing' => 'bar'} ] )
|
443
|
-
|
444
|
-
subject.confine :except, :thing => ['foo', 'baz']
|
445
|
-
end
|
446
|
-
|
447
|
-
it 'rejects hosts when a passed block returns true' do
|
448
|
-
host1 = {'platform' => 'solaris'}
|
449
|
-
host2 = {'platform' => 'solaris'}
|
450
|
-
host3 = {'platform' => 'windows'}
|
451
|
-
ret1 = (Struct.new('Result1', :stdout)).new(':global')
|
452
|
-
ret2 = (Struct.new('Result2', :stdout)).new('a_zone')
|
453
|
-
hosts = [ host1, host2, host3 ]
|
454
|
-
|
455
|
-
expect( subject ).to receive( :hosts ).and_return( hosts )
|
456
|
-
expect( subject ).to receive( :on ).
|
457
|
-
with( host1, '/sbin/zonename' ).
|
458
|
-
and_return( ret1 )
|
459
|
-
expect( subject ).to receive( :on ).
|
460
|
-
with( host1, '/sbin/zonename' ).
|
461
|
-
and_return( ret2 )
|
462
|
-
|
463
|
-
expect( subject ).to receive( :hosts= ).with( [ host1 ] )
|
464
|
-
|
465
|
-
subject.confine :to, :platform => 'solaris' do |host|
|
466
|
-
subject.on( host, '/sbin/zonename' ).stdout =~ /:global/
|
467
|
-
end
|
468
|
-
end
|
469
|
-
end
|
470
|
-
|
471
|
-
describe '#select_hosts' do
|
472
|
-
let(:logger) { double.as_null_object }
|
473
|
-
before do
|
474
|
-
allow( subject ).to receive( :logger ).and_return( logger )
|
475
|
-
end
|
476
|
-
|
477
|
-
it 'it returns an empty array if there are no applicable hosts' do
|
478
|
-
hosts = [ {'thing' => 'foo'}, {'thing' => 'bar'} ]
|
479
|
-
|
480
|
-
expect(subject.select_hosts( {'thing' => 'nope'}, hosts )).to be == []
|
481
|
-
end
|
482
|
-
|
483
|
-
it 'selects hosts that match a list of criteria' do
|
484
|
-
hosts = [ {'thing' => 'foo'}, {'thing' => 'bar'}, {'thing' => 'baz'} ]
|
485
|
-
|
486
|
-
expect(subject.select_hosts( {:thing => ['foo', 'baz']}, hosts )).to be == [ {'thing' => 'foo'}, {'thing' => 'baz'} ]
|
487
|
-
end
|
488
|
-
|
489
|
-
it 'selects hosts when a passed block returns true' do
|
490
|
-
host1 = {'platform' => 'solaris1'}
|
491
|
-
host2 = {'platform' => 'solaris2'}
|
492
|
-
host3 = {'platform' => 'windows'}
|
493
|
-
ret1 = double('result1')
|
494
|
-
allow( ret1 ).to receive( :stdout ).and_return(':global')
|
495
|
-
ret2 = double('result2')
|
496
|
-
allow( ret2 ).to receive( :stdout ).and_return('a_zone')
|
497
|
-
hosts = [ host1, host2, host3 ]
|
498
|
-
expect( subject ).to receive( :hosts ).and_return( hosts )
|
499
|
-
|
500
|
-
expect( subject ).to receive( :on ).with( host1, '/sbin/zonename' ).once.and_return( ret1 )
|
501
|
-
expect( subject ).to receive( :on ).with( host2, '/sbin/zonename' ).once.and_return( ret2 )
|
502
|
-
|
503
|
-
selected_hosts = subject.select_hosts 'platform' => 'solaris' do |host|
|
504
|
-
subject.on(host, '/sbin/zonename').stdout =~ /:global/
|
505
|
-
end
|
506
|
-
expect( selected_hosts ).to be == [ host1 ]
|
507
|
-
end
|
508
|
-
end
|
509
78
|
|
510
79
|
describe '#apply_manifest_on' do
|
511
80
|
it 'calls puppet' do
|
@@ -783,33 +352,6 @@ describe ClassMixedWithDSLHelpers do
|
|
783
352
|
end
|
784
353
|
end
|
785
354
|
|
786
|
-
describe 'version_is_less' do
|
787
|
-
|
788
|
-
it 'reports 3.0.0-160-gac44cfb is not less than 3.0.0' do
|
789
|
-
expect( subject.version_is_less( '3.0.0-160-gac44cfb', '3.0.0' ) ).to be === false
|
790
|
-
end
|
791
|
-
|
792
|
-
it 'reports 3.0.0-160-gac44cfb is not less than 2.8.2' do
|
793
|
-
expect( subject.version_is_less( '3.0.0-160-gac44cfb', '2.8.2' ) ).to be === false
|
794
|
-
end
|
795
|
-
|
796
|
-
it 'reports 3.0.0 is less than 3.0.0-160-gac44cfb' do
|
797
|
-
expect( subject.version_is_less( '3.0.0', '3.0.0-160-gac44cfb' ) ).to be === true
|
798
|
-
end
|
799
|
-
|
800
|
-
it 'reports 2.8.2 is less than 3.0.0-160-gac44cfb' do
|
801
|
-
expect( subject.version_is_less( '2.8.2', '3.0.0-160-gac44cfb' ) ).to be === true
|
802
|
-
end
|
803
|
-
|
804
|
-
it 'reports 2.8 is less than 3.0.0-160-gac44cfb' do
|
805
|
-
expect( subject.version_is_less( '2.8', '3.0.0-160-gac44cfb' ) ).to be === true
|
806
|
-
end
|
807
|
-
|
808
|
-
it 'reports 2.8 is less than 2.9' do
|
809
|
-
expect( subject.version_is_less( '2.8', '2.9' ) ).to be === true
|
810
|
-
end
|
811
|
-
end
|
812
|
-
|
813
355
|
describe "#stop_agent_on" do
|
814
356
|
let( :result_fail ) { Beaker::Result.new( [], "" ) }
|
815
357
|
let( :result_pass ) { Beaker::Result.new( [], "" ) }
|
@@ -1257,156 +799,5 @@ describe ClassMixedWithDSLHelpers do
|
|
1257
799
|
end
|
1258
800
|
end
|
1259
801
|
|
1260
|
-
describe '#fact_on' do
|
1261
|
-
it 'retrieves a fact on a single host' do
|
1262
|
-
result.stdout = "family\n"
|
1263
|
-
expect( subject ).to receive(:facter).with('osfamily',{}).once
|
1264
|
-
expect( subject ).to receive(:on).and_return(result)
|
1265
|
-
|
1266
|
-
expect( subject.fact_on('host','osfamily') ).to be === result.stdout.chomp
|
1267
|
-
end
|
1268
|
-
|
1269
|
-
it 'retrieves an array of facts from multiple hosts' do
|
1270
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
1271
|
-
times = hosts.length
|
1272
|
-
result.stdout = "family\n"
|
1273
|
-
hosts.each do |host|
|
1274
|
-
expect( host ).to receive(:exec).and_return(result)
|
1275
|
-
end
|
1276
|
-
|
1277
|
-
expect( subject.fact_on(hosts,'osfamily') ).to be === [result.stdout.chomp] * hosts.length
|
1278
|
-
|
1279
|
-
end
|
1280
|
-
end
|
1281
|
-
|
1282
|
-
describe '#fact' do
|
1283
|
-
it 'delegates to #fact_on with the default host' do
|
1284
|
-
allow( subject ).to receive(:hosts).and_return(hosts)
|
1285
|
-
expect( subject ).to receive(:fact_on).with(master,"osfamily",{}).once
|
1286
|
-
|
1287
|
-
subject.fact('osfamily')
|
1288
|
-
end
|
1289
|
-
end
|
1290
|
-
|
1291
|
-
describe 'modify_tk_config' do
|
1292
|
-
let(:host) { double.as_null_object }
|
1293
|
-
let(:config_file_path) { 'existing-file-path'}
|
1294
|
-
let(:invalid_config_file_path) { 'nonexisting-file-path'}
|
1295
|
-
let(:options_hash) { {:key => 'value'} }
|
1296
|
-
let(:replace) { true }
|
1297
|
-
|
1298
|
-
shared_examples 'modify-tk-config-without-error' do
|
1299
|
-
it 'dumps to the SUT config file path' do
|
1300
|
-
allow( JSON ).to receive(:dump)
|
1301
|
-
allow( subject ).to receive(:create_remote_file).with(host, config_file_path, anything())
|
1302
|
-
subject.modify_tk_config(host, config_file_path, options_hash, replace)
|
1303
|
-
end
|
1304
|
-
end
|
1305
|
-
|
1306
|
-
before do
|
1307
|
-
allow( host ).to receive(:file_exist?).with(invalid_config_file_path).and_return(false)
|
1308
|
-
allow( host ).to receive(:file_exist?).with(config_file_path).and_return(true)
|
1309
|
-
end
|
1310
|
-
|
1311
|
-
describe 'if file does not exist on SUT' do
|
1312
|
-
it 'raises Runtime error' do
|
1313
|
-
expect do
|
1314
|
-
subject.modify_tk_config(host, invalid_config_file_path, options_hash)
|
1315
|
-
end.to raise_error(RuntimeError, /.* does not exist on .*/)
|
1316
|
-
end
|
1317
|
-
end
|
1318
|
-
|
1319
|
-
describe 'given an empty options hash' do
|
1320
|
-
it 'returns nil' do
|
1321
|
-
expect(subject.modify_tk_config(host, 'blahblah', {})).to eq(nil)
|
1322
|
-
end
|
1323
|
-
end
|
1324
|
-
|
1325
|
-
describe 'given a non-empty options hash' do
|
1326
|
-
|
1327
|
-
describe 'given a false value to its `replace` parameter' do
|
1328
|
-
let(:replace) { false }
|
1329
|
-
before do
|
1330
|
-
expect( subject ).to receive(:read_tk_config_string).with(anything())
|
1331
|
-
end
|
1332
|
-
include_examples('modify-tk-config-without-error')
|
1333
|
-
end
|
1334
|
-
|
1335
|
-
describe 'given a true value to its `replace` parameter' do
|
1336
|
-
before do
|
1337
|
-
expect( JSON ).to receive(:dump)
|
1338
|
-
expect( subject ).to receive(:create_remote_file).with(host, config_file_path, anything())
|
1339
|
-
end
|
1340
|
-
include_examples('modify-tk-config-without-error')
|
1341
|
-
end
|
1342
|
-
end
|
1343
|
-
end
|
1344
|
-
|
1345
|
-
describe "#write_hiera_config_on" do
|
1346
|
-
let(:hierarchy) { [ 'nodes/%{::fqdn}', 'common' ] }
|
1347
|
-
it 'on FOSS host' do
|
1348
|
-
host = make_host('testhost', { :platform => 'ubuntu' } )
|
1349
|
-
expect(subject).to receive(:create_remote_file).with(host, host.puppet['hiera_config'], /#{host[:hieradatadir]}/)
|
1350
|
-
subject.write_hiera_config_on(host, hierarchy)
|
1351
|
-
end
|
1352
|
-
|
1353
|
-
it 'on PE host' do
|
1354
|
-
host = make_host('testhost', { :platform => 'ubuntu', :type => 'pe' } )
|
1355
|
-
expect(subject).to receive(:create_remote_file).with(host, host.puppet['hiera_config'], /#{host[:hieradatadir]}/)
|
1356
|
-
subject.write_hiera_config_on(host, hierarchy)
|
1357
|
-
end
|
1358
|
-
|
1359
|
-
end
|
1360
|
-
|
1361
|
-
describe "#write_hiera_config" do
|
1362
|
-
let(:hierarchy) { [ 'nodes/%{::fqdn}', 'common' ] }
|
1363
|
-
it 'delegates to #write_hiera_config_on with the default host' do
|
1364
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
1365
|
-
expect( subject ).to receive( :write_hiera_config_on ).with( master, hierarchy).once
|
1366
|
-
subject.write_hiera_config( hierarchy )
|
1367
|
-
end
|
1368
|
-
|
1369
|
-
end
|
1370
|
-
|
1371
|
-
describe "#copy_hiera_data_to" do
|
1372
|
-
let(:path) { 'spec/fixtures/hieradata' }
|
1373
|
-
it 'on FOSS host' do
|
1374
|
-
host = make_host('testhost', { :platform => 'ubuntu' } )
|
1375
|
-
expect(subject).to receive(:scp_to).with(host, File.expand_path(path), host[:hieradatadir])
|
1376
|
-
subject.copy_hiera_data_to(host, path)
|
1377
|
-
end
|
1378
|
-
|
1379
|
-
it 'on PE host' do
|
1380
|
-
host = make_host('testhost', { :platform => 'ubuntu', :type => 'pe' } )
|
1381
|
-
expect(subject).to receive(:scp_to).with(host, File.expand_path(path), host[:hieradatadir])
|
1382
|
-
subject.copy_hiera_data_to(host, path)
|
1383
|
-
end
|
1384
|
-
end
|
1385
|
-
|
1386
|
-
describe "#copy_hiera_data" do
|
1387
|
-
let(:path) { 'spec/fixtures/hieradata' }
|
1388
|
-
it 'delegates to #copy_hiera_data_to with the default host' do
|
1389
|
-
allow( subject ).to receive( :hosts ).and_return( hosts )
|
1390
|
-
expect( subject ).to receive( :copy_hiera_data_to ).with( master, path).once
|
1391
|
-
subject.copy_hiera_data( path )
|
1392
|
-
end
|
1393
|
-
|
1394
|
-
end
|
1395
|
-
|
1396
|
-
describe '#hiera_datadir' do
|
1397
|
-
it 'returns the codedir based hieradatadir for AIO' do
|
1398
|
-
host = hosts[0]
|
1399
|
-
host['type'] = :aio
|
1400
|
-
correct_answer = File.join(host.puppet['codedir'], 'hieradata')
|
1401
|
-
expect( subject.hiera_datadir(host) ).to be === correct_answer
|
1402
|
-
end
|
1403
|
-
|
1404
|
-
it 'returns the hieradata host value for anything not AIO (backwards compatible)' do
|
1405
|
-
host_hieradatadir_value = '/home/fishing/man/pants'
|
1406
|
-
host = hosts[0]
|
1407
|
-
host[:hieradatadir] = host_hieradatadir_value
|
1408
|
-
expect( subject.hiera_datadir(host) ).to be === host_hieradatadir_value
|
1409
|
-
end
|
1410
|
-
end
|
1411
802
|
|
1412
803
|
end
|