From: Michal Fojtik <[email protected]> Provider can define an extra attributes for each resource. In case of Deltacloud API we do need provide Consumer a way how to define the 'realm_id' when creating Machine.
This patch will add 'realm' attribute that hold information about the 'realm' (eg. where Machine is located). This patch also add 'machineImage' attribute to Machine that point client to MachineImage that was used for creating Machine Signed-off-by: Michal fojtik <[email protected]> --- server/lib/cimi/models/machine.rb | 5 +++++ server/lib/cimi/models/resource_metadata.rb | 30 ++++++++++++++++++++++++++++- server/lib/cimi/models/schema.rb | 10 ++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/server/lib/cimi/models/machine.rb b/server/lib/cimi/models/machine.rb index e9d774b..1b1c77e 100644 --- a/server/lib/cimi/models/machine.rb +++ b/server/lib/cimi/models/machine.rb @@ -17,6 +17,9 @@ class CIMI::Model::Machine < CIMI::Model::Base acts_as_root_entity + resource_attr :realm, :required => false + resource_attr :machine_image, :required => false, :type => :href + text :state text :cpu @@ -159,6 +162,8 @@ class CIMI::Model::Machine < CIMI::Model::Base if context.expand? :volumes machine_spec[:volumes] = CIMI::Model::MachineVolume.find(instance.id, context, :all) end + machine_spec[:realm] = instance.realm_id if instance.realm_id + machine_spec[:machine_image] = { :href => context.machine_image_url(instance.image_id) } if instance.image_id machine = self.new(machine_spec) machine end diff --git a/server/lib/cimi/models/resource_metadata.rb b/server/lib/cimi/models/resource_metadata.rb index 858fcdc..6976515 100644 --- a/server/lib/cimi/models/resource_metadata.rb +++ b/server/lib/cimi/models/resource_metadata.rb @@ -81,10 +81,29 @@ class CIMI::Model::ResourceMetadata < CIMI::Model::Base }) end + def self.resource_attributes + @resource_attributes ||= {} + end + + def self.add_resource_attribute!(klass, name, opts={}) + resource_attributes[klass.name] ||= {} + resource_attributes[klass.name][name] = opts + end + private def self.rm_attributes_for(resource_class, context) - [] + return [] if resource_attributes[resource_class.name].nil? + resource_attributes[resource_class.name].map do |attr_name, attr_def| + { + :name => attr_name.to_s, + # TODO: We need to make this URI return description of this 'non-CIMI' + # attribute + :namespace => "http://deltacloud.org/cimi/#{resource_class.name.split('::').last}/#{attr_name}", + :type => translate_attr_type(attr_def[:type]), + :required => attr_def[:required] ? 'true' : 'false' + } + end end def self.rm_capabilities_for(resource_class,context) @@ -108,6 +127,15 @@ class CIMI::Model::ResourceMetadata < CIMI::Model::Base [] end + def self.translate_attr_type(type) + case type + when :href then 'URI' + when :text then 'string' + when :boolean then 'boolean' + else 'text' + end + end + def self.none_defined(metadata) return true if metadata.capabilities.empty? && metadata.capabilities.empty? && metadata.attributes.empty? return false diff --git a/server/lib/cimi/models/schema.rb b/server/lib/cimi/models/schema.rb index b86fb08..4acd2dc 100644 --- a/server/lib/cimi/models/schema.rb +++ b/server/lib/cimi/models/schema.rb @@ -334,6 +334,16 @@ class CIMI::Model::Schema # Requires that the class into which this is included has a # +add_attributes!+ method module DSL + + def resource_attr(name, opts={}) + CIMI::Model::ResourceMetadata.add_resource_attribute!(self, name, opts) + if opts[:type] + send(opts[:type], name) + else + text name + end + end + def href(*args) opts = args.extract_opts! args.each { |arg| struct(arg, opts) { scalar :href } } -- 1.8.0.2
