From f53fc98ff242d58107e79624dd03b9649e30445c Mon Sep 17 00:00:00 2001 From: Grzesiek Kolodziejczyk Date: Tue, 25 Jun 2013 15:33:52 +0200 Subject: [PATCH 1/6] [openstack|volume] support imageRef option Volumes can be created with the imageRef option, which dictates which image to base the volume off. --- lib/fog/openstack/models/volume/volume.rb | 1 + lib/fog/openstack/requests/volume/create_volume.rb | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/fog/openstack/models/volume/volume.rb b/lib/fog/openstack/models/volume/volume.rb index 6f81934bc..783a33466 100644 --- a/lib/fog/openstack/models/volume/volume.rb +++ b/lib/fog/openstack/models/volume/volume.rb @@ -14,6 +14,7 @@ module Fog attribute :size attribute :type, :aliases => 'volumeType' attribute :snapshot_id, :aliases => 'snapshotId' + attribute :imageRef, :aliases => 'image_id' attribute :availability_zone, :aliases => 'availabilityZone' attribute :created_at, :aliases => 'createdAt' attribute :attachments diff --git a/lib/fog/openstack/requests/volume/create_volume.rb b/lib/fog/openstack/requests/volume/create_volume.rb index 116aa8a56..b64d5f240 100644 --- a/lib/fog/openstack/requests/volume/create_volume.rb +++ b/lib/fog/openstack/requests/volume/create_volume.rb @@ -12,7 +12,7 @@ module Fog } } - vanilla_options = ['snapshot_id'] + vanilla_options = [:snapshot_id, :imageRef] vanilla_options.select{|o| options[o]}.each do |key| data['volume'][key] = options[key] end @@ -38,7 +38,8 @@ module Fog 'display_description' => description, 'size' => size, 'status' => 'creating', - 'snapshot_id' => options["snapshot_id"] || nil, + 'snapshot_id' => options[:snapshot_id] || nil, + 'image_id' => options[:imageRef] || nil, 'volume_type' => nil, 'availability_zone' => 'nova', 'created_at' => Time.now, From 8433a74807a7dd88a89fcbfad311b7e2af02d507 Mon Sep 17 00:00:00 2001 From: Grzesiek Kolodziejczyk Date: Wed, 26 Jun 2013 09:58:51 +0200 Subject: [PATCH 2/6] [openstack|compute] support block_device_mapping Servers can be booted with block_device_mapping instead of image_id. --- lib/fog/openstack/models/compute/server.rb | 7 +++++-- .../requests/compute/create_server.rb | 20 ++++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/lib/fog/openstack/models/compute/server.rb b/lib/fog/openstack/models/compute/server.rb index 512e1aa30..2c5040899 100644 --- a/lib/fog/openstack/models/compute/server.rb +++ b/lib/fog/openstack/models/compute/server.rb @@ -41,6 +41,7 @@ module Fog attr_reader :password attr_writer :image_ref, :flavor_ref, :nics, :os_scheduler_hints + attr_accessor :block_device_mapping def initialize(attributes={}) @@ -52,6 +53,7 @@ module Fog self.max_count = attributes.delete(:max_count) self.nics = attributes.delete(:nics) self.os_scheduler_hints = attributes.delete(:os_scheduler_hints) + self.block_device_mapping = attributes.delete(:block_device_mapping) super end @@ -267,10 +269,10 @@ module Fog true end - # TODO: Implement /os-volumes-boot support with 'block_device_mapping' def save raise Fog::Errors::Error.new('Resaving an existing object may create a duplicate') if persisted? - requires :flavor_ref, :image_ref, :name + requires :flavor_ref, :name + requires_one :image_ref, :block_device_mapping options = { 'personality' => personality, 'accessIPv4' => accessIPv4, @@ -283,6 +285,7 @@ module Fog 'max_count' => @max_count, 'nics' => @nics, 'os:scheduler_hints' => @os_scheduler_hints, + 'block_device_mapping' => @block_device_mapping } options['metadata'] = metadata.to_hash unless @metadata.nil? options = options.reject {|key, value| value.nil?} diff --git a/lib/fog/openstack/requests/compute/create_server.rb b/lib/fog/openstack/requests/compute/create_server.rb index 586d3cd92..18452e549 100644 --- a/lib/fog/openstack/requests/compute/create_server.rb +++ b/lib/fog/openstack/requests/compute/create_server.rb @@ -56,11 +56,29 @@ module Fog data['os:scheduler_hints'] = options['os:scheduler_hints'] end + if options['block_device_mapping'] + data['server']['block_device_mapping'] = + [options['block_device_mapping']].flatten.map do |mapping| + { + 'volume_size' => mapping[:volume_size], + 'volume_id' => mapping[:volume_id], + 'delete_on_termination' => mapping[:delete_on_termination], + 'device_name' => mapping[:device_name] + } + end + end + + path = if data['server']['block_device_mapping'] + 'os-volumes_boot.json' + else + 'servers.json' + end + request( :body => Fog::JSON.encode(data), :expects => [200, 202], :method => 'POST', - :path => 'servers.json' + :path => path ) end From 3970ab57972f196aff4679115bacce28fef96a6c Mon Sep 17 00:00:00 2001 From: Grzesiek Kolodziejczyk Date: Wed, 3 Jul 2013 12:24:55 +0200 Subject: [PATCH 3/6] [Openstack|volume] Add #get to volumes collection This fixes reloading Volume objects and makes it consistent with other collections. Keeping find_by_id as an alias for compatibility. --- lib/fog/openstack/models/volume/volumes.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/fog/openstack/models/volume/volumes.rb b/lib/fog/openstack/models/volume/volumes.rb index 47faf8a4f..8924b5214 100644 --- a/lib/fog/openstack/models/volume/volumes.rb +++ b/lib/fog/openstack/models/volume/volumes.rb @@ -12,13 +12,14 @@ module Fog load(service.list_volumes(detailed).body['volumes']) end - def find_by_id(volume_id) + def get(volume_id) if volume = service.get_volume_details(volume_id).body['volume'] new(volume) end rescue Fog::Volume::OpenStack::NotFound nil end + alias_method :find_by_id, :get end end From 9111f7aba766bd3a40b5dd333fdf294fb4e2e489 Mon Sep 17 00:00:00 2001 From: Grzesiek Kolodziejczyk Date: Fri, 5 Jul 2013 15:41:01 +0200 Subject: [PATCH 4/6] [Openstack|volume] fix key name for volume_type The cinder API uses volume_type instead of type. --- lib/fog/openstack/models/volume/volume.rb | 2 +- lib/fog/openstack/requests/volume/create_volume.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/fog/openstack/models/volume/volume.rb b/lib/fog/openstack/models/volume/volume.rb index 783a33466..3b29b6e63 100644 --- a/lib/fog/openstack/models/volume/volume.rb +++ b/lib/fog/openstack/models/volume/volume.rb @@ -12,7 +12,7 @@ module Fog attribute :display_description, :aliases => 'displayDescription' attribute :status attribute :size - attribute :type, :aliases => 'volumeType' + attribute :volume_type, :aliases => 'volumeType' attribute :snapshot_id, :aliases => 'snapshotId' attribute :imageRef, :aliases => 'image_id' attribute :availability_zone, :aliases => 'availabilityZone' diff --git a/lib/fog/openstack/requests/volume/create_volume.rb b/lib/fog/openstack/requests/volume/create_volume.rb index b64d5f240..984db2a75 100644 --- a/lib/fog/openstack/requests/volume/create_volume.rb +++ b/lib/fog/openstack/requests/volume/create_volume.rb @@ -12,7 +12,7 @@ module Fog } } - vanilla_options = [:snapshot_id, :imageRef] + vanilla_options = [:snapshot_id, :imageRef, :volume_type] vanilla_options.select{|o| options[o]}.each do |key| data['volume'][key] = options[key] end From 3f81b28a4347741948d9cf3896f2fbb5def92443 Mon Sep 17 00:00:00 2001 From: Grzesiek Kolodziejczyk Date: Wed, 10 Jul 2013 09:48:46 +0200 Subject: [PATCH 5/6] [Openstack|volume] create volumes from other vol. --- lib/fog/openstack/models/volume/volume.rb | 1 + lib/fog/openstack/requests/volume/create_volume.rb | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/fog/openstack/models/volume/volume.rb b/lib/fog/openstack/models/volume/volume.rb index 3b29b6e63..95ded28ac 100644 --- a/lib/fog/openstack/models/volume/volume.rb +++ b/lib/fog/openstack/models/volume/volume.rb @@ -18,6 +18,7 @@ module Fog attribute :availability_zone, :aliases => 'availabilityZone' attribute :created_at, :aliases => 'createdAt' attribute :attachments + attribute :source_volid def initialize(attributes) diff --git a/lib/fog/openstack/requests/volume/create_volume.rb b/lib/fog/openstack/requests/volume/create_volume.rb index 984db2a75..62e01080a 100644 --- a/lib/fog/openstack/requests/volume/create_volume.rb +++ b/lib/fog/openstack/requests/volume/create_volume.rb @@ -12,7 +12,8 @@ module Fog } } - vanilla_options = [:snapshot_id, :imageRef, :volume_type] + vanilla_options = [:snapshot_id, :imageRef, :volume_type, + :source_volid] vanilla_options.select{|o| options[o]}.each do |key| data['volume'][key] = options[key] end From c3278a1cc9185c3e94cf67e28d329ac47f76055c Mon Sep 17 00:00:00 2001 From: Grzesiek Kolodziejczyk Date: Thu, 18 Jul 2013 17:32:20 +0200 Subject: [PATCH 6/6] [Openstack|Volumes] alias type to volume_type This makes the changes consistent with how it previously worked. --- lib/fog/openstack/models/volume/volume.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/fog/openstack/models/volume/volume.rb b/lib/fog/openstack/models/volume/volume.rb index 95ded28ac..965643f22 100644 --- a/lib/fog/openstack/models/volume/volume.rb +++ b/lib/fog/openstack/models/volume/volume.rb @@ -12,7 +12,7 @@ module Fog attribute :display_description, :aliases => 'displayDescription' attribute :status attribute :size - attribute :volume_type, :aliases => 'volumeType' + attribute :volume_type, :aliases => ['volumeType', 'type'] attribute :snapshot_id, :aliases => 'snapshotId' attribute :imageRef, :aliases => 'image_id' attribute :availability_zone, :aliases => 'availabilityZone'