stemcell 0.11.6 → 0.11.7
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 +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/stemcell/launcher.rb +38 -6
- data/lib/stemcell/option_parser.rb +10 -1
- data/lib/stemcell/version.rb +1 -1
- data/spec/lib/stemcell/launcher_spec.rb +76 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bbe504f40413724bf87e2b12fac6d6e82da0f47c
|
4
|
+
data.tar.gz: 3ee37995a832825a2479fd784d7d02d8ef070875
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: acd48d19f76a18638048eae5ce84f4537bcb60a8d036510a60d2aa87d220840973e19fb094216e2a192d5f1f6b5e6b43914e9cf44e302dcb9c89a0b8f9785d01
|
7
|
+
data.tar.gz: b929a418da0773876d21785fb7d67fc8ea19e95e989111dae3a8ee13649602299a65caef33eb500750fc5544c19c7a717ef0685c3d5013a2e6e8f97c9d6f3081
|
data/CHANGELOG.md
CHANGED
data/lib/stemcell/launcher.rb
CHANGED
@@ -106,14 +106,21 @@ module Stemcell
|
|
106
106
|
:count => opts['count'],
|
107
107
|
}
|
108
108
|
|
109
|
-
if opts['security_groups'] && !opts['security_groups'].empty?
|
110
|
-
launch_options[:security_groups] = opts['security_groups']
|
111
|
-
end
|
112
|
-
|
113
109
|
if opts['security_group_ids'] && !opts['security_group_ids'].empty?
|
114
110
|
launch_options[:security_group_ids] = opts['security_group_ids']
|
115
111
|
end
|
116
112
|
|
113
|
+
if opts['security_groups'] && !opts['security_groups'].empty?
|
114
|
+
if @vpc_id
|
115
|
+
# convert sg names to sg ids as VPC only accepts ids
|
116
|
+
security_group_ids = get_vpc_security_group_ids(@vpc_id, opts['security_groups'])
|
117
|
+
launch_options[:security_group_ids] ||= []
|
118
|
+
launch_options[:security_group_ids].concat(security_group_ids)
|
119
|
+
else
|
120
|
+
launch_options[:security_groups] = opts['security_groups']
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
117
124
|
# specify availability zone (optional)
|
118
125
|
if opts['availability_zone']
|
119
126
|
launch_options[:availability_zone] = opts['availability_zone']
|
@@ -299,10 +306,35 @@ module Stemcell
|
|
299
306
|
check_errors(:set_tags, instances.map(&:id), errors)
|
300
307
|
end
|
301
308
|
|
309
|
+
# Resolve security group names to their ids in the given VPC
|
310
|
+
def get_vpc_security_group_ids(vpc_id, group_names)
|
311
|
+
group_map = {}
|
312
|
+
@log.info "resolving security groups #{group_names} in #{vpc_id}"
|
313
|
+
vpc = AWS::EC2::VPC.new(vpc_id, :ec2_endpoint => "ec2.#{@region}.amazonaws.com")
|
314
|
+
vpc.security_groups.each do |sg|
|
315
|
+
next if sg.vpc_id != vpc_id
|
316
|
+
group_map[sg.name] = sg.group_id
|
317
|
+
end
|
318
|
+
group_ids = []
|
319
|
+
group_names.each do |sg_name|
|
320
|
+
raise "Couldn't find security group #{sg_name} in #{vpc_id}" unless group_map.has_key?(sg_name)
|
321
|
+
group_ids << group_map[sg_name]
|
322
|
+
end
|
323
|
+
group_ids
|
324
|
+
end
|
325
|
+
|
302
326
|
def set_classic_link(left_to_process, classic_link)
|
303
327
|
return unless classic_link
|
304
328
|
return unless classic_link['vpc_id']
|
305
|
-
|
329
|
+
|
330
|
+
security_group_ids = classic_link['security_group_ids'] || []
|
331
|
+
security_group_names = classic_link['security_groups'] || []
|
332
|
+
return if security_group_ids.empty? && security_group_names.empty?
|
333
|
+
|
334
|
+
if !security_group_names.empty?
|
335
|
+
extra_group_ids = get_vpc_security_group_ids(classic_link['vpc_id'], security_group_names)
|
336
|
+
security_group_ids = security_group_ids + extra_group_ids
|
337
|
+
end
|
306
338
|
|
307
339
|
@log.info "applying classic link settings on #{left_to_process.count} instance(s)"
|
308
340
|
|
@@ -323,7 +355,7 @@ module Stemcell
|
|
323
355
|
result = ec2.client.attach_classic_link_vpc({
|
324
356
|
:instance_id => instance.id,
|
325
357
|
:vpc_id => classic_link['vpc_id'],
|
326
|
-
:groups =>
|
358
|
+
:groups => security_group_ids,
|
327
359
|
})
|
328
360
|
result.error
|
329
361
|
rescue StandardError => e
|
@@ -102,6 +102,12 @@ module Stemcell
|
|
102
102
|
:type => String,
|
103
103
|
:env => 'CLASSIC_LINK_SECURITY_GROUP_IDS',
|
104
104
|
},
|
105
|
+
{
|
106
|
+
:name => 'classic_link_security_groups',
|
107
|
+
:desc => 'comma-separated list of security groups to link into ClassicLink; not used unless classic_link_vpc_id is set',
|
108
|
+
:type => String,
|
109
|
+
:env => 'CLASSIC_LINK_SECURITY_GROUPS',
|
110
|
+
},
|
105
111
|
{
|
106
112
|
:name => 'subnet',
|
107
113
|
:desc => "VPC subnet for which to launch this instance",
|
@@ -415,7 +421,10 @@ module Stemcell
|
|
415
421
|
options['classic_link']['vpc_id'] = options['classic_link_vpc_id']
|
416
422
|
end
|
417
423
|
if options['classic_link_security_group_ids']
|
418
|
-
options['classic_link']['security_group_ids'] = options['classic_link_security_group_ids']
|
424
|
+
options['classic_link']['security_group_ids'] = options['classic_link_security_group_ids'].split(',')
|
425
|
+
end
|
426
|
+
if options['classic_link_security_groups']
|
427
|
+
options['classic_link']['security_groups'] = options['classic_link_security_groups'].split(',')
|
419
428
|
end
|
420
429
|
|
421
430
|
options
|
data/lib/stemcell/version.rb
CHANGED
@@ -14,6 +14,15 @@ class MockInstance
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
+
class MockSecurityGroup
|
18
|
+
attr_reader :group_id, :name, :vpc_id
|
19
|
+
def initialize(id, name, vpc_id)
|
20
|
+
@group_id = id
|
21
|
+
@name = name
|
22
|
+
@vpc_id = vpc_id
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
17
26
|
class MockException < StandardError
|
18
27
|
end
|
19
28
|
|
@@ -27,6 +36,61 @@ describe Stemcell::Launcher do
|
|
27
36
|
let(:instances) { (1..4).map { |id| MockInstance.new(id) } }
|
28
37
|
let(:instance_ids) { instances.map(&:id) }
|
29
38
|
|
39
|
+
describe '#launch' do
|
40
|
+
let(:ec2) { instance_double(AWS::EC2) }
|
41
|
+
let(:client) { double(AWS::EC2::Client) }
|
42
|
+
let(:response) { instance_double(AWS::Core::Response) }
|
43
|
+
let(:launcher) {
|
44
|
+
opts = {'region' => 'region', 'vpc_id' => 'vpc-1'}
|
45
|
+
launcher = Stemcell::Launcher.new(opts)
|
46
|
+
launcher
|
47
|
+
}
|
48
|
+
let(:launch_options) {
|
49
|
+
{
|
50
|
+
'chef_role' => 'role',
|
51
|
+
'chef_environment' => 'environment',
|
52
|
+
'chef_data_bag_secret' => 'data_bag_secret',
|
53
|
+
'git_branch' => 'branch',
|
54
|
+
'git_key' => 'key',
|
55
|
+
'git_origin' => 'origin',
|
56
|
+
'key_name' => 'key',
|
57
|
+
'instance_type' => 'c1.xlarge',
|
58
|
+
'image_id' => 'ami-d9d6a6b0',
|
59
|
+
'availability_zone' => 'us-east-1a',
|
60
|
+
'count' => 2,
|
61
|
+
'security_groups' => ['sg_name1', 'sg_name2'],
|
62
|
+
'wait' => false
|
63
|
+
}
|
64
|
+
}
|
65
|
+
|
66
|
+
before do
|
67
|
+
allow(launcher).to receive(:try_file).and_return('secret')
|
68
|
+
allow(launcher).to receive(:render_template).and_return('template')
|
69
|
+
allow(launcher).to receive(:ec2).and_return(ec2)
|
70
|
+
allow(ec2).to receive(:client).and_return(client)
|
71
|
+
allow(response).to receive(:error).and_return(nil)
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'launches all of the instances' do
|
75
|
+
expect(launcher).to receive(:get_vpc_security_group_ids).
|
76
|
+
with('vpc-1', ['sg_name1', 'sg_name2']).and_call_original
|
77
|
+
expect_any_instance_of(AWS::EC2::VPC).to receive(:security_groups).
|
78
|
+
and_return([1,2].map { |i| MockSecurityGroup.new("sg-#{i}", "sg_name#{i}", 'vpc-1')})
|
79
|
+
expect(launcher).to receive(:do_launch).with(a_hash_including(
|
80
|
+
:image_id => 'ami-d9d6a6b0',
|
81
|
+
:instance_type => 'c1.xlarge',
|
82
|
+
:key_name => 'key',
|
83
|
+
:count => 2,
|
84
|
+
:security_group_ids => ['sg-1', 'sg-2'],
|
85
|
+
:availability_zone => 'us-east-1a',
|
86
|
+
:user_data => 'template'
|
87
|
+
)).and_return(instances)
|
88
|
+
expect(launcher).to receive(:set_tags).with(kind_of(Array), kind_of(Hash)).and_return(nil)
|
89
|
+
|
90
|
+
launcher.send(:launch, launch_options)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
30
94
|
describe '#set_classic_link' do
|
31
95
|
let(:ec2) { instance_double(AWS::EC2) }
|
32
96
|
let(:client) { double(AWS::EC2::Client) }
|
@@ -37,14 +101,24 @@ describe Stemcell::Launcher do
|
|
37
101
|
allow(response).to receive(:error).and_return(nil)
|
38
102
|
end
|
39
103
|
|
40
|
-
let(:classic_link) {
|
104
|
+
let(:classic_link) {
|
105
|
+
{
|
106
|
+
'vpc_id' => 'vpc-1',
|
107
|
+
'security_group_ids' => ['sg-1', 'sg-2'],
|
108
|
+
'security_groups' => ['sg_name']
|
109
|
+
}
|
110
|
+
}
|
41
111
|
|
42
112
|
it 'invokes classic link on all of the instances' do
|
113
|
+
expect(launcher).to receive(:get_vpc_security_group_ids).with('vpc-1', ['sg_name']).
|
114
|
+
and_call_original
|
115
|
+
expect_any_instance_of(AWS::EC2::VPC).to receive(:security_groups).
|
116
|
+
and_return([MockSecurityGroup.new('sg-3', 'sg_name', 'vpc-1')])
|
43
117
|
instances.each do |instance|
|
44
118
|
expect(client).to receive(:attach_classic_link_vpc).ordered.with(a_hash_including(
|
45
119
|
:instance_id => instance.id,
|
46
120
|
:vpc_id => classic_link['vpc_id'],
|
47
|
-
:groups =>
|
121
|
+
:groups => ['sg-1', 'sg-2', 'sg-3'],
|
48
122
|
)).and_return(response)
|
49
123
|
end
|
50
124
|
|
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.11.
|
4
|
+
version: 0.11.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Martin Rhoads
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2017-
|
14
|
+
date: 2017-11-14 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: aws-sdk-v1
|
@@ -239,7 +239,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
239
239
|
version: '0'
|
240
240
|
requirements: []
|
241
241
|
rubyforge_project:
|
242
|
-
rubygems_version: 2.
|
242
|
+
rubygems_version: 2.5.2
|
243
243
|
signing_key:
|
244
244
|
specification_version: 4
|
245
245
|
summary: no summary
|