beaker-aws 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/CHANGELOG.md +42 -0
- data/Rakefile +31 -0
- data/beaker-aws.gemspec +4 -2
- data/ec2.md +13 -0
- data/lib/beaker/hypervisor/aws_sdk.rb +271 -201
- data/lib/beaker-aws/version.rb +1 -1
- data/spec/beaker/hypervisor/aws_sdk_spec.rb +381 -272
- metadata +67 -32
@@ -7,17 +7,20 @@ module Beaker
|
|
7
7
|
# Mock out the call to load_fog_credentials
|
8
8
|
allow_any_instance_of( Beaker::AwsSdk ).
|
9
9
|
to receive(:load_fog_credentials).
|
10
|
-
and_return(
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
and_return(Aws::Credentials.new(
|
11
|
+
fog_file_contents[:default][:aws_access_key_id],
|
12
|
+
fog_file_contents[:default][:aws_secret_access_key],
|
13
|
+
fog_file_contents[:default][:aws_session_token],
|
14
|
+
))
|
15
15
|
|
16
16
|
|
17
17
|
# This is needed because the EC2 api looks up a local endpoints.json file
|
18
18
|
FakeFS.deactivate!
|
19
19
|
aws = Beaker::AwsSdk.new(@hosts, options)
|
20
|
+
aws_partitions_dir = Gem::Specification.find_by_name('aws-partitions').gem_dir
|
20
21
|
FakeFS.activate!
|
22
|
+
allow(File).to receive(:exist?).with(File.join(aws_partitions_dir, 'partitions.json'))
|
23
|
+
FakeFS::FileSystem.clone(File.join(aws_partitions_dir, 'partitions.json'))
|
21
24
|
|
22
25
|
aws
|
23
26
|
}
|
@@ -59,9 +62,11 @@ module Beaker
|
|
59
62
|
|
60
63
|
it 'from .fog file' do
|
61
64
|
creds = aws.load_fog_credentials
|
62
|
-
expect(
|
63
|
-
|
64
|
-
|
65
|
+
expect(creds).to have_attributes(
|
66
|
+
:access_key_id => 'IMANACCESSKEY',
|
67
|
+
:secret_access_key => 'supersekritkey',
|
68
|
+
:session_token =>'somecrazylongsupersessiontoken!#%^^*(%$^&@$%#!!#$asd;fjapugfrejklvznb;jdgfjiadvij',
|
69
|
+
)
|
65
70
|
end
|
66
71
|
|
67
72
|
|
@@ -70,9 +75,11 @@ module Beaker
|
|
70
75
|
ENV['AWS_SECRET_ACCESS_KEY'] = "supersekritkey"
|
71
76
|
|
72
77
|
creds = aws.load_env_credentials
|
73
|
-
expect(
|
74
|
-
|
75
|
-
|
78
|
+
expect(creds).to have_attributes(
|
79
|
+
:access_key_id => "IMANACCESSKEY",
|
80
|
+
:secret_access_key => "supersekritkey",
|
81
|
+
:session_token => nil,
|
82
|
+
)
|
76
83
|
end
|
77
84
|
|
78
85
|
it 'from environment variables with session_token' do
|
@@ -81,9 +88,11 @@ module Beaker
|
|
81
88
|
ENV['AWS_SESSION_TOKEN'] = 'somesuperlongsessiontokenspecialcharsblah!#%$#@$^!@qewpofudjsvjm'
|
82
89
|
|
83
90
|
creds = aws.load_env_credentials
|
84
|
-
expect(
|
85
|
-
|
86
|
-
|
91
|
+
expect(creds).to have_attributes(
|
92
|
+
:access_key_id => "IMANACCESSKEY",
|
93
|
+
:secret_access_key => "supersekritkey",
|
94
|
+
:session_token => 'somesuperlongsessiontokenspecialcharsblah!#%$#@$^!@qewpofudjsvjm',
|
95
|
+
)
|
87
96
|
end
|
88
97
|
|
89
98
|
end
|
@@ -91,11 +100,17 @@ module Beaker
|
|
91
100
|
context 'dont read fog credentials' do
|
92
101
|
let(:options) { make_opts.merge({ 'use_fog_credentials' => false }) }
|
93
102
|
|
103
|
+
before(:each) do
|
104
|
+
ENV.delete('AWS_ACCESS_KEY_ID')
|
105
|
+
end
|
106
|
+
|
94
107
|
it 'not using fog' do
|
95
108
|
creds = aws.load_env_credentials
|
96
|
-
expect(
|
97
|
-
|
98
|
-
|
109
|
+
expect(creds).to have_attributes(
|
110
|
+
:access_key_id => nil,
|
111
|
+
:secret_access_key => nil,
|
112
|
+
)
|
113
|
+
expect(options[:use_fog_credentials]).to eq(false)
|
99
114
|
end
|
100
115
|
end
|
101
116
|
|
@@ -121,11 +136,29 @@ module Beaker
|
|
121
136
|
end
|
122
137
|
|
123
138
|
describe '#kill_instances' do
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
139
|
+
def mock_instance(id, state)
|
140
|
+
instance_double(
|
141
|
+
Aws::EC2::Types::Instance,
|
142
|
+
:state => instance_double(Aws::EC2::Types::InstanceState, :name => state),
|
143
|
+
:instance_id => id,
|
144
|
+
)
|
145
|
+
end
|
146
|
+
|
147
|
+
let(:ec2_instance) { mock_instance('ec2', 'running') }
|
148
|
+
let(:vpc_instance) { mock_instance('vpc', 'running') }
|
149
|
+
let(:nil_instance) { nil }
|
150
|
+
let(:unreal_instance) { mock_instance('unreal', 'terminated') }
|
151
|
+
|
128
152
|
subject(:kill_instances) { aws.kill_instances(instance_set) }
|
153
|
+
let(:mock_client) { instance_double(Aws::EC2::Client, :terminate_instances => nil) }
|
154
|
+
|
155
|
+
before(:each) do
|
156
|
+
allow(aws).to receive(:client).and_return(mock_client)
|
157
|
+
allow(aws).to receive(:instance_by_id).with('ec2').and_return(ec2_instance)
|
158
|
+
allow(aws).to receive(:instance_by_id).with('vpc').and_return(vpc_instance)
|
159
|
+
allow(aws).to receive(:instance_by_id).with('nil').and_return(nil_instance)
|
160
|
+
allow(aws).to receive(:instance_by_id).with('unreal').and_return(unreal_instance)
|
161
|
+
end
|
129
162
|
|
130
163
|
it 'should return nil' do
|
131
164
|
instance_set = [ec2_instance, vpc_instance, nil_instance, unreal_instance]
|
@@ -138,28 +171,21 @@ module Beaker
|
|
138
171
|
end
|
139
172
|
|
140
173
|
context 'in general use' do
|
141
|
-
let( :instance_set ) { [ec2_instance, vpc_instance] }
|
174
|
+
let( :instance_set ) { [ec2_instance, nil_instance, vpc_instance] }
|
142
175
|
|
143
176
|
it 'terminates each running instance' do
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
expect(kill_instances).to be_nil
|
148
|
-
end
|
177
|
+
expect(mock_client).to receive(:terminate_instances).with(
|
178
|
+
:instance_ids => [ec2_instance.instance_id, vpc_instance.instance_id],
|
179
|
+
)
|
149
180
|
|
150
|
-
it 'verifies instances are not nil' do
|
151
|
-
instance_set.each do |instance|
|
152
|
-
expect(instance).to receive(:nil?)
|
153
|
-
allow(instance).to receive(:terminate).once
|
154
|
-
end
|
155
181
|
expect(kill_instances).to be_nil
|
156
182
|
end
|
157
183
|
|
158
184
|
it 'verifies instances exist in AWS' do
|
159
|
-
instance_set.each do |instance|
|
160
|
-
expect(
|
161
|
-
allow(instance).to receive(:terminate).once
|
185
|
+
instance_set.compact.each do |instance|
|
186
|
+
expect(aws).to receive(:instance_by_id).with(instance.instance_id)
|
162
187
|
end
|
188
|
+
|
163
189
|
expect(kill_instances).to be_nil
|
164
190
|
end
|
165
191
|
end
|
@@ -168,25 +194,23 @@ module Beaker
|
|
168
194
|
let( :instance_set ) { [ec2_instance] }
|
169
195
|
|
170
196
|
it 'terminates the running instance' do
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
expect(kill_instances).to be_nil
|
175
|
-
end
|
197
|
+
expect(mock_client).to receive(:terminate_instances).with(
|
198
|
+
:instance_ids => [ec2_instance.instance_id],
|
199
|
+
)
|
176
200
|
|
177
|
-
it 'verifies instance is not nil' do
|
178
|
-
instance_set.each do |instance|
|
179
|
-
expect(instance).to receive(:nil?)
|
180
|
-
allow(instance).to receive(:terminate).once
|
181
|
-
end
|
182
201
|
expect(kill_instances).to be_nil
|
183
202
|
end
|
184
203
|
|
185
204
|
it 'verifies instance exists in AWS' do
|
186
205
|
instance_set.each do |instance|
|
187
|
-
|
188
|
-
|
206
|
+
expected_state = instance_double(Aws::EC2::Types::InstanceState, :name => 'running')
|
207
|
+
expect(instance).to receive(:state).and_return(expected_state)
|
189
208
|
end
|
209
|
+
|
210
|
+
expect(mock_client).to receive(:terminate_instances).with(
|
211
|
+
:instance_ids => [ec2_instance.instance_id],
|
212
|
+
)
|
213
|
+
|
190
214
|
expect(kill_instances).to be_nil
|
191
215
|
end
|
192
216
|
end
|
@@ -195,54 +219,47 @@ module Beaker
|
|
195
219
|
let( :instance_set ) { [unreal_instance] }
|
196
220
|
|
197
221
|
it 'does not call terminate' do
|
198
|
-
|
199
|
-
expect(instance).to receive(:terminate).exactly(0).times
|
200
|
-
end
|
222
|
+
expect(mock_client).not_to receive(:terminate_instances)
|
201
223
|
expect(kill_instances).to be_nil
|
202
224
|
end
|
203
225
|
|
204
226
|
it 'verifies instance does not exist' do
|
205
227
|
instance_set.each do |instance|
|
206
|
-
|
207
|
-
|
228
|
+
expected_state = instance_double(Aws::EC2::Types::InstanceState, :name => 'terminated')
|
229
|
+
expect(instance).to receive(:state).and_return(expected_state)
|
208
230
|
end
|
231
|
+
|
232
|
+
expect(mock_client).not_to receive(:terminate_instances)
|
209
233
|
expect(kill_instances).to be_nil
|
210
234
|
end
|
211
235
|
end
|
212
236
|
|
213
237
|
context 'when an instance is nil' do
|
214
|
-
let(
|
238
|
+
let(:instance_set) { [nil_instance] }
|
215
239
|
|
216
240
|
it 'does not call terminate' do
|
217
|
-
|
218
|
-
expect(instance).to receive(:terminate).exactly(0).times
|
219
|
-
end
|
220
|
-
expect(kill_instances).to be_nil
|
221
|
-
end
|
241
|
+
expect(mock_client).not_to receive(:terminate_instances)
|
222
242
|
|
223
|
-
it 'verifies instance is nil' do
|
224
|
-
instance_set.each do |instance|
|
225
|
-
expect(instance).to receive(:nil?).once
|
226
|
-
allow(instance).to receive(:terminate).exactly(0).times
|
227
|
-
end
|
228
243
|
expect(kill_instances).to be_nil
|
229
244
|
end
|
230
245
|
end
|
231
|
-
|
232
246
|
end
|
233
247
|
|
234
248
|
describe '#cleanup' do
|
235
249
|
subject(:cleanup) { aws.cleanup }
|
236
|
-
let(
|
250
|
+
let(:ec2_instance) do
|
251
|
+
instance_double(Aws::EC2::Types::Instance,
|
252
|
+
:instance_id => 'id',
|
253
|
+
:state => instance_double(Aws::EC2::Types::InstanceState, :name => 'running'),
|
254
|
+
)
|
255
|
+
end
|
237
256
|
|
238
257
|
context 'with a list of hosts' do
|
239
258
|
before :each do
|
240
|
-
@hosts.each {|host| host['instance'] = ec2_instance}
|
241
|
-
expect(aws).to receive(
|
259
|
+
@hosts.each { |host| host['instance'] = ec2_instance }
|
260
|
+
expect(aws).to receive(:delete_key_pair_all_regions)
|
242
261
|
end
|
243
262
|
|
244
|
-
it { is_expected.to be_nil }
|
245
|
-
|
246
263
|
it 'kills instances' do
|
247
264
|
expect(aws).to receive(:kill_instances).once
|
248
265
|
expect(cleanup).to be_nil
|
@@ -255,8 +272,6 @@ module Beaker
|
|
255
272
|
expect(aws).to receive( :delete_key_pair_all_regions )
|
256
273
|
end
|
257
274
|
|
258
|
-
it { is_expected.to be_nil }
|
259
|
-
|
260
275
|
it 'kills instances' do
|
261
276
|
expect(aws).to receive(:kill_instances).once
|
262
277
|
expect(cleanup).to be_nil
|
@@ -267,45 +282,32 @@ module Beaker
|
|
267
282
|
describe '#log_instances', :wip do
|
268
283
|
end
|
269
284
|
|
270
|
-
describe '#instance_by_id' do
|
271
|
-
subject { aws.instance_by_id('my_id') }
|
272
|
-
it { is_expected.to be_instance_of(AWS::EC2::Instance) }
|
285
|
+
describe '#instance_by_id', :wip do
|
273
286
|
end
|
274
287
|
|
275
|
-
describe '#instances' do
|
276
|
-
subject { aws.instances }
|
277
|
-
it { is_expected.to be_instance_of(AWS::EC2::InstanceCollection) }
|
288
|
+
describe '#instances', :wip do
|
278
289
|
end
|
279
290
|
|
280
|
-
describe '#vpc_by_id' do
|
281
|
-
subject { aws.vpc_by_id('my_id') }
|
282
|
-
it { is_expected.to be_instance_of(AWS::EC2::VPC) }
|
291
|
+
describe '#vpc_by_id', :wip do
|
283
292
|
end
|
284
293
|
|
285
|
-
describe '#vpcs' do
|
286
|
-
subject { aws.vpcs }
|
287
|
-
it { is_expected.to be_instance_of(AWS::EC2::VPCCollection) }
|
294
|
+
describe '#vpcs', :wip do
|
288
295
|
end
|
289
296
|
|
290
|
-
describe '#security_group_by_id' do
|
291
|
-
subject { aws.security_group_by_id('my_id') }
|
292
|
-
it { is_expected.to be_instance_of(AWS::EC2::SecurityGroup) }
|
297
|
+
describe '#security_group_by_id', :wip do
|
293
298
|
end
|
294
299
|
|
295
|
-
describe '#security_groups' do
|
296
|
-
subject { aws.security_groups }
|
297
|
-
it { is_expected.to be_instance_of(AWS::EC2::SecurityGroupCollection) }
|
300
|
+
describe '#security_groups', :wip do
|
298
301
|
end
|
299
302
|
|
300
303
|
describe '#kill_zombies' do
|
301
304
|
it 'calls delete_key_pair_all_regions' do
|
302
|
-
|
303
|
-
allow(ec2_mock).to receive( :regions ).and_return( {} )
|
304
|
-
aws.instance_variable_set( :@ec2, ec2_mock )
|
305
|
+
allow(aws).to receive(:regions).and_return([])
|
305
306
|
|
306
|
-
expect(
|
307
|
+
expect(aws).to receive(:kill_instances).once
|
308
|
+
expect(aws).to receive(:delete_key_pair_all_regions).once
|
307
309
|
|
308
|
-
aws.kill_zombies
|
310
|
+
aws.kill_zombies
|
309
311
|
end
|
310
312
|
end
|
311
313
|
|
@@ -322,21 +324,34 @@ module Beaker
|
|
322
324
|
end
|
323
325
|
|
324
326
|
describe '#wait_for_status' do
|
325
|
-
let( :aws_instance ) {
|
326
|
-
let( :instance_set ) { [{:instance => aws_instance}] }
|
327
|
+
let( :aws_instance ) { instance_double(Aws::EC2::Types::Instance, :instance_id => "ec2") }
|
328
|
+
let( :instance_set ) { [{:instance => aws_instance, :host => instance_double(Beaker::Host, :name => 'test')}] }
|
327
329
|
subject(:wait_for_status) { aws.wait_for_status(:running, instance_set) }
|
328
330
|
|
331
|
+
def mock_instance(state, other = {})
|
332
|
+
r = instance_double(
|
333
|
+
Aws::EC2::Types::Instance,
|
334
|
+
:instance_id => 'ec2',
|
335
|
+
:state => instance_double(Aws::EC2::Types::InstanceState, :name => state),
|
336
|
+
)
|
337
|
+
|
338
|
+
other.each do |k, v|
|
339
|
+
allow(r).to receive(:[]).with(k).and_return(v)
|
340
|
+
end
|
341
|
+
|
342
|
+
r
|
343
|
+
end
|
344
|
+
|
329
345
|
context 'single instance' do
|
330
346
|
it 'behaves correctly in typical case' do
|
331
|
-
allow(
|
347
|
+
allow(aws).to receive(:instance_by_id).with('ec2').and_return(mock_instance(:waiting), mock_instance(:waiting), mock_instance(:running))
|
332
348
|
expect(aws).to receive(:backoff_sleep).exactly(3).times
|
333
349
|
expect(wait_for_status).to eq(instance_set)
|
334
350
|
end
|
335
351
|
|
336
352
|
it 'executes block correctly instead of status if given one' do
|
337
353
|
barn_value = 'did you grow up in a barn?'
|
338
|
-
|
339
|
-
expect(aws_instance).to receive(:status).exactly(0).times
|
354
|
+
expect(aws).to receive(:instance_by_id).and_return(mock_instance(:running, :barn => barn_value))
|
340
355
|
expect(aws).to receive(:backoff_sleep).exactly(1).times
|
341
356
|
aws.wait_for_status(:running, instance_set) do |instance|
|
342
357
|
expect( instance[:barn] ).to be === barn_value
|
@@ -346,16 +361,35 @@ module Beaker
|
|
346
361
|
end
|
347
362
|
|
348
363
|
context 'with multiple instances' do
|
349
|
-
let(
|
364
|
+
let(:instance_set) do
|
365
|
+
[
|
366
|
+
{ :instance => aws_instance, :host => instance_double(Beaker::Host, :name => 'test1') },
|
367
|
+
{ :instance => aws_instance, :host => instance_double(Beaker::Host, :name => 'test2') },
|
368
|
+
]
|
369
|
+
end
|
350
370
|
|
351
371
|
it 'returns the instance set passed to it' do
|
352
|
-
allow(
|
372
|
+
allow(aws).to receive(:instance_by_id).and_return(
|
373
|
+
mock_instance(:waiting),
|
374
|
+
mock_instance(:waiting),
|
375
|
+
mock_instance(:running),
|
376
|
+
mock_instance(:waiting),
|
377
|
+
mock_instance(:waiting),
|
378
|
+
mock_instance(:running)
|
379
|
+
)
|
353
380
|
allow(aws).to receive(:backoff_sleep).exactly(6).times
|
354
381
|
expect(wait_for_status).to eq(instance_set)
|
355
382
|
end
|
356
383
|
|
357
384
|
it 'calls backoff_sleep once per instance.status call' do
|
358
|
-
allow(
|
385
|
+
allow(aws).to receive(:instance_by_id).and_return(
|
386
|
+
mock_instance(:waiting),
|
387
|
+
mock_instance(:waiting),
|
388
|
+
mock_instance(:running),
|
389
|
+
mock_instance(:waiting),
|
390
|
+
mock_instance(:waiting),
|
391
|
+
mock_instance(:running),
|
392
|
+
)
|
359
393
|
expect(aws).to receive(:backoff_sleep).exactly(6).times
|
360
394
|
expect(wait_for_status).to eq(instance_set)
|
361
395
|
end
|
@@ -364,7 +398,12 @@ module Beaker
|
|
364
398
|
barn_value = 'did you grow up in a barn?'
|
365
399
|
not_barn_value = 'notabarn'
|
366
400
|
allow(aws_instance).to receive( :[] ).with( :barn ).and_return(not_barn_value, barn_value, not_barn_value, barn_value)
|
367
|
-
allow(
|
401
|
+
allow(aws).to receive(:instance_by_id).and_return(
|
402
|
+
mock_instance(:waiting, :barn => not_barn_value),
|
403
|
+
mock_instance(:waiting, :barn => barn_value),
|
404
|
+
mock_instance(:waiting, :barn => not_barn_value),
|
405
|
+
mock_instance(:waiting, :barn => barn_value),
|
406
|
+
)
|
368
407
|
expect(aws).to receive(:backoff_sleep).exactly(4).times
|
369
408
|
aws.wait_for_status(:running, instance_set) do |instance|
|
370
409
|
instance[:barn] == barn_value
|
@@ -374,148 +413,197 @@ module Beaker
|
|
374
413
|
|
375
414
|
context 'after 10 tries' do
|
376
415
|
it 'raises RuntimeError' do
|
377
|
-
expect(
|
416
|
+
expect(aws).to receive(:instance_by_id).and_return(mock_instance(:waiting)).exactly(10).times
|
378
417
|
expect(aws).to receive(:backoff_sleep).exactly(9).times
|
379
418
|
expect { wait_for_status }.to raise_error('Instance never reached state running')
|
380
419
|
end
|
381
420
|
|
382
421
|
it 'still raises RuntimeError if given a block' do
|
383
|
-
expect(
|
422
|
+
expect(aws).to receive(:instance_by_id).and_return(mock_instance(:waiting)).exactly(10).times
|
384
423
|
expect(aws).to receive(:backoff_sleep).exactly(9).times
|
385
424
|
expect { wait_for_status { false } }.to raise_error('Instance never reached state running')
|
386
425
|
end
|
387
426
|
end
|
388
|
-
|
389
|
-
context 'with an invalid instance' do
|
390
|
-
it 'raises AWS::EC2::Errors::InvalidInstanceID::NotFound' do
|
391
|
-
expect(aws_instance).to receive(:status).and_raise(AWS::EC2::Errors::InvalidInstanceID::NotFound).exactly(10).times
|
392
|
-
allow(aws).to receive(:backoff_sleep).at_most(10).times
|
393
|
-
expect(wait_for_status).to eq(instance_set)
|
394
|
-
end
|
395
|
-
end
|
396
427
|
end
|
397
428
|
|
398
429
|
describe '#add_tags' do
|
399
|
-
let(
|
430
|
+
let(:aws_instance) { instance_double(Aws::EC2::Types::Instance, :instance_id => 'id-123') }
|
431
|
+
let(:mock_client) { instance_double(Aws::EC2::Client) }
|
432
|
+
|
400
433
|
subject(:add_tags) { aws.add_tags }
|
401
434
|
|
402
|
-
|
403
|
-
|
404
|
-
|
435
|
+
before(:each) do
|
436
|
+
allow(aws).to receive(:client).and_return(mock_client)
|
437
|
+
allow(mock_client).to receive(:create_tags)
|
405
438
|
end
|
406
439
|
|
407
|
-
it '
|
408
|
-
@hosts[
|
409
|
-
@hosts = [@hosts[0]]
|
440
|
+
it 'returns nil' do
|
441
|
+
@hosts.each {|host| host['instance'] = aws_instance}
|
410
442
|
expect(add_tags).to be_nil
|
411
443
|
end
|
412
444
|
|
413
445
|
context 'with multiple hosts' do
|
414
446
|
before :each do
|
415
|
-
@hosts.
|
447
|
+
@hosts.each_with_index do |host, i|
|
448
|
+
host['instance'] = instance_double(Aws::EC2::Types::Instance, :instance_id => "id-#{i}")
|
449
|
+
end
|
416
450
|
end
|
417
451
|
|
418
452
|
it 'handles host_tags hash on host object' do
|
419
453
|
# set :host_tags on first host
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
454
|
+
@hosts[0][:host_tags] = {'test_tag' => 'test_value'}
|
455
|
+
|
456
|
+
expect(mock_client).to receive(:create_tags).with(
|
457
|
+
:resources => [@hosts[0]['instance'].instance_id],
|
458
|
+
:tags => include(
|
459
|
+
{
|
460
|
+
:key => 'test_tag',
|
461
|
+
:value => 'test_value',
|
462
|
+
},
|
463
|
+
),
|
464
|
+
).once
|
465
|
+
|
424
466
|
expect(add_tags).to be_nil
|
425
467
|
end
|
426
468
|
|
427
469
|
it 'adds tag for jenkins_build_url' do
|
428
470
|
aws.instance_eval('@options[:jenkins_build_url] = "my_build_url"')
|
429
|
-
|
471
|
+
|
472
|
+
expect(mock_client).to receive(:create_tags).with(
|
473
|
+
:resources => anything,
|
474
|
+
:tags => include(
|
475
|
+
{
|
476
|
+
:key => 'jenkins_build_url',
|
477
|
+
:value => 'my_build_url',
|
478
|
+
},
|
479
|
+
),
|
480
|
+
).at_least(:once)
|
481
|
+
|
430
482
|
expect(add_tags).to be_nil
|
431
483
|
end
|
432
484
|
|
433
485
|
it 'adds tag for Name' do
|
434
|
-
expect(
|
486
|
+
expect(mock_client).to receive(:create_tags).with(
|
487
|
+
:resources => anything,
|
488
|
+
:tags => include(
|
489
|
+
{
|
490
|
+
:key => 'Name',
|
491
|
+
:value => a_string_matching(/vm/),
|
492
|
+
},
|
493
|
+
),
|
494
|
+
).at_least(:once)
|
495
|
+
|
435
496
|
expect(add_tags).to be_nil
|
436
497
|
end
|
437
498
|
|
438
499
|
it 'adds tag for department' do
|
439
500
|
aws.instance_eval('@options[:department] = "my_department"')
|
440
|
-
|
501
|
+
|
502
|
+
expect(mock_client).to receive(:create_tags).with(
|
503
|
+
:resources => anything,
|
504
|
+
:tags => include(
|
505
|
+
{
|
506
|
+
:key => 'department',
|
507
|
+
:value => 'my_department',
|
508
|
+
},
|
509
|
+
),
|
510
|
+
).at_least(:once)
|
511
|
+
|
441
512
|
expect(add_tags).to be_nil
|
442
513
|
end
|
443
514
|
|
444
515
|
it 'adds tag for project' do
|
445
516
|
aws.instance_eval('@options[:project] = "my_project"')
|
446
|
-
|
517
|
+
|
518
|
+
expect(mock_client).to receive(:create_tags).with(
|
519
|
+
:resources => anything,
|
520
|
+
:tags => include(
|
521
|
+
{
|
522
|
+
:key => 'project',
|
523
|
+
:value => 'my_project',
|
524
|
+
},
|
525
|
+
),
|
526
|
+
).at_least(:once)
|
527
|
+
|
447
528
|
expect(add_tags).to be_nil
|
448
529
|
end
|
449
530
|
|
450
531
|
it 'adds tag for created_by' do
|
451
532
|
aws.instance_eval('@options[:created_by] = "my_created_by"')
|
452
|
-
|
533
|
+
|
534
|
+
expect(mock_client).to receive(:create_tags).with(
|
535
|
+
:resources => anything,
|
536
|
+
:tags => include(
|
537
|
+
{
|
538
|
+
:key => 'created_by',
|
539
|
+
:value => 'my_created_by',
|
540
|
+
},
|
541
|
+
),
|
542
|
+
).at_least(:once)
|
543
|
+
|
453
544
|
expect(add_tags).to be_nil
|
454
545
|
end
|
455
546
|
end
|
456
547
|
end
|
457
548
|
|
458
549
|
describe '#populate_dns' do
|
459
|
-
let( :vpc_instance )
|
460
|
-
|
550
|
+
let( :vpc_instance ) do
|
551
|
+
instance_double(Aws::EC2::Types::Instance, public_ip_address: nil, private_ip_address: "vpc_private_ip", public_dns_name: "vpc_dns_name")
|
552
|
+
end
|
553
|
+
let( :ec2_instance ) do
|
554
|
+
instance_double(Aws::EC2::Types::Instance, public_ip_address: "ec2_public_ip", private_ip_address: "ec2_private_ip", public_dns_name: "ec2_dns_name")
|
555
|
+
end
|
461
556
|
subject(:populate_dns) { aws.populate_dns }
|
557
|
+
subject(:hosts) { aws.instance_variable_get(:@hosts) }
|
462
558
|
|
463
559
|
context 'on a public EC2 instance' do
|
464
560
|
before :each do
|
465
|
-
@hosts.each {|host| host['instance'] =
|
466
|
-
end
|
561
|
+
@hosts.each { |host| host['instance'] = ec2_instance }
|
467
562
|
|
468
|
-
it 'sets host ip to instance.ip_address' do
|
469
563
|
populate_dns
|
470
|
-
|
564
|
+
end
|
565
|
+
|
566
|
+
it 'sets host ip to instance.public_ip_address' do
|
471
567
|
hosts.each do |host|
|
472
|
-
expect(host['ip']).to eql(ec2_instance
|
568
|
+
expect(host['ip']).to eql(ec2_instance.public_ip_address)
|
473
569
|
end
|
474
570
|
end
|
475
571
|
|
476
572
|
it 'sets host private_ip to instance.private_ip_address' do
|
477
|
-
populate_dns
|
478
|
-
hosts = aws.instance_variable_get( :@hosts )
|
479
573
|
hosts.each do |host|
|
480
|
-
expect(host['private_ip']).to eql(ec2_instance
|
574
|
+
expect(host['private_ip']).to eql(ec2_instance.private_ip_address)
|
481
575
|
end
|
482
576
|
end
|
483
577
|
|
484
|
-
it 'sets host dns_name to instance.
|
485
|
-
populate_dns
|
486
|
-
hosts = aws.instance_variable_get( :@hosts )
|
578
|
+
it 'sets host dns_name to instance.public_dns_name' do
|
487
579
|
hosts.each do |host|
|
488
|
-
expect(host['dns_name']).to eql(ec2_instance
|
580
|
+
expect(host['dns_name']).to eql(ec2_instance.public_dns_name)
|
489
581
|
end
|
490
582
|
end
|
491
583
|
end
|
492
584
|
|
493
585
|
context 'on a VPC based instance' do
|
494
586
|
before :each do
|
495
|
-
@hosts.each {|host| host['instance'] =
|
587
|
+
@hosts.each { |host| host['instance'] = vpc_instance }
|
588
|
+
|
589
|
+
populate_dns
|
496
590
|
end
|
497
591
|
|
498
592
|
it 'sets host ip to instance.private_ip_address' do
|
499
|
-
populate_dns
|
500
|
-
hosts = aws.instance_variable_get( :@hosts )
|
501
593
|
hosts.each do |host|
|
502
|
-
expect(host['ip']).to eql(vpc_instance
|
594
|
+
expect(host['ip']).to eql(vpc_instance.private_ip_address)
|
503
595
|
end
|
504
596
|
end
|
505
597
|
|
506
598
|
it 'sets host private_ip to instance.private_ip_address' do
|
507
|
-
populate_dns
|
508
|
-
hosts = aws.instance_variable_get( :@hosts )
|
509
599
|
hosts.each do |host|
|
510
|
-
expect(host['private_ip']).to eql(vpc_instance
|
600
|
+
expect(host['private_ip']).to eql(vpc_instance.private_ip_address)
|
511
601
|
end
|
512
602
|
end
|
513
603
|
|
514
|
-
it 'sets host dns_name to instance.
|
515
|
-
populate_dns
|
516
|
-
hosts = aws.instance_variable_get( :@hosts )
|
604
|
+
it 'sets host dns_name to instance.public_dns_name' do
|
517
605
|
hosts.each do |host|
|
518
|
-
expect(host['dns_name']).to eql(vpc_instance
|
606
|
+
expect(host['dns_name']).to eql(vpc_instance.public_dns_name)
|
519
607
|
end
|
520
608
|
end
|
521
609
|
end
|
@@ -608,13 +696,11 @@ module Beaker
|
|
608
696
|
end
|
609
697
|
|
610
698
|
describe '#enable_root_netscaler' do
|
611
|
-
let(
|
699
|
+
let(:ns_host) { @hosts[5] }
|
612
700
|
subject(:enable_root_netscaler) { aws.enable_root_netscaler(ns_host) }
|
613
701
|
|
614
702
|
it 'set password to instance id of the host' do
|
615
|
-
|
616
|
-
allow( instance_mock ).to receive(:id).and_return("i-842018")
|
617
|
-
ns_host["instance"]=instance_mock
|
703
|
+
ns_host["instance"] = instance_double(Aws::EC2::Types::Instance, :instance_id => 'i-842018')
|
618
704
|
enable_root_netscaler
|
619
705
|
expect(ns_host['ssh'][:password]).to eql("i-842018")
|
620
706
|
end
|
@@ -701,6 +787,8 @@ module Beaker
|
|
701
787
|
end
|
702
788
|
|
703
789
|
it "should return an error if the files do not exist" do
|
790
|
+
allow(File).to receive(:exist?).with(/id_[dr]sa.pub/) { false }
|
791
|
+
allow(File).to receive(:exist?).with(/id_[dr]sa/) { false }
|
704
792
|
expect { public_key }.to raise_error(RuntimeError, /Expected to find a public key/)
|
705
793
|
end
|
706
794
|
|
@@ -761,124 +849,133 @@ module Beaker
|
|
761
849
|
end
|
762
850
|
|
763
851
|
describe '#delete_key_pair_all_regions' do
|
852
|
+
before(:each) do
|
853
|
+
allow(aws).to receive(:my_key_pairs).and_return(region_keypairs)
|
854
|
+
end
|
855
|
+
|
856
|
+
after(:each) do
|
857
|
+
aws.delete_key_pair_all_regions
|
858
|
+
end
|
859
|
+
|
860
|
+
let(:region_keypairs) do
|
861
|
+
{
|
862
|
+
'test1' => ['key1', 'key2', 'key3'],
|
863
|
+
'test2' => ['key4', 'key5', 'key6'],
|
864
|
+
}
|
865
|
+
end
|
866
|
+
|
764
867
|
it 'calls delete_key_pair over all regions' do
|
765
|
-
|
766
|
-
allow(aws).to receive( :key_name ).and_return(key_name)
|
767
|
-
regions = []
|
768
|
-
regions << double('region', :key_pairs => 'pair1', :name => 'name1')
|
769
|
-
regions << double('region', :key_pairs => 'pair2', :name => 'name2')
|
770
|
-
ec2_mock = Object.new
|
771
|
-
allow(ec2_mock).to receive( :regions ).and_return(regions)
|
772
|
-
aws.instance_variable_set( :@ec2, ec2_mock )
|
773
|
-
region_keypairs_hash_mock = {}
|
774
|
-
region_keypairs_hash_mock[double('region')] = ['key1', 'key2', 'key3']
|
775
|
-
region_keypairs_hash_mock[double('region')] = ['key4', 'key5', 'key6']
|
776
|
-
allow( aws ).to receive( :my_key_pairs ).and_return( region_keypairs_hash_mock )
|
777
|
-
|
778
|
-
region_keypairs_hash_mock.each_pair do |region, keyname_array|
|
868
|
+
region_keypairs.each do |region, keyname_array|
|
779
869
|
keyname_array.each do |keyname|
|
780
|
-
expect(
|
870
|
+
expect(aws).to receive(:delete_key_pair).with(region, keyname)
|
781
871
|
end
|
782
872
|
end
|
783
|
-
aws.delete_key_pair_all_regions
|
784
873
|
end
|
785
874
|
end
|
786
875
|
|
787
876
|
describe '#my_key_pairs' do
|
788
|
-
let(
|
877
|
+
let(:regions) { ['name1', 'name2'] }
|
878
|
+
let(:mock_clients) { regions.map { |r| [r, instance_double(Aws::EC2::Client)] }.to_h }
|
879
|
+
let(:default_key_name) { 'test_pair_6193' }
|
880
|
+
|
881
|
+
before(:each) do
|
882
|
+
allow(aws).to receive(:regions).and_return(regions)
|
883
|
+
allow(aws).to receive(:key_name).and_return(default_key_name)
|
884
|
+
|
885
|
+
regions.each do |region|
|
886
|
+
allow(aws).to receive(:client).with(region).and_return(mock_clients[region])
|
887
|
+
end
|
888
|
+
end
|
789
889
|
|
790
890
|
it 'uses the default keyname if no filter is given' do
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
|
795
|
-
|
796
|
-
regions = []
|
797
|
-
regions << double('region', :key_pairs => kp_mock_1, :name => 'name1')
|
798
|
-
regions << double('region', :key_pairs => kp_mock_2, :name => 'name2')
|
799
|
-
ec2_mock = Object.new
|
800
|
-
allow( ec2_mock ).to receive( :regions ).and_return( regions )
|
801
|
-
aws.instance_variable_set( :@ec2, ec2_mock )
|
802
|
-
|
803
|
-
kp_mock = double('keypair')
|
804
|
-
allow( region ).to receive( :key_pairs ).and_return( kp_mock )
|
805
|
-
expect( kp_mock_1 ).to receive( :filter ).with( 'key-name', default_keyname_answer ).and_return( [] )
|
806
|
-
expect( kp_mock_2 ).to receive( :filter ).with( 'key-name', default_keyname_answer ).and_return( [] )
|
891
|
+
regions.each do |region|
|
892
|
+
expect(mock_clients[region]).to receive(:describe_key_pairs).with(
|
893
|
+
:filters => [{ :name => 'key-name', :values => [default_key_name] }]
|
894
|
+
).and_return(instance_double(Aws::EC2::Types::DescribeKeyPairsResult, :key_pairs => []))
|
895
|
+
end
|
807
896
|
|
808
897
|
aws.my_key_pairs()
|
809
898
|
end
|
810
899
|
|
811
900
|
it 'uses the filter passed if given' do
|
812
|
-
default_keyname_answer = 'test_pair_6194'
|
813
|
-
allow( aws ).to receive( :key_name ).and_return( default_keyname_answer )
|
814
901
|
name_filter = 'filter_pair_1597'
|
815
|
-
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
ec2_mock = Object.new
|
823
|
-
allow( ec2_mock ).to receive( :regions ).and_return( regions )
|
824
|
-
aws.instance_variable_set( :@ec2, ec2_mock )
|
825
|
-
|
826
|
-
kp_mock = double('keypair')
|
827
|
-
allow( region ).to receive( :key_pairs ).and_return( kp_mock )
|
828
|
-
expect( kp_mock_1 ).to receive( :filter ).with( 'key-name', filter_star ).and_return( [] )
|
829
|
-
expect( kp_mock_2 ).to receive( :filter ).with( 'key-name', filter_star ).and_return( [] )
|
902
|
+
filter_pattern = "#{name_filter}-*"
|
903
|
+
|
904
|
+
regions.each do |region|
|
905
|
+
expect(mock_clients[region]).to receive(:describe_key_pairs).with(
|
906
|
+
:filters => [{ :name => 'key-name', :values => [filter_pattern] }]
|
907
|
+
).and_return(instance_double(Aws::EC2::Types::DescribeKeyPairsResult, :key_pairs => []))
|
908
|
+
end
|
830
909
|
|
831
910
|
aws.my_key_pairs(name_filter)
|
832
911
|
end
|
833
912
|
end
|
834
913
|
|
835
914
|
describe '#delete_key_pair' do
|
836
|
-
let(
|
915
|
+
let(:region) { 'test_region_name' }
|
916
|
+
let(:mock_client) { instance_double(Aws::EC2::Client) }
|
917
|
+
let(:pair_name) { 'pair1' }
|
837
918
|
|
838
|
-
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
allow( region ).to receive( :key_pairs ).and_return( pairs )
|
844
|
-
aws.delete_key_pair(region, pair_name)
|
919
|
+
before(:each) do
|
920
|
+
allow(aws).to receive(:client).with(region).and_return(mock_client)
|
921
|
+
allow(mock_client).to receive(:describe_key_pairs).with(
|
922
|
+
:key_names => [pair_name]
|
923
|
+
).and_return(instance_double(Aws::EC2::Types::DescribeKeyPairsResult, :key_pairs => result))
|
845
924
|
end
|
846
925
|
|
847
|
-
|
848
|
-
pair_name = 'pair1'
|
849
|
-
kp_mock = double('keypair', :exists? => false)
|
850
|
-
expect( kp_mock ).to receive( :delete ).never
|
851
|
-
pairs = { pair_name => kp_mock }
|
852
|
-
allow( region ).to receive( :key_pairs ).and_return( pairs )
|
926
|
+
after(:each) do
|
853
927
|
aws.delete_key_pair(region, pair_name)
|
854
928
|
end
|
929
|
+
|
930
|
+
context 'when the keypair exists' do
|
931
|
+
let(:result) { [instance_double(Aws::EC2::Types::KeyPairInfo)] }
|
932
|
+
|
933
|
+
it 'deletes the keypair' do
|
934
|
+
expect(mock_client).to receive(:delete_key_pair).with(:key_name => pair_name)
|
935
|
+
end
|
936
|
+
end
|
937
|
+
|
938
|
+
context 'when the keypair does not exist' do
|
939
|
+
let(:result) { [] }
|
940
|
+
|
941
|
+
it 'does not try to delete the keypair' do
|
942
|
+
expect(mock_client).not_to receive(:delete_key_pair)
|
943
|
+
end
|
944
|
+
end
|
855
945
|
end
|
856
946
|
|
857
947
|
describe '#create_new_key_pair' do
|
858
|
-
let(:region) {
|
948
|
+
let(:region) { 'test_region_name' }
|
859
949
|
let(:ssh_string) { 'ssh_string_test_0867' }
|
860
|
-
let(:
|
861
|
-
let(:pair) { double('keypair') }
|
950
|
+
let(:pair) { instance_double(Aws::EC2::Types::KeyPairInfo) }
|
862
951
|
let(:pair_name) { 'pair_name_1555432' }
|
952
|
+
let(:mock_client) { instance_double(Aws::EC2::Client) }
|
863
953
|
|
864
954
|
before :each do
|
955
|
+
allow(aws).to receive(:client).with(region).and_return(mock_client)
|
865
956
|
allow(aws).to receive(:public_key).and_return(ssh_string)
|
866
|
-
|
867
|
-
|
868
|
-
|
957
|
+
allow(mock_client).to receive(:import_key_pair).with(
|
958
|
+
:key_name => pair_name,
|
959
|
+
:public_key_material => ssh_string,
|
960
|
+
)
|
961
|
+
allow(mock_client).to receive(:wait_until).with(:key_pair_exists, any_args)
|
869
962
|
end
|
870
963
|
|
871
964
|
it 'imports the key given from public_key' do
|
872
|
-
expect(
|
965
|
+
expect(mock_client).to receive(:import_key_pair).with(
|
966
|
+
:key_name => pair_name,
|
967
|
+
:public_key_material => ssh_string,
|
968
|
+
)
|
969
|
+
|
873
970
|
aws.create_new_key_pair(region, pair_name)
|
874
971
|
end
|
875
972
|
|
876
973
|
it 'raises an exception if subsequent keypair check is false' do
|
877
|
-
|
878
|
-
expect
|
879
|
-
|
880
|
-
|
881
|
-
|
974
|
+
allow(mock_client).to receive(:wait_until).with(:key_pair_exists, any_args).and_raise(Aws::Waiters::Errors::WaiterFailed)
|
975
|
+
expect {
|
976
|
+
aws.create_new_key_pair(region, pair_name)
|
977
|
+
}.to raise_error(RuntimeError,
|
978
|
+
"AWS key pair #{pair_name} can not be queried, even after import")
|
882
979
|
end
|
883
980
|
end
|
884
981
|
|
@@ -893,84 +990,96 @@ module Beaker
|
|
893
990
|
end
|
894
991
|
|
895
992
|
describe '#ensure_group' do
|
896
|
-
let(
|
897
|
-
let(
|
993
|
+
let(:vpc) { instance_double(Aws::EC2::Types::Vpc, :vpc_id => 1) }
|
994
|
+
let(:ports) { [22, 80, 8080] }
|
898
995
|
subject(:ensure_group) { aws.ensure_group(vpc, ports) }
|
899
996
|
|
997
|
+
let(:mock_client) { instance_double(Aws::EC2::Client) }
|
998
|
+
|
999
|
+
before :each do
|
1000
|
+
allow(aws).to receive(:client).and_return(mock_client)
|
1001
|
+
end
|
1002
|
+
|
1003
|
+
let(:security_group_result) do
|
1004
|
+
instance_double(Aws::EC2::Types::DescribeSecurityGroupsResult, :security_groups => [group])
|
1005
|
+
end
|
1006
|
+
|
900
1007
|
context 'for an existing group' do
|
901
|
-
|
902
|
-
@group = double(:nil? => false)
|
903
|
-
end
|
1008
|
+
let(:group) { instance_double(Aws::EC2::Types::SecurityGroup, :group_name => 'Beaker-1521896090') }
|
904
1009
|
|
905
1010
|
it 'returns group from vpc lookup' do
|
906
|
-
|
907
|
-
expect(ensure_group).to eq(
|
1011
|
+
allow(mock_client).to receive(:describe_security_groups).with(any_args).and_return(security_group_result)
|
1012
|
+
expect(ensure_group).to eq(group)
|
908
1013
|
end
|
909
1014
|
|
910
1015
|
context 'during group lookup' do
|
911
1016
|
it 'performs group_id lookup for ports' do
|
912
1017
|
expect(aws).to receive(:group_id).with(ports)
|
913
|
-
|
914
|
-
expect(ensure_group).to eq(
|
1018
|
+
allow(mock_client).to receive(:describe_security_groups).with(any_args).and_return(security_group_result)
|
1019
|
+
expect(ensure_group).to eq(group)
|
915
1020
|
end
|
916
1021
|
|
917
1022
|
it 'filters on group_id' do
|
918
|
-
|
919
|
-
expect(
|
920
|
-
expect(vpc).to receive(:first).and_return(@group)
|
921
|
-
expect(ensure_group).to eq(@group)
|
1023
|
+
allow(mock_client).to receive(:describe_security_groups).with(:filters => include({:name => 'group-name', :values => ['Beaker-1521896090']})).and_return(security_group_result)
|
1024
|
+
expect(ensure_group).to eq(group)
|
922
1025
|
end
|
923
1026
|
end
|
924
1027
|
end
|
925
1028
|
|
926
1029
|
context 'when group does not exist' do
|
1030
|
+
let(:group) { nil }
|
1031
|
+
|
927
1032
|
it 'creates group if group.nil?' do
|
928
|
-
group = double(:nil? => true)
|
929
1033
|
expect(aws).to receive(:create_group).with(vpc, ports).and_return(group)
|
930
|
-
|
1034
|
+
allow(mock_client).to receive(:describe_security_groups).with(any_args).and_return(security_group_result)
|
931
1035
|
expect(ensure_group).to eq(group)
|
932
1036
|
end
|
933
1037
|
end
|
934
1038
|
end
|
935
1039
|
|
936
1040
|
describe '#create_group' do
|
937
|
-
let(
|
938
|
-
let(
|
1041
|
+
let(:rv) { double('rv') }
|
1042
|
+
let(:ports) { [22, 80, 8080] }
|
939
1043
|
subject(:create_group) { aws.create_group(rv, ports) }
|
940
1044
|
|
941
|
-
|
942
|
-
|
1045
|
+
let(:group) { instance_double(Aws::EC2::Types::SecurityGroup, :group_id => 1) }
|
1046
|
+
let(:mock_client) { instance_double(Aws::EC2::Client) }
|
1047
|
+
|
1048
|
+
before(:each) do
|
1049
|
+
allow(aws).to receive(:client).and_return(mock_client)
|
943
1050
|
end
|
944
1051
|
|
945
1052
|
it 'returns a newly created group' do
|
946
|
-
allow(
|
947
|
-
allow(
|
948
|
-
expect(create_group).to eq(
|
1053
|
+
allow(mock_client).to receive(:create_security_group).with(any_args).and_return(group)
|
1054
|
+
allow(mock_client).to receive(:authorize_security_group_ingress).with(include(:group_id => group.group_id)).at_least(:once)
|
1055
|
+
expect(create_group).to eq(group)
|
949
1056
|
end
|
950
1057
|
|
951
1058
|
it 'requests group_id for ports given' do
|
952
1059
|
expect(aws).to receive(:group_id).with(ports)
|
953
|
-
allow(
|
954
|
-
allow(
|
955
|
-
expect(create_group).to eq(
|
1060
|
+
allow(mock_client).to receive(:create_security_group).with(any_args).and_return(group)
|
1061
|
+
allow(mock_client).to receive(:authorize_security_group_ingress).with(include(:group_id => group.group_id)).at_least(:once)
|
1062
|
+
expect(create_group).to eq(group)
|
956
1063
|
end
|
957
1064
|
|
958
1065
|
it 'creates group with expected arguments' do
|
959
1066
|
group_name = "Beaker-1521896090"
|
960
1067
|
group_desc = "Custom Beaker security group for #{ports.to_a}"
|
961
|
-
expect(
|
962
|
-
|
963
|
-
|
964
|
-
|
965
|
-
|
1068
|
+
expect(mock_client).to receive(:create_security_group).with(
|
1069
|
+
:group_name => group_name,
|
1070
|
+
:description => group_desc,
|
1071
|
+
).and_return(group)
|
1072
|
+
allow(mock_client).to receive(:authorize_security_group_ingress).with(include(:group_id => group.group_id)).at_least(:once)
|
1073
|
+
expect(create_group).to eq(group)
|
966
1074
|
end
|
967
1075
|
|
968
1076
|
it 'authorizes requested ports for group' do
|
969
|
-
|
1077
|
+
allow(mock_client).to receive(:create_security_group).with(any_args).and_return(group)
|
1078
|
+
|
970
1079
|
ports.each do |port|
|
971
|
-
expect(
|
1080
|
+
expect(mock_client).to receive(:authorize_security_group_ingress).with(include(:to_port => port)).once
|
972
1081
|
end
|
973
|
-
expect(create_group).to eq(
|
1082
|
+
expect(create_group).to eq(group)
|
974
1083
|
end
|
975
1084
|
end
|
976
1085
|
|
@@ -980,19 +1089,19 @@ module Beaker
|
|
980
1089
|
subject(:load_fog_credentials) { aws.load_fog_credentials(dot_fog) }
|
981
1090
|
|
982
1091
|
it 'returns loaded fog credentials' do
|
983
|
-
creds = {:
|
1092
|
+
creds = {:access_key_id => 'awskey', :secret_access_key => 'awspass', :session_token => nil}
|
984
1093
|
fog_hash = {:default => {:aws_access_key_id => 'awskey', :aws_secret_access_key => 'awspass'}}
|
985
1094
|
expect(aws).to receive(:load_fog_credentials).and_call_original
|
986
1095
|
expect(YAML).to receive(:load_file).and_return(fog_hash)
|
987
|
-
expect(load_fog_credentials).to
|
1096
|
+
expect(load_fog_credentials).to have_attributes(creds)
|
988
1097
|
end
|
989
1098
|
|
990
1099
|
it 'returns loaded fog credentials with session token' do
|
991
|
-
creds = {:
|
1100
|
+
creds = {:access_key_id => 'awskey', :secret_access_key => 'awspass', :session_token => 'sometoken'}
|
992
1101
|
fog_hash = {:default => {:aws_access_key_id => 'awskey', :aws_secret_access_key => 'awspass', :aws_session_token => 'sometoken'}}
|
993
1102
|
expect(aws).to receive(:load_fog_credentials).and_call_original
|
994
1103
|
expect(YAML).to receive(:load_file).and_return(fog_hash)
|
995
|
-
expect(load_fog_credentials).to
|
1104
|
+
expect(load_fog_credentials).to have_attributes(creds)
|
996
1105
|
end
|
997
1106
|
|
998
1107
|
context 'raises errors' do
|