stemcell 0.9.0 → 0.10.0

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 CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- OTZlY2E0ZjNlZWQ4NTgyOWU0MTViNjI3ZTk3MzQzOTYxOTRhZGI4YQ==
5
- data.tar.gz: !binary |-
6
- Y2FhMDhjNGUwNGFlZGU0YTkwY2RiNTliNTZlYTc5MTU1ZjhkNGNjNQ==
2
+ SHA1:
3
+ metadata.gz: 871924c8a955cfdba26317f7f7dcff52dea5a958
4
+ data.tar.gz: e62ab6445f2a240a52dd6ccff12861d1c51f6e0a
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- MWJjOGRmMzFjMGIwYWM5ZDQ1OGU4OWUyNTkwZTRkZjU0NDlmYWY4ZjA2MTI5
10
- Zjg1NTcyYTYwZjQ5ZWI1NDIzNjM4NmYyZjBkZGFlYzVlYzA5YzQ2Y2ZkM2Y3
11
- Y2UwNzI5NjI2OWE5ZTdiM2VmOTlmNzA2NmY2YzY5M2E0OTg3MDc=
12
- data.tar.gz: !binary |-
13
- ODNlNGRlYjQ0MWIyMGVhODg2ZDliMTgzYTQ4ZTI3ZWFmYzJkMGNmYmQzYTE2
14
- NzQ4NjZhNjc5NWU4MmYwOGNhMTFkOWExYTVlNTg3OGQ5YTA4Yjg4OTgyYjZi
15
- MTk4N2RlMTc0OWY1MzE1ODEyY2JmN2YxOTJhZGY4OTRkY2Q5ZjY=
6
+ metadata.gz: 60a1f87a3a1316ce5efbea9f5e582b23819ac09580494f031d05379009a8dcdcbd0e94e4c12d9afee3dd8c9649bae5e9665ea97347ee2c5fdcb76bc946732983
7
+ data.tar.gz: 990eddea2e886dcbef2859b706d4e04af931527da6bdbde3688a35633bde7203d0765f132f2ca90e70bfda2feebb9a7e8c6513cc5efeedac1d7149ac44b6fddf
data/.travis.yml CHANGED
@@ -1,6 +1,8 @@
1
+ sudo: false
1
2
  language: ruby
3
+ cache: bundler
2
4
  rvm:
3
5
  - 1.9.3
4
6
  - 2.1.2
5
- - 2.2.0
6
- - ruby-head
7
+ - 2.2.4
8
+ - 2.3.1
data/CHANGELOG.md CHANGED
@@ -1,5 +1,7 @@
1
+ # 0.9.1
2
+ - Don't require aws keys for Stemcell::Launcher to allow for launching via iam role
1
3
 
2
- # next release
4
+ # 0.9.0
3
5
  - ...
4
6
 
5
7
  # 0.8.1
data/Gemfile CHANGED
@@ -4,8 +4,7 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  group :test do
7
- gem 'rspec', '~> 2.14.1'
8
- gem 'rspec-instafail', '~> 0.2.4'
7
+ gem 'rspec', '~> 3.4'
9
8
  gem 'simplecov', :require => false
10
9
  gem 'rake', '~> 10.3.2'
11
10
  end
data/Rakefile CHANGED
@@ -4,5 +4,5 @@ task :default => :spec
4
4
 
5
5
  RSpec::Core::RakeTask.new(:spec) do |spec|
6
6
  spec.pattern = 'spec/**/*_spec.rb'
7
- spec.rspec_opts = ['-cfs --backtrace']
7
+ spec.rspec_opts = ['-c --backtrace']
8
8
  end
@@ -8,11 +8,8 @@ require "stemcell/option_parser"
8
8
 
9
9
  module Stemcell
10
10
  class Launcher
11
-
12
11
  REQUIRED_OPTIONS = [
13
- 'aws_access_key',
14
- 'aws_secret_key',
15
- 'region'
12
+ 'region',
16
13
  ]
