bosh_aws_cpi 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/cloud/aws/cloud.rb +59 -11
- data/lib/cloud/aws/version.rb +1 -1
- data/spec/unit/create_stemcell_spec.rb +16 -1
- data/spec/unit/create_vm_spec.rb +10 -0
- metadata +4 -4
data/lib/cloud/aws/cloud.rb
CHANGED
@@ -11,12 +11,6 @@ module Bosh::AwsCloud
|
|
11
11
|
METADATA_TIMEOUT = 5 # seconds
|
12
12
|
DEVICE_POLL_TIMEOUT = 60 # seconds
|
13
13
|
|
14
|
-
DEFAULT_AKI = "aki-b4aa75dd"
|
15
|
-
DEFAULT_ROOT_DEVICE_NAME = "/dev/sda1"
|
16
|
-
|
17
|
-
# UBUNTU_10_04_32_BIT_US_EAST_EBS = "ami-3e9b4957"
|
18
|
-
# UBUNTU_10_04_32_BIT_US_EAST = "ami-809a48e9"
|
19
|
-
|
20
14
|
attr_reader :ec2
|
21
15
|
attr_reader :registry
|
22
16
|
attr_accessor :logger
|
@@ -101,7 +95,11 @@ module Bosh::AwsCloud
|
|
101
95
|
@logger.debug("using security groups: #{security_groups.join(', ')}")
|
102
96
|
|
103
97
|
response = @ec2.client.describe_images(:image_ids => [stemcell_id])
|
104
|
-
|
98
|
+
images_set = response.images_set
|
99
|
+
if images_set.empty?
|
100
|
+
cloud_error("no stemcell info for #{stemcell_id}")
|
101
|
+
end
|
102
|
+
root_device_name = images_set.first.root_device_name
|
105
103
|
|
106
104
|
instance_params = {
|
107
105
|
:image_id => stemcell_id,
|
@@ -285,6 +283,14 @@ module Bosh::AwsCloud
|
|
285
283
|
# involves creating and mounting new EBS volume as local block device.
|
286
284
|
# @param [String] image_path local filesystem path to a stemcell image
|
287
285
|
# @param [Hash] cloud_properties CPI-specific properties
|
286
|
+
# @option cloud_properties [String] kernel_id
|
287
|
+
# AKI, auto-selected based on the region
|
288
|
+
# @option cloud_properties [String] root_device_name
|
289
|
+
# provided by the stemcell manifest
|
290
|
+
# @option cloud_properties [String] architecture
|
291
|
+
# provided by the stemcell manifest
|
292
|
+
# @option cloud_properties [String] disk (2048)
|
293
|
+
# root disk size
|
288
294
|
def create_stemcell(image_path, cloud_properties)
|
289
295
|
# TODO: refactor into several smaller methods
|
290
296
|
with_thread_name("create_stemcell(#{image_path}...)") do
|
@@ -309,13 +315,18 @@ module Bosh::AwsCloud
|
|
309
315
|
snapshot = volume.create_snapshot
|
310
316
|
wait_resource(snapshot, :completed)
|
311
317
|
|
312
|
-
root_device_name = cloud_properties["root_device_name"]
|
313
|
-
|
318
|
+
root_device_name = cloud_properties["root_device_name"]
|
319
|
+
architecture = cloud_properties["architecture"]
|
320
|
+
|
321
|
+
aki = find_aki(architecture, root_device_name)
|
314
322
|
|
323
|
+
# we could set :description here, but since we don't have a
|
324
|
+
# handle to the stemcell name and version, we can't set it
|
325
|
+
# to something useful :(
|
315
326
|
image_params = {
|
316
327
|
:name => "BOSH-#{generate_unique_name}",
|
317
|
-
:architecture =>
|
318
|
-
:kernel_id =>
|
328
|
+
:architecture => architecture,
|
329
|
+
:kernel_id => aki,
|
319
330
|
:root_device_name => root_device_name,
|
320
331
|
:block_device_mappings => {
|
321
332
|
"/dev/sda" => { :snapshot_id => snapshot.id },
|
@@ -340,6 +351,42 @@ module Bosh::AwsCloud
|
|
340
351
|
end
|
341
352
|
end
|
342
353
|
|
354
|
+
# finds the correct aki for the current region
|
355
|
+
def find_aki(arch, root_device_name)
|
356
|
+
|
357
|
+
filters = []
|
358
|
+
filters << {:name => "architecture", :values => [arch]}
|
359
|
+
filters << {:name => "image-type", :values => %w[kernel]}
|
360
|
+
filters << {:name => "owner-alias", :values => %w[amazon]}
|
361
|
+
|
362
|
+
response = @ec2.client.describe_images(:filters => filters)
|
363
|
+
|
364
|
+
# do nasty hackery to select boot device and version from
|
365
|
+
# the image_location string e.g. pv-grub-hd00_1.03-x86_64.gz
|
366
|
+
if root_device_name == "/dev/sda1"
|
367
|
+
regexp = /-hd00[-_](\d+)\.(\d+)/
|
368
|
+
else
|
369
|
+
regexp = /-hd0[-_](\d+)\.(\d+)/
|
370
|
+
end
|
371
|
+
|
372
|
+
candidate = nil
|
373
|
+
major = 0
|
374
|
+
minor = 0
|
375
|
+
response.images_set.each do |image|
|
376
|
+
match = image.image_location.match(regexp)
|
377
|
+
if match && match[1].to_i > major && match[2].to_i > minor
|
378
|
+
candidate = image
|
379
|
+
major = match[1].to_i
|
380
|
+
minor = match[2].to_i
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
cloud_error("unable to find AKI") unless candidate
|
385
|
+
@logger.info("auto-selected AKI: #{candidate.image_id}")
|
386
|
+
|
387
|
+
candidate.image_id
|
388
|
+
end
|
389
|
+
|
343
390
|
def delete_stemcell(stemcell_id)
|
344
391
|
with_thread_name("delete_stemcell(#{stemcell_id})") do
|
345
392
|
image = @ec2.images[stemcell_id]
|
@@ -393,6 +440,7 @@ module Bosh::AwsCloud
|
|
393
440
|
# assume its identity
|
394
441
|
# @param [Hash] network_spec Agent network spec
|
395
442
|
# @param [Hash] environment
|
443
|
+
# @param [String] root_device_name root device, e.g. /dev/sda1
|
396
444
|
# @return [Hash]
|
397
445
|
def initial_agent_settings(agent_id, network_spec, environment,
|
398
446
|
root_device_name)
|
data/lib/cloud/aws/version.rb
CHANGED
@@ -39,6 +39,17 @@ describe Bosh::AwsCloud::Cloud do
|
|
39
39
|
ec2.volumes.stub(:[]).with("v-foo").and_return(volume)
|
40
40
|
ec2.instances.stub(:[]).with("i-current").and_return(current_instance)
|
41
41
|
ec2.images.should_receive(:create).with(image_params).and_return(image)
|
42
|
+
|
43
|
+
i1 = double("image-1", :root_device_name => "/dev/sda1",
|
44
|
+
:image_location => "pv-grub-hd00_1.03-x86_64.gz",
|
45
|
+
:image_id => "aki-b4aa75dd")
|
46
|
+
i2 = double("image-2", :root_device_name => "/dev/sda1",
|
47
|
+
:image_location => "pv-grub-hd00_1.02-x86_64.gz",
|
48
|
+
:image_id => "aki-b4aa75d0")
|
49
|
+
|
50
|
+
result = double("images_set", :images_set => [i1, i2])
|
51
|
+
client = double("client", :describe_images => result)
|
52
|
+
ec2.should_receive(:client).and_return(client)
|
42
53
|
end
|
43
54
|
|
44
55
|
cloud.stub(:generate_unique_name).and_return(unique_name)
|
@@ -89,7 +100,11 @@ describe Bosh::AwsCloud::Cloud do
|
|
89
100
|
|
90
101
|
cloud.should_receive(:delete_disk).with("v-foo")
|
91
102
|
|
92
|
-
|
103
|
+
cloud_properties = {
|
104
|
+
"root_device_name" => "/dev/sda1",
|
105
|
+
"architecture" => "x86_64"
|
106
|
+
}
|
107
|
+
cloud.create_stemcell("/tmp/foo", cloud_properties).should == "i-bar"
|
93
108
|
end
|
94
109
|
|
95
110
|
end
|
data/spec/unit/create_vm_spec.rb
CHANGED
@@ -127,6 +127,16 @@ describe Bosh::AwsCloud::Cloud, "create_vm" do
|
|
127
127
|
|
128
128
|
cloud = mock_cloud do |ec2|
|
129
129
|
ec2.instances.should_receive(:create).and_return(instance)
|
130
|
+
image = double("image")
|
131
|
+
image.should_receive(:root_device_name).and_return("/dev/sda1")
|
132
|
+
|
133
|
+
result = double("result")
|
134
|
+
result.should_receive(:images_set).and_return([image])
|
135
|
+
|
136
|
+
client = double("client")
|
137
|
+
client.should_receive(:describe_images).with({:image_ids=>["sc-id"]}).
|
138
|
+
and_return(result)
|
139
|
+
|
130
140
|
ec2.should_receive(:client).and_return(client)
|
131
141
|
end
|
132
142
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bosh_aws_cpi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aws-sdk
|
@@ -158,7 +158,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
158
158
|
version: '0'
|
159
159
|
segments:
|
160
160
|
- 0
|
161
|
-
hash:
|
161
|
+
hash: 3392403251669276232
|
162
162
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
163
|
none: false
|
164
164
|
requirements:
|
@@ -167,7 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
167
167
|
version: '0'
|
168
168
|
segments:
|
169
169
|
- 0
|
170
|
-
hash:
|
170
|
+
hash: 3392403251669276232
|
171
171
|
requirements: []
|
172
172
|
rubyforge_project:
|
173
173
|
rubygems_version: 1.8.24
|