aerosol 0.5.1 → 1.0.1

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.
@@ -59,8 +59,14 @@ namespace :aerosol do
59
59
 
60
60
  Aerosol.deploys.values.each do |inst|
61
61
  namespace :"#{inst.name}" do
62
+ desc "Assumes a role if necessary"
63
+ task :assume_role => 'aerosol:load' do |name|
64
+ Thread.current[:rake_task] = name
65
+ inst.perform_role_assumption
66
+ end
67
+
62
68
  desc "Runs the ActiveRecord migration through the SSH connection given"
63
- task :run_migration => 'aerosol:load' do |name|
69
+ task :run_migration => "aerosol:#{inst.name}:assume_role" do |name|
64
70
  Thread.current[:rake_task] = name
65
71
  Aerosol::Runner.new.with_deploy(inst.name) do |runner|
66
72
  runner.run_migration
@@ -71,7 +77,7 @@ namespace :aerosol do
71
77
  task :create_auto_scaling_group => "aerosol:auto_scaling:#{inst.auto_scaling.name}"
72
78
 
73
79
  desc "Waits for instances of the new autoscaling groups to start up"
74
- task :wait_for_new_instances => 'aerosol:load' do |name|
80
+ task :wait_for_new_instances => "aerosol:#{inst.name}:assume_role" do |name|
75
81
  Thread.current[:rake_task] = name
76
82
  Aerosol::Runner.new.with_deploy(inst.name) do |runner|
77
83
  runner.wait_for_new_instances
@@ -79,7 +85,7 @@ namespace :aerosol do
79
85
  end
80
86
 
81
87
  desc "Runs command to shut down the application on the old instances instead of just terminating"
82
- task :stop_old_app => 'aerosol:load' do |name|
88
+ task :stop_old_app => "aerosol:#{inst.name}:assume_role" do |name|
83
89
  Thread.current[:rake_task] = name
84
90
  Aerosol::Runner.new.with_deploy(inst.name) do |runner|
85
91
  runner.stop_app
@@ -87,7 +93,7 @@ namespace :aerosol do
87
93
  end
88
94
 
89
95
  desc "Terminates instances with the current tag and different git hash"
90
- task :destroy_old_auto_scaling_groups => 'aerosol:load' do |name|
96
+ task :destroy_old_auto_scaling_groups => "aerosol:#{inst.name}:assume_role" do |name|
91
97
  Thread.current[:rake_task] = name
92
98
  Aerosol::Runner.new.with_deploy(inst.name) do |runner|
93
99
  runner.destroy_old_auto_scaling_groups
@@ -95,7 +101,7 @@ namespace :aerosol do
95
101
  end
96
102
 
97
103
  desc "Terminates instances with the current tag and current git hash"
98
- task :destroy_new_auto_scaling_groups => 'aerosol:load' do |name|
104
+ task :destroy_new_auto_scaling_groups => "aerosol:#{inst.name}:assume_role" do |name|
99
105
  Thread.current[:rake_task] = name
100
106
  Aerosol::Runner.new.with_deploy(inst.name) do |runner|
101
107
  runner.destroy_new_auto_scaling_groups
@@ -103,7 +109,7 @@ namespace :aerosol do
103
109
  end
104
110
 
105
111
  desc "Runs a post deploy command"
106
- task :run_post_deploy => 'aerosol:load' do |name|
112
+ task :run_post_deploy => "aerosol:#{inst.name}:assume_role" do |name|
107
113
  Thread.current[:rake_task] = name
108
114
  inst.run_post_deploy
109
115
  end
@@ -70,8 +70,8 @@ class Aerosol::Runner
70
70
  current_instances = new_instances
71
71
  remaining_instances = current_instances - live_instances
72
72
  info "waiting for instances to be live (#{remaining_instances.count} remaining)"
73
- debug "current instances: #{current_instances.map(&:id)}"
74
- debug "live instances: #{live_instances.map(&:id)}"
73
+ debug "current instances: #{current_instances.map(&:instance_id)}"
74
+ debug "live instances: #{live_instances.map(&:instance_id)}"
75
75
  live_instances.concat(remaining_instances.select { |instance| healthy?(instance) })
