stemcell 0.13.0 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +9 -0
- data/lib/stemcell/command_line.rb +1 -0
- data/lib/stemcell/launcher.rb +16 -4
- data/lib/stemcell/option_parser.rb +28 -0
- data/lib/stemcell/version.rb +1 -1
- data/spec/lib/stemcell/launcher_spec.rb +62 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 941a58d82b39ad807a558b7d569ffee7f28ad7477f5dbc1cb61c11e8daab9ff4
|
4
|
+
data.tar.gz: 3736e5f1586336821de1d74b249dd64b65b68042de443600cae166a61d054e82
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce9ebf93cd89e275e7bcf01cce447936b99686aad8a0fc82ca5ee3982009b508f5ffa7faa0e3b65cb2c310d06fc991a8268262652bd4b083bc53e924e1eded36
|
7
|
+
data.tar.gz: a976b2c11ffb37d4703cf8d5424e3110a01653b6dde3ddcfb6c6879845cbbab6580c5c1c5cca6029ca43fadfe50fe4e64f740fbe4ccadfa38f406c10e58f77ec
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
# 0.14.0
|
2
|
+
- Adds support for specifying a custom bootstrap template file
|
3
|
+
|
4
|
+
# 0.13.2
|
5
|
+
- Support for specifying --min-count and --max-count
|
6
|
+
|
7
|
+
# 0.13.1
|
8
|
+
- Support for specifying --cpu-options
|
9
|
+
|
1
10
|
# 0.13.0
|
2
11
|
- Migrate to AWS SDK to v3
|
3
12
|
- Drop support for ClassicLink
|
@@ -132,6 +132,7 @@ module Stemcell
|
|
132
132
|
# comma-separated list when presented as defaults.
|
133
133
|
pd['security_groups'] &&= pd['security_groups'].join(',')
|
134
134
|
pd['tags'] &&= pd['tags'].to_a.map { |p| p.join('=') }.join(',')
|
135
|
+
pd['cpu_options'] &&= pd['cpu_options'].to_a.map { |p| p.join('=') }.join(',')
|
135
136
|
pd['chef_cookbook_attributes'] &&= pd['chef_cookbook_attributes'].join(',')
|
136
137
|
end
|
137
138
|
|
data/lib/stemcell/launcher.rb
CHANGED
@@ -31,6 +31,7 @@ module Stemcell
|
|
31
31
|
'chef_environment',
|
32
32
|
'chef_data_bag_secret',
|
33
33
|
'chef_data_bag_secret_path',
|
34
|
+
'cpu_options',
|
34
35
|
'git_branch',
|
35
36
|
'git_key',
|
36
37
|
'git_origin',
|
@@ -46,6 +47,8 @@ module Stemcell
|
|
46
47
|
'dedicated_tenancy',
|
47
48
|
'associate_public_ip_address',
|
48
49
|
'count',
|
50
|
+
'min_count',
|
51
|
+
'max_count',
|
49
52
|
'security_groups',
|
50
53
|
'security_group_ids',
|
51
54
|
'tags',
|
@@ -80,6 +83,7 @@ module Stemcell
|
|
80
83
|
@aws_secret_key = opts['aws_secret_key']
|
81
84
|
@aws_session_token = opts['aws_session_token']
|
82
85
|
@max_attempts = opts['max_attempts'] || 3
|
86
|
+
@bootstrap_template_path = opts['bootstrap_template_path']
|
83
87
|
configure_aws_creds_and_region
|
84
88
|
end
|
85
89
|
|
@@ -101,16 +105,19 @@ module Stemcell
|
|
101
105
|
tags['Name'] = opts['chef_role'] if opts['chef_environment'] == 'production'
|
102
106
|
tags.merge!(opts['tags']) if opts['tags']
|
103
107
|
|
108
|
+
# Min/max number of instances to launch
|
109
|
+
min_count = opts['min_count'] || opts['count']
|
110
|
+
max_count = opts['max_count'] || opts['count']
|
111
|
+
|
104
112
|
# generate launch options
|
105
113
|
launch_options = {
|
106
114
|
:image_id => opts['image_id'],
|
107
115
|
:instance_type => opts['instance_type'],
|
108
116
|
:key_name => opts['key_name'],
|
109
|
-
:min_count =>
|
110
|
-
:max_count =>
|
117
|
+
:min_count => min_count,
|
118
|
+
:max_count => max_count,
|
111
119
|
}
|
112
120
|
|
113
|
-
|
114
121
|
# Associate Public IP can only bet set on network_interfaces, and if present
|
115
122
|
# security groups and subnet should be set on the interface. VPC-only.
|
116
123
|
# Primary network interface
|
@@ -178,6 +185,11 @@ module Stemcell
|
|
178
185
|
launch_options[:block_device_mappings] = opts['block_device_mappings']
|
179
186
|
end
|
180
187
|
|
188
|
+
# specify cpu options (optional)
|
189
|
+
if opts['cpu_options']
|
190
|
+
launch_options[:cpu_options] = opts['cpu_options']
|
191
|
+
end
|
192
|
+
|
181
193
|
# specify ephemeral block device mappings (optional)
|
182
194
|
if opts['ephemeral_devices']
|
183
195
|
launch_options[:block_device_mappings] ||= []
|
@@ -246,7 +258,7 @@ module Stemcell
|
|
246
258
|
|
247
259
|
# this is made public for ec2admin usage
|
248
260
|
def render_template(opts={})
|
249
|
-
template_file_path = File.expand_path(TEMPLATE_PATH, __FILE__)
|
261
|
+
template_file_path = @bootstrap_template_path || File.expand_path(TEMPLATE_PATH, __FILE__)
|
250
262
|
template_file = File.read(template_file_path)
|
251
263
|
erb_template = ERB.new(template_file)
|
252
264
|
last_bootstrap_line = LAST_BOOTSTRAP_LINE
|
@@ -187,6 +187,12 @@ module Stemcell
|
|
187
187
|
:type => String,
|
188
188
|
:env => 'CHEF_DATA_BAG_SECRET_PATH'
|
189
189
|
},
|
190
|
+
{
|
191
|
+
:name => 'cpu_options',
|
192
|
+
:desc => "comma-separated list of cpu option key=value pairs",
|
193
|
+
:type => String,
|
194
|
+
:env => 'CPU_OPTIONS'
|
195
|
+
},
|
190
196
|
{
|
191
197
|
:name => 'chef_role',
|
192
198
|
:desc => "chef role of instance to be launched",
|
@@ -253,6 +259,18 @@ module Stemcell
|
|
253
259
|
:type => Integer,
|
254
260
|
:env => 'COUNT'
|
255
261
|
},
|
262
|
+
{
|
263
|
+
:name => 'min_count',
|
264
|
+
:desc => "minimum number of instances to launch",
|
265
|
+
:type => Integer,
|
266
|
+
:env => 'MIN_COUNT'
|
267
|
+
},
|
268
|
+
{
|
269
|
+
:name => 'max_count',
|
270
|
+
:desc => "maximum number of instances to launch",
|
271
|
+
:type => Integer,
|
272
|
+
:env => 'MAX_COUNT'
|
273
|
+
},
|
256
274
|
{
|
257
275
|
:name => 'tail',
|
258
276
|
:desc => "interactively tail the initial converge",
|
@@ -345,6 +363,16 @@ module Stemcell
|
|
345
363
|
options['tags'] = tags
|
346
364
|
end
|
347
365
|
|
366
|
+
# convert cpu_options from comma separated string to ruby hash
|
367
|
+
if options['cpu_options']
|
368
|
+
cpu_options = {}
|
369
|
+
options['cpu_options'].split(',').each do |cpu_opt|
|
370
|
+
key, value = cpu_opt.split('=')
|
371
|
+
cpu_options[key] = value
|
372
|
+
end
|
373
|
+
options['cpu_options'] = cpu_options
|
374
|
+
end
|
375
|
+
|
348
376
|
# parse block_device_mappings to convert it from the standard CLI format
|
349
377
|
# to the EC2 Ruby API format.
|
350
378
|
# All of this is a bit hard to find so here are some docs links to
|
data/lib/stemcell/version.rb
CHANGED
@@ -23,6 +23,51 @@ describe Stemcell::Launcher do
|
|
23
23
|
end
|
24
24
|
let(:instance_ids) { instances.map(&:id) }
|
25
25
|
|
26
|
+
describe '#render_template' do
|
27
|
+
|
28
|
+
context 'when bootstrap_template_path is not provided' do
|
29
|
+
let(:subject) do
|
30
|
+
launcher.render_template()
|
31
|
+
end
|
32
|
+
|
33
|
+
before do
|
34
|
+
allow(File).to receive(:expand_path).and_return('/path/to/default/bootstrap.sh.erb')
|
35
|
+
allow(File).to receive(:read).and_return('default template content')
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'launches the default template' do
|
39
|
+
expect(File).to receive(:expand_path)
|
40
|
+
expect(File).to receive(:read).with('/path/to/default/bootstrap.sh.erb')
|
41
|
+
|
42
|
+
expect(subject).not_to be_empty
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'when bootstrap_template_path is provided' do
|
47
|
+
let(:subject) do
|
48
|
+
launcher.render_template()
|
49
|
+
end
|
50
|
+
|
51
|
+
let(:launcher) do
|
52
|
+
opts = {'region' => 'region', 'vpc_id' => 'vpc-1', 'bootstrap_template_path' => '/path/to/file.sh.erb'}
|
53
|
+
launcher = Stemcell::Launcher.new(opts)
|
54
|
+
|
55
|
+
launcher
|
56
|
+
end
|
57
|
+
|
58
|
+
before do
|
59
|
+
allow(File).to receive(:read).and_return('custom template content')
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'launches the override template' do
|
63
|
+
expect(File).not_to receive(:expand_path)
|
64
|
+
expect(File).to receive(:read).with('/path/to/file.sh.erb')
|
65
|
+
|
66
|
+
expect(subject).not_to be_empty
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
26
71
|
describe '#launch' do
|
27
72
|
let(:ec2) do
|
28
73
|
ec2 = Aws::EC2::Client.new
|
@@ -71,7 +116,8 @@ describe Stemcell::Launcher do
|
|
71
116
|
'count' => 2,
|
72
117
|
'security_groups' => ['sg_name1', 'sg_name2'],
|
73
118
|
'user' => 'some_user',
|
74
|
-
'wait' => true
|
119
|
+
'wait' => true,
|
120
|
+
'cpu_options' => 'core_count=1,threads_per_core=1'
|
75
121
|
}
|
76
122
|
}
|
77
123
|
|
@@ -107,11 +153,25 @@ describe Stemcell::Launcher do
|
|
107
153
|
{ :key => "stemcell", :value => Stemcell::VERSION },
|
108
154
|
]},
|
109
155
|
],
|
110
|
-
:user_data => Base64.encode64('template')
|
156
|
+
:user_data => Base64.encode64('template'),
|
157
|
+
:cpu_options => 'core_count=1,threads_per_core=1'
|
111
158
|
)).and_return(instances)
|
112
159
|
launched_instances = launcher.send(:launch, launch_options)
|
113
160
|
expect(launched_instances.map(&:public_ip_address)).to all(be_truthy)
|
114
161
|
end
|
162
|
+
|
163
|
+
it 'launches with min/max count' do
|
164
|
+
expect(launcher).to receive(:do_launch).with(a_hash_including(
|
165
|
+
:min_count => 3,
|
166
|
+
:max_count => 6,
|
167
|
+
)).and_return(instances)
|
168
|
+
options = launch_options.merge(
|
169
|
+
'min_count' => 3,
|
170
|
+
'max_count' => 6,
|
171
|
+
)
|
172
|
+
launched_instances = launcher.send(:launch,
|
173
|
+
launch_options.merge('min_count' => 3, 'max_count' => 6))
|
174
|
+
end
|
115
175
|
end
|
116
176
|
|
117
177
|
describe '#kill' do
|
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.
|
4
|
+
version: 0.14.0
|
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:
|
14
|
+
date: 2022-07-27 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: aws-eventstream
|
@@ -267,7 +267,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
267
267
|
- !ruby/object:Gem::Version
|
268
268
|
version: '0'
|
269
269
|
requirements: []
|
270
|
-
rubygems_version: 3.0.3
|
270
|
+
rubygems_version: 3.0.3.1
|
271
271
|
signing_key:
|
272
272
|
specification_version: 4
|
273
273
|
summary: no summary
|