bosh_openstack_cpi 1.2579.0 → 1.2583.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -13,6 +13,7 @@ module Bosh::OpenStackCloud
13
13
  attr_reader :openstack
14
14
  attr_reader :registry
15
15
  attr_reader :glance
16
+ attr_reader :volume
16
17
  attr_accessor :logger
17
18
 
18
19
  ##
@@ -33,11 +34,12 @@ module Bosh::OpenStackCloud
33
34
  @agent_properties = @options['agent'] || {}
34
35
  @openstack_properties = @options['openstack']
35
36
 
36
- @default_key_name = @openstack_properties['default_key_name']
37
- @default_security_groups = @openstack_properties['default_security_groups']
38
- @state_timeout = @openstack_properties['state_timeout']
39
- @stemcell_public_visibility = @openstack_properties['stemcell_public_visibility']
40
- @wait_resource_poll_interval = @openstack_properties['wait_resource_poll_interval']
37
+ @default_key_name = @openstack_properties["default_key_name"]
38
+ @default_security_groups = @openstack_properties["default_security_groups"]
39
+ @state_timeout = @openstack_properties["state_timeout"]
40
+ @stemcell_public_visibility = @openstack_properties["stemcell_public_visibility"]
41
+ @wait_resource_poll_interval = @openstack_properties["wait_resource_poll_interval"]
42
+ @boot_from_volume = @openstack_properties["boot_from_volume"]
41
43
 
42
44
  unless @openstack_properties['auth_url'].match(/\/tokens$/)
43
45
  @openstack_properties['auth_url'] = @openstack_properties['auth_url'] + '/tokens'
@@ -77,6 +79,22 @@ module Bosh::OpenStackCloud
77
79
  cloud_error('Unable to connect to the OpenStack Image Service API. Check task debug log for details.')
78
80
  end
79
81
 
82
+ volume_params = {
83
+ :provider => "OpenStack",
84
+ :openstack_auth_url => @openstack_properties["auth_url"],
85
+ :openstack_username => @openstack_properties["username"],
86
+ :openstack_api_key => @openstack_properties["api_key"],
87
+ :openstack_tenant => @openstack_properties["tenant"],
88
+ :openstack_endpoint_type => @openstack_properties["endpoint_type"],
89
+ :connection_options => @openstack_properties['connection_options']
90
+ }
91
+ begin
92
+ @volume = Fog::Volume.new(volume_params)
93
+ rescue Exception => e
94
+ @logger.error(e)
95
+ cloud_error("Unable to connect to the OpenStack Volume API. Check task debug log for details.")
96
+ end
97
+
80
98
  @metadata_lock = Mutex.new
81
99
  end
82
100
 
@@ -222,6 +240,14 @@ module Bosh::OpenStackCloud
222
240
  cloud_error("Key-pair `#{keyname}' not found") if keypair.nil?
223
241
  @logger.debug("Using key-pair: `#{keypair.name}' (#{keypair.fingerprint})")
224
242
 
243
+ if @boot_from_volume
244
+ boot_vol_size = flavor.disk * 1024
245
+
246
+ boot_vol_id = create_boot_disk(boot_vol_size, stemcell_id)
247
+ cloud_error("Failed to create boot volume.") if boot_vol_id.nil?
248
+ @logger.debug("Using boot volume: `#{boot_vol_id}'")
249
+ end
250
+
225
251
  server_params = {
226
252
  :name => server_name,
227
253
  :image_ref => image.id,
@@ -229,16 +255,26 @@ module Bosh::OpenStackCloud
229
255
  :key_name => keypair.name,
230
256
  :security_groups => security_groups,
231
257
  :nics => nics,
232
- :user_data => Yajl::Encoder.encode(user_data(server_name, network_spec)),
233
- :personality => [{
234
- 'path' => "#{BOSH_APP_DIR}/user_data.json",
235
- 'contents' => Yajl::Encoder.encode(user_data(server_name, network_spec, keypair.public_key))
236
- }]
258
+ :user_data => Yajl::Encoder.encode(user_data(server_name, network_spec))
237
259
  }
238
260
 
239
261
  availability_zone = select_availability_zone(disk_locality, resource_pool['availability_zone'])
240
262
  server_params[:availability_zone] = availability_zone if availability_zone
241
263
 
264
+ if @boot_from_volume
265
+ server_params[:block_device_mapping] = [{
266
+ :volume_size => "",
267
+ :volume_id => boot_vol_id,
268
+ :delete_on_termination => "1",
269
+ :device_name => "/dev/vda"
270
+ }]
271
+ else
272
+ server_params[:personality] = [{
273
+ "path" => "#{BOSH_APP_DIR}/user_data.json",
274
+ "contents" => Yajl::Encoder.encode(user_data(server_name, network_spec, keypair.public_key))
275
+ }]
276
+ end
277
+
242
278
  @logger.debug("Using boot parms: `#{server_params.inspect}'")
