Skip to content

Commit 859633b

Browse files
committed
Adding an existence check before tagging server, fixes #138
1 parent 1512109 commit 859633b

File tree

3 files changed

+100
-1
lines changed

3 files changed

+100
-1
lines changed

.cane

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
--abc-max 30
1+
--abc-max 40
22
--style-measure 100

lib/kitchen/driver/ec2.rb

+5
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,10 @@ def create(state) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
188188
server = submit_server
189189
end
190190
info("Instance <#{server.id}> requested.")
191+
ec2.client.wait_until(
192+
:instance_exists,
193+
:instance_ids => [server.id]
194+
)
191195
tag_server(server)
192196

193197
state[:server_id] = server.id
@@ -234,6 +238,7 @@ def destroy(state)
234238
ec2.client.cancel_spot_instance_requests(
235239
:spot_instance_request_ids => [state[:spot_request_id]]
236240
)
241+
state.delete(:spot_request_id)
237242
end
238243
info("EC2 instance <#{state[:server_id]}> destroyed.")
239244
state.delete(:server_id)

spec/kitchen/driver/ec2_spec.rb

+94
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@
3232
let(:provisioner) { Kitchen::Provisioner::Dummy.new }
3333
let(:transport) { Kitchen::Transport::Dummy.new }
3434
let(:state_file) { double("state_file") }
35+
let(:generator) { instance_double(Kitchen::Driver::Aws::InstanceGenerator) }
36+
# There is too much name overlap I let creep in - my `client` is actually
37+
# a wrapper around the actual ec2 client
38+
let(:actual_client) { double("actual ec2 client") }
39+
let(:client) { double(Kitchen::Driver::Aws::Client, :client => actual_client) }
40+
let(:server) { double("aws server object") }
3541

3642
let(:driver) { Kitchen::Driver::Ec2.new(config) }
3743

@@ -48,6 +54,11 @@
4854
)
4955
end
5056

57+
before do
58+
allow(Kitchen::Driver::Aws::InstanceGenerator).to receive(:new).and_return(generator)
59+
allow(Kitchen::Driver::Aws::Client).to receive(:new).and_return(client)
60+
end
61+
5162
it "driver api_version is 2" do
5263
expect(driver.diagnose_plugin[:api_version]).to eq(2)
5364
end
@@ -159,4 +170,87 @@
159170
end
160171
end
161172

173+
describe "#submit_server" do
174+
it "submits the server request" do
175+
expect(generator).to receive(:ec2_instance_data).and_return({})
176+
expect(client).to receive(:create_instance).with(:min_count => 1, :max_count => 1)
177+
driver.submit_server
178+
end
179+
end
180+
181+
describe "#submit_spot" do
182+
let(:state) { {} }
183+
let(:response) {
184+
{ :spot_instance_requests => [{ :spot_instance_request_id => "id" }] }
185+
}
186+
187+
it "submits the server request" do
188+
expect(generator).to receive(:ec2_instance_data).and_return({})
189+
expect(actual_client).to receive(:request_spot_instances).with(
190+
:spot_price => "", :launch_specification => {}
191+
).and_return(response)
192+
expect(actual_client).to receive(:wait_until)
193+
expect(client).to receive(:get_instance_from_spot_request).with("id")
194+
driver.submit_spot(state)
195+
expect(state).to eq(:spot_request_id => "id")
196+
end
197+
end
198+
199+
describe "#tag_server" do
200+
it "tags the server" do
201+
config[:tags] = { :key1 => :value1, :key2 => :value2 }
202+
expect(server).to receive(:create_tags).with(
203+
:tags => [
204+
{ :key => :key1, :value => :value1 },
205+
{ :key => :key2, :value => :value2 }
206+
]
207+
)
208+
driver.tag_server(server)
209+
end
210+
end
211+
212+
describe "#destroy" do
213+
context "when state[:server_id] is nil" do
214+
let(:state) { {} }
215+
it "returns nil" do
216+
expect(driver.destroy(state)).to eq(nil)
217+
end
218+
end
219+
220+
context "when state has a normal server_id" do
221+
let(:state) { { :server_id => "id", :hostname => "name" } }
222+
223+
context "the server is already destroyed" do
224+
it "does nothing" do
225+
expect(client).to receive(:get_instance).with("id").and_return nil
226+
driver.destroy(state)
227+
expect(state).to eq({})
228+
end
229+
end
230+
231+
it "destroys the server" do
232+
expect(client).to receive(:get_instance).with("id").and_return(server)
233+
expect(instance).to receive_message_chain("transport.connection.close")
234+
expect(server).to receive(:terminate)
235+
driver.destroy(state)
236+
expect(state).to eq({})
237+
end
238+
end
239+
240+
context "when state has a spot request" do
241+
let(:state) { { :server_id => "id", :hostname => "name", :spot_request_id => "spot" } }
242+
243+
it "destroys the server" do
244+
expect(client).to receive(:get_instance).with("id").and_return(server)
245+
expect(instance).to receive_message_chain("transport.connection.close")
246+
expect(server).to receive(:terminate)
247+
expect(actual_client).to receive(:cancel_spot_instance_requests).with(
248+
:spot_instance_request_ids => ["spot"]
249+
)
250+
driver.destroy(state)
251+
expect(state).to eq({})
252+
end
253+
end
254+
end
255+
162256
end

0 commit comments

Comments
 (0)