From: Michal Fojtik <mfoj...@redhat.com> Signed-off-by: Michal fojtik <mfoj...@redhat.com> TrackedAt: http://tracker.deltacloud.org/patch/15544d24bd245a6d5ecee21e0efb3aaa2f3856f2 --- server/lib/cimi/collections/volumes.rb | 3 +- server/lib/cimi/models.rb | 3 +- server/lib/cimi/models/volume.rb | 40 ------------------ server/lib/cimi/models/volume_configuration.rb | 3 +- server/lib/cimi/models/volume_create.rb | 58 ++++++++++++++++++++++++++ server/lib/cimi/models/volume_template.rb | 4 +- server/support/cimi/volume.xml | 6 +-- server/support/cimi/volume_by_value.xml | 10 +++++ 8 files changed, 77 insertions(+), 50 deletions(-) create mode 100644 server/lib/cimi/models/volume_create.rb create mode 100644 server/support/cimi/volume_by_value.xml
diff --git a/server/lib/cimi/collections/volumes.rb b/server/lib/cimi/collections/volumes.rb index 74f8c69..3f46591 100644 --- a/server/lib/cimi/collections/volumes.rb +++ b/server/lib/cimi/collections/volumes.rb @@ -49,7 +49,8 @@ module CIMI::Collections operation :create, :with_capability => :create_storage_volume do description "Create a new Volume." control do - new_volume = Volume.create(request.body.read, self, current_content_type) + vol = CIMI::Model::VolumeCreate.parse(request.body, request.content_type) + new_volume = vol.create(self) headers_for_create new_volume respond_to do |format| format.json { new_volume.to_json } diff --git a/server/lib/cimi/models.rb b/server/lib/cimi/models.rb index a86d6a9..b41cb8f 100644 --- a/server/lib/cimi/models.rb +++ b/server/lib/cimi/models.rb @@ -64,9 +64,10 @@ require_relative './models/credential' require_relative './models/credential_template' require_relative './models/credential_create' require_relative './models/volume' -require_relative './models/volume_template' require_relative './models/volume_configuration' require_relative './models/volume_image' +require_relative './models/volume_template' +require_relative './models/volume_create' require_relative './models/machine' require_relative './models/machine_configuration' require_relative './models/machine_image' diff --git a/server/lib/cimi/models/volume.rb b/server/lib/cimi/models/volume.rb index 3bb0f10..b144ba3 100644 --- a/server/lib/cimi/models/volume.rb +++ b/server/lib/cimi/models/volume.rb @@ -51,24 +51,6 @@ class CIMI::Model::Volume < CIMI::Model::Base def self.all(context); find(:all, context); end - def self.create(request_body, context, type) - #json = JSON.parse(json_in) - input = (type == :xml)? XmlSimple.xml_in(request_body, {"ForceArray"=>false,"NormaliseSpace"=>2}) : JSON.parse(request_body) - if input["volumeTemplate"]["href"] #template by reference - #FIXME - don't have volumeTemplates yet - datamapper volume_config = - else #template by value - volume_image_id = (input["volumeTemplate"].has_key?("volumeImage") ? - input["volumeTemplate"]["volumeImage"]["href"].split("/").last : nil) - if input["volumeTemplate"]["volumeConfig"]["href"] #with config by reference - volume_config_id = input["volumeTemplate"]["volumeConfig"]["href"].split("/").last - create_volume({:volume_config_id=>volume_config_id, :volume_image_id=>volume_image_id}, input, context) - else #with config by value - capacity = input["volumeTemplate"]["volumeConfig"]["capacity"] - create_volume({:capacity=>capacity, :volume_image_id=>volume_image_id}, input, context) - end - end - end - def self.delete!(id, context) context.driver.destroy_storage_volume(context.credentials, {:id=>id} ) new(:id => id).destroy @@ -86,28 +68,6 @@ class CIMI::Model::Volume < CIMI::Model::Base :attachment_point=>v["attachmentPoint"] }} end - private - - def self.create_volume(params, data, context) - if params[:volume_config_id] - volume_config = CIMI::Model::VolumeConfiguration.find(params[:volume_config_id], context) - opts = {:capacity=>context.from_kibibyte(volume_config.capacity, "GB"), - :snapshot_id=>params[:volume_image_id], - :name=>data["name"]} - elsif params[:capacity] - opts = {:capacity=>context.from_kibibyte(params[:capacity], "GB"), - :snapshot_id=>params[:volume_image_id], - :name=>data["name"]} - end - storage_volume = context.driver.create_storage_volume(context.credentials, opts) - result = from_storage_volume(storage_volume, context) - result.name = data['name'] if data['name'] - result.description = data['description'] - result.extract_properties!(data) - result.save - result - end - def self.from_storage_volume(volume, context) self.new( { :name => volume.id, :created => volume.created.nil? ? nil : Time.parse(volume.created).xmlschema, diff --git a/server/lib/cimi/models/volume_configuration.rb b/server/lib/cimi/models/volume_configuration.rb index 10ce146..7f67051 100644 --- a/server/lib/cimi/models/volume_configuration.rb +++ b/server/lib/cimi/models/volume_configuration.rb @@ -18,8 +18,7 @@ class CIMI::Model::VolumeConfiguration < CIMI::Model::Base acts_as_root_entity :as => "volumeConfigs" text :format - - text :capacity + text :capacity, :required => true array :operations do scalar :rel, :href diff --git a/server/lib/cimi/models/volume_create.rb b/server/lib/cimi/models/volume_create.rb new file mode 100644 index 0000000..607c407 --- /dev/null +++ b/server/lib/cimi/models/volume_create.rb @@ -0,0 +1,58 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +class CIMI::Model::VolumeCreate < CIMI::Model::Base + + ref :volume_template, :required => true + + def create(context) + validate! + + if volume_template.href? + template = volume_template.find(context) + else + template = CIMI::Model::VolumeTemplate.from_xml(volume_template.to_xml) + end + + volume_image = template.volume_image.href? ? + template.volume_image.find(context) : template.volume_image + + volume_config = template.volume_config.href? ? + template.volume_config.find(context) : template.volume_config + + params = { + :name => name, + :capacity => volume_config.capacity, + :snapshot_id => ref_id(volume_image.id), + } + + unless context.driver.respond_to? :create_storage_volume + raise Deltacloud::Exceptions.exception_from_status( + 501, + "Creating Volume is not supported by the current driver" + ) + end + + volume = context.driver.create_storage_volume(context.credentials, params) + + result = CIMI::Model::Volume.from_storage_volume(volume, context) + result.name = name if result.name.nil? + result.description = description if description + result.property = property if property + result.save + result + end + +end diff --git a/server/lib/cimi/models/volume_template.rb b/server/lib/cimi/models/volume_template.rb index c00ffc8..500fa75 100644 --- a/server/lib/cimi/models/volume_template.rb +++ b/server/lib/cimi/models/volume_template.rb @@ -17,8 +17,8 @@ class CIMI::Model::VolumeTemplate < CIMI::Model::Base acts_as_root_entity - href :volume_config - href :volume_image + ref :volume_config, :required => true + ref :volume_image, :required => true array :meter_templates do end diff --git a/server/support/cimi/volume.xml b/server/support/cimi/volume.xml index 030dcce..62d9e08 100644 --- a/server/support/cimi/volume.xml +++ b/server/support/cimi/volume.xml @@ -1,10 +1,8 @@ <VolumeCreate> <name>myVolume1</name> <description>Description of my new volume</description> - <type>http://schemas.dmtf.org/cimi/1/mapped</type> - <capacity>1048576</capacity> - <bootable>false</bootable> <volumeTemplate> - <volumeConfig href="http://localhost:3001/cimi/volume_configurations/2"/> + <volumeConfig href="http://localhost:3001/cimi/volume_configurations/1" /> + <volumeImage href="http://localhost:3001/cimi/volume_images/snap1" /> </volumeTemplate> </VolumeCreate> diff --git a/server/support/cimi/volume_by_value.xml b/server/support/cimi/volume_by_value.xml new file mode 100644 index 0000000..389cc2d --- /dev/null +++ b/server/support/cimi/volume_by_value.xml @@ -0,0 +1,10 @@ +<VolumeCreate> + <name>myVolume2</name> + <description>Description of my new volume</description> + <volumeTemplate> + <volumeConfig> + <capacity>9999</capacity> + </volumeConfig> + <volumeImage href="http://localhost:3001/cimi/volume_images/snap1" /> + </volumeTemplate> +</VolumeCreate> -- 1.8.1.2