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:36:22 UTC

svn commit: r962202 - in /incubator/deltacloud/trunk/client: lib/deltacloud.rb specs/spec_helper.rb

Author: lutter
Date: Thu Jul  8 23:36:22 2010
New Revision: 962202

URL: http://svn.apache.org/viewvc?rev=962202&view=rev
Log:
Use rest-client rather than Net::HTTP

You now need the rest-client gem

See http://rdoc.info/projects/archiloque/rest-client

Modified:
    incubator/deltacloud/trunk/client/lib/deltacloud.rb
    incubator/deltacloud/trunk/client/specs/spec_helper.rb

Modified: incubator/deltacloud/trunk/client/lib/deltacloud.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/client/lib/deltacloud.rb?rev=962202&r1=962201&r2=962202&view=diff
==============================================================================
--- incubator/deltacloud/trunk/client/lib/deltacloud.rb (original)
+++ incubator/deltacloud/trunk/client/lib/deltacloud.rb Thu Jul  8 23:36:22 2010
@@ -15,60 +15,78 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
-require 'uri'
-require 'net/http'
-require 'logger'
+require 'rest_client'
 require 'rexml/document'
-
+require 'logger'
 require 'dcloud/flavor'
 require 'dcloud/realm'
 require 'dcloud/image'
 require 'dcloud/instance'
 require 'dcloud/storage_volume'
 require 'dcloud/storage_snapshot'
-
 require 'dcloud/state'
 require 'dcloud/transition'
+require 'base64'
+
+module RestClient
+  class Response
+    def body
+      self.to_s
+    end
+  end
+end
 
 class DeltaCloud
 
+  attr_accessor :logger
+  attr_reader   :api_uri
+  attr_reader   :entry_points
+  attr_reader   :driver_name
+
   def self.driver_name(url)
     DeltaCloud.new( nil, nil, url) do |client|
       return client.driver_name
     end
   end
 
-  attr_accessor :logger
-  attr_reader :api_uri
-  attr_reader :entry_points
-  attr_reader :driver_name
-
   def initialize(name, password, api_uri, &block)
     @logger       = Logger.new( STDERR )
     @name         = name
     @password     = password
     @api_uri      = URI.parse( api_uri )
     @entry_points = {}
+    discover_entry_points
     connect( &block )
     self
   end
 
+
   def connect(&block)
-    @http = Net::HTTP.new( api_host, api_port )
+    @http = RestClient::Resource.new( api_uri.to_s , :accept => 'application/xml' )
     discover_entry_points
     block.call( self ) if block
     self
   end
 
+  def api_host
+    @api_uri.host
+  end
+
+  def api_port
+    @api_uri.port
+  end
+
+  def api_path
+    @api_uri.path
+  end
+
   def flavors(opts={})
     flavors = []
-    request( entry_points[:flavors], :get, opts ) do |response|
-      if ( response.is_a?( Net::HTTPSuccess ) )
-        doc = REXML::Document.new( response.body )
-        doc.get_elements( 'flavors/flavor' ).each do |flavor|
-          uri = flavor.attributes['href']
-          flavors << DCloud::Flavor.new( self, uri, flavor )
-        end
+    request(entry_points[:flavors], :get, opts) do |response|
+      doc = REXML::Document.new( response )
+      doc.get_elements( 'flavors/flavor' ).each do |flavor|
+        uri = flavor.attributes['href']
+        flavors << DCloud::Flavor.new( self, uri, flavor )
       end
     end
     flavors
@@ -76,15 +94,12 @@ class DeltaCloud
 
   def flavor(id)
     request( entry_points[:flavors], :get, {:id=>id } ) do |response|
-      if ( response.is_a?( Net::HTTPSuccess ) )
-        doc = REXML::Document.new( response.body )
-        doc.get_elements( 'flavors/flavor' ).each do |flavor|
-          uri = flavor.attributes['href']
-          return DCloud::Flavor.new( self, uri, flavor )
-        end
+      doc = REXML::Document.new( response.body )
+      doc.get_elements( '/flavor' ).each do |flavor|
+        uri = flavor.attributes['href']
+        return DCloud::Flavor.new( self, uri, flavor )
       end
     end
-    nil
   end
 
   def fetch_flavor(uri)
@@ -93,21 +108,29 @@ class DeltaCloud
     nil
   end
 
