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/02/22 11:32:24 UTC
[2/12] git commit: This makes it possible to have a full
MachineConfiguration object referenced from a Machinetemplate
This makes it possible to have a full MachineConfiguration object
referenced from a Machinetemplate
Project: http://git-wip-us.apache.org/repos/asf/deltacloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltacloud/commit/6646a7ee
Tree: http://git-wip-us.apache.org/repos/asf/deltacloud/tree/6646a7ee
Diff: http://git-wip-us.apache.org/repos/asf/deltacloud/diff/6646a7ee
Branch: refs/heads/master
Commit: 6646a7eed05a6071d084b1cada598f9cc9305fb9
Parents: 54a8611
Author: David Lutterkort <lu...@redhat.com>
Authored: Sat Feb 9 21:53:20 2013 +0100
Committer: Michal fojtik <mf...@redhat.com>
Committed: Thu Feb 21 15:31:31 2013 +0100
----------------------------------------------------------------------
server/lib/cimi/models.rb | 4 +-
server/lib/cimi/models/base.rb | 5 ++
server/lib/cimi/models/machine_template.rb | 6 +-
server/lib/cimi/models/schema.rb | 44 ++++++++++++++-
server/tests/cimi/data/machine_create_by_value.xml | 7 ++
server/tests/cimi/model/machine_template_spec.rb | 29 ++++++++++
6 files changed, 88 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/6646a7ee/server/lib/cimi/models.rb
----------------------------------------------------------------------
diff --git a/server/lib/cimi/models.rb b/server/lib/cimi/models.rb
index c48b531..8e27537 100644
--- a/server/lib/cimi/models.rb
+++ b/server/lib/cimi/models.rb
@@ -60,15 +60,15 @@ require_relative './models/cloud_entry_point'
CIMI::Model::ResourceMetadata.acts_as_root_entity
+require_relative './models/credential'
require_relative './models/volume'
require_relative './models/volume_template'
require_relative './models/volume_configuration'
require_relative './models/volume_image'
require_relative './models/machine'
-require_relative './models/machine_template'
require_relative './models/machine_configuration'
require_relative './models/machine_image'
-require_relative './models/credential'
+require_relative './models/machine_template'
require_relative './models/network_port'
require_relative './models/network'
require_relative './models/network_template'
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/6646a7ee/server/lib/cimi/models/base.rb
----------------------------------------------------------------------
diff --git a/server/lib/cimi/models/base.rb b/server/lib/cimi/models/base.rb
index 5a8b13a..80b645b 100644
--- a/server/lib/cimi/models/base.rb
+++ b/server/lib/cimi/models/base.rb
@@ -60,6 +60,11 @@ require_relative '../helpers/database_helper'
# A shorthand for +struct name { scalar :href }+; in JSON, this is
# represented as +{ name: { "href": string } }+, and in XML as +<name
# href="..."/>+
+# [ref(name, [klass])]
+# A reference to another object, like the reference to the
+# MachineConfiguration in a MachineTemplate. If +klass+ is not given,
+# an attempt is made to infer the class of the target of the reference
+# from +name+
# [struct(name, opts, &block)]
# A structured subobject; the block defines the schema of the
# subobject. The +:content+ option can be used to specify the attribute
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/6646a7ee/server/lib/cimi/models/machine_template.rb
----------------------------------------------------------------------
diff --git a/server/lib/cimi/models/machine_template.rb b/server/lib/cimi/models/machine_template.rb
index 685fef5..43df953 100644
--- a/server/lib/cimi/models/machine_template.rb
+++ b/server/lib/cimi/models/machine_template.rb
@@ -17,9 +17,9 @@ class CIMI::Model::MachineTemplate < CIMI::Model::Base
acts_as_root_entity
- href :machine_config
- href :machine_image
- href :credential
+ ref :machine_config
+ ref :machine_image
+ ref :credential
resource_attr :realm, :required => false,
:constraints => lambda { |c| c.driver.realms(c.credentials).map { |r| r.id }}
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/6646a7ee/server/lib/cimi/models/schema.rb
----------------------------------------------------------------------
diff --git a/server/lib/cimi/models/schema.rb b/server/lib/cimi/models/schema.rb
index 298075b..5a5d2c9 100644
--- a/server/lib/cimi/models/schema.rb
+++ b/server/lib/cimi/models/schema.rb
@@ -92,7 +92,27 @@ class CIMI::Model::Schema
content = opts[:content]
super(name, opts)
if opts[:class]
- opts[:schema] = opts[:class].schema
+ raise "Cannot use both :class and :schema" if opts[:schema]
+ refname = "#{opts[:class].name.split("::").last}Ref"
+ if CIMI::Model::const_defined?(refname)
+ @klass = CIMI::Model::const_get(refname)
+ else
+ @klass = Class.new(opts[:class]) do
+ scalar :href
+
+ def ref_id(ctx)
+ # FIXME: We should use ctx's routes to split
+ # out the :id
+ href.split('/').last
+ end
+
+ def find(ctx)
+ opts[:class].find(ref_id(ctx), ctx)
+ end
+ end
+ CIMI::Model::const_set(refname, @klass)
+ end
+ opts[:schema] = @klass.schema
end
if opts[:schema]
if block_given?
@@ -150,9 +170,21 @@ class CIMI::Model::Schema
json
end
+ def convert(value)
+ if @klass
+ @klass.new(value || {})
+ else
+ super(value)
+ end
+ end
+
private
def struct
- @struct_class ||= ::Struct.new(nil, *@schema.attribute_names)
+ if @klass
+ @klass
+ else
+ @struct_class ||= ::Struct.new(nil, *@schema.attribute_names)
+ end
end
end
@@ -375,6 +407,14 @@ class CIMI::Model::Schema
add_attributes!([name, opts], Struct, &block)
end
+ def ref(name, klass = nil)
+ unless klass
+ s = name.to_s.camelize.gsub(/Config$/, "Configuration")
+ klass = CIMI::Model::const_get(s)
+ end
+ struct(name, :class => klass)
+ end
+
def hash(name)
add_attributes!([name, {}], Hash)
end
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/6646a7ee/server/tests/cimi/data/machine_create_by_value.xml
----------------------------------------------------------------------
diff --git a/server/tests/cimi/data/machine_create_by_value.xml b/server/tests/cimi/data/machine_create_by_value.xml
new file mode 100644
index 0000000..ecb6735
--- /dev/null
+++ b/server/tests/cimi/data/machine_create_by_value.xml
@@ -0,0 +1,7 @@
+<MachineCreate xmlns="http://schemas.dmtf.org/cimi/1">
+ <name>xml_machine_by_value</name>
+ <machineTemplate>
+ <machineConfig href="http://localhost:3001/cimi/machine_configurations/m1-small"/>
+ <machineImage href="http://localhost:3001/cimi/machine_images/img2"/>
+ </machineTemplate>
+</MachineCreate>
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/6646a7ee/server/tests/cimi/model/machine_template_spec.rb
----------------------------------------------------------------------
diff --git a/server/tests/cimi/model/machine_template_spec.rb b/server/tests/cimi/model/machine_template_spec.rb
index b1f6376..ed4a3d8 100644
--- a/server/tests/cimi/model/machine_template_spec.rb
+++ b/server/tests/cimi/model/machine_template_spec.rb
@@ -29,4 +29,33 @@ describe "MachineTemplate model" do
should_properly_serialize_model CIMI::Model::MachineTemplate, @xml, @json
end
+ describe "can have an embedded machineConfig" do
+ MACHINE_CONFIG_ID = "http://cimi.example.org/machine_configs/1"
+
+ it "in XML" do
+ mt = CIMI::Model::MachineTemplate.from_xml(@xml)
+ mt.name.must_equal "My First Template"
+ mt.machine_config.href.must_equal MACHINE_CONFIG_ID
+ mt.machine_config.id.must_be_nil
+ mt.machine_config.cpu = 7
+
+ mc = parse_xml(mt.to_xml)["MachineTemplate"].first["machineConfig"].first
+ mc.wont_be_nil
+ mc["href"].must_equal MACHINE_CONFIG_ID
+ mc["cpu"].first["content"].must_equal "7"
+ end
+
+ it "in JSON" do
+ mt = CIMI::Model::MachineTemplate.from_json(@json)
+ mt.name.must_equal "My First Template"
+ mt.machine_config.href.must_equal MACHINE_CONFIG_ID
+ mt.machine_config.id.must_be_nil
+ mt.machine_config.cpu = 7
+
+ mc = JSON::parse(mt.to_json)["machineConfig"]
+ mc.wont_be_nil
+ mc["href"].must_equal MACHINE_CONFIG_ID
+ mc["cpu"].must_equal 7
+ end
+ end
end