lib/fog/rackspace/requests/block_storage/create_volume.rb in fog-maestrodev-1.8.0.20130114204828 vs lib/fog/rackspace/requests/block_storage/create_volume.rb in fog-maestrodev-1.14.0.20130806165225

- old
+ new

@@ -1,9 +1,37 @@ module Fog module Rackspace class BlockStorage class Real + + # Create volume + # + # @param [Integer] size size of volume in GB. Minimum size is 100 + # @param [Hash] options + # @option options [String] :display_name display name for volume + # @option options [String] :display_description display description for volume + # @option options [String] :volume_type type of volume + # @option options [String] :snapshot_id The optional snapshot from which to create a volume. + # @return [Excon::Response] response: + # * body [Hash]: + # * 'volume' [Hash]: + # * 'volume_type' [String]: - type of volume + # * 'display_description' [String]: - volume description + # * 'metadata' [Hash]: - volume metadata + # * 'availability_zone'[String]: - region of the volume + # * 'status' [String]: - status of volume + # * 'id' [String]: - id of volume + # * 'attachments' [Array<Hash]: - array of hashes containing attachment information + # * 'size' [Fixnum]: - size of volume in GB (100 GB minimum) + # * 'snapshot_id' [String]: - The optional snapshot from which to create a volume. + # * 'display_name' [String]: - display name of volume + # * 'created_at' [String]: - the volume creation time + # @raise [Fog::Rackspace::BlockStorage::NotFound] - HTTP 404 + # @raise [Fog::Rackspace::BlockStorage::BadRequest] - HTTP 400 + # @raise [Fog::Rackspace::BlockStorage::InternalServerError] - HTTP 500 + # @raise [Fog::Rackspace::BlockStorage::ServiceError] + # @see http://docs.rackspace.com/cbs/api/v1.0/cbs-devguide/content/POST_createVolume__v1__tenant_id__volumes.html def create_volume(size, options = {}) data = { 'volume' => { 'size' => size } @@ -11,16 +39,54 @@ data['volume']['display_name'] = options[:display_name] unless options[:display_name].nil? data['volume']['display_description'] = options[:display_description] unless options[:display_description].nil? data['volume']['volume_type'] = options[:volume_type] unless options[:volume_type].nil? data['volume']['availability_zone'] = options[:availability_zone] unless options[:availability_zone].nil? + data['volume']['snapshot_id'] = options[:snapshot_id] unless options[:snapshot_id].nil? request( :body => Fog::JSON.encode(data), :expects => [200], :method => 'POST', :path => "volumes" ) + end + end + + class Mock + def create_volume(size, options = {}) + if size < 1 && !options[:snapshot_id] + raise Fog::Rackspace::BlockStorage::BadRequest + elsif size < 100 || size > 1024 + raise Fog::Rackspace::BlockStorage::BadRequest.new("'size' parameter must be between 100 and 1024") + else + volume_id = Fog::Rackspace::MockData.uuid + name = options[:display_name] || "test volume" + description = options[:display_description] || "description goes here" + volume_type = options[:volume_type] || "SATA" + + volume = { + "id" => volume_id, + "display_name" => name, + "display_description" => description, + "size" => size, + "status" => "available", + "volume_type" => volume_type, + "snapshot_id" => nil, + "attachments" => [], + "created_at" => Fog::Rackspace::MockData.zulu_time, + "availability_zone" => "nova", + "metadata" => {}, + } + if options[:snapshot_id] + snapshot = self.data[:snapshots][snapshot_id] + volume.merge!("size" => snapshot["size"]) + end + + self.data[:volumes][volume_id] = volume + + response(:body => {"volume" => volume}) + end end end end end end