/
servers.rb
149 lines (124 loc) · 4 KB
/
servers.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
require 'boucher/compute'
module Boucher
SERVER_TABLE_FORMAT = "%-12s %-12s %-10s %-10s %-10s %-15s %-15s %-10s\n"
def self.print_server_table_header
puts
printf SERVER_TABLE_FORMAT, "ID", "Environment", "Meal", "Creator", "State", "Public IP", "Private IP", "Inst. Size"
puts ("-" * 107)
end
def self.print_server(server)
printf SERVER_TABLE_FORMAT,
server.id,
(server.tags["Env"] || "???")[0...12],
(server.tags["Meal"] || "???")[0...10],
(server.tags["Creator"] || "???")[0...10],
server.state,
server.public_ip_address,
server.private_ip_address,
server.flavor_id
end
def self.print_servers(servers)
print_server_table_header
sorted_servers = servers.sort_by { |s| [s.tags["Env"] || "?",
s.tags["Meal"] || "?"] }
sorted_servers.each do |server|
print_server(server) if server
end
puts
end
module Servers
NotFound = Class.new(StandardError)
class << self
def clear
@instance = nil
end
def instance
reload if !@instance
@instance
end
def reload
@instance = Boucher.compute.servers
@instance.each {} # Wake up you lazy list!
cultivate(@instance)
end
%w{all of_meal in_env in_state search find [] with_id}.each do |m|
module_eval "def #{m}(*args); instance.#{m}(*args); end"
end
def cultivate(thing)
thing.extend(Boucher::Servers) if thing
thing
end
end
def all
self
end
def search(options={})
servers = self
servers = servers.of_meal(options[:meal]) if options[:meal]
servers = servers.in_env(options[:env]) if options[:env]
servers = servers.in_state(options[:state]) if options[:state]
servers
end
def find(options={})
servers = search(options)
first = servers.first
if first.nil?
raise Boucher::Servers::NotFound.new("No server matches criteria: #{options.inspect}")
end
first
end
def in_env(env)
Servers.cultivate(self.find_all { |s| s.tags["Env"] == env.to_s })
end
def in_state(state)
if state[0] == "!"
state = state[1..-1]
Servers.cultivate(self.find_all { |s| s.state != state.to_s })
else
Servers.cultivate(self.find_all { |s| s.state == state.to_s })
end
end
def of_meal(meal)
Servers.cultivate(self.find_all { |s| s.tags["Meal"] == meal.to_s })
end
def self.start(servers)
Boucher.change_servers_state(servers, :start, "running")
end
def self.stop(servers)
Boucher.change_servers_state(servers, :stop, "stopped")
end
def self.restart(servers)
Boucher.change_servers_state(servers, :stop, "stopped")
Boucher.change_servers_state(servers, :start, "running")
end
def self.terminate(servers)
Boucher.change_servers_state(servers, :destroy, "terminated")
end
def with_id(server_id)
Servers.cultivate(self.find_all { |s| s.id == server_id }).first
end
def [](meal)
find(:env => Boucher::Config[:env], :meal => meal, :state => "running")
end
end
def self.change_servers_state(servers, command, new_state)
print "#{command}-ing servers #{servers.map(&:id).join(", ")}..."
servers.each { |s| s.send(command.to_sym) }
servers.each { |s| s.wait_for { print "."; s.state == new_state }}
puts
Boucher.print_servers servers
puts
puts "The servers have been #{command}-ed."
end
def self.resolve_servers(id_or_meal)
if id_or_meal[0..1] == "i-"
puts "Retrieving server with id #{id_or_meal}..."
[Boucher::Servers.with_id(id_or_meal)]
else
puts "Searching for running #{id_or_meal} servers in #{Boucher.env_name} environment..."
servers = Boucher::Servers.search(:meal => id_or_meal, :env => Boucher.env_name, :state => "!terminated")
Boucher::print_servers(servers)
servers
end
end
end