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