bosh_openstack_cpi 1.2820.0 → 1.2824.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.
data/USAGE.md CHANGED
@@ -34,6 +34,8 @@ The registry options are passed to the Openstack CPI by the BOSH director based
34
34
  default OpenStack ssh key name to assign to created virtual machines
35
35
  * `default_security_group` (required)
36
36
  default OpenStack security group to assign to created virtual machines
37
+ * `ignore_server_availability_zone` (optional)
38
+ When creating a disk, do not use the availability zone of the server, fall back to Openstacks default. Commonly used if Ceph is used for block storage. Defaults to false.
37
39
 
38
40
  ### Registry options
39
41
 
@@ -31,6 +31,7 @@ require "cloud/openstack/dynamic_network"
31
31
  require "cloud/openstack/manual_network"
32
32
  require "cloud/openstack/vip_network"
33
33
  require "cloud/openstack/excon_logging_instrumentor"
34
+ require "cloud/openstack/availability_zone_provider"
34
35
  require "cloud/openstack/redacted_params"
35
36
 
36
37
  module Bosh
@@ -0,0 +1,43 @@
1
+ module Bosh::OpenStackCloud
2
+ class AvailabilityZoneProvider
3
+ include Helpers
4
+
5
+ def initialize(openstack, ignore_server_availability_zone)
6
+ @openstack = openstack
7
+ @ignore_server_availability_zone = ignore_server_availability_zone
8
+ end
9
+
10
+ def select(volume_ids, resource_pool_az)
11
+ if volume_ids && !volume_ids.empty? && constrain_to_server_availability_zone?
12
+ fog_volume_map = @openstack.volumes
13
+ volumes = volume_ids.map { |vid| with_openstack { fog_volume_map.get(vid) } }
14
+ ensure_same_availability_zone(volumes, resource_pool_az)
15
+ volumes.first.availability_zone
16
+ else
17
+ resource_pool_az
18
+ end
19
+ end
20
+
21
+ def constrain_to_server_availability_zone?
22
+ !@ignore_server_availability_zone
23
+ end
24
+
25
+ private
26
+
27
+ ##
28
+ # Ensure all supplied availability zones are the same
29
+ #
30
+ # @param [Array] disks OpenStack volumes
31
+ # @param [String] default availability zone specified in
32
+ # the resource pool (may be nil)
33
+ # @return [String] availability zone to use or nil
34
+ # @note this is a private method that is public to make it easier to test
35
+ def ensure_same_availability_zone(disks, default)
36
+ zones = disks.map { |disk| disk.availability_zone }
37
+ zones << default if default
38
+ zones.uniq!
39
+ cloud_error "can't use multiple availability zones: %s" %
40
+ zones.join(', ') unless zones.size == 1
41
+ end
42
+ end
43
+ end
@@ -69,6 +69,10 @@ module Bosh::OpenStackCloud
69
69
  cloud_error('Unable to connect to the OpenStack Compute API. Check task debug log for details.')
70
70
  end
71
71
 
72
+ @az_provider = Bosh::OpenStackCloud::AvailabilityZoneProvider.new(
73
+ @openstack,
74
+ @openstack_properties["ignore_server_availability_zone"])
75
+
72
76
  glance_params = {
73
77
  :provider => 'OpenStack',
74
78
  :openstack_auth_url => @openstack_properties['auth_url'],
@@ -235,7 +239,7 @@ module Bosh::OpenStackCloud
235
239
  if flavor.ram
236
240
  # Ephemeral disk size should be at least the double of the vm total memory size, as agent will need:
237
241
  # - vm total memory size for swapon,
238
- # - the rest for /vcar/vcap/data
242
+ # - the rest for /var/vcap/data
239
243
  min_ephemeral_size = (flavor.ram / 1024) * 2
240
244
  if flavor.ephemeral < min_ephemeral_size
241
245
  cloud_error("Flavor `#{resource_pool['instance_type']}' should have at least #{min_ephemeral_size}Gb " +
@@ -268,7 +272,7 @@ module Bosh::OpenStackCloud
268
272
  :user_data => Yajl::Encoder.encode(user_data(server_name, network_spec))
269
273
  }
270
274
 
271
- availability_zone = select_availability_zone(disk_locality, resource_pool['availability_zone'])
275
+ availability_zone = @az_provider.select(disk_locality, resource_pool['availability_zone'])
272
276
  server_params[:availability_zone] = availability_zone if availability_zone
273
277
 
274
278
  if @boot_from_volume
@@ -410,7 +414,7 @@ module Bosh::OpenStackCloud
410
414
  volume_params[:volume_type] = cloud_properties['type']
411
415
  end
412
416
 
413
- if server_id
417
+ if server_id && @az_provider.constrain_to_server_availability_zone?
414
418
  server = with_openstack { @openstack.servers.get(server_id) }
415
419
  if server && server.availability_zone
416
420
  volume_params[:availability_zone] = server.availability_zone
@@ -448,7 +452,9 @@ module Bosh::OpenStackCloud
448
452
  :imageRef => stemcell_id
449
453
  }
