From: Michal Fojtik <[email protected]>
Signed-off-by: Michal fojtik <[email protected]>
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