-  def instance_states()
+  def fetch_resource(type, uri)
+    request( uri ) do |response|
+      doc = REXML::Document.new( response.body )
+      if ( doc.root && ( doc.root.name == type.to_s.gsub( /_/, '-' ) ) )
+        return doc.root
+      end
+    end
+    nil
+  end
+
+  def instance_states
     states = []
     request( entry_points[:instance_states] ) do |response|
-      if ( response.is_a?( Net::HTTPSuccess ) )
-        doc = REXML::Document.new( response.body )
-        doc.get_elements( 'states/state' ).each do |state_elem|
-          state = DCloud::State.new( state_elem.attributes['name'] )
-          state_elem.get_elements( 'transition' ).each do |transition_elem|
-            state.transitions << DCloud::Transition.new(
-                                   transition_elem.attributes['to'],
-                                   transition_elem.attributes['action']
-                                 )
-          end
-          states << state
+      doc = REXML::Document.new( response.body )
+      doc.get_elements( 'states/state' ).each do |state_elem|
+        state = DCloud::State.new( state_elem.attributes['name'] )
+        state_elem.get_elements( 'transition' ).each do |transition_elem|
+          state.transitions << DCloud::Transition.new(
+                                 transition_elem.attributes['to'],
+                                 transition_elem.attributes['action']
+                               )
         end
+        states << state
       end
     end
     states
@@ -121,12 +144,10 @@ class DeltaCloud
   def realms(opts={})
     realms = []
     request( entry_points[:realms], :get, opts ) do |response|
-      if ( response.is_a?( Net::HTTPSuccess ) )
-        doc = REXML::Document.new( response.body )
-        doc.get_elements( 'realms/realm' ).each do |realm|
-          uri = realm.attributes['href']
-          realms << DCloud::Realm.new( self, uri, realm )
-        end
+      doc = REXML::Document.new( response.body )
+      doc.get_elements( 'realms/realm' ).each do |realm|
+        uri = realm.attributes['href']
+        realms << DCloud::Realm.new( self, uri, realm )
       end
     end
     realms
@@ -134,12 +155,10 @@ class DeltaCloud
 
   def realm(id)
     request( entry_points[:realms], :get, {:id=>id } ) do |response|
-      if ( response.is_a?( Net::HTTPSuccess ) )
-        doc = REXML::Document.new( response.body )
-        doc.get_elements( 'realms/realm' ).each do |realm|
-          uri = realm.attributes['href']
-          return DCloud::Realm.new( self, uri, realm )
-        end
+      doc = REXML::Document.new( response.body )
+      doc.get_elements( 'realm' ).each do |realm|
+        uri = realm.attributes['href']
+        return DCloud::Realm.new( self, uri, realm )
       end
     end
     nil
@@ -155,12 +174,10 @@ class DeltaCloud
     images = []
     request_path = entry_points[:images]
     request( request_path, :get, opts ) do |response|
-      if ( response.is_a?( Net::HTTPSuccess ) )
-        doc = REXML::Document.new( response.body )
-        doc.get_elements( 'images/image' ).each do |image|
-          uri = image.attributes['href']
-          images << DCloud::Image.new( self, uri, image )
-        end
+      doc = REXML::Document.new( response.body )
+      doc.get_elements( 'images/image' ).each do |image|
+        uri = image.attributes['href']
+        images << DCloud::Image.new( self, uri, image )
       end
     end
     images
@@ -168,32 +185,22 @@ class DeltaCloud
 
   def image(id)
     request( entry_points[:images], :get, {:id=>id } ) do |response|
-      if ( response.is_a?( Net::HTTPSuccess ) )
-        doc = REXML::Document.new( response.body )
-        doc.get_elements( 'images/image' ).each do |instance|
-          uri = instance.attributes['href']
-          return DCloud::Image.new( self, uri, instance )
-        end
+      doc = REXML::Document.new( response.body )
+      doc.get_elements( 'image' ).each do |instance|
+        uri = instance.attributes['href']
+        return DCloud::Image.new( self, uri, instance )
       end
     end
     nil
   end
 
-  def fetch_image(uri)
-    xml = fetch_resource( :image, uri )
-    return DCloud::Image.new( self, uri, xml ) if xml
-    nil
-  end
-
-  def instances()
+  def instances
     instances = []
     request( entry_points[:instances] ) do |response|
-      if ( response.is_a?( Net::HTTPSuccess ) )
-        doc = REXML::Document.new( response.body )
-        doc.get_elements( 'instances/instance' ).each do |instance|
-          uri = instance.attributes['href']
-          instances << DCloud::Instance.new( self, uri, instance )
-        end
+      doc = REXML::Document.new( response.body )
+      doc.get_elements( 'instances/instance' ).each do |instance|
+        uri = instance.attributes['href']
+        instances << DCloud::Instance.new( self, uri, instance )
       end
     end
     instances
