You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@deltacloud.apache.org by mf...@redhat.com on 2010/11/29 16:25:32 UTC

[PATCH core] Added names for EC2 instances

From: Michal Fojtik <mf...@redhat.com>

---
 server/lib/deltacloud/drivers/ec2/ec2_driver.rb |   43 +++++++++++++++++++++++
 1 files changed, 43 insertions(+), 0 deletions(-)

diff --git a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
index 59206d7..e2a6087 100644
--- a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
+++ b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
@@ -160,6 +160,16 @@ module Deltacloud
             inst_arr = ec2.describe_instances.collect do |instance| 
               convert_instance(instance) if instance
             end.flatten
+            tags = ec2.describe_tags(
+              'Filter.1.Name' => 'resource-type', 'Filter.1.Value' => 'instance'
+            )
+            inst_arr.each do |inst|
+              name_tag = tags.select { |t| (t[:aws_resource_id] == inst.id) and t[:aws_key] == 'name' }
+              unless name_tag.empty?
+                inst.name = name_tag.first[:aws_value]
+              end
+            end
+            delete_unused_tags(credentials, inst_arr.collect {|inst| inst.id})
           end
           inst_arr = filter_on( inst_arr, :id, opts )
           filter_on( inst_arr, :state, opts )
@@ -178,6 +188,9 @@ module Deltacloud
             if opts[:public_ip]
               ec2.associate_address(new_instance.id, opts[:public_ip])
             end
+            if opts[:name]
+              tag_instance(credentials, new_instance, opts[:name])
+            end
             new_instance
           end
         end
@@ -194,7 +207,9 @@ module Deltacloud
         def destroy_instance(credentials, instance_id)
           ec2 = new_client(credentials)
           puts "Terminating instance #{instance_id}"
+          instance_id = instance_id
           if ec2.terminate_instances([instance_id])
+            untag_instance(credentials, instance_id)
             instance(credentials, instance_id)
           else
             raise Deltacloud::BackendError.new(500, "Instance", "Instance cannot be terminated", "")
@@ -401,6 +416,34 @@ module Deltacloud
             when :s3 then Aws::S3.new(credentials.user, credentials.password)
           end
         end
+
+        def tag_instance(credentials, instance, name)
+          ec2 = new_client(credentials)
+          safely do
+            ec2.create_tag(instance.id, 'name', name)
+          end
+        end
+
+        def untag_instance(credentials, instance_id)
+          ec2 = new_client(credentials)
+          safely do
+            ec2.delete_tag(instance_id, 'name')
+          end
+        end
+
+        def delete_unused_tags(credentials, inst_ids)
+          ec2 = new_client(credentials)
+          tags = []
+          safely do
+            tags = ec2.describe_tags('Filter.1.Name' => 'resource-type', 'Filter.1.Value' => 'instance')
+            tags.collect! { |t| t[:aws_resource_id] }
+            inst_ids.each do |inst_id|
+              unless tags.include?(inst_id)
+                ec2.delete_tag(inst_id, 'name')
+              end
+            end
+          end
+        end
         
         def convert_bucket(s3_bucket)
           #get blob list:
-- 
1.7.3.2