You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltacloud.apache.org by lu...@apache.org on 2010/07/09 01:17:03 UTC
svn commit: r962014 - in /incubator/deltacloud/trunk/client-ruby:
lib/deltacloud.rb lib/models/ lib/models/base_model.rb lib/models/flavor.rb
lib/models/image.rb lib/models/instance.rb specs/flavors_spec.rb
specs/images_spec.rb specs/instances_spec.rb
Author: lutter
Date: Thu Jul 8 23:17:02 2010
New Revision: 962014
URL: http://svn.apache.org/viewvc?rev=962014&view=rev
Log:
Work up lazy-loading richer model.
Added:
incubator/deltacloud/trunk/client-ruby/lib/models/
incubator/deltacloud/trunk/client-ruby/lib/models/base_model.rb
incubator/deltacloud/trunk/client-ruby/lib/models/flavor.rb
incubator/deltacloud/trunk/client-ruby/lib/models/image.rb
incubator/deltacloud/trunk/client-ruby/lib/models/instance.rb
Modified:
incubator/deltacloud/trunk/client-ruby/lib/deltacloud.rb
incubator/deltacloud/trunk/client-ruby/specs/flavors_spec.rb
incubator/deltacloud/trunk/client-ruby/specs/images_spec.rb
incubator/deltacloud/trunk/client-ruby/specs/instances_spec.rb
Modified: incubator/deltacloud/trunk/client-ruby/lib/deltacloud.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/client-ruby/lib/deltacloud.rb?rev=962014&r1=962013&r2=962014&view=diff
==============================================================================
--- incubator/deltacloud/trunk/client-ruby/lib/deltacloud.rb (original)
+++ incubator/deltacloud/trunk/client-ruby/lib/deltacloud.rb Thu Jul 8 23:17:02 2010
@@ -3,6 +3,10 @@ require 'net/http'
require 'logger'
require 'rexml/document'
+require 'models/flavor'
+require 'models/image'
+require 'models/instance'
+
class DeltaCloud
attr_accessor :logger
@@ -30,7 +34,8 @@ class DeltaCloud
if ( response.is_a?( Net::HTTPSuccess ) )
doc = REXML::Document.new( response.body )
doc.get_elements( 'flavors/flavor' ).each do |flavor|
- flavors << convert( :flavor, flavor )
+ uri = flavor.attributes['href']
+ flavors << Flavor.new( self, uri, build_hash( flavor ) )
end
end
end
@@ -47,7 +52,8 @@ class DeltaCloud
if ( response.is_a?( Net::HTTPSuccess ) )
doc = REXML::Document.new( response.body )
doc.get_elements( 'images/image' ).each do |image|
- images << convert( :image, image )
+ uri = image.attributes['href']
+ images << Image.new( self, uri, build_hash( image ) )
end
end
end
@@ -60,13 +66,21 @@ class DeltaCloud
if ( response.is_a?( Net::HTTPSuccess ) )
doc = REXML::Document.new( response.body )
doc.get_elements( 'instances/instance' ).each do |instance|
- instances << convert( :instance, instance )
+ uri = instance.attributes['href']
+ instances << Instance.new( self, uri, build_hash( instance ) )
end
end
end
instances
end
+ def fetch(uri)
+ request( uri ) do |response|
+ doc = REXML::Document.new( response.body )
+ return build_hash( doc.root )
+ end
+ end
+
def api_host
@api_uri.host
end
@@ -81,23 +95,13 @@ class DeltaCloud
private
- CONVERSIONS = {
- :flavor=>{
- :storage=>:to_f,
- :memory=>:to_f,
- }
- }
-
attr_reader :http
- def convert(type, elem)
+ def build_hash(elem)
hash = {}
elem.elements.each do |element|
key = element.name.gsub( /-/, '_' ).to_sym
value = element.text
- conversions = CONVERSIONS[type]
- ( conversion = conversions[key] ) if conversions
- ( value = value.send( conversion ) ) if conversion
hash[key] = value
end
hash
Added: incubator/deltacloud/trunk/client-ruby/lib/models/base_model.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/client-ruby/lib/models/base_model.rb?rev=962014&view=auto
==============================================================================
--- incubator/deltacloud/trunk/client-ruby/lib/models/base_model.rb (added)
+++ incubator/deltacloud/trunk/client-ruby/lib/models/base_model.rb Thu Jul 8 23:17:02 2010
@@ -0,0 +1,90 @@
+
+class BaseModel
+
+ def self.attribute(attr, type=:string)
+ build_accessor attr
+ attributes[attr] = type
+ end
+
+ def self.has_one(attr, type)
+ build_accessor attr
+ has_ones[attr] = type
+ end
+
+ def self.has_many(*attrs)
+ attrs.each do |attr|
+ build_accessor attr
+ has_manys << attr
+ end
+ end
+
+ def self.attributes
+ @attributes ||= {}
+ end
+
+ def self.has_ones
+ @has_ones ||= {}
+ end
+
+ def self.has_manyes
+ @has_manys ||= []
+ end
+
+ def self.build_accessor(attr)
+ eval "
+ def #{attr}
+ check_load_payload
+ @#{attr}
+ end
+ def #{attr}=(v)
+ @#{attr} = v
+ end
+ "
+ end
+
+ attr_reader :uri
+
+ def initialize(client, uri=nil, init=nil)
+ @client = client
+ @uri = uri
+ @loaded = false
+ load_payload( init )
+ end
+
+ def check_load_payload()
+ return if @loaded
+ init = @client.fetch( @uri )
+ load_payload(init)
+ end
+
+ def load_payload(init=nil)
+ unless ( init.nil? )
+ @loaded = true
+ self.class.attributes.each{|attr,type|
+ value = convert( init[attr], type )
+ self.send( "#{attr}=", value )
+ }
+ self.class.has_ones.each{|attr,type|
+ type_class = eval( type.to_s )
+ ref_uri = init[attr]
+ value = type_class.new( @client, ref_uri )
+ self.send( "#{attr}=", value )
+ }
+ end
+ end
+
+
+ def convert(value, type)
+ case ( type )
+ when :float
+ return value.to_f
+ when :int
+ return value.to_i
+ when :string
+ return value.to_s
+ else
+ return value
+ end
+ end
+
+end
Added: incubator/deltacloud/trunk/client-ruby/lib/models/flavor.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/client-ruby/lib/models/flavor.rb?rev=962014&view=auto
==============================================================================
--- incubator/deltacloud/trunk/client-ruby/lib/models/flavor.rb (added)
+++ incubator/deltacloud/trunk/client-ruby/lib/models/flavor.rb Thu Jul 8 23:17:02 2010
@@ -0,0 +1,14 @@
+
+require 'models/base_model'
+
+class Flavor < BaseModel
+
+ attribute :memory, :float
+ attribute :storage, :float
+ attribute :architecture, :string
+
+ def initialize(client, uri, init=nil)
+ super( client, uri, init )
+ end
+
+end
Added: incubator/deltacloud/trunk/client-ruby/lib/models/image.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/client-ruby/lib/models/image.rb?rev=962014&view=auto
==============================================================================
--- incubator/deltacloud/trunk/client-ruby/lib/models/image.rb (added)
+++ incubator/deltacloud/trunk/client-ruby/lib/models/image.rb Thu Jul 8 23:17:02 2010
@@ -0,0 +1,14 @@
+
+require 'models/base_model'
+
+class Image < BaseModel
+
+ attribute :description, :string
+ attribute :owner_id, :string
+ attribute :architecture, :string
+
+ def initialize(client, uri, init=nil)
+ super( client, uri, init )
+ end
+
+end
Added: incubator/deltacloud/trunk/client-ruby/lib/models/instance.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/client-ruby/lib/models/instance.rb?rev=962014&view=auto
==============================================================================
--- incubator/deltacloud/trunk/client-ruby/lib/models/instance.rb (added)
+++ incubator/deltacloud/trunk/client-ruby/lib/models/instance.rb Thu Jul 8 23:17:02 2010
@@ -0,0 +1,18 @@
+
+require 'models/base_model'
+
+class Instance < BaseModel
+
+ attribute :owner_id, :string
+ attribute :public_address, :string
+ attribute :private_address, :string
+ attribute :state, :string
+
+ has_one :image, :Image
+ has_one :flavor, :Flavor
+
+ def initialize(client, uri, init=nil)
+ super( client, uri, init )
+ end
+
+end
Modified: incubator/deltacloud/trunk/client-ruby/specs/flavors_spec.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/client-ruby/specs/flavors_spec.rb?rev=962014&r1=962013&r2=962014&view=diff
==============================================================================
--- incubator/deltacloud/trunk/client-ruby/specs/flavors_spec.rb (original)
+++ incubator/deltacloud/trunk/client-ruby/specs/flavors_spec.rb Thu Jul 8 23:17:02 2010
@@ -1,6 +1,7 @@
require 'specs/spec_helper'
+
describe "flavors" do
it "should allow retrieval of all flavors" do
@@ -8,14 +9,14 @@ describe "flavors" do
flavors = client.flavors
flavors.should_not be_empty
flavors.each do |flavor|
- flavor[:id].should_not be_nil
- flavor[:id].should be_a(String)
- flavor[:architecture].should_not be_nil
- flavor[:architecture].should be_a(String)
- flavor[:storage].should_not be_nil
- flavor[:storage].should be_a(Float)
- flavor[:memory].should_not be_nil
- flavor[:memory].should be_a(Float)
+ flavor.uri.should_not be_nil
+ flavor.uri.should be_a(String)
+ flavor.architecture.should_not be_nil
+ flavor.architecture.should be_a(String)
+ flavor.storage.should_not be_nil
+ flavor.storage.should be_a(Float)
+ flavor.memory.should_not be_nil
+ flavor.memory.should be_a(Float)
end
end
end
Modified: incubator/deltacloud/trunk/client-ruby/specs/images_spec.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/client-ruby/specs/images_spec.rb?rev=962014&r1=962013&r2=962014&view=diff
==============================================================================
--- incubator/deltacloud/trunk/client-ruby/specs/images_spec.rb (original)
+++ incubator/deltacloud/trunk/client-ruby/specs/images_spec.rb Thu Jul 8 23:17:02 2010
@@ -9,14 +9,14 @@ describe "images" do
images.should_not be_empty
images.size.should eql( 3 )
images.each do |image|
- image[:id].should_not be_nil
- image[:id].should be_a(String)
- image[:description].should_not be_nil
- image[:description].should be_a(String)
- image[:architecture].should_not be_nil
- image[:architecture].should be_a(String)
- image[:owner_id].should_not be_nil
- image[:owner_id].should be_a(String)
+ image.uri.should_not be_nil
+ image.uri.should be_a(String)
+ image.description.should_not be_nil
+ image.description.should be_a(String)
+ image.architecture.should_not be_nil
+ image.architecture.should be_a(String)
+ image.owner_id.should_not be_nil
+ image.owner_id.should be_a(String)
end
end
end
@@ -27,14 +27,14 @@ describe "images" do
images.should_not be_empty
images.size.should eql( 1 )
images.each do |image|
- image[:id].should_not be_nil
- image[:id].should be_a(String)
- image[:description].should_not be_nil
- image[:description].should be_a(String)
- image[:architecture].should_not be_nil
- image[:architecture].should be_a(String)
- image[:owner_id].should_not be_nil
- image[:owner_id].should be_a(String)
+ image.uri.should_not be_nil
+ image.uri.should be_a(String)
+ image.description.should_not be_nil
+ image.description.should be_a(String)
+ image.architecture.should_not be_nil
+ image.architecture.should be_a(String)
+ image.owner_id.should_not be_nil
+ image.owner_id.should be_a(String)
end
end
end
Modified: incubator/deltacloud/trunk/client-ruby/specs/instances_spec.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/client-ruby/specs/instances_spec.rb?rev=962014&r1=962013&r2=962014&view=diff
==============================================================================
--- incubator/deltacloud/trunk/client-ruby/specs/instances_spec.rb (original)
+++ incubator/deltacloud/trunk/client-ruby/specs/instances_spec.rb Thu Jul 8 23:17:02 2010
@@ -8,21 +8,32 @@ describe "images" do
instances = client.instances
instances.should_not be_empty
instances.each do |instance|
- instance[:id].should_not be_nil
- instance[:id].should be_a( String )
- instance[:owner_id].should_not be_nil
- instance[:owner_id].should be_a( String )
- instance[:image].should_not be_nil
- instance[:image].should be_a( String )
- instance[:flavor].should_not be_nil
- instance[:flavor].should be_a( String )
- instance[:state].should_not be_nil
- instance[:state].should be_a( String )
- instance[:public_address].should_not be_nil
- instance[:public_address].should be_a( String )
- instance[:private_address].should_not be_nil
- instance[:private_address].should be_a( String )
+ instance.uri.should_not be_nil
+ instance.uri.should be_a( String )
+ instance.owner_id.should_not be_nil
+ instance.owner_id.should be_a( String )
+ instance.image.should_not be_nil
+ instance.image.should be_a( Image )
+ instance.flavor.should_not be_nil
+ instance.flavor.should be_a( Flavor )
+ instance.state.should_not be_nil
+ instance.state.should be_a( String )
+ instance.public_address.should_not be_nil
+ instance.public_address.should be_a( String )
+ instance.private_address.should_not be_nil
+ instance.private_address.should be_a( String )
end
end
end
+
+ it "should allow navigation from instance to image" do
+ DeltaCloud.new( API_NAME, API_PASSWORD, API_URL ) do |client|
+ instances = client.instances
+ instances.should_not be_empty
+ instance = instances.first
+ instance.image.should_not be_nil
+ instance.image.description.should_not be_nil
+ instance.image.description.should be_a(String)
+ end
+ end
end