76
76
  break if (current_instances - live_instances).empty?
77
77
  debug 'sleeping for 10 seconds'
@@ -94,18 +94,18 @@ class Aerosol::Runner
94
94
  end
95
95
 
96
96
  def healthy?(instance)
97
- debug "Checking if #{instance.id} is healthy"
97
+ debug "Checking if #{instance.instance_id} is healthy"
98
98
 
99
99
  unless instance.live?
100
- debug "#{instance.id} is not live"
100
+ debug "#{instance.instance_id} is not live"
101
101
  return false
102
102
  end
103
103
 
104
- debug "trying to SSH to #{instance.id}"
104
+ debug "trying to SSH to #{instance.instance_id}"
105
105
  success = false
106
106
  ssh.with_connection(instance) do |session|
107
- start_tailing_logs(ssh, instance) if log_pids[instance.id].nil?
108
- debug "checking if #{instance.id} is healthy"
107
+ start_tailing_logs(ssh, instance) if log_pids[instance.instance_id].nil?
108
+ debug "checking if #{instance.instance_id} is healthy"
109
109
  success = if is_alive?.nil?
110
110
  debug 'Using default site live check'
111
111
  check_site_live(session)
@@ -116,13 +116,13 @@ class Aerosol::Runner
116
116
  end
117
117
 
118
118
  if success
119
- debug "#{instance.id} is healthy"
119
+ debug "#{instance.instance_id} is healthy"
120
120
  else
121
- debug "#{instance.id} is not healthy"
121
+ debug "#{instance.instance_id} is not healthy"
122
122
  end
123
123
  success
124
124
  rescue => ex
125
- debug "#{instance.id} is not healthy: #{ex.message}"
125
+ debug "#{instance.instance_id} is not healthy: #{ex.message}"
126
126
  false
127
127
  end
128
128
 
@@ -149,7 +149,7 @@ class Aerosol::Runner
149
149
  'sudo', 'tail', '-f', *log_files
150
150
  ].join(' ')
151
151
 
152
- log_pids[instance.id] ||= ssh_fork(command, ssh, instance)
152
+ log_pids[instance.instance_id] ||= ssh_fork(command, ssh, instance)
153
153
  end
154
154
  end
155
155
 
@@ -168,7 +168,7 @@ class Aerosol::Runner
168
168
  ssh_exec!(session, command) do |stream, data|
169
169
  data.lines.each do |line|
170
170
  if line.end_with?($/)
171
- debug "[#{instance.id}] #{stream}: #{buffer + line}"
171
+ debug "[#{instance.instance_id}] #{stream}: #{buffer + line}"
172
172
  buffer = ''
173
173
  else
174
174
  buffer = line
@@ -278,15 +278,15 @@ class Aerosol::Runner
278
278
  private
279
279
 
280
280
  def stop_one_app(instance)
281
- debug "attempting to stop app on: #{instance.public_hostname}"
281
+ debug "attempting to stop app on: #{instance.address}"
282
282
  ssh.with_connection(instance) do |session|
283
283
  session.exec!(stop_command)
284
284
  session.loop
285
285
  end
286
- info "successfully stopped app on: #{instance.public_hostname}"
286
+ info "successfully stopped app on: #{instance.address}"
287
287
  true
288
288
  rescue => ex
289
- warn "stop app failed on #{instance.public_hostname} due to: #{ex}"
289
+ warn "stop app failed on #{instance.address} due to: #{ex}"
290
290
  false
291
291
  end
292
292
 
@@ -1,5 +1,5 @@
1
1
  # Copyright Swipely, Inc. All rights reserved.
2
2
 
3
3
  module Aerosol
4
- VERSION = '0.5.1'
4
+ VERSION = '1.0.1'
5
5
  end
data/lib/aerosol.rb CHANGED
@@ -1,5 +1,9 @@
1
- require 'fog'
1
+ require 'yaml'
2
+ require 'aws-sdk'
2
3
  require 'dockly/util'
