20
20
require "json"
21
21
require "aws"
22
22
require "kitchen"
23
- require "kitchen/driver/ ec2_version"
23
+ require_relative " ec2_version"
24
24
require_relative "aws/client"
25
25
require_relative "aws/instance_generator"
26
+ require "aws-sdk-core/waiters/errors"
26
27
27
28
module Kitchen
28
29
@@ -60,6 +61,7 @@ class Ec2 < Kitchen::Driver::Base # rubocop:disable Metrics/ClassLength
60
61
end
61
62
default_config :username , nil
62
63
default_config :associate_public_ip , nil
64
+ default_config :interface , nil
63
65
64
66
required_config :aws_ssh_key_id
65
67
required_config :image_id
@@ -194,14 +196,21 @@ def create(state) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
194
196
t = config [ :retryable_tries ] * config [ :retryable_sleep ]
195
197
info "Waited #{ c } /#{ t } s for instance <#{ state [ :server_id ] } > to become ready."
196
198
end
197
- server = server . wait_until (
198
- :max_attempts => config [ :retryable_tries ] ,
199
- :delay => config [ :retryable_sleep ] ,
200
- :before_attempt => wait_log
201
- ) do |s |
202
- hostname = hostname ( s )
203
- # Euca instances often report ready before they have an IP
204
- s . state . name == "running" && !hostname . nil? && hostname != "0.0.0.0"
199
+ begin
200
+ server = server . wait_until (
201
+ :max_attempts => config [ :retryable_tries ] ,
202
+ :delay => config [ :retryable_sleep ] ,
203
+ :before_attempt => wait_log
204
+ ) do |s |
205
+ hostname = hostname ( s , config [ :interface ] )
206
+ # Euca instances often report ready before they have an IP
207
+ s . exists? && s . state . name == "running" && !hostname . nil? && hostname != "0.0.0.0"
208
+ end
209
+ rescue ::Aws ::Waiters ::Errors ::WaiterFailed
210
+ error ( "Ran out of time waiting for the server with id [#{ state [ :server_id ] } ]" \
211
+ " to become ready, attempting to destroy it" )
212
+ destroy ( state )
213
+ raise
205
214
end
206
215
207
216
info ( "EC2 instance <#{ state [ :server_id ] } > ready." )
@@ -217,7 +226,7 @@ def destroy(state)
217
226
server = ec2 . get_instance ( state [ :server_id ] )
218
227
unless server . nil?
219
228
instance . transport . connection ( state ) . close
220
- server . terminate unless server . nil?
229
+ server . terminate
221
230
end
222
231
if state [ :spot_request_id ]
223
232
debug ( "Deleting spot request <#{ state [ :server_id ] } >" )
@@ -235,8 +244,6 @@ def default_ami
235
244
region && region [ instance . platform . name ]
236
245
end
237
246
238
- private
239
-
240
247
def ec2
241
248
@ec2 ||= Aws ::Client . new (
242
249
config [ :region ] ,
@@ -354,6 +361,8 @@ def hostname(server, interface_type = nil)
354
361
potential_hostname = nil
355
362
INTERFACE_TYPES . values . each do |type |
356
363
potential_hostname ||= server . send ( type )
364
+ # AWS returns an empty string if the dns name isn't populated yet
365
+ potential_hostname = nil if potential_hostname == ""
357
366
end
358
367
potential_hostname
359
368
end
0 commit comments