module Awsam::Ec2

Constants

LOOKUP_TAGS

Public Class Methods

find(ec2, instance_id) click to toggle source
# File lib/awsam/ec2.rb, line 24
def self.find(ec2, instance_id)
  if instance_id =~ /^i-[0-9a-f]{8,17}$/
    find_by_instance_id(ec2, instance_id)
  else
    find_by_tag(ec2, instance_id)
  end
end
find_by_instance_id(ec2, instance_id) click to toggle source
# File lib/awsam/ec2.rb, line 32
def self.find_by_instance_id(ec2, instance_id)
  begin
    resp = ec2.describe_instances(:instance_ids => [instance_id])
    resp.reservations.length > 0 ? resp.reservations[0].instances.first : nil
  rescue => e
    puts "error describing instance: #{instance_id}: #{e}"
    exit 1
  end
end
find_by_tag(ec2, instance_id) click to toggle source
# File lib/awsam/ec2.rb, line 42
def self.find_by_tag(ec2, instance_id)
  results = []

  params = {
    :filters => [{
                   :name => "resource-type",
                   :values => ["instance"]
                 }]
  }
  resp = ec2.describe_tags(params)
  resp.tags.each do |tag|
    if LOOKUP_TAGS.include?(tag.key) &&
        tag.value.downcase.include?(instance_id.downcase)
      results << tag
    end
  end

  if !results || results.length == 0
    puts "No tags by this name are available in your account"
    exit 1
  end

  results.uniq! { |a| a.resource_id }
  results.sort! { |a,b| a.value <=> b.value }

  rmap = {}
  params = {
    :instance_ids => results.map{|a| a.resource_id},
    :filters => [{
                   :name => "instance-state-name",
                   :values => ["running"]
                 }]
  }
  resp = ec2.describe_instances(params)
  resp.reservations.each do |resv|
    resv.instances.each do |inst|
      rmap[inst.instance_id] = inst
    end
  end

  results.reject! { |a| rmap[a.resource_id].nil? }

  if results.length == 0
    puts "No running instances by that tag name are available"
    exit 1
  end

  if $opts[:first_node] || results.length == 1
    node = results.first
  else
    puts "Please select which node you wish to use:"
    puts

    namemax = 0
    instmax = 0
    ipmax = 0
    results.each_with_index do |elem, i|
      inst = rmap[elem.resource_id]
      if elem.value.length > namemax
        namemax = elem.value.length
      end
      if inst.instance_id.length > instmax
        instmax = inst.instance_id.length
      end
      if inst.private_ip_address.length > ipmax
        ipmax = inst.private_ip_address.length
      end
    end

    countmax = results.size.to_s.length
    results.each_with_index do |elem, i|
      inst = rmap[elem.resource_id]

      launchtime = inst.launch_time
      puts "%*d) %-*s (%*s %-*s %-11s %s %s)" %
        [countmax, i + 1,
         namemax, elem.value,
         instmax, inst.instance_id,
         ipmax, inst.private_ip_address,
         inst.instance_type,
         inst.placement.availability_zone,
         launchtime.strftime("%Y-%m-%d")]
    end
    puts "%*s) Quit" % [countmax, "q"]
    puts

    print "> "
    input = $stdin.gets
    puts
    exit unless input =~ /^\d+$/
    sel = input.to_i
    exit unless sel > 0 && sel <= results.size

    node = results[sel - 1]
  end

  return rmap[node.resource_id]
end
find_instance(acct, instance_id) click to toggle source
# File lib/awsam/ec2.rb, line 11
def self.find_instance(acct, instance_id)
  ec2 = Aws::EC2::Client.new(:access_key_id => acct.access_key,
                             :secret_access_key => acct.secret_key,
                             :region => acct.aws_region)

  unless ec2
    puts "Unable to connect to EC2"
    return nil
  end

  find(ec2, instance_id)
end
instance_hostname(inst) click to toggle source
# File lib/awsam/ec2.rb, line 6
def self.instance_hostname(inst)
  # Always use private IP address
  inst.private_ip_address
end