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

svn commit: r962300 - /incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb

Author: lutter
Date: Thu Jul  8 23:44:36 2010
New Revision: 962300

URL: http://svn.apache.org/viewvc?rev=962300&view=rev
Log:
Replaced RightAWS with amazon-ec2

Modified:
    incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb

Modified: incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb?rev=962300&r1=962299&r2=962300&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb (original)
+++ incubator/deltacloud/trunk/server/lib/deltacloud/drivers/ec2/ec2_driver.rb Thu Jul  8 23:44:36 2010
@@ -17,7 +17,7 @@
 
 
 require 'deltacloud/base_driver'
-require 'right_aws'
+require 'AWS'
 
 module Deltacloud
   module Drivers
@@ -91,35 +91,19 @@ class EC2Driver < Deltacloud::BaseDriver
   # Images
   #
 
-  def images(credentials, opts=nil )
-    puts(opts)
-    ec2 = new_client( credentials )
-    images = []
+  def images(credentials, opts={} )
+    ec2 = new_client(credentials)
+    img_arr = []
+    config = { :owner_id => "amazon" }
+    config.merge!({ :owner_id => opts[:owner_id] }) if opts and opts[:owner_id]
+    config.merge!({ :image_id => opts[:id] }) if opts and opts[:id]
     safely do
-      if ( opts && opts[:id] )
-        ec2.describe_images(opts[:id]).each do |ec2_image|
-          if ( ec2_image[:aws_id] =~ /^ami-/ )
-            images << convert_image( ec2_image )
-          end
-        end
-        filter_on( images, :owner_id, opts )
-      elsif ( opts && opts[:owner_id] )
-        ec2.describe_images_by_owner( opts[:owner_id] ).each do |ec2_image|
-          if ( ec2_image[:aws_id] =~ /^ami-/ )
-            images << convert_image( ec2_image )
-          end
-        end
-      else
-        ec2.describe_images().each do |ec2_image|
-          if ( ec2_image[:aws_id] =~ /^ami-/ )
-            images << convert_image( ec2_image )
-          end
-        end
+      ec2.describe_images(config).imagesSet.item.each do |image|
+        img_arr << convert_image(image)
       end
     end
-
-    images = filter_on( images, :architecture, opts )
-    images.sort_by{|e| [e.owner_id,e.description]}
+    img_arr = filter_on( img_arr, :architecture, opts )
+    img_arr.sort_by{|e| [e.owner_id, e.name]}
   end
 
   #
@@ -130,7 +114,7 @@ class EC2Driver < Deltacloud::BaseDriver
     ec2 = new_client(credentials)
     realms = []
     safely do
-      ec2.describe_availability_zones.each do |ec2_realm|
+      ec2.describe_availability_zones.availabilityZoneInfo.item.each do |ec2_realm|
         realms << convert_realm( ec2_realm )
       end
     end
@@ -140,14 +124,17 @@ class EC2Driver < Deltacloud::BaseDriver
   #
   # Instances
   #
-
   def instances(credentials, opts=nil)
     ec2 = new_client(credentials)
     instances = []
     safely do
       param = opts.nil? ? nil : opts[:id]
-      ec2.describe_instances( param ).each do |ec2_instance|
-        instances << convert_instance( ec2_instance )
+      ec2_instances = ec2.describe_instances.reservationSet
+      return [] unless ec2_instances
+      ec2_instances.item.each do |item|
+        item.instancesSet.item.each do |ec2_instance|
+          instances << convert_instance( ec2_instance, item.ownerId )
+        end
       end
     end
     instances = filter_on( instances, :id, opts )
@@ -155,42 +142,43 @@ class EC2Driver < Deltacloud::BaseDriver
     instances
   end
 
+
   def create_instance(credentials, image_id, opts)
     ec2 = new_client( credentials )
     realm_id = opts[:realm_id]