450
454
 
451
- volume_params[:availability_zone] = availability_zone if availability_zone
455
+ if availability_zone && @az_provider.constrain_to_server_availability_zone?
456
+ volume_params[:availability_zone] = availability_zone
457
+ end
452
458
  volume_params[:volume_type] = boot_volume_cloud_properties["type"] if boot_volume_cloud_properties["type"]
453
459
 
454
460
  @logger.info("Creating new boot volume...")
@@ -621,29 +627,7 @@ module Bosh::OpenStackCloud
621
627
  # @return [String] availability zone to use or nil
622
628
  # @note this is a private method that is public to make it easier to test
623
629
  def select_availability_zone(volumes, resource_pool_az)
624
- if volumes && !volumes.empty?
625
- disks = volumes.map { |vid| with_openstack { @openstack.volumes.get(vid) } }
626
- ensure_same_availability_zone(disks, resource_pool_az)
627
- disks.first.availability_zone
628
- else
629
- resource_pool_az
630
- end
631
- end
632
-
633
- ##
634
- # Ensure all supplied availability zones are the same
635
- #
636
- # @param [Array] disks OpenStack volumes
637
- # @param [String] default availability zone specified in
638
- # the resource pool (may be nil)
639
- # @return [String] availability zone to use or nil
640
- # @note this is a private method that is public to make it easier to test
641
- def ensure_same_availability_zone(disks, default)
642
- zones = disks.map { |disk| disk.availability_zone }
643
- zones << default if default
644
- zones.uniq!
645
- cloud_error "can't use multiple availability zones: %s" %
646
- zones.join(', ') unless zones.size == 1 || zones.empty?
630
+ @az_provider.select(volumes, resource_pool_az)
647
631
  end
648
632
 
649
633
  private
@@ -989,6 +973,6 @@ module Bosh::OpenStackCloud
989
973
  end
990
974
  options
991
975
  end
992
-
993
976
  end
994
977
  end
978
+
@@ -3,6 +3,6 @@
3
3
 
4
4
  module Bosh
5
5
  module OpenStackCloud
6
- VERSION = '1.2820.0'
6
+ VERSION = '1.2824.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.2820.0
4
+ version: 1.2824.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: 2015-01-20 00:00:00.000000000 Z
12
+ date: 2015-01-23 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.2820.0
37
+ version: 1.2824.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.2820.0
45
+ version: 1.2824.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.2820.0
53
+ version: 1.2824.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.2820.0
61
+ version: 1.2824.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.2820.0
69
+ version: 1.2824.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.2820.0
77
+ version: 1.2824.0
78
78
  - !ruby/object:Gem::Dependency
79
79
  name: httpclient
80
80
  requirement: !ruby/object:Gem::Requirement
@@ -125,7 +125,7 @@ dependencies:
125
125
  version: 1.1.0
126
126
  description: ! 'BOSH OpenStack CPI
127
127
 
128
- ebc2f0'
128
+ 1607a8'
129
129
  email: support@cloudfoundry.com
130
130
  executables:
131
131
  - bosh_openstack_console
@@ -137,6 +137,7 @@ files:
137
137
  - bin/openstack_cpi
138
138
  - lib/bosh_openstack_cpi.rb
139
139
  - lib/cloud/openstack.rb
140
+ - lib/cloud/openstack/availability_zone_provider.rb
140
141
  - lib/cloud/openstack/cloud.rb
141
142
  - lib/cloud/openstack/dynamic_network.rb
142
143
  - lib/cloud/openstack/excon_logging_instrumentor.rb
@@ -171,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
171
172
  version: '0'
172
173
  segments:
173
174
  - 0
174
- hash: -1441481642216417872
175
+ hash: -1072403128542098218
175
176
  requirements: []
176
177
  rubyforge_project:
177
178
  rubygems_version: 1.8.23