You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltacloud.apache.org by mf...@apache.org on 2013/01/10 11:12:31 UTC
[3/4] git commit: CIMI: Added database support for VolumeConfiguration
CIMI: Added database support for VolumeConfiguration
Since VolumeConfiguration is now generated using 1..1000,
this patch will give user ability to create VolumeConfiguration
and store it into database.
Project: http://git-wip-us.apache.org/repos/asf/deltacloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltacloud/commit/8b60c602
Tree: http://git-wip-us.apache.org/repos/asf/deltacloud/tree/8b60c602
Diff: http://git-wip-us.apache.org/repos/asf/deltacloud/diff/8b60c602
Branch: refs/heads/master
Commit: 8b60c60271b0d1e5b9d8fcbac69c279760223e89
Parents: 1ae4f22
Author: Michal Fojtik <mf...@redhat.com>
Authored: Mon Jan 7 16:01:49 2013 +0100
Committer: Michal fojtik <mf...@redhat.com>
Committed: Thu Jan 10 11:12:12 2013 +0100
----------------------------------------------------------------------
.../lib/cimi/collections/volume_configurations.rb | 25 ++++
server/lib/cimi/models/volume_configuration.rb | 88 +++++++++++----
server/lib/db.rb | 1 +
server/lib/db/provider.rb | 5 +
server/lib/db/volume_configuration.rb | 12 ++
server/support/cimi/volume_config.json | 7 +
server/support/cimi/volume_config.xml | 6 +
7 files changed, 122 insertions(+), 22 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/8b60c602/server/lib/cimi/collections/volume_configurations.rb
----------------------------------------------------------------------
diff --git a/server/lib/cimi/collections/volume_configurations.rb b/server/lib/cimi/collections/volume_configurations.rb
index 91ad6b0..5895209 100644
--- a/server/lib/cimi/collections/volume_configurations.rb
+++ b/server/lib/cimi/collections/volume_configurations.rb
@@ -41,6 +41,31 @@ module CIMI::Collections
end
end
end
+
+ operation :create, :with_capability => :create_storage_volume do
+ description "Create new VolumeConfiguration"
+ control do
+ if grab_content_type(request.content_type, request.body) == :json
+ new_config = CIMI::Model::VolumeConfiguration.create_from_json(request.body.read, self)
+ else
+ new_config = CIMI::Model::VolumeConfiguration.create_from_xml(request.body.read, self)
+ end
+ headers_for_create new_config
+ respond_to do |format|
+ format.json { new_config.to_json }
+ format.xml { new_config.to_xml }
+ end
+ end
+ end
+
+ operation :destroy, :with_capability => :destroy_storage_volume do
+ description "Delete a specified VolumeConfiguration"
+ control do
+ CIMI::Model::VolumeConfiguration.delete!(params[:id], self)
+ no_content_with_status(200)
+ end
+ end
+
end
end
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/8b60c602/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 383aac3..4a8373e 100644
--- a/server/lib/cimi/models/volume_configuration.rb
+++ b/server/lib/cimi/models/volume_configuration.rb
@@ -25,36 +25,80 @@ class CIMI::Model::VolumeConfiguration < CIMI::Model::Base
scalar :rel, :href
end
+ def self.create_from_json(body, context)
+ json = JSON.parse(body)
+ new_config = current_db.volume_configurations.new(
+ :name => json['name'],
+ :description => json['description'],
+ :format => json['format'],
+ :capacity => json['capacity'],
+ :ent_properties => json['properties'].to_json,
+ :be_kind => 'volume_configuration',
+ :be_id => ''
+ )
+ new_config.save!
+ from_db(new_config, context)
+ end
+
+ def self.create_from_xml(body, context)
+ xml = XmlSimple.xml_in(body)
+ xml['property'] ||= []
+ new_config = current_db.volume_configurations.new(
+ :name => xml['name'].first,
+ :description => xml['description'].first,
+ :format => xml['format'].first,
+ :capacity => xml['capacity'].first,
+ :ent_properties => xml['property'].inject({}) { |r, p| r[p['key']]=p['content']; r },
+ :be_kind => 'volume_configuration',
+ :be_id => ''
+ )
+ new_config.save!
+ from_db(new_config, context)
+ end
+
+ def self.delete!(id, context)
+ current_db.volume_configurations.first(:id => id).destroy
+ end
+
def self.find(id, context)
- volume_configs = []
- if id == :all
- #ec2 ebs volumes can 1gb..1tb
- (1..1000).each do |size|
- volume_configs << create(size, context)
+ if id==:all
+ if context.driver.respond_to? :volume_configurations
+ context.driver.volume_configurations(context.credentials, {:env=>context})
+ else
+ Deltacloud::Database::VolumeConfiguration.all(
+ 'provider.driver' => driver_symbol.to_s,
+ 'provider.url' => current_provider
+ ).map { |t| from_db(t, context) }
end
else
- volume_configs << create(id, context)
- return volume_configs.first
+ if context.driver.respond_to? :volume_configuration
+ context.driver.volume_configuration(context.credentials, id, :env=>context)
+ else
+ config = Deltacloud::Database::VolumeConfiguration.first(
+ 'provider.driver' => driver_symbol.to_s,
+ 'provider.url' => current_provider,
+ :id => id
+ )
+ raise CIMI::Model::NotFound unless config
+ from_db(config, context)
+ end
end
- return volume_configs
end
-
- def self.all(context); find(:all, context); end
-
private
- def self.create(size, context)
- size_kib = context.to_kibibyte(size, "GB")
- self.new( {
- :id => context.volume_configuration_url(size),
- :name => "volume-#{size}",
- :description => "Volume configuration with #{size_kib} kibibytes",
- :created => Time.now.xmlschema,
- :capacity => size_kib,
- :supports_snapshots => "true"
- # FIXME :guest_interface => "NFS"
- } )
+ def self.from_db(model, context)
+ self.new(
+ :id => context.volume_configuration_url(model.id),
+ :name => model.name,
+ :description => model.description,
+ :format => model.format,
+ :capacity => context.to_kibibyte(model.capacity, "GB"),
+ :property => model.ent_properties,
+ :operations => [
+ { :href => context.destroy_volume_configuration_url(model.id), :rel => 'http://schemas.dmtf.org/cimi/1/action/delete' }
+ ]
+ )
end
end
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/8b60c602/server/lib/db.rb
----------------------------------------------------------------------
diff --git a/server/lib/db.rb b/server/lib/db.rb
index 9564b79..f359664 100644
--- a/server/lib/db.rb
+++ b/server/lib/db.rb
@@ -10,6 +10,7 @@ module Deltacloud
require_relative './db/entity'
require_relative './db/machine_template'
require_relative './db/address_template'
+ require_relative './db/volume_configuration'
end
DATABASE_LOCATION = ENV['DATABASE_LOCATION'] || File.join('/', 'var', 'tmp', "deltacloud-mock-#{ENV['USER']}", 'db.sqlite')
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/8b60c602/server/lib/db/provider.rb
----------------------------------------------------------------------
diff --git a/server/lib/db/provider.rb b/server/lib/db/provider.rb
index 789bf3e..310d007 100644
--- a/server/lib/db/provider.rb
+++ b/server/lib/db/provider.rb
@@ -11,6 +11,7 @@ module Deltacloud
has n, :entities
has n, :machine_templates
has n, :address_templates
+ has n, :volume_configurations
# This is a workaround for strange bug in Fedora MRI:
#
@@ -22,6 +23,10 @@ module Deltacloud
AddressTemplate.all(:provider_id => self.id)
end
+ def volume_configurations
+ VolumeConfiguration.all(:provider_id => self.id)
+ end
+
def entities
Entity.all(:provider_id => self.id)
end
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/8b60c602/server/lib/db/volume_configuration.rb
----------------------------------------------------------------------
diff --git a/server/lib/db/volume_configuration.rb b/server/lib/db/volume_configuration.rb
new file mode 100644
index 0000000..58aa624
--- /dev/null
+++ b/server/lib/db/volume_configuration.rb
@@ -0,0 +1,12 @@
+module Deltacloud
+ module Database
+
+ class VolumeConfiguration < Entity
+ belongs_to :provider
+
+ property :format, String
+ property :capacity, String
+ end
+
+ end
+end
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/8b60c602/server/support/cimi/volume_config.json
----------------------------------------------------------------------
diff --git a/server/support/cimi/volume_config.json b/server/support/cimi/volume_config.json
new file mode 100644
index 0000000..d0fb0ab
--- /dev/null
+++ b/server/support/cimi/volume_config.json
@@ -0,0 +1,7 @@
+{
+ "resourceURI": "http://schemas.dmtf.org/cimi/1/VolumeConfigurationCreate",
+ "name": "myVolumeConfig1",
+ "description": "1 GB volume configuration",
+ "format": "qcow2",
+ "capacity": "1"
+}
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/8b60c602/server/support/cimi/volume_config.xml
----------------------------------------------------------------------
diff --git a/server/support/cimi/volume_config.xml b/server/support/cimi/volume_config.xml
new file mode 100644
index 0000000..1f6942d
--- /dev/null
+++ b/server/support/cimi/volume_config.xml
@@ -0,0 +1,6 @@
+<VolumeConfigurationCreate>
+ <name>SampleVolumeConfiguration1</name>
+ <description>This is sample 1GB volume configuration</description>
+ <format>qcow2</format>
+ <capacity>1</capacity>
+</VolumeConfigurationCreate>