17
14
 
18
15
  REQUIRED_LAUNCH_PARAMETERS = [
@@ -53,8 +50,10 @@ module Stemcell
53
50
  'security_groups',
54
51
  'security_group_ids',
55
52
  'tags',
53
+ 'classic_link',
56
54
  'iam_role',
57
55
  'ebs_optimized',
56
+ 'termination_protection',
58
57
  'block_device_mappings',
59
58
  'ephemeral_devices',
60
59
  'placement_group'
@@ -63,34 +62,25 @@ module Stemcell
63
62
  TEMPLATE_PATH = '../templates/bootstrap.sh.erb'
64
63
  LAST_BOOTSTRAP_LINE = "Stemcell bootstrap finished successfully!"
65
64
 
65
+ MAX_RUNNING_STATE_WAIT_TIME = 300 # seconds
66
+ RUNNING_STATE_WAIT_SLEEP_TIME = 5 # seconds
67
+
66
68
  def initialize(opts={})
67
69
  @log = Logger.new(STDOUT)
68
70
  @log.level = Logger::INFO unless ENV['DEBUG']
69
71
  @log.debug "creating new stemcell object"
70
72
  @log.debug "opts are #{opts.inspect}"
71
73
 
72
- REQUIRED_OPTIONS.each do |req|
73
- raise ArgumentError, "missing required param #{req}" unless opts[req]
74
- instance_variable_set("@#{req}",opts[req])
74
+ REQUIRED_OPTIONS.each do |opt|
75
+ raise ArgumentError, "missing required option 'region'" unless opts[opt]
75
76
  end
76
77
 
77
- @ec2_url = "ec2.#{@region}.amazonaws.com"
78
- @timeout = 300
79
- @start_time = Time.new
80
-
81
- AWS.config({
82
- :access_key_id => @aws_access_key,
83
- :secret_access_key => @aws_secret_key})
84
-
85
- if opts['vpc_id']
86
- puts 'using vpc tho'
87
- @ec2 = AWS::VPC.new(opts['vpc_id'], :ec2_endpoint => @ec2_url)
88
- else
89
- @ec2 = AWS::EC2.new(:ec2_endpoint => @ec2_url)
90
- end
78
+ @region = opts['region']
79
+ @vpc_id = opts['vpc_id']
80
+ @aws_access_key = opts['aws_access_key']
81
+ @aws_secret_key = opts['aws_secret_key']
91
82
  end
92
83
 
93
-
94
84
  def launch(opts={})
95
85
  verify_required_options(opts, REQUIRED_LAUNCH_PARAMETERS)
96
86
 
@@ -161,6 +151,12 @@ module Stemcell
161
151
  # specify an EBS-optimized instance (optional)
162
152
  launch_options[:ebs_optimized] = true if opts['ebs_optimized']
163
153
 
154
+ # specify placement group (optional)
155
+ if opts['instance_initiated_shutdown_behavior']
156
+ launch_options[:instance_initiated_shutdown_behavior] =
157
+ opts['instance_initiated_shutdown_behavior']
158
+ end
159
+
164
160
  # specify raw block device mappings (optional)
165
161
  if opts['block_device_mappings']
166
162
  launch_options[:block_device_mappings] = opts['block_device_mappings']
@@ -184,10 +180,22 @@ module Stemcell
184
180
  # launch instances
185
181
  instances = do_launch(launch_options)
186
182
 
187
- # set tags on all instances launched
183
+ # everything from here on out must succeed, or we kill the instances we just launched
188
184
  begin
185
+ # set tags on all instances launched
189
186
  set_tags(instances, tags)
190
- @log.info "sent ec2 api requests successfully"
187
+ @log.info "sent ec2 api tag requests successfully"
188
+
189
+ # link to classiclink
190
+ set_classic_link(instances, opts['classic_link'])
191
+ @log.info "succesfully applied classic link settings (if any)"
192
+
193
+ # turn on termination protection
194
+ # we do this now to make sure all other settings worked
195
+ if opts['termination_protection']
196
+ enable_termination_protection(instances)
197
+ @log.info "succesfully enabled termination protection"
198
+ end
191
199
 
192
200
  # wait for aws to report instance stats
193
201
  if opts.fetch('wait', true)
@@ -208,24 +216,19 @@ module Stemcell
208
216
  return instances
209
217
  end
210
218
 
211
- def find_instance(id)
212
- return @ec2.instances[id]
213
- end
214
-
215
- def kill(instance_ids, opts={})
216
- return if instance_ids.nil?
219
+ def kill(instances, opts={})
220
+ return if !instances || instances.empty?
217
221
 
218
- errors = run_batch_operation(instance_ids) do |id|
222
+ errors = run_batch_operation(instances) do |instance|
219
223
  begin
220
- instance = find_instance(id)
221
- @log.warn "Terminating instance #{instance.instance_id}"
224
+ @log.warn "Terminating instance #{instance.id}"
222
225
  instance.terminate
223
226
  nil # nil == success
224
227
  rescue AWS::EC2::Errors::InvalidInstanceID::NotFound => e
225
228
  opts[:ignore_not_found] ? nil : e
226
229
  end
227
230
  end
228
- check_errors(:kill, instance_ids, errors)
231
+ check_errors(:kill, instances.map(&:id), errors)
229
232
  end
230
233
 
231
234
  # this is made public for ec2admin usage
@@ -252,22 +255,18 @@ module Stemcell
252
255
  end
253
256
 
254
257
  def wait(instances)
255
- @log.info "Waiting up to #{@timeout} seconds for #{instances.count} " \
256
- "instance(s) (#{instances.inspect}):"
257
-
258
- while !instances.all? { |i| i.status == :running }
259
- elapsed = Time.now - @start_time
260
- if elapsed >= @timeout
261
- raise TimeoutError, "exceded timeout of #{@timeout}"
262
- else
263
- sleep min(5, @timeout - elapsed)
264
- end
258
+ @log.info "Waiting up to #{MAX_RUNNING_STATE_WAIT_TIME} seconds for #{instances.count} " \
259
+ "instance(s): (#{instances.inspect})"
260
+
261
+ times_out_at = Time.now + MAX_RUNNING_STATE_WAIT_TIME
262
+ until instances.all?{ |i| i.status == :running }
263
+ wait_time_expire_or_sleep(times_out_at)
265
264
  end
266
265
 
267
266
  @log.info "all instances in running state"
268
267
  end
269
268
 
270
- def verify_required_options(params,required_options)
269
+ def verify_required_options(params, required_options)
271
270
  @log.debug "params is #{params}"
272
271
  @log.debug "required_options are #{required_options}"
273
272
  required_options.each do |required|
@@ -280,7 +279,7 @@ module Stemcell
280
279
  def do_launch(opts={})
281
280
  @log.debug "about to launch instance(s) with options #{opts}"
282
281
  @log.info "launching instances"
283
- instances = @ec2.instances.create(opts)
282
+ instances = ec2.instances.create(opts)
284
283
  instances = [instances] unless Array === instances
285
284
  instances.each do |instance|
286
285
  @log.info "launched instance #{instance.instance_id}"
@@ -301,6 +300,59 @@ module Stemcell
301
300
  check_errors(:set_tags, instances.map(&:id), errors)
302
301
  end
303
302
 
303
+ def set_classic_link(left_to_process, classic_link)
304
+ return unless classic_link['vpc_id']
305
+ return unless classic_link['security_group_ids'] && !classic_link['security_group_ids'].empty?
306
+
307
+ @log.info "applying classic link settings on #{left_to_process.count} instance(s)"
308
+
309
+ errors = []
310
+ processed = []
311
+ times_out_at = Time.now + MAX_RUNNING_STATE_WAIT_TIME
312
+ until left_to_process.empty?
313
+ wait_time_expire_or_sleep(times_out_at)
314
+
315
+ # we can only apply classic link when instances are in the running state
316
+ # lets apply classiclink as instances become available so we don't wait longer than necessary
317
+ recently_running = left_to_process.select{ |inst| inst.status == :running }
318
+ left_to_process = left_to_process.reject{ |inst| recently_running.include?(inst) }
319
+
320
+ processed += recently_running
321
+ errors += run_batch_operation(recently_running) do |instance|
322
+ begin
323
+ result = ec2.client.attach_classic_link_vpc({
324
+ :instance_id => instance.id,
325
+ :vpc_id => classic_link['vpc_id'],
326
+ :groups => classic_link['security_group_ids'],
327
+ })
328
+ result.error
329
+ rescue StandardError => e
330
+ e
331
+ end
332
+ end
333
+ end
334
+
335
+ check_errors(:set_classic_link, processed.map(&:id), errors)
336
+ end
337
+
338
+ def enable_termination_protection(instances)
339
+ @log.info "enabling termination protection on instance(s)"
340
+ errors = run_batch_operation(instances) do |instance|
341
+ begin
342
+ resp = ec2.client.modify_instance_attribute({
343
+ :instance_id => instance.id,
344
+ :disable_api_termination => {
345
+ :value => true
346
+ }
347
+ })
348
+ resp.error # returns nil (success) unless there was an error
349
+ rescue StandardError => e
350
+ e
351
+ end
352
+ end
353
+ check_errors(:enable_termination_protection, instances.map(&:id), errors)
354
+ end
355
+
304
356
  # attempt to accept keys as file paths
305
357
  def try_file(opt="")
306
358
  File.read(File.expand_path(opt)) rescue opt
@@ -341,5 +393,37 @@ module Stemcell
341
393
  instance_ids.zip(errors).reject { |i, e| e.nil? }
342
394
  )