-    hwp = find_hardware_profile(credentials, opts[:hwp_id], image_id)
+    image = image(credentials, :id => image_id )
+    hwp = find_hardware_profile(credentials, opts[:hwp_id], image.id)
     ec2_instances = ec2.run_instances(
-                          image_id,
-                          1,1,
-                          [],
-                          nil,
-                          opts[:user_data],
-                          'public',
-                          hwp.name.gsub(/-/, '.'),
-                          nil,
-                          nil,
-                          realm_id )
-    convert_instance( ec2_instances.first )
+      :image_id => image.id,
+      :user_data => opts[:user_data],
+      :key_name => opts[:key_name],
+      :availability_zone => realm_id,
+      :monitoring_enabled => true,
+      :instance_type => hwp.name.tr('-', '.'),
+      :disable_api_termination => false,
+      :instance_initiated_shutdown_behavior => 'terminate'
+    )
+    convert_instance( ec2_instances.instancesSet.item.first, 'pending' )
   end
 
   def reboot_instance(credentials, id)
     ec2 = new_client(credentials)
     safely do
-      ec2.reboot_instances( id )
+      ec2.reboot_instances( :instance_id => id )
     end
   end
 
   def stop_instance(credentials, id)
     ec2 = new_client(credentials)
     safely do
-      ec2.terminate_instances( id )
+      ec2.terminate_instances( :instance_id => id )
     end
   end
 
   def destroy_instance(credentials, id)
     ec2 = new_client(credentials)
     safely do
-      ec2.terminate_instances( id )
+      ec2.terminate_instances( :instance_id => id )
     end
   end
 
@@ -203,11 +191,13 @@ class EC2Driver < Deltacloud::BaseDriver
     volumes = []
     safely do
       if (opts)
-        ec2.describe_volumes(opts[:id]).each do |ec2_volume|
+        ec2.describe_volumes(:volume_id => opts[:id]).volumeSet.item.each do |ec2_volume|
           volumes << convert_volume( ec2_volume )
         end
       else
-        ec2.describe_volumes().each do |ec2_volume|
+        ec2_volumes = ec2.describe_volumes.volumeSet
+        return [] unless ec2_volumes
+        ec2_volumes.item.each do |ec2_volume|
           volumes << convert_volume( ec2_volume )
         end
       end
@@ -224,11 +214,13 @@ class EC2Driver < Deltacloud::BaseDriver
     snapshots = []
     safely do
       if (opts)
-        ec2.describe_snapshots(opts[:id]).each do |ec2_snapshot|
+        ec2.describe_snapshots(:owner => 'self', :snapshot_id => opts[:id]).snapshotSet.item.each do |ec2_snapshot|
           snapshots << convert_snapshot( ec2_snapshot )
         end
       else
-        ec2.describe_snapshots(opts).each do |ec2_snapshot|
+        ec2_snapshots = ec2.describe_snapshots(:owner => 'self').snapshotSet
+        return [] unless ec2_snapshots
+        ec2_snapshots.item.each do |ec2_snapshot|
           snapshots << convert_snapshot( ec2_snapshot )
         end
       end
@@ -239,84 +231,79 @@ class EC2Driver < Deltacloud::BaseDriver
   private
 
   def new_client(credentials)
-    RightAws::Ec2.new(credentials.user, credentials.password, :cache=>false )
+    AWS::EC2::Base.new(
+      :access_key_id => credentials.user,
+      :secret_access_key => credentials.password
+    )
   end
 
   def convert_image(ec2_image)
     Image.new( {
-      :id=>ec2_image[:aws_id],
-      :name=>ec2_image[:aws_location],
-      :description=>ec2_image[:aws_location],
-      :owner_id=>ec2_image[:aws_owner],
-      :architecture=>ec2_image[:aws_architecture],
+      :id=>ec2_image['imageId'],
+      :name=>ec2_image['name'] || ec2_image['imageId'],
+      :description=>ec2_image['description'] || ec2_image['imageLocation'] || '',
+      :owner_id=>ec2_image['imageOwnerId'],
+      :architecture=>ec2_image['architecture'],
     } )
   end
 
   def convert_realm(ec2_realm)
     Realm.new( {
-      :id=>ec2_realm[:zone_name],
-      :name=>ec2_realm[:zone_name],
-      :limit=>:unlimited,
-      :state=>ec2_realm[:zone_state].upcase,
+      :id=>ec2_realm['zoneName'],
+      :name=>ec2_realm['regionName'],
+      :limit=>ec2_realm['zoneState'].eql?('available') ? :unlimited : 0,
+      :state=>ec2_realm['zoneState'].upcase,
     } )
   end
 