243
279
  server = with_openstack { @openstack.servers.create(server_params) }
244
280
 
@@ -376,6 +412,35 @@ module Bosh::OpenStackCloud
376
412
  end
377
413
  end
378
414
 
415
+ ##
416
+ # Creates a new OpenStack boot volume
417
+ #
418
+ # @param [Integer] size disk size in MiB
419
+ # @param [String] stemcell_id OpenStack image UUID that will be used to
420
+ # populate the boot volume
421
+ # @return [String] OpenStack volume UUID
422
+ def create_boot_disk(size, stemcell_id)
423
+ with_thread_name("create_boot_disk(#{size}, #{stemcell_id})") do
424
+ raise ArgumentError, "Disk size needs to be an integer" unless size.kind_of?(Integer)
425
+ cloud_error("Minimum disk size is 1 GiB") if (size < 1024)
426
+ cloud_error("Maximum disk size is 1 TiB") if (size > 1024 * 1000)
427
+
428
+ volume_params = {
429
+ :display_name => "volume-#{generate_unique_name}",
430
+ :size => (size / 1024.0).ceil,
431
+ :imageRef => stemcell_id
432
+ }
433
+
434
+ @logger.info("Creating new boot volume...")
435
+ boot_volume = with_openstack { @volume.volumes.create(volume_params) }
436
+
437
+ @logger.info("Creating new boot volume `#{boot_volume.id}'...")
438
+ wait_resource(boot_volume, :available)
439
+
440
+ boot_volume.id.to_s
441
+ end
442
+ end
443
+
379
444
  ##
380
445
  # Deletes an OpenStack volume
381
446
  #
@@ -525,14 +590,6 @@ module Bosh::OpenStackCloud
525
590
  end
526
591
  end
527
592
 
528
- ##
529
- # Validates the deployment
530
- #
531
- # @note Not implemented in the OpenStack CPI
532
- def validate_deployment(old_manifest, new_manifest)
533
- not_implemented(:validate_deployment)
534
- end
535
-
536
593
  ##
537
594
  # Selects the availability zone to use from a list of disk volumes,
538
595
  # resource pool availability zone (if any) and the default availability
@@ -3,6 +3,6 @@
3
3
 
4
4
  module Bosh
5
5
  module OpenStackCloud
6
- VERSION = '1.2579.0'
6
+ VERSION = '1.2583.0'
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bosh_openstack_cpi
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2579.0
4
+ version: 1.2583.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: 2014-05-24 00:00:00.000000000 Z
12
+ date: 2014-05-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fog
@@ -34,7 +34,7 @@ dependencies:
34
34
  requirements:
35
35
  - - ~>
36
36
  - !ruby/object:Gem::Version
37
- version: 1.2579.0
37
+ version: 1.2583.0
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -42,7 +42,7 @@ dependencies:
42
42
  requirements:
43
43
  - - ~>
44
44
  - !ruby/object:Gem::Version
45
- version: 1.2579.0
45
+ version: 1.2583.0
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: bosh_cpi
48
48
  requirement: !ruby/object:Gem::Requirement
@@ -50,7 +50,7 @@ dependencies:
50
50
  requirements:
51
51
  - - ~>
52
52
  - !ruby/object:Gem::Version
53
- version: 1.2579.0
53
+ version: 1.2583.0
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -58,7 +58,7 @@ dependencies:
58
58
  requirements:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: 1.2579.0
61
+ version: 1.2583.0
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: bosh-registry
64
64
  requirement: !ruby/object:Gem::Requirement
@@ -66,7 +66,7 @@ dependencies:
66
66
  requirements:
67
67
  - - ~>
68
68
  - !ruby/object:Gem::Version
69
- version: 1.2579.0
69
+ version: 1.2583.0
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -74,7 +74,7 @@ dependencies:
74
74
  requirements:
75
75
  - - ~>
76
76
  - !ruby/object:Gem::Version
77
- version: 1.2579.0
77
+ version: 1.2583.0
78
78
  - !ruby/object:Gem::Dependency
79
79
  name: httpclient
80
80
  requirement: !ruby/object:Gem::Requirement
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: 0.8.2
110
110
  description: ! 'BOSH OpenStack CPI
111
111
 
112
- 4fef83'
112
+ b96a92'
113
113
  email: support@cloudfoundry.com
114
114
  executables:
115
115
  - bosh_openstack_console
@@ -153,10 +153,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
153
  version: '0'
154
154
  segments:
155
155
  - 0
156
- hash: -3384941327746268005
156
+ hash: -4384250625249937982
157
157
  requirements: []
158
158
  rubyforge_project:
159
- rubygems_version: 1.8.23
159
+ rubygems_version: 1.8.23.2
160
160
  signing_key:
161
161
  specification_version: 3
162
162
  summary: BOSH OpenStack CPI