343
395
  end
396
+
397
+ def ec2
398
+ return @ec2 if @ec2
399
+
400
+ # configure AWS with creds/region
401
+ aws_configs = {:region => @region}
402
+ aws_configs.merge!({
403
+ :access_key_id => @aws_access_key,
404
+ :secret_access_key => @aws_secret_key
405
+ }) if @aws_access_key && @aws_secret_key
406
+ AWS.config(aws_configs)
407
+
408
+ # calculate our ec2 url
409
+ ec2_url = "ec2.#{@region}.amazonaws.com"
410
+
411
+ if @vpc_id
412
+ @ec2 = AWS::VPC.new(@vpc_id, :ec2_endpoint => ec2_url)
413
+ else
414
+ @ec2 = AWS::EC2.new(:ec2_endpoint => ec2_url)
415
+ end
416
+
417
+ @ec2
418
+ end
419
+
420
+ def wait_time_expire_or_sleep(times_out_at)
421
+ now = Time.now
422
+ if now >= times_out_at
423
+ raise TimeoutError, "exceded timeout of #{MAX_RUNNING_STATE_WAIT_TIME} seconds"
424
+ else
425
+ sleep [RUNNING_STATE_WAIT_SLEEP_TIME, times_out_at - now].min
426
+ end
427
+ end
344
428
  end
