judo 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/bin/judo +11 -6
- data/lib/judo.rb +1 -0
- data/lib/judo/base.rb +84 -20
- data/lib/judo/commandline_helpers.rb +5 -3
- data/lib/judo/group.rb +4 -8
- data/lib/judo/server.rb +58 -26
- data/lib/judo/snapshot.rb +23 -22
- metadata +3 -3
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.3.
|
|
1
|
+
0.3.2
|
data/bin/judo
CHANGED
|
@@ -35,7 +35,7 @@ Usage: judo launch [options] SERVER ...
|
|
|
35
35
|
judo animate [options] SNAPSHOT SERVER ## create a new server from a snapshot
|
|
36
36
|
judo erase [options] SNAPSHOT ## erase an old snapshot
|
|
37
37
|
|
|
38
|
-
judo
|
|
38
|
+
judo swap [options] SERVER SERVER ## swap elastic IP's and names on the two servers
|
|
39
39
|
|
|
40
40
|
judo info [options] [SERVER ...]
|
|
41
41
|
judo console [options] [SERVER ...] ## shows AWS console output
|
|
@@ -124,13 +124,18 @@ begin
|
|
|
124
124
|
when "start" then find_servers(judo, ARGV) { |s| s.start(options) }
|
|
125
125
|
when "restart" then find_servers(judo, ARGV) { |s| s.restart(options) }
|
|
126
126
|
when "stop" then find_servers(judo, ARGV) { |s| s.stop(options) }
|
|
127
|
-
when "create" then mk_servers(judo, ARGV)
|
|
128
|
-
when "launch" then mk_servers(judo, ARGV) { |s| s.
|
|
127
|
+
when "create" then mk_servers(judo, options, ARGV)
|
|
128
|
+
when "launch" then mk_servers(judo, options, ARGV) { |s| s.start(options) }
|
|
129
129
|
when "snapshots" then do_snapshots(judo, ARGV)
|
|
130
|
-
when "
|
|
130
|
+
when "rename" then
|
|
131
|
+
raise JudoError, "usage: judo rename SERVER SERVER" unless ARGV.size == 2
|
|
132
|
+
old,new = ARGV
|
|
133
|
+
server = find_servers(judo, [old]).first
|
|
134
|
+
server.rename(new)
|
|
135
|
+
when "swap" then
|
|
131
136
|
servers = find_servers(judo, ARGV)
|
|
132
137
|
raise JudoError, "usage: judo swapip SERVER SERVER" unless servers.size == 2
|
|
133
|
-
servers[0].
|
|
138
|
+
servers[0].swap(servers[1])
|
|
134
139
|
when "erase" then
|
|
135
140
|
raise JudoError, "usage: judo erase SNAPSHOT" unless ARGV.size == 1
|
|
136
141
|
snapshot_name = ARGV.shift
|
|
@@ -150,7 +155,7 @@ begin
|
|
|
150
155
|
raise JudoError, "You must specify a new server name" unless new_server
|
|
151
156
|
snapshot = judo.snapshots.detect { |s| s.name == snapshot_name }
|
|
152
157
|
raise JudoError, "No such snapshot #{snapshot_name}" unless snapshot
|
|
153
|
-
snapshot.animate(new_server
|
|
158
|
+
snapshot.animate(new_server).start(options)
|
|
154
159
|
when "destroy" then
|
|
155
160
|
raise JudoError, "You must specify what servers to destroy" if ARGV.empty?
|
|
156
161
|
find_either(judo, ARGV) do |i|
|
data/lib/judo.rb
CHANGED
data/lib/judo/base.rb
CHANGED
|
@@ -152,12 +152,22 @@ module Judo
|
|
|
152
152
|
end
|
|
153
153
|
|
|
154
154
|
def servers
|
|
155
|
-
@servers ||= servers_state.map { |
|
|
155
|
+
@servers ||= servers_state.map { |id,data| Judo::Server.new(self, id, data["group"].first) }
|
|
156
156
|
end
|
|
157
157
|
|
|
158
|
-
def
|
|
159
|
-
|
|
158
|
+
def new_server_id
|
|
159
|
+
rand(2**32).to_s(36)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def mk_server_name(group)
|
|
163
|
+
index = servers.map { |s| (s.name =~ /^#{s.group.name}.(\d*)$/); $1.to_i }.sort.last.to_i + 1
|
|
164
|
+
"#{group.name}.#{index}"
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def create_server(name, group, options)
|
|
168
|
+
s = Judo::Server.new(self, new_server_id, group)
|
|
160
169
|
servers << s
|
|
170
|
+
s.create(name, options)
|
|
161
171
|
s
|
|
162
172
|
end
|
|
163
173
|
|
|
@@ -217,6 +227,19 @@ module Judo
|
|
|
217
227
|
@group_version ||= sdb.get_attributes(base_domain, "group_versions")[:attributes]
|
|
218
228
|
end
|
|
219
229
|
|
|
230
|
+
def set_keypair(key_name, material)
|
|
231
|
+
s3_put("#{key_name}.pem", material)
|
|
232
|
+
update "key_name" => key_name
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
def key_name
|
|
236
|
+
get("key_name")
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def key_material
|
|
240
|
+
s3_get("#{key_name}.pem")
|
|
241
|
+
end
|
|
242
|
+
|
|
220
243
|
def ip_to_judo(ip)
|
|
221
244
|
servers.detect { |s| s.elastic_ip == ip }
|
|
222
245
|
end
|
|
@@ -267,8 +290,14 @@ module Judo
|
|
|
267
290
|
@access_secret || (raise JudoError, "no AWS Secret Key specified")
|
|
268
291
|
end
|
|
269
292
|
|
|
293
|
+
## this is a little funny - does not work like the others - can specify bucket on cmdline or env - but if not takes from judo state
|
|
270
294
|
def bucket_name
|
|
271
|
-
@bucket_name || (raise JudoError, "no S3 bucket name specified")
|
|
295
|
+
(@bucket_name ||= get("bucket")) || (raise JudoError, "no S3 bucket name specified")
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
def set_bucket_name(new_name)
|
|
299
|
+
@bucket_name = new_name
|
|
300
|
+
update "bucket" => @bucket_name
|
|
272
301
|
end
|
|
273
302
|
|
|
274
303
|
def db_version
|
|
@@ -295,12 +324,25 @@ module Judo
|
|
|
295
324
|
end
|
|
296
325
|
|
|
297
326
|
def set_db_version(new_version)
|
|
298
|
-
|
|
299
|
-
sdb.put_attributes(base_domain, "judo", { "dbversion" => new_version }, :replace)
|
|
327
|
+
update "dbversion" => new_version
|
|
300
328
|
end
|
|
301
329
|
|
|
302
330
|
def get_db_version
|
|
303
|
-
|
|
331
|
+
get("dbversion").to_i
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
def get(key)
|
|
335
|
+
state[key] && [state[key]].flatten.first
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
## i'm copy pasting code from server - this needs to be its own module
|
|
339
|
+
def update(attrs)
|
|
340
|
+
sdb.put_attributes(base_domain, "judo", attrs, :replace)
|
|
341
|
+
state.merge! attrs
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
def state
|
|
345
|
+
@state ||= sdb.get_attributes(base_domain, "judo")[:attributes]
|
|
304
346
|
end
|
|
305
347
|
|
|
306
348
|
def check_version
|
|
@@ -311,15 +353,14 @@ module Judo
|
|
|
311
353
|
end
|
|
312
354
|
|
|
313
355
|
def setup
|
|
314
|
-
## no need to setup bucket
|
|
315
|
-
|
|
316
356
|
@repo ||= "." ## use cwd as default repo dir
|
|
317
357
|
|
|
318
358
|
setup_sdb
|
|
359
|
+
setup_keypair
|
|
360
|
+
setup_bucket
|
|
319
361
|
setup_security_group
|
|
320
362
|
setup_judo_config
|
|
321
363
|
setup_repo
|
|
322
|
-
get_group("default").compile
|
|
323
364
|
end
|
|
324
365
|
|
|
325
366
|
def setup_sdb
|
|
@@ -345,9 +386,13 @@ module Judo
|
|
|
345
386
|
raise JudoError, "You must specify a repo dir" unless repo
|
|
346
387
|
task("writing .judo/config.yml") do
|
|
347
388
|
Dir.chdir(repo) do
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
389
|
+
if File.exists?(".judo/config.yml")
|
|
390
|
+
puts ".judo folder already exists"
|
|
391
|
+
else
|
|
392
|
+
system "mkdir .judo"
|
|
393
|
+
File.open(".judo/config.yml","w") do |f|
|
|
394
|
+
f.write({ "access_id" => access_id, "access_secret" => access_secret, "s3_bucket" => bucket_name }.to_yaml)
|
|
395
|
+
end
|
|
351
396
|
end
|
|
352
397
|
end
|
|
353
398
|
end
|
|
@@ -360,14 +405,34 @@ module Judo
|
|
|
360
405
|
end
|
|
361
406
|
task("Setting up default group") do
|
|
362
407
|
Dir.chdir(repo) do
|
|
363
|
-
|
|
408
|
+
File.open("default/config.json","w") { |f| f.write default_config }
|
|
409
|
+
end
|
|
410
|
+
get_group("default").compile
|
|
411
|
+
end
|
|
412
|
+
end
|
|
364
413
|
|
|
365
|
-
|
|
366
|
-
|
|
414
|
+
def keypair_file(&blk)
|
|
415
|
+
Tempfile.open("judo_pem") do |file|
|
|
416
|
+
file.write key_material
|
|
417
|
+
file.flush
|
|
418
|
+
blk.call(file.path)
|
|
419
|
+
end
|
|
420
|
+
end
|
|
367
421
|
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
422
|
+
def setup_bucket
|
|
423
|
+
if name = get("bucket_name")
|
|
424
|
+
puts "Bucket #{name} already set"
|
|
425
|
+
else
|
|
426
|
+
set_bucket_name(bucket_name)
|
|
427
|
+
end
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
def setup_keypair
|
|
431
|
+
unless key_name
|
|
432
|
+
task("Generating an ssl keyapir") do
|
|
433
|
+
name = "judo#{ec2.describe_key_pairs.map { |k| k[:aws_key_name] }.map { |k| k =~ /^judo(\d*)/; $1.to_i }.sort.last.to_i + 1}"
|
|
434
|
+
material = ec2.create_key_pair(name)[:aws_material]
|
|
435
|
+
set_keypair(name, material)
|
|
371
436
|
end
|
|
372
437
|
end
|
|
373
438
|
end
|
|
@@ -375,7 +440,6 @@ module Judo
|
|
|
375
440
|
def default_config
|
|
376
441
|
<<DEFAULT
|
|
377
442
|
{
|
|
378
|
-
"key_name":"#{@keypair}",
|
|
379
443
|
"instance_type":"m1.small",
|
|
380
444
|
"ami32":"ami-bb709dd2", // public ubuntu 9.10 ami - 32 bit
|
|
381
445
|
"ami64":"ami-55739e3c", // public ubuntu 9.10 ami - 64 bit
|
|
@@ -29,7 +29,8 @@ module JudoCommandLineHelpers
|
|
|
29
29
|
groups.each { |group| judo_yield(group, blk) if blk }
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
## I dont like the way this is working anymore - needs refactor
|
|
33
|
+
def mk_servers(judo, options, args, &blk)
|
|
33
34
|
servers = args.map do |arg|
|
|
34
35
|
name,group = split(arg)
|
|
35
36
|
group ||= judo.group
|
|
@@ -37,9 +38,9 @@ module JudoCommandLineHelpers
|
|
|
37
38
|
if name =~ /^\+(\d+)/
|
|
38
39
|
count = $1.to_i
|
|
39
40
|
raise JudoError, "You can batch-create between 1 and 5 servers" if count < 1 or count > 5
|
|
40
|
-
(1..count).map { judo.
|
|
41
|
+
(1..count).map { judo.create_server( judo.mk_server_name(group), group, options) }
|
|
41
42
|
else
|
|
42
|
-
judo.
|
|
43
|
+
judo.create_server(name, group, options)
|
|
43
44
|
end
|
|
44
45
|
end
|
|
45
46
|
servers.flatten.each { |s| judo_yield(s, blk) if blk }
|
|
@@ -150,6 +151,7 @@ module JudoCommandLineHelpers
|
|
|
150
151
|
|
|
151
152
|
def do_info(judo, server)
|
|
152
153
|
puts "[ #{server} ]"
|
|
154
|
+
printf " %-24s: %s\n", "ID", server.id
|
|
153
155
|
printf " %-24s: %s\n", "Group", server.group.name
|
|
154
156
|
printf " %-24s: %s\n", "Note", server.note if server.note
|
|
155
157
|
printf " %-24s: %s\n", "Animated From", server.clone if server.clone
|
data/lib/judo/group.rb
CHANGED
|
@@ -16,12 +16,12 @@ module Judo
|
|
|
16
16
|
@build_config ||= all_configs.reverse.inject({}) { |sum,conf| sum.merge(conf) }
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
def
|
|
20
|
-
@
|
|
19
|
+
def server_ids
|
|
20
|
+
@server_ids ||= (@base.groups_config[@name] || [])
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
def servers
|
|
24
|
-
@base.servers.select { |s|
|
|
24
|
+
@base.servers.select { |s| server_ids.include?(s.name) }
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def load_config
|
|
@@ -123,10 +123,6 @@ module Judo
|
|
|
123
123
|
files
|
|
124
124
|
end
|
|
125
125
|
|
|
126
|
-
def keypair_file
|
|
127
|
-
extract_file(:keypair, config["key_name"] + ".pem" , {}).first
|
|
128
|
-
end
|
|
129
|
-
|
|
130
126
|
def attachments(c = config)
|
|
131
127
|
extract(c, {})
|
|
132
128
|
end
|
|
@@ -169,7 +165,7 @@ module Judo
|
|
|
169
165
|
end
|
|
170
166
|
|
|
171
167
|
def delete_server(server)
|
|
172
|
-
sdb.delete_attributes(@base.base_domain, "groups", name => server.
|
|
168
|
+
sdb.delete_attributes(@base.base_domain, "groups", name => server.id)
|
|
173
169
|
end
|
|
174
170
|
|
|
175
171
|
def to_s
|
data/lib/judo/server.rb
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
module Judo
|
|
2
2
|
class Server
|
|
3
|
-
attr_accessor :
|
|
3
|
+
attr_accessor :id,:group_name
|
|
4
4
|
|
|
5
|
-
def initialize(base,
|
|
5
|
+
def initialize(base, id, group, version = nil)
|
|
6
6
|
@base = base
|
|
7
|
-
@
|
|
7
|
+
@id = id
|
|
8
8
|
@group_name = group
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
-
def create(options)
|
|
11
|
+
def create(name, options)
|
|
12
12
|
raise JudoError, "no group specified" unless group_name
|
|
13
13
|
|
|
14
14
|
options[:virgin] = true if options[:virgin].nil?
|
|
@@ -18,23 +18,21 @@ module Judo
|
|
|
18
18
|
data = options[:data] ## instance specific data passed in JUDO_DATA
|
|
19
19
|
ip = options[:elastic_ip] ## if the ip was allocated beforehand
|
|
20
20
|
virgin = options[:virgin] ## should the server init?
|
|
21
|
+
clone = options[:clone] ## if it was cloned from a snapshot
|
|
21
22
|
|
|
22
23
|
version = options[:version]
|
|
23
24
|
version ||= group.version
|
|
24
25
|
|
|
25
|
-
if @name
|
|
26
|
-
|
|
27
|
-
@name = "#{group.name}.#{index}"
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
raise JudoError, "there is already a server named #{name}" if @base.servers.detect { |s| s.name == @name and s != self}
|
|
26
|
+
raise JudoError, "there is already a server named #{name}" if @base.servers.detect { |s| s.name == name and s != self}
|
|
27
|
+
raise JudoError, "there is already a server with id #{id}" if @base.servers.detect { |s| s.id == id and s != self}
|
|
31
28
|
|
|
32
29
|
task("Creating server #{name}") do
|
|
33
30
|
update "name" => name, "group" => group_name,
|
|
34
31
|
"note" => note, "virgin" => virgin,
|
|
35
32
|
"secret" => new_secret, "version" => version,
|
|
36
|
-
"data" => data, "elastic_ip" => ip
|
|
37
|
-
|
|
33
|
+
"data" => data, "elastic_ip" => ip,
|
|
34
|
+
"clone" => clone, "created_at" => Time.now.to_i
|
|
35
|
+
@base.sdb.put_attributes(@base.base_domain, "groups", group_name => id)
|
|
38
36
|
end
|
|
39
37
|
|
|
40
38
|
allocate_disk(snapshots)
|
|
@@ -48,17 +46,33 @@ module Judo
|
|
|
48
46
|
end
|
|
49
47
|
|
|
50
48
|
def fetch_state
|
|
51
|
-
@base.sdb.get_attributes(@base.server_domain,
|
|
49
|
+
@base.sdb.get_attributes(@base.server_domain, id)[:attributes]
|
|
52
50
|
end
|
|
53
51
|
|
|
54
52
|
def state
|
|
55
|
-
@base.servers_state[
|
|
53
|
+
@base.servers_state[id] ||= fetch_state
|
|
56
54
|
end
|
|
57
55
|
|
|
58
56
|
def get(key)
|
|
59
57
|
state[key] && [state[key]].flatten.first
|
|
60
58
|
end
|
|
61
59
|
|
|
60
|
+
def created_at
|
|
61
|
+
Time.at(get("created_at").to_i)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def started_at
|
|
65
|
+
Time.at(get("started_at").to_i)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def stopped_at
|
|
69
|
+
Time.at(get("stopped_at").to_i)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def name
|
|
73
|
+
get "name"
|
|
74
|
+
end
|
|
75
|
+
|
|
62
76
|
def data
|
|
63
77
|
get "data"
|
|
64
78
|
end
|
|
@@ -128,28 +142,28 @@ module Judo
|
|
|
128
142
|
end
|
|
129
143
|
|
|
130
144
|
def update(attrs)
|
|
131
|
-
@base.sdb.put_attributes(@base.server_domain,
|
|
145
|
+
@base.sdb.put_attributes(@base.server_domain, id, attrs, :replace)
|
|
132
146
|
state.merge! attrs
|
|
133
147
|
end
|
|
134
148
|
|
|
135
149
|
def add(key, value)
|
|
136
|
-
@base.sdb.put_attributes(@base.server_domain,
|
|
150
|
+
@base.sdb.put_attributes(@base.server_domain, id, { key => value })
|
|
137
151
|
(state[key] ||= []) << value
|
|
138
152
|
end
|
|
139
153
|
|
|
140
154
|
def remove(key, value = nil)
|
|
141
155
|
if value
|
|
142
|
-
@base.sdb.delete_attributes(@base.server_domain,
|
|
156
|
+
@base.sdb.delete_attributes(@base.server_domain, id, key => value)
|
|
143
157
|
state[key] - [value]
|
|
144
158
|
else
|
|
145
|
-
@base.sdb.delete_attributes(@base.server_domain,
|
|
159
|
+
@base.sdb.delete_attributes(@base.server_domain, id, [ key ])
|
|
146
160
|
state.delete(key)
|
|
147
161
|
end
|
|
148
162
|
end
|
|
149
163
|
|
|
150
164
|
def delete
|
|
151
165
|
group.delete_server(self) if group
|
|
152
|
-
@base.sdb.delete_attributes(@base.server_domain,
|
|
166
|
+
@base.sdb.delete_attributes(@base.server_domain, id)
|
|
153
167
|
end
|
|
154
168
|
|
|
155
169
|
######## end simple DB access #######
|
|
@@ -339,7 +353,7 @@ module Judo
|
|
|
339
353
|
result = @base.ec2.launch_instances(ami,
|
|
340
354
|
:instance_type => instance_type,
|
|
341
355
|
:availability_zone => config["availability_zone"],
|
|
342
|
-
:key_name =>
|
|
356
|
+
:key_name => @base.key_name,
|
|
343
357
|
:group_ids => security_groups,
|
|
344
358
|
:user_data => ud).first
|
|
345
359
|
update "instance_id" => result[:aws_instance_id], "virgin" => false, "started_at" => Time.now.to_i
|
|
@@ -474,8 +488,9 @@ module Judo
|
|
|
474
488
|
|
|
475
489
|
def connect_ssh
|
|
476
490
|
wait_for_ssh
|
|
477
|
-
|
|
478
|
-
|
|
491
|
+
@base.keypair_file do |file|
|
|
492
|
+
system "ssh -i #{file} #{config["user"]}@#{hostname}"
|
|
493
|
+
end
|
|
479
494
|
end
|
|
480
495
|
|
|
481
496
|
def ec2_instance_type
|
|
@@ -488,7 +503,7 @@ module Judo
|
|
|
488
503
|
|
|
489
504
|
def reload
|
|
490
505
|
@base.reload_ec2_instances
|
|
491
|
-
@base.servers_state.delete(
|
|
506
|
+
@base.servers_state.delete(id)
|
|
492
507
|
end
|
|
493
508
|
|
|
494
509
|
def user_data(judo_boot = nil)
|
|
@@ -497,7 +512,8 @@ module Judo
|
|
|
497
512
|
|
|
498
513
|
export DEBIAN_FRONTEND="noninteractive"
|
|
499
514
|
export DEBIAN_PRIORITY="critical"
|
|
500
|
-
export JUDO_ID='#{
|
|
515
|
+
export JUDO_ID='#{id}'
|
|
516
|
+
export JUDO_NAME='#{name}'
|
|
501
517
|
export JUDO_DOMAIN='#{@base.domain}'
|
|
502
518
|
export JUDO_BOOT='#{judo_boot}'
|
|
503
519
|
export JUDO_DATA='#{data}'
|
|
@@ -532,13 +548,22 @@ USER_DATA
|
|
|
532
548
|
end
|
|
533
549
|
|
|
534
550
|
def snapshot(name)
|
|
535
|
-
snap = @base.new_snapshot(name,
|
|
551
|
+
snap = @base.new_snapshot(name, id)
|
|
536
552
|
snap.create
|
|
553
|
+
snap
|
|
554
|
+
end
|
|
555
|
+
|
|
556
|
+
def rename(newname)
|
|
557
|
+
raise JudoError, "Already a server with that name" if @base.servers.detect { |s| s.name == newname }
|
|
558
|
+
task("Renaming to #{newname}") do
|
|
559
|
+
update "name" => newname
|
|
560
|
+
end
|
|
537
561
|
end
|
|
538
562
|
|
|
539
|
-
def
|
|
563
|
+
def swap(other)
|
|
540
564
|
ip1 = elastic_ip
|
|
541
565
|
ip2 = other.elastic_ip
|
|
566
|
+
|
|
542
567
|
raise JudoError, "Server must have an elastic IP to swap" unless ip1 and ip2
|
|
543
568
|
|
|
544
569
|
task("Swapping Ip Addresses") do
|
|
@@ -551,6 +576,13 @@ USER_DATA
|
|
|
551
576
|
update "elastic_ip" => ip2
|
|
552
577
|
other.update "elastic_ip" => ip1
|
|
553
578
|
end
|
|
579
|
+
|
|
580
|
+
task("Swapping Names") do
|
|
581
|
+
name1 = name
|
|
582
|
+
name2 = other.name
|
|
583
|
+
update "name" => name2
|
|
584
|
+
other.update "name" => name1
|
|
585
|
+
end
|
|
554
586
|
end
|
|
555
587
|
|
|
556
588
|
def <=>(s)
|
data/lib/judo/snapshot.rb
CHANGED
|
@@ -1,25 +1,29 @@
|
|
|
1
1
|
module Judo
|
|
2
|
-
### sdb
|
|
3
|
-
### name {
|
|
4
|
-
### "version" => [ server.version ],
|
|
2
|
+
### sdb
|
|
3
|
+
### name {
|
|
4
|
+
### "version" => [ server.version ],
|
|
5
5
|
### "devs" => [ "/dev/sde1:snap-abc123", "/dev/sde2:snap-abc456" ],
|
|
6
|
-
### "server" => server.
|
|
6
|
+
### "server" => server.id
|
|
7
7
|
### "group" => server.group.name
|
|
8
8
|
### "virgin" => server.virgin
|
|
9
9
|
### "note" => server.note
|
|
10
10
|
### "data" => server.data
|
|
11
11
|
### "created_at" => unixtime
|
|
12
12
|
class Snapshot
|
|
13
|
-
attr_accessor :name, :
|
|
13
|
+
attr_accessor :name, :server_id
|
|
14
14
|
|
|
15
|
-
def initialize(base, name,
|
|
15
|
+
def initialize(base, name, server_id)
|
|
16
16
|
@base = base
|
|
17
17
|
@name = name
|
|
18
|
-
@
|
|
18
|
+
@server_id = server_id
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def server_name
|
|
22
|
+
server.name rescue '(deleted)'
|
|
19
23
|
end
|
|
20
24
|
|
|
21
25
|
def server
|
|
22
|
-
@server ||= @base.servers.detect { |s| s.
|
|
26
|
+
@server ||= @base.servers.detect { |s| s.id == server_id }
|
|
23
27
|
end
|
|
24
28
|
|
|
25
29
|
def fetch_state
|
|
@@ -35,7 +39,7 @@ module Judo
|
|
|
35
39
|
end
|
|
36
40
|
|
|
37
41
|
def created_at
|
|
38
|
-
Time.at(get("
|
|
42
|
+
Time.at(get("created_at").to_i)
|
|
39
43
|
end
|
|
40
44
|
|
|
41
45
|
def version
|
|
@@ -65,13 +69,13 @@ module Judo
|
|
|
65
69
|
devs = server.volumes.map do |dev,vol|
|
|
66
70
|
"#{dev}:#{@base.ec2.create_snapshot(vol)[:aws_id]}"
|
|
67
71
|
end
|
|
68
|
-
@base.sdb.put_attributes(@base.snapshot_domain, name, {
|
|
69
|
-
"version" => server.version,
|
|
70
|
-
"virgin" => server.virgin?,
|
|
71
|
-
"note" => server.note,
|
|
72
|
-
"data" => server.data,
|
|
73
|
-
"devs" => devs,
|
|
74
|
-
"server" => server.
|
|
72
|
+
@base.sdb.put_attributes(@base.snapshot_domain, name, {
|
|
73
|
+
"version" => server.version,
|
|
74
|
+
"virgin" => server.virgin?,
|
|
75
|
+
"note" => server.note,
|
|
76
|
+
"data" => server.data,
|
|
77
|
+
"devs" => devs,
|
|
78
|
+
"server" => server.id,
|
|
75
79
|
"group" => server.group.name,
|
|
76
80
|
"created_at" => Time.now.to_i.to_s
|
|
77
81
|
}, :replace)
|
|
@@ -79,17 +83,14 @@ module Judo
|
|
|
79
83
|
end
|
|
80
84
|
end
|
|
81
85
|
|
|
82
|
-
def animate(new_server
|
|
86
|
+
def animate(new_server)
|
|
83
87
|
raise JudoError, "cannot animate, snapshotting not complete" unless completed?
|
|
84
|
-
|
|
85
|
-
server.create( :version => version, :snapshots => devs, :virgin => virgin, :note => note, :data => data )
|
|
86
|
-
server.update "clone" => name ##, "secret" => rand(2 ** 128).to_s(36) ## cant change this till kuzushi knows about a post-clone operation
|
|
87
|
-
server
|
|
88
|
+
@base.create_server(new_server, group_name, :version => version, :snapshots => devs, :virgin => virgin, :note => note, :data => data , :clone => name)
|
|
88
89
|
end
|
|
89
90
|
|
|
90
91
|
def delete
|
|
91
92
|
@base.sdb.delete_attributes(@base.snapshot_domain, name)
|
|
92
|
-
server.remove
|
|
93
|
+
server.remove("snapshots", name) if server
|
|
93
94
|
end
|
|
94
95
|
|
|
95
96
|
def get(key)
|
metadata
CHANGED
|
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
|
5
5
|
segments:
|
|
6
6
|
- 0
|
|
7
7
|
- 3
|
|
8
|
-
-
|
|
9
|
-
version: 0.3.
|
|
8
|
+
- 2
|
|
9
|
+
version: 0.3.2
|
|
10
10
|
platform: ruby
|
|
11
11
|
authors:
|
|
12
12
|
- Orion Henry
|
|
@@ -14,7 +14,7 @@ autorequire:
|
|
|
14
14
|
bindir: bin
|
|
15
15
|
cert_chain: []
|
|
16
16
|
|
|
17
|
-
date: 2010-05-
|
|
17
|
+
date: 2010-05-21 00:00:00 -04:00
|
|
18
18
|
default_executable: judo
|
|
19
19
|
dependencies:
|
|
20
20
|
- !ruby/object:Gem::Dependency
|