Module: Utils

Included in:
Runner
Defined in:
lib/utils.rb

Constant Summary collapse

INSTANCE_MAPPINGS_FILENAME =
File.expand_path("~/.ec2/instance_mappings.yml")

Instance Method Summary collapse

Instance Method Details

#console_output(instance) ⇒ Object



78
79
80
# File 'lib/utils.rb', line 78

def console_output instance
  exec "ec2-get-console-output #{instance.instance_id}"
end

#delete_instance_from_datastore(name) ⇒ Object



126
127
128
129
130
# File 'lib/utils.rb', line 126

def delete_instance_from_datastore(name)
  instances = load_instances_from_datastore
  instances.delete(name)
  write_instances_to_datastore(instances)
end

#get_instance(name) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/utils.rb', line 33

def get_instance(name)
  instance_id = if name =~ /^i-\w{8}$/
                  name
                else
                  load_instances_from_datastore[name]
                end
  `ec2-describe-instances #{instance_id}`.split("\n").select{ |l| l =~ /^INSTANCE/ }.inject([]) do |result, line|
    instance = parse_aws_status_line_into_instance(line, name)

    if instance.status != 'terminated'
      instance.name = name
      result << instance
    else
      result
    end
  end.compact.first
end

#get_instancesObject



51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/utils.rb', line 51

def get_instances
  instance_mappings = load_instances_from_datastore
  `ec2-describe-instances`.split("\n").select{|l| l =~ /^INSTANCE/}.inject([]) do |result, line|
    instance = parse_aws_status_line_into_instance(line)

    if instance.status != "terminated"
      instance.name = instance_mappings.find_name_by_instance_id(instance.instance_id)
      result << instance
    else
      result
    end
  end
end

#get_name_for_instanceObject



24
25
26
# File 'lib/utils.rb', line 24

def get_name_for_instance
  Forgery::Dictionaries.new[:company_names].random.downcase
end

#load_instances_from_datastoreObject



113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/utils.rb', line 113

def load_instances_from_datastore
  data = File.read(INSTANCE_MAPPINGS_FILENAME)
  instances = YAML.load(data)

  class << instances
    def find_name_by_instance_id(instance_id)
      select { |k,v| v == instance_id }[0]
    end
  end

  instances
end

#parse_aws_status_line_into_instance(line, name = nil) ⇒ Object



28
29
30
31
# File 'lib/utils.rb', line 28

def parse_aws_status_line_into_instance line, name=nil
  columns = line.split("\t")
  instance = Instance.new line, columns[1], columns[2], columns[5], columns[3], name
end

#run_instance(options = {}) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/utils.rb', line 10

def run_instance(options={})
  instance_size = options.delete(:instance_size)
  image_id = options.delete(:ami_id)
  name = options.delete(:name)
  zone = options.delete(:zone)
  user_data_file = options.delete(:user_data_file)
  instance_options = "-t #{instance_size}"
  instance_options += " -f #{user_data_file}" if user_data_file
  instance_options += " -z #{zone}" if zone
  instance = parse_aws_status_line_into_instance `ec2-run-instances #{image_id} -k #{EC2_SSH_KEY_NAME} #{instance_options}`.split("\n")[-1], name
  write_instance_to_datastore(instance)
  instance
end

#scp_up(instance, source, destination) ⇒ Object



74
75
76
# File 'lib/utils.rb', line 74

def scp_up instance, source, destination
  exec "scp -i #{EC2_SSH_KEY_PATH} #{source} root@#{instance.url}:#{destination}"
end

#spindown(name) ⇒ Object



132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/utils.rb', line 132

def spindown name
  puts "Spinning down #{name}"
  instance = get_instance(name)
  raise "Unknown instance name #{name}" unless instance

  terminate_instances instance

  while instance
    puts "waiting...#{instance.line}"
    sleep 2
    instance = get_instance(name)
  end

  delete_instance_from_datastore(name)

  puts "Terminated #{name}"
end

#spinup(options = {}) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/utils.rb', line 82

def spinup(options={})
  puts "Spinning up image"
  name = options[:name]
  current_instance = instance = run_instance(options)
  puts "Instance #{instance.instance_id} spinning up"

  still_loading = true
  while still_loading
    puts "waiting...#{current_instance.line}"
    sleep 2
    current_instance = get_instance(name)
    still_loading = current_instance.status == "pending"
  end

  puts "Instance running!"
  puts "name: #{current_instance.name}, id: #{current_instance.instance_id}, url: #{current_instance.url}"
end

#ssh(url, options = {}) ⇒ Object



69
70
71
72
# File 'lib/utils.rb', line 69

def ssh(url, options={})
  puts url
  exec "ssh -i #{options[:keypair_path]} #{options[:user]}@#{url}"
end

#terminate_instances(*instances) ⇒ Object



65
66
67
# File 'lib/utils.rb', line 65

def terminate_instances *instances
  `ec2-terminate-instances #{instances.map{|i| i.instance_id}.join(' ')}`
end

#write_instance_to_datastore(instance) ⇒ Object



101
102
103
104
105
# File 'lib/utils.rb', line 101

def write_instance_to_datastore(instance)
  instances = load_instances_from_datastore || {}
  instances.merge!({instance.name => instance.instance_id})
  write_instances_to_datastore(instances)
end

#write_instances_to_datastore(instances) ⇒ Object



107
108
109
110
111
# File 'lib/utils.rb', line 107

def write_instances_to_datastore(instances)
  File.open(INSTANCE_MAPPINGS_FILENAME, "w+") do |f|
    f << instances.to_yaml
  end
end