345
429
  end
@@ -83,6 +83,18 @@ module Stemcell
83
83
  :type => String,
84
84
  :env => 'VPC_ID'
85
85
  },
86
+ {
87
+ :name => 'classic_link_vpc_id',
88
+ :desc => 'VPC ID to which this instance will be classic-linked',
89
+ :type => String,
90
+ :env => 'CLASSIC_LINK_VPC_ID',
91
+ },
92
+ {
93
+ :name => 'classic_link_security_group_ids',
94
+ :desc => 'comma-separated list of security group IDs to link into ClassicLink; not used unless classic_link_vpc_id is set',
95
+ :type => String,
96
+ :env => 'CLASSIC_LINK_SECURITY_GROUP_IDS',
97
+ },
86
98
  {
87
99
  :name => 'subnet',
88
100
  :desc => "VPC subnet for which to launch this instance",
@@ -137,6 +149,19 @@ module Stemcell
137
149
  :type => String,
138
150
  :env => 'EBS_OPTIMIZED'
139
151
  },
152
+ {
153
+ :name => 'termination_protection',
154
+ :desc => "Prevent created instances from being terminated via the API",
155
+ :type => String,
156
+ :env => 'TERMINATION_PROTECTION'
157
+ },
158
+ {
159
+ :name => 'instance_initiated_shutdown_behavior',
160
+ :desc => "What happens when the instance shuts down? ('stop' or 'terminate')",
161
+ :type => String,
162
+ :default => 'stop',
163
+ :env => 'INSTANCE_INITIATED_SHUTDOWN_BEHAVIOR',
164
+ },
140
165
  {
141
166
  :name => 'block_device_mappings',
142
167
  :desc => 'block device mappings',
@@ -358,6 +383,14 @@ module Stemcell
358
383
  # convert ephemeral_devices from comma separated string to ruby array
359
384
  options['ephemeral_devices'] &&= options['ephemeral_devices'].split(',')
360
385
 
386
+ # format the classic link options
387
+ if options['classic_link_vpc_id']
388
+ options['classic_link']['vpc_id'] = options['classic_link_vpc_id']
389
+ end
390
+ if options['classic_link_security_group_ids']
391
+ options['classic_link']['security_group_ids'] = options['classic_link_security_group_ids']
392
+ end
393
+
361
394
  options
362
395
  end
363
396
 
@@ -1,3 +1,3 @@
1
1
  module Stemcell
2
- VERSION = "0.9.0"
2
+ VERSION = "0.10.0"
3
3
  end
@@ -8,6 +8,10 @@ class MockInstance
8
8
  def id
9
9
  @id
10
10
  end
11
+
12
+ def status
13
+ :running
14
+ end
11
15
  end
12
16
 
13
17
  class MockException < StandardError
@@ -15,8 +19,7 @@ end
15
19
 
16
20
  describe Stemcell::Launcher do
17
21
  let(:launcher) {
18
- opts = {}
19
- Stemcell::Launcher::REQUIRED_OPTIONS.map { |k| opts[k] = "" }
22
+ opts = {'region' => 'region'}
20
23
  launcher = Stemcell::Launcher.new(opts)
21
24
  launcher
22
25
  }
@@ -24,11 +27,35 @@ describe Stemcell::Launcher do
24
27
  let(:instances) { (1..4).map { |id| MockInstance.new(id) } }
25
28
  let(:instance_ids) { instances.map(&:id) }
26
29
 
27
- describe '#run_batch_operation' do
30
+ describe '#set_classic_link' do
31
+ let(:ec2) { instance_double(AWS::EC2) }
32
+ let(:client) { double(AWS::EC2::Client) }
33
+ let(:response) { instance_double(AWS::Core::Response) }
34
+ before do
35
+ allow(launcher).to receive(:ec2).and_return(ec2)
36
+ allow(ec2).to receive(:client).and_return(client)
37
+ allow(response).to receive(:error).and_return(nil)
38
+ end
39
+
40
+ let(:classic_link) { {'vpc_id' => 'vpc_id', 'security_group_ids' => ['sg1', 'sg2']} }
28
41
 
42
+ it 'invokes classic link on all of the instances' do
43
+ instances.each do |instance|
44
+ expect(client).to receive(:attach_classic_link_vpc).ordered.with(a_hash_including(
45
+ :instance_id => instance.id,
46
+ :vpc_id => classic_link['vpc_id'],
47
+ :groups => classic_link['security_group_ids'],
48
+ )).and_return(response)
49
+ end
50
+
51
+ launcher.send(:set_classic_link, instances, classic_link)
52
+ end
53
+ end
54
+
55
+ describe '#run_batch_operation' do
29
56
  it "raises no exception when no internal error occur" do
30
57
  errors = launcher.send(:run_batch_operation, instances) {}
31
- errors.all?(&:nil?).should be_true
58
+ expect(errors.all?(&:nil?)).to be true
32
59
  end
33
60
 
34
61
  it "runs full batch even when there are two error" do
@@ -36,8 +63,8 @@ describe Stemcell::Launcher do
36
63
  instances) do |instance, error|
