kitchen-ec2 0.9.4 → 0.9.5
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +11 -0
- data/lib/kitchen/driver/ec2.rb +18 -9
- data/lib/kitchen/driver/ec2_version.rb +1 -1
- data/spec/kitchen/driver/ec2_spec.rb +76 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3a4c3c1651c87e7efe1021c8c7f42eea85b1bd50
|
|
4
|
+
data.tar.gz: 4f9beb18601e10e003b579da74f2920061040543
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0a8da55831097f198d69c3de6c0474cc9a85aedbaf15b96180a198c9ce3455ef5ce8081f75aeecb80a211ca0d2002118f39a1e5b23ae83d3f41aa692d7adcf01
|
|
7
|
+
data.tar.gz: 5aa911a240efb08e0fce0d17adab20a7851fd8ec4ec1718459739e8ad5a0a264f10e7c4267b1fb0cdbb231d3973aec9b7067570f5364ed3074c7273900b4e8fc
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
## 0.9.4 / 2015-06-05
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
|
|
5
|
+
* Pull Request [#151][]: Fixing a regression where we are fetching the hostname from an old server object even after waiting for it to update, causing us to get back an invalid hostname
|
|
6
|
+
|
|
7
|
+
### New Features
|
|
8
|
+
|
|
9
|
+
### Improvements
|
|
10
|
+
|
|
1
11
|
## 0.9.4 / 2015-06-03
|
|
2
12
|
|
|
3
13
|
### Bug Fixes
|
|
@@ -165,6 +175,7 @@
|
|
|
165
175
|
[#131]: https://github.com/test-kitchen/kitchen-ec2/issues/131
|
|
166
176
|
[#140]: https://github.com/test-kitchen/kitchen-ec2/issues/140
|
|
167
177
|
[#142]: https://github.com/test-kitchen/kitchen-ec2/issues/142
|
|
178
|
+
[#151]: https://github.com/test-kitchen/kitchen-ec2/issues/151
|
|
168
179
|
[@Atalanta]: https://github.com/Atalanta
|
|
169
180
|
[@Igorshp]: https://github.com/Igorshp
|
|
170
181
|
[@JamesAwesome]: https://github.com/JamesAwesome
|
data/lib/kitchen/driver/ec2.rb
CHANGED
|
@@ -201,7 +201,6 @@ module Kitchen
|
|
|
201
201
|
wait_until_ready(server, state)
|
|
202
202
|
|
|
203
203
|
info("EC2 instance <#{state[:server_id]}> ready.")
|
|
204
|
-
state[:hostname] = hostname(server)
|
|
205
204
|
instance.transport.connection(state).wait_until_ready
|
|
206
205
|
create_ec2_json(state)
|
|
207
206
|
debug("ec2:create '#{state[:hostname]}'")
|
|
@@ -317,24 +316,34 @@ module Kitchen
|
|
|
317
316
|
end
|
|
318
317
|
|
|
319
318
|
def wait_until_ready(server, state)
|
|
319
|
+
wait_with_destroy(server, state, "to become ready") do |aws_instance|
|
|
320
|
+
hostname = hostname(aws_instance, config[:interface])
|
|
321
|
+
# We aggressively store the hostname so if the process fails here
|
|
322
|
+
# we still have it, even if it will change later
|
|
323
|
+
state[:hostname] = hostname
|
|
324
|
+
# Euca instances often report ready before they have an IP
|
|
325
|
+
aws_instance.exists? &&
|
|
326
|
+
aws_instance.state.name == "running" &&
|
|
327
|
+
hostname != "0.0.0.0"
|
|
328
|
+
end
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
def wait_with_destroy(server, state, status_msg, &block)
|
|
320
332
|
wait_log = proc do |attempts|
|
|
321
333
|
c = attempts * config[:retryable_sleep]
|
|
322
334
|
t = config[:retryable_tries] * config[:retryable_sleep]
|
|
323
|
-
info "Waited #{c}/#{t}s for instance <#{state[:server_id]}>
|
|
335
|
+
info "Waited #{c}/#{t}s for instance <#{state[:server_id]}> #{status_msg}."
|
|
324
336
|
end
|
|
325
337
|
begin
|
|
326
338
|
server.wait_until(
|
|
327
339
|
:max_attempts => config[:retryable_tries],
|
|
328
340
|
:delay => config[:retryable_sleep],
|
|
329
|
-
:before_attempt => wait_log
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
# Euca instances often report ready before they have an IP
|
|
333
|
-
s.exists? && s.state.name == "running" && !hostname.nil? && hostname != "0.0.0.0"
|
|
334
|
-
end
|
|
341
|
+
:before_attempt => wait_log,
|
|
342
|
+
&block
|
|
343
|
+
)
|
|
335
344
|
rescue ::Aws::Waiters::Errors::WaiterFailed
|
|
336
345
|
error("Ran out of time waiting for the server with id [#{state[:server_id]}]" \
|
|
337
|
-
"
|
|
346
|
+
" #{status_msg}, attempting to destroy it")
|
|
338
347
|
destroy(state)
|
|
339
348
|
raise
|
|
340
349
|
end
|
|
@@ -38,6 +38,7 @@ describe Kitchen::Driver::Ec2 do
|
|
|
38
38
|
let(:actual_client) { double("actual ec2 client") }
|
|
39
39
|
let(:client) { double(Kitchen::Driver::Aws::Client, :client => actual_client) }
|
|
40
40
|
let(:server) { double("aws server object") }
|
|
41
|
+
let(:state) { {} }
|
|
41
42
|
|
|
42
43
|
let(:driver) { Kitchen::Driver::Ec2.new(config) }
|
|
43
44
|
|
|
@@ -223,9 +224,83 @@ describe Kitchen::Driver::Ec2 do
|
|
|
223
224
|
end
|
|
224
225
|
end
|
|
225
226
|
|
|
227
|
+
describe "#wait_until_ready" do
|
|
228
|
+
let(:hostname) { "0.0.0.0" }
|
|
229
|
+
let(:msg) { "to become ready" }
|
|
230
|
+
let(:aws_instance) { double("aws instance") }
|
|
231
|
+
|
|
232
|
+
before do
|
|
233
|
+
config[:interface] = :i
|
|
234
|
+
expect(driver).to receive(:wait_with_destroy).with(server, state, msg).and_yield(aws_instance)
|
|
235
|
+
expect(driver).to receive(:hostname).with(aws_instance, :i).and_return(hostname)
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
after do
|
|
239
|
+
expect(state[:hostname]).to eq(hostname)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
it "first checks instance existence" do
|
|
243
|
+
expect(aws_instance).to receive(:exists?).and_return(false)
|
|
244
|
+
expect(driver.wait_until_ready(server, state)).to eq(false)
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
it "second checks instance state" do
|
|
248
|
+
expect(aws_instance).to receive(:exists?).and_return(true)
|
|
249
|
+
expect(aws_instance).to receive_message_chain("state.name").and_return("nope")
|
|
250
|
+
expect(driver.wait_until_ready(server, state)).to eq(false)
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
it "third checks hostname" do
|
|
254
|
+
expect(aws_instance).to receive(:exists?).and_return(true)
|
|
255
|
+
expect(aws_instance).to receive_message_chain("state.name").and_return("running")
|
|
256
|
+
expect(driver.wait_until_ready(server, state)).to eq(false)
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
context "when it exists, has a valid state and a valid hostname" do
|
|
260
|
+
let(:hostname) { "host" }
|
|
261
|
+
|
|
262
|
+
it "returns true" do
|
|
263
|
+
expect(aws_instance).to receive(:exists?).and_return(true)
|
|
264
|
+
expect(aws_instance).to receive_message_chain("state.name").and_return("running")
|
|
265
|
+
expect(driver.wait_until_ready(server, state)).to eq(true)
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
describe "#wait_with_destroy" do
|
|
271
|
+
let(:tries) { 111 }
|
|
272
|
+
let(:sleep) { 222 }
|
|
273
|
+
let(:msg) { "msg" }
|
|
274
|
+
given_block = lambda do; end
|
|
275
|
+
|
|
276
|
+
before do
|
|
277
|
+
config[:retryable_sleep] = sleep
|
|
278
|
+
config[:retryable_tries] = tries
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
it "calls wait and exits successfully if there is no error" do
|
|
282
|
+
expect(server).to receive(:wait_until) do |args, &block|
|
|
283
|
+
expect(args[:max_attempts]).to eq(tries)
|
|
284
|
+
expect(args[:delay]).to eq(sleep)
|
|
285
|
+
expect(block).to eq(given_block)
|
|
286
|
+
expect(driver).to receive(:info).with(/#{msg}/)
|
|
287
|
+
args[:before_attempt].call(0)
|
|
288
|
+
end
|
|
289
|
+
driver.wait_with_destroy(server, state, msg, &given_block)
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
it "attempts to destroy the instance if the waiter fails" do
|
|
293
|
+
expect(server).to receive(:wait_until).and_raise(::Aws::Waiters::Errors::WaiterFailed)
|
|
294
|
+
expect(driver).to receive(:destroy).with(state)
|
|
295
|
+
expect(driver).to receive(:error).with(/#{msg}/)
|
|
296
|
+
expect {
|
|
297
|
+
driver.wait_with_destroy(server, state, msg, &given_block)
|
|
298
|
+
}.to raise_error(::Aws::Waiters::Errors::WaiterFailed)
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
|
|
226
302
|
describe "#destroy" do
|
|
227
303
|
context "when state[:server_id] is nil" do
|
|
228
|
-
let(:state) { {} }
|
|
229
304
|
it "returns nil" do
|
|
230
305
|
expect(driver.destroy(state)).to eq(nil)
|
|
231
306
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kitchen-ec2
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.9.
|
|
4
|
+
version: 0.9.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Fletcher Nichol
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-06-
|
|
11
|
+
date: 2015-06-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: test-kitchen
|