|
32 | 32 | let(:provisioner) { Kitchen::Provisioner::Dummy.new }
|
33 | 33 | let(:transport) { Kitchen::Transport::Dummy.new }
|
34 | 34 | 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") } |
35 | 41 |
|
36 | 42 | let(:driver) { Kitchen::Driver::Ec2.new(config) }
|
37 | 43 |
|
|
48 | 54 | )
|
49 | 55 | end
|
50 | 56 |
|
| 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 | + |
51 | 62 | it "driver api_version is 2" do
|
52 | 63 | expect(driver.diagnose_plugin[:api_version]).to eq(2)
|
53 | 64 | end
|
|
159 | 170 | end
|
160 | 171 | end
|
161 | 172 |
|
| 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 | + |
162 | 256 | end
|
0 commit comments