From: Michal Fojtik <[email protected]> * DataMapper is required for CIMI from this commit. * This patch support storing of :name, :description and :properties.
Signed-off-by: Michal fojtik <[email protected]> --- 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(-) create mode 100644 server/lib/db.rb create mode 100644 server/lib/db/entity.rb create mode 100644 server/lib/db/provider.rb 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) diff --git a/server/deltacloud-core.gemspec b/server/deltacloud-core.gemspec index cb9a8c8..0b60396 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 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 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' 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 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 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 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 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 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 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 -- 1.8.0