37
64
  raise "error-#{instance.id}" if instance.id % 2 == 0
38
65
  end
39
- errors.count(&:nil?).should be_eql(2)
40
- errors.reject(&:nil?).map { |e| e.message }.should \
66
+ expect(errors.count(&:nil?)).to be_eql(2)
67
+ expect(errors.reject(&:nil?).map { |e| e.message }).to \
41
68
  be_eql([2, 4].map { |id| "error-#{id}" })
42
69
  end
43
70
 
@@ -52,7 +79,7 @@ describe Stemcell::Launcher do
52
79
  nil
53
80
  end
54
81
  end
55
- errors.all?(&:nil?).should be_true
82
+ expect(errors.all?(&:nil?)).to be true
56
83
  end
57
84
  end
58
85
  end
@@ -68,10 +68,10 @@ describe Stemcell::MetadataSource do
68
68
  let(:expand_options) { Hash.new }
69
69
 
70
70
  before do
71
- config.stub(:default_options) { default_options }
72
- config.stub(:availability_zones) { availability_zones }
73
- config.stub(:options_for_backing_store) { backing_options }
74
- chef_repo.stub(:metadata_for_role) { role_metadata }
71
+ allow(config).to receive(:default_options) { default_options }
72
+ allow(config).to receive(:availability_zones) { availability_zones }
73
+ allow(config).to receive(:options_for_backing_store) { backing_options }
74
+ allow(chef_repo).to receive(:metadata_for_role) { role_metadata }
75
75
  end
