You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltacloud.apache.org by lu...@apache.org on 2013/02/25 20:23:01 UTC

[4/9] git commit: CIMI: Added VolumeCreate model

CIMI: Added VolumeCreate model

Signed-off-by: Michal fojtik <mf...@redhat.com>
TrackedAt: http://tracker.deltacloud.org/patch/15544d24bd245a6d5ecee21e0efb3aaa2f3856f2


Project: http://git-wip-us.apache.org/repos/asf/deltacloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltacloud/commit/e8942f45
Tree: http://git-wip-us.apache.org/repos/asf/deltacloud/tree/e8942f45
Diff: http://git-wip-us.apache.org/repos/asf/deltacloud/diff/e8942f45

Branch: refs/heads/master
Commit: e8942f4576501bcad5870f6a077fd5e698413eba
Parents: 103bbf5
Author: Michal Fojtik <mf...@redhat.com>
Authored: Fri Feb 22 13:35:05 2013 +0100
Committer: David Lutterkort <lu...@redhat.com>
Committed: Mon Feb 25 11:22:37 2013 -0800

----------------------------------------------------------------------
 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(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltacloud/blob/e8942f45/server/lib/cimi/collections/volumes.rb
----------------------------------------------------------------------
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 }

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/e8942f45/server/lib/cimi/models.rb
----------------------------------------------------------------------
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'

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/e8942f45/server/lib/cimi/models/volume.rb
----------------------------------------------------------------------
diff --git a/server/lib/cimi/models/volume.rb b/server/lib/cimi/models/volume.rb
index 19827a9..888589a 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
                            :initial_location=>v["initialLocation"] }}
   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,

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/e8942f45/server/lib/cimi/models/volume_configuration.rb
----------------------------------------------------------------------
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

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/e8942f45/server/lib/cimi/models/volume_create.rb
----------------------------------------------------------------------
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

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/e8942f45/server/lib/cimi/models/volume_template.rb
----------------------------------------------------------------------
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

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/e8942f45/server/support/cimi/volume.xml
----------------------------------------------------------------------
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>

http://git-wip-us.apache.org/repos/asf/deltacloud/blob/e8942f45/server/support/cimi/volume_by_value.xml
----------------------------------------------------------------------
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>