-  def convert_instance(ec2_instance)
-    state = ec2_instance[:aws_state].upcase
+  def convert_instance(ec2_instance, owner_id)
+    state = ec2_instance['instanceState']['name'].upcase
     state_key = state.downcase.underscore.to_sym
-
-    realm_id = ec2_instance[:aws_availability_zone]
+    realm_id = ec2_instance['placement']['availabilityZone']
     (realm_id = nil ) if ( realm_id == '' )
-
-    hwp_name = ec2_instance[:aws_instance_type].gsub( /\./, '-')
-
+    hwp_name = ec2_instance['instanceType'].gsub( /\./, '-')
     Instance.new( {
-      :id=>ec2_instance[:aws_instance_id],
-      :name => ec2_instance[:aws_image_id],
-      :state=>ec2_instance[:aws_state].upcase,
-      :image_id=>ec2_instance[:aws_image_id],
-      :owner_id=>ec2_instance[:aws_owner],
+      :id=>ec2_instance['instanceId'],
+      :name => ec2_instance['imageId'],
+      :state=>state,
+      :image_id=>ec2_instance['imageId'],
+      :owner_id=>owner_id,
       :realm_id=>realm_id,
-      :public_addresses=>( ec2_instance[:dns_name] == '' ? [] : [ec2_instance[:dns_name]] ),
-      :private_addresses=>( ec2_instance[:private_dns_name] == '' ? [] : [ec2_instance[:private_dns_name]] ),
-      :instance_profile => InstanceProfile.new(hwp_name),
-      :actions=>instance_actions_for( ec2_instance[:aws_state].upcase ),
+      :public_addresses=>( ec2_instance['dnsName'] == '' ? [] : [ec2_instance['dnsName']] ),
+      :private_addresses=>( ec2_instance['privateDnsName'] == '' ? [] : [ec2_instance['privateDnsName']] ),
+      :flavor_id=>ec2_instance['instanceType'].gsub( /\./, '-'),
+      :instance_profile =>InstanceProfile.new(hwp_name),
+      :actions=>instance_actions_for( state ),
     } )
   end
 
   def convert_volume(ec2_volume)
     StorageVolume.new( {
-      :id=>ec2_volume[:aws_id],
-      :created=>ec2_volume[:aws_created_at],
-      :state=>ec2_volume[:aws_status].upcase,
-      :capacity=>ec2_volume[:aws_size],
-      :instance_id=>ec2_volume[:aws_instance_id],
-      :device=>ec2_volume[:aws_device],
+      :id=>ec2_volume['volumeId'],
+      :created=>ec2_volume['createTime'],
+      :state=>ec2_volume['status'].upcase,
+      :capacity=>ec2_volume['size'],
+      :instance_id=>ec2_volume['snapshotId'],
+      :device=>ec2_volume['attachmentSet'],
     } )
   end
 
   def convert_snapshot(ec2_snapshot)
     StorageSnapshot.new( {
-      :id=>ec2_snapshot[:aws_id],
-      :state=>ec2_snapshot[:aws_status].upcase,
-      :storage_volume_id=>ec2_snapshot[:aws_volume_id],
-      :created=>ec2_snapshot[:aws_started_at],
+      :id=>ec2_snapshot['snapshotId'],
+      :state=>ec2_snapshot['status'].upcase,
+      :storage_volume_id=>ec2_snapshot['volumeId'],
+      :created=>ec2_snapshot['startTime'],
     } )
   end
 
   def safely(&block)
     begin
       block.call
-    rescue RightAws::AwsError => e
-      if ( e.include?( /SignatureDoesNotMatch/ ) )
+    rescue AWS::AuthFailure => e
         raise Deltacloud::AuthException.new
-      elsif ( e.include?( /InvalidClientTokenId/ ) )
-        raise Deltacloud::AuthException.new
-      else
-        e.errors.each do |error|
-          puts "ERROR #{error.inspect}"
-        end
-      end
+    rescue Exception => e
+        puts "ERROR: #{e.message}"
     end
   end