From: Michal Fojtik <mfoj...@redhat.com>
Signed-off-by: Michal fojtik <mfoj...@redhat.com> --- server/lib/cimi/collections/volume_images.rb | 3 +- server/lib/cimi/models.rb | 1 + server/lib/cimi/models/volume_image.rb | 25 +++++--------- server/lib/cimi/models/volume_image_create.rb | 47 +++++++++++++++++++++++++++ server/support/cimi/volume_image.xml | 7 ++++ 5 files changed, 65 insertions(+), 18 deletions(-) create mode 100644 server/lib/cimi/models/volume_image_create.rb create mode 100644 server/support/cimi/volume_image.xml diff --git a/server/lib/cimi/collections/volume_images.rb b/server/lib/cimi/collections/volume_images.rb index 708f2f1..1596e2d 100644 --- a/server/lib/cimi/collections/volume_images.rb +++ b/server/lib/cimi/collections/volume_images.rb @@ -46,7 +46,8 @@ module CIMI::Collections operation :create, :with_capability => :create_storage_snapshot do description "Create a new volume image." control do - volume_image = CIMI::Model::VolumeImage.create(request.body, self) + img = CIMI::Model::VolumeImageCreate.parse(request.body, request.content_type) + volume_image = img.create(self) headers_for_create volume_image respond_to do |format| format.xml { volume_image.to_xml } diff --git a/server/lib/cimi/models.rb b/server/lib/cimi/models.rb index a86d6a9..c7a2f4e 100644 --- a/server/lib/cimi/models.rb +++ b/server/lib/cimi/models.rb @@ -67,6 +67,7 @@ require_relative './models/volume' require_relative './models/volume_template' require_relative './models/volume_configuration' require_relative './models/volume_image' +require_relative './models/volume_image_create' require_relative './models/machine' require_relative './models/machine_configuration' require_relative './models/machine_image' diff --git a/server/lib/cimi/models/volume_image.rb b/server/lib/cimi/models/volume_image.rb index 4858ad8..ef06552 100644 --- a/server/lib/cimi/models/volume_image.rb +++ b/server/lib/cimi/models/volume_image.rb @@ -20,6 +20,7 @@ class CIMI::Model::VolumeImage < CIMI::Model::Base href :image_location text :image_data text :bootable + array :operations do scalar :rel, :href end @@ -38,29 +39,19 @@ class CIMI::Model::VolumeImage < CIMI::Model::Base def self.all(context); find(:all, context); end - def self.create(request_body, context) - type = context.current_content_type - input = (type == :xml)? XmlSimple.xml_in(request_body.read, {"ForceArray"=>false,"NormaliseSpace"=>2}) : JSON.parse(request_body.read) - params = {:volume_id => context.href_id(input["imageLocation"]["href"], :volumes), :name=>input["name"], :description=>input["description"]} - vol_image = context.driver.create_storage_snapshot(context.credentials, params) - from_storage_snapshot(vol_image, context) - end - def self.delete!(vol_image_id, context) context.driver.destroy_storage_snapshot(context.credentials, {:id=>vol_image_id}) end - private - def self.from_storage_snapshot(snapshot, context) self.new( { - :name => snapshot.name || snapshot.id, - :description => snapshot.description || snapshot.id, - :created => snapshot.created.nil? ? nil : Time.parse(snapshot.created).xmlschema, - :id => context.volume_image_url(snapshot.id), - :image_location => {:href=>context.volume_url(snapshot.storage_volume_id)}, - :bootable => "false" #FIXME - } ) + :name => snapshot.name, + :description => snapshot.description, + :created => snapshot.created.nil? ? nil : Time.parse(snapshot.created).xmlschema, + :id => context.volume_image_url(snapshot.id), + :image_location => {:href=>context.volume_url(snapshot.storage_volume_id)}, + :bootable => "false" #FIXME + } ) end end diff --git a/server/lib/cimi/models/volume_image_create.rb b/server/lib/cimi/models/volume_image_create.rb new file mode 100644 index 0000000..f953146 --- /dev/null +++ b/server/lib/cimi/models/volume_image_create.rb @@ -0,0 +1,47 @@ +# 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::VolumeImageCreate < CIMI::Model::Base + + href :image_location + text :image_data + text :bootable, :required => true + + def create(context) + validate! + + params = { + :volume_id => context.href_id(image_location.href, :volumes), + :name => name, + :description => description + } + + unless context.driver.respond_to? :create_storage_snapshot + raise Deltacloud::Exceptions.exception_from_status( + 501, + 'Creating VolumeImage is not supported by the current driver' + ) + end + + new_snapshot = context.driver.create_storage_snapshot(context.credentials, params) + result = CIMI::Model::VolumeImage.from_storage_snapshot(new_snapshot, context) + result.name= name unless new_snapshot.name + result.description = description unless new_snapshot.description + result.property = property if property + result.save + result + end + +end diff --git a/server/support/cimi/volume_image.xml b/server/support/cimi/volume_image.xml new file mode 100644 index 0000000..b89f1e5 --- /dev/null +++ b/server/support/cimi/volume_image.xml @@ -0,0 +1,7 @@ +<VolumeImageCreate> + <name>myVolumeImage</name> + <description>My very first VolumeImage</description> + <imageLocation href="http://localhost:3001/cimi/volumes/vo1"/> + <bootable>false</bootable> + <property key="foo">bar</property> +</VolumeImageCreate> -- 1.8.1.2