@@ -201,12 +208,10 @@ class DeltaCloud
 
   def instance(id)
     request( entry_points[:instances], :get, {:id=>id } ) do |response|
-      if ( response.is_a?( Net::HTTPSuccess ) )
-        doc = REXML::Document.new( response.body )
-        doc.get_elements( 'instances/instance' ).each do |instance|
-          uri = instance.attributes['href']
-          return DCloud::Instance.new( self, uri, instance )
-        end
+      doc = REXML::Document.new( response.body )
+      doc.get_elements( 'instance' ).each do |instance|
+        uri = instance.attributes['href']
+        return DCloud::Instance.new( self, uri, instance )
       end
     end
     nil
@@ -214,9 +219,7 @@ class DeltaCloud
 
   def post_instance(uri)
     request( uri, :post ) do |response|
-      if ( response.is_a?( Net::HTTPSuccess ) )
-        return true
-      end
+      return true
     end
     return false
   end
@@ -239,24 +242,20 @@ class DeltaCloud
 
     params[:image_id] = image_id
     request( entry_points[:instances], :post, {}, params ) do |response|
-      if ( response.is_a?( Net::HTTPSuccess ) )
-        doc = REXML::Document.new( response.body )
-        instance = doc.root
-        uri = instance.attributes['href']
-        return DCloud::Instance.new( self, uri, instance )
-      end
+      doc = REXML::Document.new( response.body )
+      instance = doc.root
+      uri = instance.attributes['href']
+      return DCloud::Instance.new( self, uri, instance )
     end
   end
 
-  def storage_volumes()
+  def storage_volumes
     storage_volumes = []
     request( entry_points[:storage_volumes] ) do |response|
-      if ( response.is_a?( Net::HTTPSuccess ) )
-        doc = REXML::Document.new( response.body )
-        doc.get_elements( 'storage-volumes/storage-volume' ).each do |instance|
-          uri = instance.attributes['href']
-          storage_volumes << DCloud::StorageVolume.new( self, uri, instance )
-        end
+      doc = REXML::Document.new( response.body )
+      doc.get_elements( 'storage-volumes/storage-volume' ).each do |instance|
+        uri = instance.attributes['href']
+        storage_volumes << DCloud::StorageVolume.new( self, uri, instance )
       end
     end
     storage_volumes
@@ -264,12 +263,10 @@ class DeltaCloud
 
   def storage_volume(id)
     request( entry_points[:storage_volumes], :get, {:id=>id } ) do |response|
-      if ( response.is_a?( Net::HTTPSuccess ) )
-        doc = REXML::Document.new( response.body )
-        doc.get_elements( 'storage-volumes/storage-volume' ).each do |storage_volume|
-          uri = storage_volume.attributes['href']
-          return DCloud::StorageVolume.new( self, uri, storage_volume )
-        end
+      doc = REXML::Document.new( response.body )
+      doc.get_elements( 'storage-volume' ).each do |storage_volume|
+        uri = storage_volume.attributes['href']
+        return DCloud::StorageVolume.new( self, uri, storage_volume )
       end
     end
     nil
@@ -284,12 +281,10 @@ class DeltaCloud
   def storage_snapshots()
     storage_snapshots = []
     request( entry_points[:storage_snapshots] ) do |response|
-      if ( response.is_a?( Net::HTTPSuccess ) )
-        doc = REXML::Document.new( response.body )
-        doc.get_elements( 'storage-snapshots/storage-snapshot' ).each do |instance|
-          uri = instance.attributes['href']
-          storage_snapshots << DCloud::StorageSnapshot.new( self, uri, instance )
-        end
+      doc = REXML::Document.new( response.body )
+      doc.get_elements( 'storage-snapshots/storage-snapshot' ).each do |instance|
+        uri = instance.attributes['href']
+        storage_snapshots << DCloud::StorageSnapshot.new( self, uri, instance )
       end
     end
     storage_snapshots
@@ -297,12 +292,10 @@ class DeltaCloud
 
   def storage_snapshot(id)
     request( entry_points[:storage_snapshots], :get, {:id=>id } ) do |response|
