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 2012/11/30 09:48:25 UTC
[8/8] git commit: CIMI: Initial support for persisting attributes in
database
CIMI: Initial support for persisting attributes in database
* DataMapper is required for CIMI from this commit.
* This patch support storing of :name, :description and :properties.
Project: http://git-wip-us.apache.org/repos/asf/deltacloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltacloud/commit/b47315ab
Tree: http://git-wip-us.apache.org/repos/asf/deltacloud/tree/b47315ab
Diff: http://git-wip-us.apache.org/repos/asf/deltacloud/diff/b47315ab
Branch: refs/heads/master
Commit: b47315abbcd72a9e0af427d4fedb7c4ef88178b5
Parents: f8cb264
Author: Michal Fojtik <mf...@redhat.com>
Authored: Tue Nov 13 11:59:06 2012 +0100
Committer: Michal fojtik <mf...@redhat.com>
Committed: Fri Nov 30 09:42:19 2012 +0100
----------------------------------------------------------------------
server/config.ru | 1 +
server/deltacloud-core.gemspec | 3 +
server/lib/cimi/collections/base.rb | 1 +
server/lib/cimi/helpers.rb | 1 +
server/lib/cimi/models/base.rb | 10 ++++
server/lib/cimi/models/machine.rb | 21 +++++++-
server/lib/db.rb | 55 +++++++++++++++++++++
server/lib/db/entity.rb | 29 +++++++++++
server/lib/db/provider.rb | 15 ++++++
server/lib/deltacloud/drivers/base_driver.rb | 4 ++
server/lib/deltacloud/models/base_model.rb | 4 ++
11 files changed, 141 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/b47315ab/server/config.ru
----------------------------------------------------------------------
diff --git a/server/config.ru b/server/config.ru
index efed62f..406c769 100644
--- a/server/config.ru
+++ b/server/config.ru
@@ -54,6 +54,7 @@ end
# different root_url's
#
frontends.each do |frontend|
+ frontend = frontend.strip
if Deltacloud[frontend.to_sym].nil?
puts "ERROR: Unknown frontend (#{frontend}). Valid values are 'deltacloud,cimi,ec2'"
exit(1)
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/b47315ab/server/deltacloud-core.gemspec
----------------------------------------------------------------------
diff --git a/server/deltacloud-core.gemspec b/server/deltacloud-core.gemspec
index 2c4f0f8..cecc154 100644
--- a/server/deltacloud-core.gemspec
+++ b/server/deltacloud-core.gemspec
@@ -79,6 +79,9 @@ Gem::Specification.new do |s|
s.add_dependency('nokogiri', '>= 1.4.3')
s.add_dependency('require_relative') if RUBY_VERSION < '1.9'
+ s.add_dependency('data_mapper')
+ s.add_dependency('dm-sqlite-adapter')
+
# dependencies for various cloud providers:
# RHEV-M and oVirt
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/b47315ab/server/lib/cimi/collections/base.rb
----------------------------------------------------------------------
diff --git a/server/lib/cimi/collections/base.rb b/server/lib/cimi/collections/base.rb
index a78b78a..30c595b 100644
--- a/server/lib/cimi/collections/base.rb
+++ b/server/lib/cimi/collections/base.rb
@@ -23,6 +23,7 @@ module CIMI::Collections
include CIMI::Model
helpers Deltacloud::Helpers::Drivers
+ helpers Deltacloud::Helpers::Database
helpers Sinatra::AuthHelper
helpers Sinatra::Rabbit::URLHelper
helpers Deltacloud::Helpers::Application
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/b47315ab/server/lib/cimi/helpers.rb
----------------------------------------------------------------------
diff --git a/server/lib/cimi/helpers.rb b/server/lib/cimi/helpers.rb
index 9d069b1..c2f2461 100644
--- a/server/lib/cimi/helpers.rb
+++ b/server/lib/cimi/helpers.rb
@@ -26,6 +26,7 @@ end
# Declare namespace for CIMI models
#
+require_relative '../db'
require_relative '../deltacloud/drivers'
require_relative '../deltacloud/models'
require_relative '../deltacloud/helpers/driver_helper'
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/b47315ab/server/lib/cimi/models/base.rb
----------------------------------------------------------------------
diff --git a/server/lib/cimi/models/base.rb b/server/lib/cimi/models/base.rb
index 6a73cf6..a5d8f34 100644
--- a/server/lib/cimi/models/base.rb
+++ b/server/lib/cimi/models/base.rb
@@ -285,4 +285,14 @@ class CIMI::Model::Base < CIMI::Model::Resource
end
self.class.new(attrs)
end
+
+ class << self
+ def store_attributes_for(context, entity, attrs={})
+ stored_attributes = {}
+ stored_attributes[:description] = attrs['description'] if attrs['description']
+ stored_attributes[:name] = attrs['name'] if attrs['name']
+ stored_attributes[:ent_properties] = attrs['properties'].to_json if attrs['properties']
+ context.store_attributes_for(entity, stored_attributes)
+ end
+ end
end
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/b47315ab/server/lib/cimi/models/machine.rb
----------------------------------------------------------------------
diff --git a/server/lib/cimi/models/machine.rb b/server/lib/cimi/models/machine.rb
index 21e0081..07c5a17 100644
--- a/server/lib/cimi/models/machine.rb
+++ b/server/lib/cimi/models/machine.rb
@@ -58,6 +58,10 @@ class CIMI::Model::Machine < CIMI::Model::Base
instance = context.driver.create_instance(context.credentials, image_id, {
:hwp_id => hardware_profile_id
}.merge(additional_params))
+
+ # Store attributes that are not supported by the backend cloud to local
+ # database:
+ store_attributes_for(context, instance, json)
from_instance(instance, context)
end
@@ -74,6 +78,10 @@ class CIMI::Model::Machine < CIMI::Model::Base
instance = context.driver.create_instance(context.credentials, image_id, {
:hwp_id => hardware_profile_id
}.merge(additional_params))
+
+ # Store attributes that are not supported by the backend cloud to local
+ # database:
+ store_attributes_for(context, instance, xml)
from_instance(instance, context)
end
@@ -90,6 +98,7 @@ class CIMI::Model::Machine < CIMI::Model::Base
end
def self.delete!(id, context)
+ context.delete_attributes_for Instance.new(:id => id)
context.driver.destroy_instance(context.credentials, id)
end
@@ -120,10 +129,16 @@ class CIMI::Model::Machine < CIMI::Model::Base
def self.from_instance(instance, context)
cpu = memory = (instance.instance_profile.id == "opaque")? "n/a" : nil
machine_conf = CIMI::Model::MachineConfiguration.find(instance.instance_profile.name, context)
+ stored_attributes = context.load_attributes_for(instance)
+ if stored_attributes[:property]
+ stored_attributes[:property].merge!(convert_instance_properties(instance, context))
+ else
+ stored_attributes[:property] = convert_instance_properties(instance, context)
+ end
machine_spec = {
:name => instance.name,
- :description => "Instance #{instance.name}",
:created => instance.launch_time.nil? ? Time.now.xmlschema : Time.parse(instance.launch_time.to_s).xmlschema,
+ :description => "No description set for Machine #{instance.name}",
:id => context.machine_url(instance.id),
:state => convert_instance_state(instance.state),
:cpu => cpu || convert_instance_cpu(instance.instance_profile, context),
@@ -131,8 +146,8 @@ class CIMI::Model::Machine < CIMI::Model::Base
:disks => { :href => context.machine_url(instance.id)+"/disks"},
:volumes => { :href=>context.machine_url(instance.id)+"/volumes"},
:operations => convert_instance_actions(instance, context),
- :property => convert_instance_properties(instance, context)
- }
+ :property => stored_attributes
+ }.merge(stored_attributes)
if context.expand? :disks
machine_spec[:disks] = CIMI::Model::Disk.find(instance, machine_conf, context, :all)
end
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/b47315ab/server/lib/db.rb
----------------------------------------------------------------------
diff --git a/server/lib/db.rb b/server/lib/db.rb
new file mode 100644
index 0000000..e0f28d4
--- /dev/null
+++ b/server/lib/db.rb
@@ -0,0 +1,55 @@
+module Deltacloud
+
+ require 'data_mapper'
+
+ require_relative './db/provider'
+ require_relative './db/entity'
+
+ DATABASE_LOCATION = ENV['DATABASE_LOCATION'] || "/var/tmp/deltacloud-mock-#{ENV['USER']}/db.sqlite"
+
+ def self.initialize_database
+ DataMapper::Logger.new($stdout, :debug)
+ DataMapper::setup(:default, "sqlite://#{DATABASE_LOCATION}")
+ DataMapper::finalize
+ DataMapper::auto_upgrade!
+ end
+
+ module Helpers
+ module Database
+ include Deltacloud::Database
+
+ def store_attributes_for(model, values={})
+ return if model.nil? or values.empty?
+ current_db.entities.first_or_create(:be_kind => model.to_entity, :be_id => model.id).update(values)
+ end
+
+ def load_attributes_for(model)
+ entity = get_entity(model)
+ entity.nil? ? {} : entity.to_hash
+ end
+
+ def delete_attributes_for(model)
+ get_entity(model).destroy
+ end
+
+ def get_entity(model)
+ current_db.entities.first(:be_kind => model.to_entity, :be_id => model.id)
+ end
+
+ def current_provider
+ Thread.current[:provider] || ENV['API_PROVIDER'] || 'default'
+ end
+
+ # This method allows to store things into database based on current driver
+ # and provider.
+ #
+ def current_db
+ Provider.first_or_create(:driver => driver_symbol.to_s, :url => current_provider)
+ end
+
+ end
+ end
+
+end
+
+Deltacloud::initialize_database
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/b47315ab/server/lib/db/entity.rb
----------------------------------------------------------------------
diff --git a/server/lib/db/entity.rb b/server/lib/db/entity.rb
new file mode 100644
index 0000000..b220f9e
--- /dev/null
+++ b/server/lib/db/entity.rb
@@ -0,0 +1,29 @@
+module Deltacloud
+ module Database
+
+ class Entity
+ include DataMapper::Resource
+
+ belongs_to :provider
+
+ property :id, Serial
+ property :be_kind, String, :required => true # => Machine, MachineImage, ...
+ property :be_id, String, :required => true # => Original Machine 'id'
+
+ property :ent_properties, Json
+
+ property :name, String
+ property :description, String
+
+ def to_hash
+ retval = {}
+ retval.merge!(:name => self.name) if !self.name.nil?
+ retval.merge!(:description => self.description) if !self.description.nil?
+ retval.merge!(:property => self.ent_properties) if !self.ent_properties.nil?
+ retval
+ end
+
+ end
+
+ end
+end
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/b47315ab/server/lib/db/provider.rb
----------------------------------------------------------------------
diff --git a/server/lib/db/provider.rb b/server/lib/db/provider.rb
new file mode 100644
index 0000000..6a761e5
--- /dev/null
+++ b/server/lib/db/provider.rb
@@ -0,0 +1,15 @@
+module Deltacloud
+ module Database
+
+ class Provider
+ include DataMapper::Resource
+
+ property :id, Serial
+ property :driver, String, :required => true
+ property :url, Text
+
+ has n, :entities
+ end
+
+ end
+end
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/b47315ab/server/lib/deltacloud/drivers/base_driver.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/drivers/base_driver.rb b/server/lib/deltacloud/drivers/base_driver.rb
index cfb689d..b828d33 100644
--- a/server/lib/deltacloud/drivers/base_driver.rb
+++ b/server/lib/deltacloud/drivers/base_driver.rb
@@ -60,6 +60,10 @@ module Deltacloud
features.has_key?(collection) and features[collection].include?(feature_name)
end
+ def has_feature?(collection, feature_name)
+ self.class.has_feature?(collection, feature_name)
+ end
+
def name
self.class.name.split('::').last.gsub('Driver', '').downcase
end
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/b47315ab/server/lib/deltacloud/models/base_model.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/base_model.rb b/server/lib/deltacloud/models/base_model.rb
index 5c19ad5..2553042 100644
--- a/server/lib/deltacloud/models/base_model.rb
+++ b/server/lib/deltacloud/models/base_model.rb
@@ -44,4 +44,8 @@ class BaseModel
@id
end
+ def to_entity
+ self.class.name.downcase
+ end
+
end