76
76
 
77
77
  let(:role) { 'role' }
@@ -159,13 +159,13 @@ describe Stemcell::MetadataSource do
159
159
  it "calls the config object to retrieve the backing store options" do
160
160
  backing_options.merge!('image_id' => 'ami-nyancat')
161
161
  override_options.merge!('backing_store' => 'ebs')
162
- config.should_receive(:options_for_backing_store).with('ebs') { backing_options }
162
+ expect(config).to receive(:options_for_backing_store).with('ebs') { backing_options }
163
163
  expect(expansion['image_id']).to eql 'ami-nyancat'
164
164
  end
165
165
 
166
166
  it "calls the repository object to determine the role metadata" do
167
167
  role_metadata.merge!('image_id' => 'ami-nyancat')
168
- chef_repo.should_receive(:metadata_for_role).with(role, environment) { role_metadata }
168
+ expect(chef_repo).to receive(:metadata_for_role).with(role, environment) { role_metadata }
169
169
  expect(expansion['image_id']).to eql 'ami-nyancat'
170
170
  end
171
171
 
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Stemcell::OptionParser do
4
+ describe '#parse!' do
5
+ it 'returns a hash containing all of the options' do
6
+ result = subject.parse!([])
7
+ expect(result).to be_an_instance_of(Hash)
8
+
9
+ possible_keys = described_class::OPTION_DEFINITIONS.map { |d| d[:name] }
10
+ expect(result).to include(*possible_keys)
11
+ end
12
+ end
13
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,3 @@
1
- require 'rspec/instafail'
2
1
  require 'simplecov'
3
2
 
4
3
  require 'stemcell'
@@ -9,5 +8,5 @@ SimpleCov.start do
9
8
  end
10
9
 
11
10
  RSpec.configure do |config|
12
- config.color_enabled = true
11
+ config.color = true
13
12
  end
data/stemcell.gemspec CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
6
6
  s.name = "stemcell"
7
7
  s.version = Stemcell::VERSION