-      if ( response.is_a?( Net::HTTPSuccess ) )
-        doc = REXML::Document.new( response.body )
-        doc.get_elements( 'storage-snapshots/storage-snapshot' ).each do |storage_snapshot|
-          uri = storage_snapshot.attributes['href']
-          return DCloud::StorageSnapshot.new( self, uri, storage_snapshot )
-        end
+      doc = REXML::Document.new( response.body )
+      doc.get_elements( 'storage-snapshot' ).each do |storage_snapshot|
+        uri = storage_snapshot.attributes['href']
+        return DCloud::StorageSnapshot.new( self, uri, storage_snapshot )
       end
     end
     nil
@@ -314,61 +307,24 @@ class DeltaCloud
     nil
   end
 
-  ##
-  ##
-  ##
-  ##
-
-  def fetch_resource(type, uri)
-    request( uri ) do |response|
-      if ( response.is_a?( Net::HTTPSuccess ) )
-        doc = REXML::Document.new( response.body )
-        if ( doc.root && ( doc.root.name == type.to_s.gsub( /_/, '-' ) ) )
-          return doc.root
-        end
-      end
-    end
+  def fetch_image(uri)
+    xml = fetch_resource( :image, uri )
+    return DCloud::Image.new( self, uri, xml ) if xml
     nil
   end
 
-  def api_host
-    @api_uri.host
-  end
-
-  def api_port
-    @api_uri.port
-  end
-
-  def api_path
-    @api_uri.path
-  end
-
   private
 
   attr_reader :http
 
-  def build_hash(elem)
-    hash = {}
-    elem.elements.each do |element|
-      key = element.name.gsub( /-/, '_' ).to_sym
-      value = element.text || element.attributes['href']
-      hash[key] = value
-    end
-    hash
-  end
-
-  def discover_entry_points()
-    @entry_points = {}
-    logger << "Discoverying entry points at #{@api_uri}\n"
-    request do |response|
-      if ( response.is_a?( Net::HTTPSuccess ) )
-        doc = REXML::Document.new( response.body )
-        @driver_name = doc.root.attributes['driver']
-        doc.get_elements( 'api/link' ).each do |link|
-          rel = link.attributes['rel']
-          uri = link.attributes['href']
-          @entry_points[rel.to_sym] = uri
-        end
+  def discover_entry_points
+    request(api_uri.to_s) do |response|
+      doc = REXML::Document.new( response.body )
+      @driver_name = doc.root.attributes['driver']
+      doc.get_elements( 'api/link' ).each do |link|
+        rel = link.attributes['rel']
+        uri = link.attributes['href']
+        @entry_points[rel.to_sym] = uri
       end
     end
   end
@@ -377,21 +333,24 @@ class DeltaCloud
     if ( path =~ /^http/ )
       request_path = path
     else
-      request_path = "#{api_path}#{path}"
-    end
-    query_string = query_args.keys.collect{|key| "#{key}=#{query_args[key]}"}.join("&")
-    if ( query_string != '' )
-      request_path += "?#{query_string}"
+      request_path = "#{api_uri.to_s}#{path}"
     end
-
-    logger << "Request [#{method.to_s.upcase} #{request_path}]\n"
-    request = eval( "Net::HTTP::#{method.to_s.capitalize}" ).new( request_path )
-    request.basic_auth( @name, @password )
-    if ( method == :post )
-      request.set_form_data( form_data )
+    if query_args[:id]
+      request_path += "/#{query_args[:id]}"
+      query_args.delete(:id)
+    end
+    query_string = URI.escape(query_args.collect{|k,v| "#{k}=#{v}"}.join('&'))
+    request_path += "?#{query_string}" unless query_string==''
+    headers = {
+      :authorization => "Basic "+Base64.encode64("#{@name}:#{@password}"),
+      :accept => "application/xml"
+    }
+    logger << "Request [#{method.to_s.upcase}] #{request_path}]\n"
+    if method.eql?(:get)
+      RestClient.send(method, request_path, headers, &block)
+    else
+      RestClient.send(method, request_path, form_data, headers, &block)
     end
-    request['Accept'] = 'text/xml'
-    http.request( request, &block )
   end
 
 end

Modified: incubator/deltacloud/trunk/client/specs/spec_helper.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/client/specs/spec_helper.rb?rev=962202&r1=962201&r2=962202&view=diff
==============================================================================
--- incubator/deltacloud/trunk/client/specs/spec_helper.rb (original)
+++ incubator/deltacloud/trunk/client/specs/spec_helper.rb Thu Jul  8 23:36:22 2010
@@ -15,6 +15,7 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
+require 'rubygems'
 require 'yaml'
 require 'fileutils'