killbill-memoizeit

Add test launcher script for ec2

12/17/2012 6:12:09 PM

Changes

bin/ec2-launcher.rb 147(+147 -0)

Details

bin/ec2-launcher.rb 147(+147 -0)

diff --git a/bin/ec2-launcher.rb b/bin/ec2-launcher.rb
new file mode 100755
index 0000000..eeb4d60
--- /dev/null
+++ b/bin/ec2-launcher.rb
@@ -0,0 +1,147 @@
+#! /usr/bin/env ruby
+
+require 'aws-sdk'
+require 'net/scp'
+require 'net/ssh'
+
+SHH_PRIVATE_KEY = ""
+
+AMI="ami-3d4ff254"
+SECURITY_GROUPS = ""
+INSTANCE_TYPE = "t1.micro"
+AVAILABILITY_ZONE = "us-east-1d"
+KEY_NAME = ""
+
+
+class SimpleEC2 
+  
+  attr_reader :aws_ec2, :ami, :instance_type, :zone, :key_name, :security_groups
+  
+  def initialize(access_key, secret_key, ami, instance_type, zone, key_name, security_groups)
+    @aws_ec2 =  AWS::EC2.new({:access_key_id => access_key,
+                  :secret_access_key => secret_key })  
+    @ami = ami
+    @instance_type = instance_type
+    @zone = zone
+    @key_name = key_name   
+    @security_groups = security_groups     
+  end
+  
+  def create_instance(wait_for_completion)
+    result = @aws_ec2.instances.create(:image_id => @ami,
+                         :security_groups => @security_groups,
+                         :instance_type => @instance_type,
+                         :placement => { :availability_zone => @zone},
+                         :key_name => @key_name)
+     add_tags(result.id, [{:key => 'role',
+                          :value => 'ri-test'}])
+     wait_for_instance(result.id, :running) if wait_for_completion
+     result.id
+  end
+
+  def terminate_all_running_instances(wait_for_completion)
+    
+    instances = running_instances
+    return if instances.length == 0
+    terminate_instances(instances.map do |i|
+      i[:id]
+    end, wait_for_completion)
+  end
+  
+  def show_running_instances
+    instances = running_instances
+    return if instances.length == 0
+    instances.each do |r|
+      puts "instance = #{r.inspect}"
+    end
+  end
+
+  def stop_instances(instances_id, force, wait_for_completion)
+    result = @aws_ec2.client.stop_instances({:instance_ids => instances_id},
+                               :force => force)
+    result.instances_set.each do |r|
+      wait_for_instance(r.id, :stopped) if wait_for_completion
+      puts "Instance #{r.instance_id} is now #{r.current_state.name}"                        
+    end                           
+  end
+
+  def terminate_instances(instances_id, wait_for_completion)
+    
+    result = @aws_ec2.client.terminate_instances({:instance_ids => instances_id})
+    result.instances_set.each do |r|
+      wait_for_instance(r.instance_id, :terminated) if wait_for_completion
+      puts "Instance #{r.instance_id} is now #{r.current_state.name}"                        
+    end                           
+  end
+
+  def upload_file_to_running_instances(src, dest)
+    running_instances.each do |i|
+      upload_file(i[:dns], src, dest)
+    end
+  end
+
+  def upload_file(dns_name, src, dest)
+    puts "Uploading file #{src} to #{dns_name}:#{dest}"
+    Net::SCP.start(dns_name, "ubuntu", :keys => [SHH_PRIVATE_KEY] ) do |scp|
+       scp.upload! src, dest
+    end
+  end
+  
+  def run_remote_script(dns_name, script)
+    puts "Starting script #{script} on #{dns_name}"
+    Net::SSH.start(dns_name, "ubuntu", :keys => [SHH_PRIVATE_KEY] ) do |ssh|
+      result = ssh.exec!(script)
+      puts "result = #{result}"
+    end
+  end
+  
+  private
+  
+  def wait_for_instance(instance_id, state)
+    puts "wait_for_instance #{instance_id} => state = #{state}"
+    has_completed = false
+    begin
+      instance = @aws_ec2.instances[instance_id]
+      if instance.nil?
+        puts "Null instance"
+        return
+      end
+
+      current_status = instance.status
+      has_completed = case state
+        when :terminated then instance.nil? || current_status == state
+        else current_status == state
+      end
+      puts "Waiting for instance = #{instance_id} #{current_status} -> #{state} " if !has_completed
+      sleep(1.0)
+    end while !has_completed
+  end
+  
+  def running_instances
+    instances = @aws_ec2.instances
+    running_instances = []
+    instances.each do |i|
+      running_instances.push(i) if i.status == :running
+    end
+
+    running_instances.map do |r| 
+       {:id => r.id,
+        :dns => r.dns_name,
+        :status => r.status,
+        :zone => r.availability_zone,
+        :key_pair => r.key_pair.name,
+        :image => r.image.id,
+        :security_groups => r.security_groups.to_ary.map do |sr|
+          sr.name
+        end.join(",")}
+     end
+  end
+  
+  def add_tags(instance_id, tags)
+    @aws_ec2.client.create_tags(:resources => [instance_id],
+                           :tags => tags)
+  end
+  
+end
+
+