8
8
  s.authors = ["Martin Rhoads", "Igor Serebryany", "Nelson Gauthier", "Patrick Viet"]
9
- s.email = ["martin.rhoads@airbnb.com", "igor.serebryany@airbnb.com"]
9
+ s.email = ["igor.serebryany@airbnb.com"]
10
10
  s.description = %q{A tool for launching and bootstrapping EC2 instances}
11
11
  s.summary = %q{no summary}
12
12
  s.homepage = "https://github.com/airbnb/stemcell"
@@ -25,6 +25,11 @@ Gem::Specification.new do |s|
25
25
  s.add_runtime_dependency 'chef', ['>= 11.4.0', '< 12.0.0']
26
26
  end
27
27
 
28
+ # this is a transitive dependency, but the latest vesion has a late ruby
29
+ # version dependency. lets explicitly include it here. if this becomes
30
+ # no-longer a dependency of chef via chef-zero, then remove it
31
+ s.add_runtime_dependency 'rack', '< 2.0.0'
32
+
28
33
  s.add_runtime_dependency 'trollop', '~> 2.1'
29
34
  s.add_runtime_dependency 'aws-creds', '~> 0.2.3'
30
35
  s.add_runtime_dependency 'colored', '~> 1.2'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stemcell
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Rhoads
@@ -11,115 +11,122 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2015-03-28 00:00:00.000000000 Z
14
+ date: 2016-07-28 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: aws-sdk-v1
18
18
  requirement: !ruby/object:Gem::Requirement
19
19
  requirements:
20
- - - ~>
20
+ - - "~>"
21
21
  - !ruby/object:Gem::Version
22
22
  version: '1.63'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - ~>
27
+ - - "~>"
28
28
  - !ruby/object:Gem::Version
29
29
  version: '1.63'
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: net-ssh
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  requirements:
34
- - - ~>
34
+ - - "~>"
35
35
  - !ruby/object:Gem::Version
36
36
  version: '2.9'
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - ~>
41
+ - - "~>"
42
42
  - !ruby/object:Gem::Version
43
43
  version: '2.9'
44
44
  - !ruby/object:Gem::Dependency
45
45
  name: chef
46
46
  requirement: !ruby/object:Gem::Requirement
47
47
  requirements:
48
- - - ! '>='
48
+ - - ">="
49
49
  - !ruby/object:Gem::Version
50
50
  version: 11.4.0
51
- - - <
52
- - !ruby/object:Gem::Version
53
- version: 12.0.0
54
51
  type: :runtime
55
52
  prerelease: false
56
53
  version_requirements: !ruby/object:Gem::Requirement
57
54
  requirements:
58
- - - ! '>='
55
+ - - ">="
59
56
  - !ruby/object:Gem::Version
60
57
  version: 11.4.0
61
- - - <
58
+ - !ruby/object:Gem::Dependency
59
+ name: rack
60
+ requirement: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - "<"
63
+ - !ruby/object:Gem::Version
64
+ version: 2.0.0
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "<"
62
70
  - !ruby/object:Gem::Version
63
- version: 12.0.0
71
+ version: 2.0.0
64
72
  - !ruby/object:Gem::Dependency
65
73
  name: trollop
66
74
  requirement: !ruby/object:Gem::Requirement
67
75
  requirements:
68
- - - ~>
76
+ - - "~>"
69
77
  - !ruby/object:Gem::Version
70
78
  version: '2.1'
71
79
  type: :runtime
72
80
  prerelease: false
73
81
  version_requirements: !ruby/object:Gem::Requirement
74
82
  requirements:
75
- - - ~>
83
+ - - "~>"
76
84
  - !ruby/object:Gem::Version
77
85
  version: '2.1'
78
86
  - !ruby/object:Gem::Dependency
79
87
  name: aws-creds
80
88
  requirement: !ruby/object:Gem::Requirement
81
89
  requirements:
82
- - - ~>
90
+ - - "~>"
83
91
  - !ruby/object:Gem::Version
84
92
  version: 0.2.3
85
93
  type: :runtime
86
94
  prerelease: false
87
95
  version_requirements: !ruby/object:Gem::Requirement
88
96
  requirements:
89
- - - ~>
97
+ - - "~>"
90
98
  - !ruby/object:Gem::Version
91
99
  version: 0.2.3
92
100
  - !ruby/object:Gem::Dependency
93
101
  name: colored
94
102
  requirement: !ruby/object:Gem::Requirement
95
103
  requirements:
96
- - - ~>
104
+ - - "~>"
97
105
  - !ruby/object:Gem::Version
98
106
  version: '1.2'
99
107
  type: :runtime
100
108
  prerelease: false
101
109
  version_requirements: !ruby/object:Gem::Requirement
102
110
  requirements:
103
- - - ~>
111
+ - - "~>"
104
112
  - !ruby/object:Gem::Version
105
113
  version: '1.2'
106
114
  - !ruby/object:Gem::Dependency
107
115
  name: json
108
116
  requirement: !ruby/object:Gem::Requirement
109
117
  requirements:
110
- - - ~>
118
+ - - "~>"
111
119
  - !ruby/object:Gem::Version
112
120
  version: 1.8.2
113
121
  type: :runtime
114
122
  prerelease: false
115
123
  version_requirements: !ruby/object:Gem::Requirement
116
124
  requirements:
117
- - - ~>
125
+ - - "~>"
118
126
  - !ruby/object:Gem::Version
119
127
  version: 1.8.2
120
128
  description: A tool for launching and bootstrapping EC2 instances
121
129
  email:
122
- - martin.rhoads@airbnb.com
123
130
  - igor.serebryany@airbnb.com
124
131
  executables:
125
132
  - necrosis
@@ -127,8 +134,8 @@ executables:
127
134
  extensions: []
128
135
  extra_rdoc_files: []
129
136
  files:
130
- - .gitignore
131
- - .travis.yml
137
+ - ".gitignore"
138
+ - ".travis.yml"
132
139
  - CHANGELOG.md
133
140
  - Gemfile
134
141
  - LICENSE.txt
@@ -175,6 +182,7 @@ files:
175
182
  - spec/lib/stemcell/metadata_source/chef_repository_spec.rb
176
183
  - spec/lib/stemcell/metadata_source/configuration_spec.rb
177
184
  - spec/lib/stemcell/metadata_source_spec.rb
185
+ - spec/lib/stemcell/option_parser_spec.rb
178
186
  - spec/spec_helper.rb
179
187
  - spec/support/fixture_helper.rb
180
188
  - stemcell.gemspec
@@ -188,17 +196,17 @@ require_paths:
188
196
  - lib
189
197
  required_ruby_version: !ruby/object:Gem::Requirement
190
198
  requirements:
191
- - - ! '>='
199
+ - - ">="
192
200
  - !ruby/object:Gem::Version
193
201
  version: '0'
194
202
  required_rubygems_version: !ruby/object:Gem::Requirement
195
203
  requirements:
196
- - - ! '>='
204
+ - - ">="
197
205
  - !ruby/object:Gem::Version
198
206
  version: '0'
199
207
  requirements: []
200
208
  rubyforge_project:
201
- rubygems_version: 2.4.6
209
+ rubygems_version: 2.4.5.1
202
210
  signing_key:
203
211
  specification_version: 4
204
212
  summary: no summary
@@ -228,5 +236,6 @@ test_files:
228
236
  - spec/lib/stemcell/metadata_source/chef_repository_spec.rb
229
237
  - spec/lib/stemcell/metadata_source/configuration_spec.rb
230
238
  - spec/lib/stemcell/metadata_source_spec.rb
239
+ - spec/lib/stemcell/option_parser_spec.rb
231
240
  - spec/spec_helper.rb
232
241
  - spec/support/fixture_helper.rb