bosh_openstack_cpi 1.2579.0 → 1.2583.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.
@@ -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