4
+ require 'base64'
5
+
6
+ Aws.config.update({ region: 'us-east-1' }) if Aws.config[:region].nil?
3
7
 
4
8
  module Aerosol
5
9
  require 'aerosol/aws'
@@ -41,6 +45,14 @@ module Aerosol
41
45
  end
42
46
  end
43
47
 
48
+ def region(value = nil)
49
+ if value.nil?
50
+ Aws.config[:region]
51
+ else
52
+ Aws.config.update(region: value)
53
+ end
54
+ end
55
+
44
56
  def setup
45
57
  {
46
58
  :auto_scalings => Aerosol::AutoScaling.instances,
@@ -76,7 +88,7 @@ module Aerosol
76
88
  module_function :inst, :load_inst, :setup, :load_file, :load_file=,
77
89
  :auto_scaling, :launch_configuration, :deploy, :ssh, :git_sha,
78
90
  :auto_scalings, :launch_configurations, :deploys, :sshs,
79
- :namespace, :env, :envs
91
+ :namespace, :env, :envs, :region
80
92
  end
81
93
 
82
94
  require 'aerosol/runner'
@@ -1,30 +1,42 @@
1
1
  require 'spec_helper'
2
- require 'fog/aws'
3
2
 
4
3
  describe Aerosol::AutoScaling do
5
- let!(:launch_config) do
4
+ let(:launch_configuration_setup) do
6
5
  Aerosol::LaunchConfiguration.new! do
7
6
  name :my_launch_config_for_auto_scaling
8
- ami 'ami :) :) :)'
7
+ image_id 'ami :) :) :)'
9
8
  instance_type 'm1.large'
10
9
  stub(:sleep)
11
- end.tap(&:create)
10
+ end
12
11
  end
13
12
 
14
- subject { described_class.new! }
15
- before { subject.stub(:sleep) }
13
+ let(:launch_configuration) do
14
+ launch_configuration_setup.tap(&:create)
15
+ end
16
16
 
17
- describe "#aws_identifier" do
18
- before do
19
- subject.instance_eval do
20
- name :my_auto_scaling
21
- end
22
- end
17
+ subject { described_class.new!(&block) }
18
+ let(:previous_launch_configurations) { [] }
19
+ let(:previous_auto_scaling_groups) { [] }
20
+
21
+ before do
22
+ subject.stub(:sleep)
23
+ Aerosol::AWS.auto_scaling.stub_responses(:describe_launch_configurations, {
24
+ launch_configurations: previous_launch_configurations, next_token: nil
25
+ })
26
+ Aerosol::AWS.auto_scaling.stub_responses(:describe_auto_scaling_groups, {
27
+ auto_scaling_groups: previous_auto_scaling_groups, next_token: nil
28
+ })
29
+ end
30
+
31
+ let(:block) { Proc.new { } }
32
+
33
+ describe "#auto_scaling_group_name" do
34
+ let(:block) { Proc.new { name :my_auto_scaling } }
23
35
 
24
36
  context "with no namespace set" do
25
37
  let(:identifier) { "my_auto_scaling-#{Aerosol::Util.git_sha}" }
26
38
  it "returns a normal identifier" do
27
- expect(subject.aws_identifier).to eq(identifier)
39
+ expect(subject.auto_scaling_group_name).to eq(identifier)
28
40
  end
29
41
  end
30
42
 
@@ -36,7 +48,7 @@ describe Aerosol::AutoScaling do
36
48
  after { Aerosol.instance_variable_set(:"@namespace", nil) }
37
49
 
38
50
  it "returns a namespaced identifier" do
39
- expect(subject.aws_identifier).to eq(identifier)
51
+ expect(subject.auto_scaling_group_name).to eq(identifier)
40
52
  end
41
53
  end
42
54
  end
@@ -57,18 +69,12 @@ describe Aerosol::AutoScaling do
57
69
  end
58
70
 
59
71
  context 'when all of the required options are set' do
60
- let!(:launch_configuration) do
61
- Aerosol::LaunchConfiguration.new! do
62
- ami 'fake_ami'
63
- instance_type 'm1.large'
64
- stub(:sleep)
65
- end
66
- end
67
72
  let(:availability_zone) { 'US' }
68
73
  let(:min_size) { 1 }
69
74
  let(:max_size) { 10 }
70
75
  let(:options) {
71
- { :name => :my_group,
76
+ {
77
+ :name => :my_group,
72
78
  :launch_configuration => launch_configuration.name,
73
79
  :availability_zones => [availability_zone],
74
80
  :min_size => 1,
@@ -88,16 +94,9 @@ describe Aerosol::AutoScaling do
88
94
  end
89
95
 
90
96
  context 'when the launch configuration is known' do
91
- before do
92
- launch_configuration.create!
93
- end
94
-
95
97
  it 'creates an auto-scaling group' do
96
98
  expect(subject.tags).to include('Deploy' => 'my_group')
97
- expect { subject.create! }
98
- .to change { subject.send(:conn).data[:auto_scaling_groups][subject.aws_identifier].class.to_s }
99
- .from('NilClass')
100
- .to('Hash')
99
+ subject.create!
101
100
  end
102
101
 
103
102
  context "when there is a namespace" do
@@ -117,30 +116,29 @@ describe Aerosol::AutoScaling do
117
116
  end
118
117
 
119
118
  describe '#destroy!' do
120
- let(:aws_identifier) { subject.aws_identifier }
121
119
  subject { Aerosol::AutoScaling.new }
122
120
 
123
121
  context 'when there is no such auto-scaling group' do
124
122
  it 'raises an error' do
125
- expect { subject.destroy! }
126
- .to raise_error(Fog::AWS::AutoScaling::ValidationError)
123
+ Aerosol::AWS.auto_scaling.stub_responses(
124
+ :delete_auto_scaling_group,
125
+ Aws::AutoScaling::Errors::ValidationError.new(nil, nil)
126
+ )
127
+
128
+ expect { subject.destroy! }.to raise_error(Aws::AutoScaling::Errors::ValidationError)
127
129
  end
128
130
  end
129
131
 
130
132
  context 'when the auto-scaling group exists' do
131
- before { subject.send(:conn).data[:auto_scaling_groups][aws_identifier] = aws_identifier }
132
-
133
133
  it 'deletes the auto-scaling group' do
134
- expect { subject.destroy! }
135
- .to change { subject.send(:conn).data[:auto_scaling_groups][aws_identifier] }
136
- .from(aws_identifier)
137
- .to(nil)
134
+ Aerosol::AWS.auto_scaling.stub_responses(:delete_auto_scaling_group, {})
135
+ expect { subject.destroy! }.to_not raise_error
138
136
  end
139
137
  end
140
138
  end
141
139
 
142
140
  describe '#create' do
143
- context 'when the aws_identifier is nil' do
141
+ context 'when the auto_scaling_group_name is nil' do
144
142
  subject { described_class.new!(:name => 'nonsense') }
145
143
 
146
144
  it 'raises an error' do
@@ -148,7 +146,7 @@ describe Aerosol::AutoScaling do
148
146
  end
149
147
  end
150
148
 
151
- context 'when the aws_identifier is present' do
149
+ context 'when the auto_scaling_group_name is present' do
152
150
  subject { described_class.new!(:name => 'nonsense2') }
153
151
 
154
152
  context 'when the model already exists' do
@@ -197,19 +195,22 @@ describe Aerosol::AutoScaling do
197
195
  subject { described_class }
198
196
 
199
197
  context 'when the argument exists' do
200
- let!(:existing) {
201
- conf = launch_config
202
- subject.new! do
203
- min_size 1
204
- max_size 3
205
- availability_zones 'us-east-1'
206
- launch_configuration conf.name
207
- stub(:sleep)
208
- end.tap(&:create)
209
- }
210
-
211
198
  it 'returns true' do
212
- subject.exists?(existing.aws_identifier).should be_true
199
+ Aerosol::AWS.auto_scaling.stub_responses(:describe_auto_scaling_groups, {
200
+ auto_scaling_groups: [{
201
+ auto_scaling_group_name: 'test',
202
+ launch_configuration_name: 'test',
203
+ min_size: 1,
204
+ max_size: 1,
205
+ desired_capacity: 1,
206
+ default_cooldown: 300,
207
+ availability_zones: ['us-east-1a'],
208
+ health_check_type: 'EC2',
209
+ created_time: Time.at(1)
210
+ }],
211
+ next_token: nil
212
+ })
213
+ subject.exists?('test').should be_true
213
214
  end
214
215
  end
215
216
 
@@ -217,7 +218,7 @@ describe Aerosol::AutoScaling do
217
218
  before do
218
219
  described_class.new! do
219
220
  name :exists_test_name
220
- aws_identifier 'does-not-exist'
221
+ auto_scaling_group_name 'does-not-exist'
221
222
  stub(:sleep)
222
223
  end.destroy! rescue nil
223
224
  end
@@ -230,18 +231,63 @@ describe Aerosol::AutoScaling do
230
231
 
231
232
  describe '.request_all' do
232
233
  describe 'repeats until no NextToken' do
233
- before do
234
- allow(Aerosol::AutoScaling).to receive(:request_all_for_token).with(nil) do
235
- { 'AutoScalingGroups' => [1, 4], 'NextToken' => 'token' }
236
- end
237
-
238
- allow(Aerosol::AutoScaling).to receive(:request_all_for_token).with('token') do
239
- { 'AutoScalingGroups' => [2, 3], 'NextToken' => nil }
240
- end
241
- end
242
-
243
234
  it 'should include both autoscaling groups lists' do
244
- expect(Aerosol::AutoScaling.request_all).to eq([1,4,2,3])
235
+ Aerosol::AWS.auto_scaling.stub_responses(:describe_auto_scaling_groups, [
236
+ {
237
+ auto_scaling_groups: [
238
+ {
239
+ auto_scaling_group_name: '1',
240
+ launch_configuration_name: '1',
241
+ min_size: 1,
242
+ max_size: 1,
243
+ desired_capacity: 1,
244
+ default_cooldown: 300,
245
+ availability_zones: ['us-east-1a'],
246
+ health_check_type: 'EC2',
247
+ created_time: Time.at(1)
248
+ }, {
249
+ auto_scaling_group_name: '4',
250
+ launch_configuration_name: '4',
251
+ min_size: 1,
252
+ max_size: 1,
253
+ desired_capacity: 1,
254
+ default_cooldown: 300,
255
+ availability_zones: ['us-east-1a'],
256
+ health_check_type: 'EC2',
257
+ created_time: Time.at(1)
258
+ }
259
+ ],
260
+ next_token: 'token'
261
+ },
262
+ {
263
+ auto_scaling_groups: [
264
+ {
265
+ auto_scaling_group_name: '2',
266
+ launch_configuration_name: '2',
267
+ min_size: 1,
268
+ max_size: 1,
269
+ desired_capacity: 1,
270
+ default_cooldown: 300,
271
+ availability_zones: ['us-east-1a'],
272
+ health_check_type: 'EC2',
273
+ created_time: Time.at(1)
274
+ }, {
275
+ auto_scaling_group_name: '3',
276
+ launch_configuration_name: '3',
277
+ min_size: 1,
278
+ max_size: 1,
279
+ desired_capacity: 1,
280
+ default_cooldown: 300,
281
+ availability_zones: ['us-east-1a'],
282
+ health_check_type: 'EC2',
283
+ created_time: Time.at(1)
284
+ }
285
+ ],
286
+ next_token: nil
287
+ }
288
+ ])
289
+
290
+ expect(Aerosol::AutoScaling.request_all.map(&:auto_scaling_group_name)).to eq(['1','4','2','3'])
245
291
  end
246
292
  end
247
293
  end
@@ -249,51 +295,60 @@ describe Aerosol::AutoScaling do
249
295
  describe '.all' do
250
296
  subject { described_class }
251
297
 
252
- def destroy_all
253
- Aerosol::AutoScaling.instances.values.each do |instance|
254
- instance.destroy! rescue nil
255
- end
256
- end
257
-
258
- after { destroy_all }
259
-
260
298
  context 'when there are no auto scaling groups' do
261
- before { destroy_all }
262
-
299
+ before do
300
+ Aerosol::AWS.auto_scaling.stub_responses(:describe_auto_scaling_groups, [
301
+ { auto_scaling_groups: [], next_token: nil }
302
+ ])
303
+ end
263
304
  its(:all) { should be_empty }
264
305
  end
265
306
 
266
307
  context 'when there are auto scaling groups' do
267
-
268
- let!(:insts) do
308
+ let(:insts) {
269
309
  [
270
310
  {
271
- :min_size => 1,
272
- :max_size => 3,
273
- :availability_zones => 'us-east-1',
274
- :launch_configuration => launch_config.name
311
+ auto_scaling_group_name: 'test',
312
+ min_size: 1,
313
+ max_size: 3,
314
+ availability_zones: ['us-east-1'],
315
+ launch_configuration_name: launch_configuration.name.to_s,
316
+ desired_capacity: 1,
317
+ default_cooldown: 300,
318
+ health_check_type: 'EC2',
319
+ created_time: Time.at(1)
275
320
  },
276
321
  {
277
- :min_size => 2,
278
- :max_size => 4,
279
- :availability_zones => 'us-east-2',
280
- :launch_configuration => launch_config.name,
281
- :tag => { :my_tag => :is_sweet }
322
+ auto_scaling_group_name: 'test2',
323
+ min_size: 2,
324
+ max_size: 4,
325
+ availability_zones: ['us-east-2'],
326
+ launch_configuration_name: launch_configuration.name.to_s,
327
+ desired_capacity: 1,
328
+ default_cooldown: 300,
329
+ health_check_type: 'EC2',
330
+ created_time: Time.at(1),
331
+ tags: [{ key: 'my_tag', value: 'is_sweet' }]
282
332
  }
283
- ].map { |hash| subject.new!(hash).tap { |inst| inst.stub(:sleep); inst.create! } }
284
- end
333
+ ]
334
+ }
285
335
 
286
336
  it 'returns each of them' do
287
- subject.all.map(&:min_size).should == [1, 2]
288
- subject.all.map(&:max_size).should == [3, 4]
289
- subject.all.map(&:tags).should == [{
290
- "GitSha" => Aerosol::Util.git_sha,
291
- "Deploy" => insts.first.name.to_s
337
+ Aerosol::AWS.auto_scaling.stub_responses(:describe_auto_scaling_groups, {
338
+ auto_scaling_groups: insts,
339
+ next_token: nil
340
+ })
341
+ instances = subject.all
342
+ instances.map(&:min_size).should == [1, 2]
343
+ instances.map(&:max_size).should == [3, 4]
344
+ instances.map(&:tags).should == [{
345
+ 'GitSha' => Aerosol::Util.git_sha,
346
+ 'Deploy' => instances.first.name.to_s
292
347
  },
293
348
  {
294
- "GitSha" => Aerosol::Util.git_sha,
295
- "Deploy" => insts.last.name.to_s,
296
- :my_tag => :is_sweet
349
+ 'GitSha' => Aerosol::Util.git_sha,
350
+ 'Deploy' => instances.last.name.to_s,
351
+ 'my_tag' => 'is_sweet'
297
352
  }
298
353
  ]
299
354
  end
@@ -306,18 +361,22 @@ describe Aerosol::AutoScaling do
306
361
 
307
362
  let(:hash) do
308
363
  {
309
- 'AutoScalingGroupName' => 'test-auto-scaling',
310
- 'AvailabilityZones' => 'us-east-1',
311
- 'LaunchConfigurationName' => launch_config.aws_identifier,
312
- 'MinSize' => 1,
313
- 'MaxSize' => 2
364
+ auto_scaling_group_name: 'test-auto-scaling',
365
+ availability_zones: ['us-east-1'],
366
+ launch_configuration_name: launch_configuration.launch_configuration_name,
367
+ min_size: 1,
368
+ max_size: 2,
369
+ desired_capacity: 1,
370
+ default_cooldown: 300,
371
+ health_check_type: 'EC2',
372
+ created_time: Time.at(1),
314
373
  }
315
374
  end
316
375
 
317
376
  it 'creates a new auto scaling group with the specified values' do
318
- auto_scaling.aws_identifier.should == 'test-auto-scaling'
319
- auto_scaling.availability_zones.should == 'us-east-1'
320
- auto_scaling.launch_configuration.should == launch_config
377
+ auto_scaling.auto_scaling_group_name.should == 'test-auto-scaling'
378
+ auto_scaling.availability_zones.should == ['us-east-1']
379
+ auto_scaling.launch_configuration.should == launch_configuration
321
380
  auto_scaling.min_size.should == 1
322
381
  auto_scaling.max_size.should == 2
323
382
  end
@@ -330,17 +389,17 @@ describe Aerosol::AutoScaling do
330
389
  context 'when the auto scaling group has already been initialized' do
331
390
  let(:old_hash) do
332
391
  {
333
- 'AutoScalingGroupName' => 'this-aws-id-abc-123',
334
- 'MinSize' => 16
392
+ auto_scaling_group_name: 'this-aws-id-abc-123',
393
+ min_size: 16
335
394
  }
336
395
  end
337
- let(:new_hash) { old_hash.merge('MaxSize' => 40) }
396
+ let(:new_hash) { old_hash.merge(max_size: 40) }
338
397
  let!(:existing) { described_class.from_hash(old_hash) }
339
398
  let(:new) { described_class.from_hash(new_hash) }
340
399
 
341
- it 'updates its values' do
400
+ it 'makes a new instance' do
342
401
  expect { new }.to change { described_class.instances.length }.by(1)
343
- new.aws_identifier.should == 'this-aws-id-abc-123'
402
+ new.auto_scaling_group_name.should == 'this-aws-id-abc-123'
344
403
  new.min_size.should == 16
345
404
  new.max_size.should == 40
346
405
  end
@@ -405,12 +464,47 @@ describe Aerosol::AutoScaling do
405
464
  :availability_zones => [],
406
465
  :max_size => 10,
407
466
  :min_size => 4,
408
- :launch_configuration => launch_config.name
467
+ :launch_configuration => launch_configuration.name
409
468
  )
410
469
  }
411
-
412
- before { auto_scaling.stub(:sleep); auto_scaling.create! }
413
- after { auto_scaling.destroy! }
470
+ let(:previous_auto_scaling_groups) {
471
+ [{
472
+ auto_scaling_group_name: 'all_instances_asg',
473
+ availability_zones: ['us-east-1'],
474
+ launch_configuration_name: launch_configuration.name.to_s,
475
+ min_size: 1,
476
+ max_size: 2,
477
+ desired_capacity: 1,
478
+ default_cooldown: 300,
479
+ health_check_type: 'EC2',
480
+ created_time: Time.at(1),
481
+ instances: [{
482
+ instance_id: 'i-1239013',
483
+ availability_zone: 'us-east-1a',
484
+ lifecycle_state: 'InService',
485
+ health_status: 'GOOD',
486
+ launch_configuration_name: launch_configuration.name.to_s
487
+ }, {
488
+ instance_id: 'i-1239014',
489
+ availability_zone: 'us-east-1a',
490
+ lifecycle_state: 'InService',
491
+ health_status: 'GOOD',
492
+ launch_configuration_name: launch_configuration.name.to_s
493
+ }, {
494
+ instance_id: 'i-1239015',
495
+ availability_zone: 'us-east-1a',
496
+ lifecycle_state: 'InService',
497
+ health_status: 'GOOD',
498
+ launch_configuration_name: launch_configuration.name.to_s
499
+ }, {
500
+ instance_id: 'i-1239016',
501
+ availability_zone: 'us-east-1a',
502
+ lifecycle_state: 'InService',
503
+ health_status: 'GOOD',
504
+ launch_configuration_name: launch_configuration.name.to_s
505
+ }]
506
+ }]
507
+ }
414
508
 
415
509
  it 'returns a list of instances associated with the group' do
416
510
  auto_scaling.all_instances.length.should == 4