judo 0.2.4 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +16 -14
- data/TODO +7 -9
- data/VERSION +1 -1
- data/bin/judo +20 -5
- data/lib/judo/base.rb +50 -20
- data/lib/judo/group.rb +5 -5
- data/lib/judo/server.rb +52 -35
- data/lib/judo/snapshot.rb +4 -4
- metadata +4 -4
data/README.markdown
CHANGED
@@ -64,7 +64,7 @@ default group will look something like this.
|
|
64
64
|
$ cat default/config.json
|
65
65
|
{
|
66
66
|
"key_name":"judo14",
|
67
|
-
"
|
67
|
+
"instance_type":"m1.small",
|
68
68
|
"ami32":"ami-bb709dd2", // public ubuntu 9.10 ami - 32 bit
|
69
69
|
"ami64":"ami-55739e3c", // public ubuntu 9.10 ami - 64 bit
|
70
70
|
"user":"ubuntu",
|
@@ -72,7 +72,7 @@ default group will look something like this.
|
|
72
72
|
"availability_zone":"us-east-1d"
|
73
73
|
}
|
74
74
|
|
75
|
-
Any changes you make to these files
|
75
|
+
Any changes you make to these files do not stick until you've committed them.
|
76
76
|
To commit a group do the following.
|
77
77
|
|
78
78
|
$ judo commit :default
|
@@ -96,7 +96,7 @@ You can stop all the servers in the :default group with:
|
|
96
96
|
|
97
97
|
You could also have typed:
|
98
98
|
|
99
|
-
|
99
|
+
$ judo stop my_server_1 my_server_2
|
100
100
|
|
101
101
|
## COMMANDS
|
102
102
|
|
@@ -126,7 +126,7 @@ Creates N new servers where N is an integer. These servers have generic names
|
|
126
126
|
(group.N). Note: servers with generic names AND no external resources (like
|
127
127
|
EBS Volumes or Elastic IPs) will be destroyed when stopped.
|
128
128
|
|
129
|
-
|
129
|
+
$ judo destroy NAME
|
130
130
|
|
131
131
|
Destroy the named server. De-allocates any elastic IP's and destroys the EBS
|
132
132
|
volumes.
|
@@ -208,7 +208,7 @@ A memcached server:
|
|
208
208
|
"elastic_ip" : true,
|
209
209
|
// only need 1 package
|
210
210
|
"packages" : "memcached",
|
211
|
-
"
|
211
|
+
"instance_type" : "m1.xlarge",
|
212
212
|
"files" : [
|
213
213
|
{ "file" : "/etc/memcached.conf",
|
214
214
|
"template" : "memcached.conf.erb" },
|
@@ -239,7 +239,7 @@ A redis server with a 2 disk xfs raid 0:
|
|
239
239
|
// dont repeat yourself - import the basic config
|
240
240
|
"import" : "default",
|
241
241
|
"elastic_ip" : true,
|
242
|
-
"
|
242
|
+
"instance_type" : "m2.xlarge",
|
243
243
|
"local_packages" : { "package" : "redis-server_1.2.5-1", "source" : "http://http.us.debian.org/debian/pool/main/r/redis/" },
|
244
244
|
"volumes" : [{ "device" : "/dev/sde1",
|
245
245
|
"media" : "ebs",
|
@@ -274,26 +274,26 @@ default config. The system is expecting a registered keypair in this case
|
|
274
274
|
named "keypair123" with a "keypair123.pem" file located in a subfolder named
|
275
275
|
"keypairs".
|
276
276
|
|
277
|
-
"
|
277
|
+
"instance_type":"m1.small",
|
278
278
|
|
279
279
|
Specify the instance size for the server type here. See:
|
280
280
|
http://aws.amazon.com/ec2/instance-types/
|
281
281
|
|
282
|
-
|
283
|
-
|
284
|
-
|
282
|
+
"ami32":"ami-bb709dd2",
|
283
|
+
"ami64":"ami-55739e3c",
|
284
|
+
"user":"ubuntu",
|
285
285
|
|
286
286
|
This is where you specify the AMI's to use. The defaults (above) are the
|
287
287
|
ubuntu 9.10 public AMI's. The "user" value is which user has the keypair
|
288
288
|
bound to it for ssh'ing into the server.
|
289
289
|
|
290
|
-
|
290
|
+
"security_group":"judo",
|
291
291
|
|
292
292
|
What security group to launch the server in. A judo group is created for you
|
293
293
|
which only has port 22 access. Manually create new security groups as needed
|
294
294
|
and name them here.
|
295
295
|
|
296
|
-
|
296
|
+
"availability_zone":"us-east-1d"
|
297
297
|
|
298
298
|
What zone to launch the server in.
|
299
299
|
|
@@ -309,7 +309,9 @@ This command is very import and allows you inherit the configurations and files
|
|
309
309
|
from other groups. If you wanted to make a group called 'mysql' that was
|
310
310
|
exactly like the default group except it installed the mysql package and ran on
|
311
311
|
a m2.4xlarge instance type you could specify it like this:
|
312
|
-
|
312
|
+
|
313
|
+
{ "import : "default", "packages" : [ "mysql" ], "instance_type" : "m2.4xlarge" }
|
314
|
+
|
313
315
|
and save yourself a lot of typing. You could further subclass by making a new
|
314
316
|
group and importing this config.
|
315
317
|
|
@@ -493,7 +495,7 @@ was run on this specific server boot check the first line of kuzushi.log.
|
|
493
495
|
ubuntu:~$ sudo head -n 1 /var/log/kuzushi.log
|
494
496
|
|
495
497
|
|
496
|
-
|
498
|
+
## Meta
|
497
499
|
|
498
500
|
Created by Orion Henry and Adam Wiggins. Forked from the gem 'sumo'.
|
499
501
|
|
data/TODO
CHANGED
@@ -1,23 +1,21 @@
|
|
1
1
|
### NEEDED for new gem launch
|
2
2
|
|
3
3
|
### [ ] ubuntu 10.04
|
4
|
-
### [ ] allocate elastic_ip first
|
5
4
|
### [ ] snapshot percent complete in do_snapshots()
|
6
5
|
### [ ] judo swap (x) (y) -> swaps elastic IP's and name
|
7
6
|
### [ ] snapshots/init/virgin
|
8
7
|
### [ ] bind kuzushi gem version version
|
9
8
|
### [ ] should be able to do ALL actions except commit without the repo!
|
10
9
|
### [ ] ssh - put pem into s3
|
11
|
-
###
|
12
|
-
### [ ]
|
13
|
-
### [ ]
|
14
|
-
### [ ] clone from ebs snapshot on start
|
15
|
-
### [ ] implement start/stop
|
10
|
+
### [ ] store s3 bucket in config
|
11
|
+
### [ ] saw a timeout on volume allocation - make sure we build in re-tries - need to allocate the server all together as much as possible
|
12
|
+
### [ ] round robin or specified availability_zone
|
16
13
|
|
14
|
+
### MAYBE
|
15
|
+
### [ ] store things in s3 by sha1sum
|
16
|
+
### [ ] ebs backed root disk + start/stop
|
17
17
|
### [ ] implement auto security_group creation and setup (6 hrs)
|
18
|
-
|
19
|
-
### [ ] judo does not work with ruby 1.8.6 - :(
|
20
|
-
### [ ] saw a timeout on volume allocation - make sure we build in re-tries - need to allocate the server all together as much as possible
|
18
|
+
### [ ] fix ruby 1.8.6 - test 1.9.1
|
21
19
|
|
22
20
|
### [ ] two phase delete (1 hr)
|
23
21
|
### [-] refactor availability_zone (2 hrs)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/bin/judo
CHANGED
@@ -63,14 +63,29 @@ banner
|
|
63
63
|
opts.on( '-f', '--force', 'Force a stop or restart (immediately force detach volumes)' ) do
|
64
64
|
options[:force] = true
|
65
65
|
end
|
66
|
+
opts.on( '-d', '--domain DOMAIN', 'Specify a judo domain within an AWS account' ) do |domain|
|
67
|
+
options[:domain] = domain
|
68
|
+
end
|
66
69
|
opts.on( '-r', '--repo DIR', 'Specify the location of the repo dir' ) do |dir|
|
67
70
|
options[:repo] = dir
|
68
71
|
end
|
72
|
+
opts.on( '-D', '--data DATA', 'Specify an instance specific string to be used during boot on create or launch' ) do |data|
|
73
|
+
options[:data] = data
|
74
|
+
end
|
75
|
+
opts.on( '-t', '--type TYPE', 'Specify an instance type different from the config on server start' ) do |type|
|
76
|
+
options[:instance_type] = type
|
77
|
+
end
|
78
|
+
opts.on( '-B', '--boot BOOT', 'Instance specific string (like --data) but for this boot only' ) do |data|
|
79
|
+
options[:boot] = data
|
80
|
+
end
|
81
|
+
opts.on( '-i', '--ip IP', 'Specify an exsiting elastic_ip address on server creation' ) do |ip|
|
82
|
+
options[:elastic_ip] = ip
|
83
|
+
end
|
69
84
|
opts.on( '-a', '--accessid ID', 'Specify the AWS access ID' ) do |id|
|
70
85
|
options[:access_id] = id
|
71
86
|
end
|
72
87
|
opts.on( '-s', '--secret KEY', 'Specify the AWS access secret key' ) do |key|
|
73
|
-
options[:
|
88
|
+
options[:access_secret] = key
|
74
89
|
end
|
75
90
|
opts.on( '-b', '--bucket BUCKET', 'Specify the AWS S3 bucket to use' ) do |bucket|
|
76
91
|
options[:bucket] = bucket
|
@@ -106,11 +121,11 @@ begin
|
|
106
121
|
when "console" then find_servers(judo, ARGV) { |s| puts s.console_output }
|
107
122
|
when "commit" then find_groups(judo, ARGV) { |g| g.compile }
|
108
123
|
when "ssh" then find_servers(judo, ARGV) { |s| s.connect_ssh }
|
109
|
-
when "start" then find_servers(judo, ARGV) { |s| s.start(options
|
110
|
-
when "restart" then find_servers(judo, ARGV) { |s| s.restart(options
|
111
|
-
when "stop" then find_servers(judo, ARGV) { |s| s.stop(options
|
124
|
+
when "start" then find_servers(judo, ARGV) { |s| s.start(options) }
|
125
|
+
when "restart" then find_servers(judo, ARGV) { |s| s.restart(options) }
|
126
|
+
when "stop" then find_servers(judo, ARGV) { |s| s.stop(options) }
|
112
127
|
when "create" then mk_servers(judo, ARGV) { |s| s.create(options) }
|
113
|
-
when "launch" then mk_servers(judo, ARGV) { |s| s.create(options); s.start }
|
128
|
+
when "launch" then mk_servers(judo, ARGV) { |s| s.create(options); s.start(options) }
|
114
129
|
when "snapshots" then do_snapshots(judo, ARGV)
|
115
130
|
when "swapip" then
|
116
131
|
servers = find_servers(judo, ARGV)
|
data/lib/judo/base.rb
CHANGED
@@ -33,6 +33,7 @@ module Judo
|
|
33
33
|
@bucket_name = options[:bucket]
|
34
34
|
@access_id = options[:access_id]
|
35
35
|
@access_secret = options[:access_secret]
|
36
|
+
@domain = options[:domain]
|
36
37
|
end
|
37
38
|
|
38
39
|
def volumes
|
@@ -60,8 +61,24 @@ module Judo
|
|
60
61
|
end
|
61
62
|
end
|
62
63
|
|
63
|
-
def
|
64
|
-
|
64
|
+
def sdb_domain(name)
|
65
|
+
if @domain
|
66
|
+
"#{@domain}_#{name}"
|
67
|
+
else
|
68
|
+
name
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def server_domain
|
73
|
+
sdb_domain("judo_servers")
|
74
|
+
end
|
75
|
+
|
76
|
+
def snapshot_domain
|
77
|
+
sdb_domain("judo_snapshots")
|
78
|
+
end
|
79
|
+
|
80
|
+
def base_domain
|
81
|
+
sdb_domain("judo_config")
|
65
82
|
end
|
66
83
|
|
67
84
|
def self.default_options(pwd, dir = find_judo_dir(pwd))
|
@@ -72,6 +89,7 @@ module Judo
|
|
72
89
|
:judo_dir => dir,
|
73
90
|
:group => group_config ? File.basename(File.dirname(group_config)) : nil,
|
74
91
|
:repo => repo_dir,
|
92
|
+
:domain => (config["domain"] || ENV['JUDO_DOMAIN']),
|
75
93
|
:bucket => (config["s3_bucket"] || ENV['JUDO_BUCKET']),
|
76
94
|
:access_id => (config["access_id"] || ENV['AWS_ACCESS_KEY_ID']),
|
77
95
|
:access_secret => (config["access_secret"] || ENV['AWS_SECRET_ACCESS_KEY'])
|
@@ -80,7 +98,8 @@ module Judo
|
|
80
98
|
{
|
81
99
|
:access_id => ENV['AWS_ACCESS_KEY_ID'],
|
82
100
|
:access_secret => ENV['AWS_SECRET_ACCESS_KEY'],
|
83
|
-
:bucket => ENV['JUDO_BUCKET']
|
101
|
+
:bucket => ENV['JUDO_BUCKET'],
|
102
|
+
:domain => ENV['JUDO_DOMAIN'],
|
84
103
|
}.delete_if { |key,value| value.nil? }
|
85
104
|
end
|
86
105
|
|
@@ -102,7 +121,7 @@ module Judo
|
|
102
121
|
|
103
122
|
def fetch_snapshots_state
|
104
123
|
s = {}
|
105
|
-
sdb.select("select * from
|
124
|
+
sdb.select("select * from `#{snapshot_domain}`")[:items].each do |group|
|
106
125
|
group.each do |key,val|
|
107
126
|
s[key] = val
|
108
127
|
end
|
@@ -112,7 +131,7 @@ module Judo
|
|
112
131
|
|
113
132
|
def fetch_servers_state
|
114
133
|
s = {}
|
115
|
-
sdb.select("select * from
|
134
|
+
sdb.select("select * from `#{server_domain}`")[:items].each do |group|
|
116
135
|
group.each do |key,val|
|
117
136
|
s[key] = val
|
118
137
|
end
|
@@ -191,11 +210,11 @@ module Judo
|
|
191
210
|
end
|
192
211
|
|
193
212
|
def groups_config
|
194
|
-
@groups_config ||= sdb.get_attributes(
|
213
|
+
@groups_config ||= sdb.get_attributes(base_domain, "groups")[:attributes]
|
195
214
|
end
|
196
215
|
|
197
216
|
def group_versions
|
198
|
-
@group_version ||= sdb.get_attributes(
|
217
|
+
@group_version ||= sdb.get_attributes(base_domain, "group_versions")[:attributes]
|
199
218
|
end
|
200
219
|
|
201
220
|
def ip_to_judo(ip)
|
@@ -215,15 +234,23 @@ module Judo
|
|
215
234
|
end
|
216
235
|
|
217
236
|
def s3_url(k)
|
218
|
-
Aws::S3Generator::Key.new(bucket, k).get
|
237
|
+
Aws::S3Generator::Key.new(bucket, s3_key(k)).get
|
219
238
|
end
|
220
239
|
|
221
240
|
def s3_get(k)
|
222
|
-
bucket.get(k)
|
241
|
+
bucket.get( s3_key(k))
|
223
242
|
end
|
224
243
|
|
225
244
|
def s3_put(k, file)
|
226
|
-
bucket.put(k, file)
|
245
|
+
bucket.put( s3_key(k), file)
|
246
|
+
end
|
247
|
+
|
248
|
+
def s3_key(k)
|
249
|
+
if @domain
|
250
|
+
"#{@domain}/#{k}"
|
251
|
+
else
|
252
|
+
k
|
253
|
+
end
|
227
254
|
end
|
228
255
|
|
229
256
|
def repo
|
@@ -252,14 +279,14 @@ module Judo
|
|
252
279
|
case get_db_version
|
253
280
|
when 0
|
254
281
|
task("Upgrading Judo: Creating Snapshots SDB Domain") do
|
255
|
-
sdb.create_domain(
|
256
|
-
sdb.create_domain(
|
257
|
-
sdb.create_domain(
|
282
|
+
sdb.create_domain(server_domain)
|
283
|
+
sdb.create_domain(base_domain)
|
284
|
+
sdb.create_domain(snapshot_domain)
|
258
285
|
set_db_version(2)
|
259
286
|
end
|
260
287
|
when 1
|
261
288
|
task("Upgrading Judo: Creating Snapshots SDB Domain") do
|
262
|
-
sdb.create_domain(
|
289
|
+
sdb.create_domain(snapshot_domain)
|
263
290
|
set_db_version(2)
|
264
291
|
end
|
265
292
|
else
|
@@ -269,15 +296,18 @@ module Judo
|
|
269
296
|
|
270
297
|
def set_db_version(new_version)
|
271
298
|
@db_version = new_version
|
272
|
-
sdb.put_attributes(
|
299
|
+
sdb.put_attributes(base_domain, "judo", { "dbversion" => new_version }, :replace)
|
273
300
|
end
|
274
301
|
|
275
302
|
def get_db_version
|
276
|
-
@db_version ||= sdb.get_attributes(
|
303
|
+
@db_version ||= (sdb.get_attributes(base_domain, "judo")[:attributes]["dbversion"] || []).first.to_i
|
277
304
|
end
|
278
305
|
|
279
306
|
def check_version
|
280
|
-
|
307
|
+
upgrade_db if get_db_version != db_version
|
308
|
+
rescue Aws::AwsError => e
|
309
|
+
setup_sdb
|
310
|
+
upgrade_db
|
281
311
|
end
|
282
312
|
|
283
313
|
def setup
|
@@ -294,7 +324,7 @@ module Judo
|
|
294
324
|
|
295
325
|
def setup_sdb
|
296
326
|
task("Trying to connect to SimpleDB") do
|
297
|
-
sdb.create_domain(
|
327
|
+
sdb.create_domain(base_domain)
|
298
328
|
end
|
299
329
|
end
|
300
330
|
|
@@ -316,7 +346,7 @@ module Judo
|
|
316
346
|
task("writing .judo/config.yml") do
|
317
347
|
Dir.chdir(repo) do
|
318
348
|
system "mkdir .judo"
|
319
|
-
File.open(".judo/config.yml","w") do |f|
|
349
|
+
File.open(".judo/config.yml","w") do |f|
|
320
350
|
f.write({ "access_id" => access_id, "access_secret" => access_secret, "s3_bucket" => bucket_name }.to_yaml)
|
321
351
|
end
|
322
352
|
end
|
@@ -346,7 +376,7 @@ module Judo
|
|
346
376
|
<<DEFAULT
|
347
377
|
{
|
348
378
|
"key_name":"#{@keypair}",
|
349
|
-
"
|
379
|
+
"instance_type":"m1.small",
|
350
380
|
"ami32":"ami-bb709dd2", // public ubuntu 9.10 ami - 32 bit
|
351
381
|
"ami64":"ami-55739e3c", // public ubuntu 9.10 ami - 64 bit
|
352
382
|
"user":"ubuntu",
|
data/lib/judo/group.rb
CHANGED
@@ -31,7 +31,7 @@ module Judo
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def set_version
|
34
|
-
@base.sdb.put_attributes(
|
34
|
+
@base.sdb.put_attributes(@base.base_domain, "group_versions", { name => version }, :replace)
|
35
35
|
end
|
36
36
|
|
37
37
|
def compile
|
@@ -137,7 +137,7 @@ module Judo
|
|
137
137
|
|
138
138
|
def parent
|
139
139
|
@parent ||= @base.groups.detect { |p| p.name == raw_config["import"] }
|
140
|
-
|
140
|
+
(@parent ||= Judo::Group.new(@base, raw_config["import"], 0 )) if raw_config["import"] ## make a mock incase the parent was never committed
|
141
141
|
@parent
|
142
142
|
end
|
143
143
|
|
@@ -145,8 +145,8 @@ module Judo
|
|
145
145
|
servers.each { |s| s.destroy }
|
146
146
|
@base.task("Destring #{self}") do
|
147
147
|
@base.groups.delete(self)
|
148
|
-
@base.sdb.delete_attributes(
|
149
|
-
@base.sdb.delete_attributes(
|
148
|
+
@base.sdb.delete_attributes(@base.base_domain, "groups", [ name ])
|
149
|
+
@base.sdb.delete_attributes(@base.base_domain, "group_versions", [ name ])
|
150
150
|
end
|
151
151
|
end
|
152
152
|
|
@@ -169,7 +169,7 @@ module Judo
|
|
169
169
|
end
|
170
170
|
|
171
171
|
def delete_server(server)
|
172
|
-
sdb.delete_attributes(
|
172
|
+
sdb.delete_attributes(@base.base_domain, "groups", name => server.name)
|
173
173
|
end
|
174
174
|
|
175
175
|
def to_s
|
data/lib/judo/server.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Judo
|
2
2
|
class Server
|
3
|
-
attr_accessor :name
|
3
|
+
attr_accessor :name, :group_name
|
4
4
|
|
5
5
|
def initialize(base, name, group, version = nil)
|
6
6
|
@base = base
|
@@ -9,10 +9,12 @@ module Judo
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def create(options)
|
12
|
-
raise JudoError, "no group specified" unless
|
12
|
+
raise JudoError, "no group specified" unless group_name
|
13
13
|
|
14
|
-
snapshots
|
15
|
-
note
|
14
|
+
snapshots = options[:snapshots]
|
15
|
+
note = options[:note] ## a user defined note field
|
16
|
+
data = options[:data] ## instance specific data passed in JUDO_DATA
|
17
|
+
ip = options[:elastic_ip] ## if the ip was allocated beforehand
|
16
18
|
|
17
19
|
version = options[:version]
|
18
20
|
version ||= group.version
|
@@ -25,8 +27,11 @@ module Judo
|
|
25
27
|
raise JudoError, "there is already a server named #{name}" if @base.servers.detect { |s| s.name == @name and s != self}
|
26
28
|
|
27
29
|
task("Creating server #{name}") do
|
28
|
-
update "name" => name,
|
29
|
-
|
30
|
+
update "name" => name, "group" => group_name,
|
31
|
+
"note" => note, "virgin" => true,
|
32
|
+
"secret" => new_secret, "version" => version,
|
33
|
+
"data" => data, "elastic_ip" => ip
|
34
|
+
@base.sdb.put_attributes(@base.base_domain, "groups", group_name => name)
|
30
35
|
end
|
31
36
|
|
32
37
|
allocate_disk(snapshots)
|
@@ -36,11 +41,11 @@ module Judo
|
|
36
41
|
end
|
37
42
|
|
38
43
|
def group
|
39
|
-
@group ||= @base.groups.detect { |g| g.name ==
|
44
|
+
@group ||= @base.groups.detect { |g| g.name == group_name }
|
40
45
|
end
|
41
46
|
|
42
47
|
def fetch_state
|
43
|
-
@base.sdb.get_attributes(
|
48
|
+
@base.sdb.get_attributes(@base.server_domain, name)[:attributes]
|
44
49
|
end
|
45
50
|
|
46
51
|
def state
|
@@ -51,6 +56,10 @@ module Judo
|
|
51
56
|
state[key] && [state[key]].flatten.first
|
52
57
|
end
|
53
58
|
|
59
|
+
def data
|
60
|
+
get "data"
|
61
|
+
end
|
62
|
+
|
54
63
|
def instance_id
|
55
64
|
get "instance_id"
|
56
65
|
end
|
@@ -60,10 +69,10 @@ module Judo
|
|
60
69
|
end
|
61
70
|
|
62
71
|
def size_desc
|
63
|
-
if not running? or ec2_instance_type ==
|
64
|
-
|
72
|
+
if not running? or ec2_instance_type == instance_type
|
73
|
+
instance_type
|
65
74
|
else
|
66
|
-
"#{ec2_instance_type}/#{
|
75
|
+
"#{ec2_instance_type}/#{instance_type}"
|
67
76
|
end
|
68
77
|
end
|
69
78
|
|
@@ -119,39 +128,36 @@ module Judo
|
|
119
128
|
Hash[ (state["volumes"] || []).map { |a| a.split(":") } ]
|
120
129
|
end
|
121
130
|
|
122
|
-
def self.domain
|
123
|
-
"judo_servers"
|
124
|
-
end
|
125
|
-
|
126
131
|
def update(attrs)
|
127
|
-
@base.sdb.put_attributes(
|
132
|
+
@base.sdb.put_attributes(@base.server_domain, name, attrs, :replace)
|
128
133
|
state.merge! attrs
|
129
134
|
end
|
130
135
|
|
131
136
|
def add(key, value)
|
132
|
-
@base.sdb.put_attributes(
|
137
|
+
@base.sdb.put_attributes(@base.server_domain, name, { key => value })
|
133
138
|
(state[key] ||= []) << value
|
134
139
|
end
|
135
140
|
|
136
141
|
def remove(key, value = nil)
|
137
142
|
if value
|
138
|
-
@base.sdb.delete_attributes(
|
143
|
+
@base.sdb.delete_attributes(@base.server_domain, name, key => value)
|
139
144
|
state[key] - [value]
|
140
145
|
else
|
141
|
-
@base.sdb.delete_attributes(
|
146
|
+
@base.sdb.delete_attributes(@base.server_domain, name, [ key ])
|
142
147
|
state.delete(key)
|
143
148
|
end
|
144
149
|
end
|
145
150
|
|
146
151
|
def delete
|
147
152
|
group.delete_server(self) if group
|
148
|
-
@base.sdb.delete_attributes(
|
153
|
+
@base.sdb.delete_attributes(@base.server_domain, name)
|
149
154
|
end
|
150
155
|
|
151
156
|
######## end simple DB access #######
|
152
157
|
|
153
|
-
def
|
154
|
-
|
158
|
+
def instance_type
|
159
|
+
## need instance_size to be backward compatible - needed for configs made before v 0.3.0
|
160
|
+
get("instance_type") || config["instance_type"] || config["instance_size"]
|
155
161
|
end
|
156
162
|
|
157
163
|
def config
|
@@ -159,7 +165,7 @@ module Judo
|
|
159
165
|
end
|
160
166
|
|
161
167
|
def to_s
|
162
|
-
"#{name}:#{
|
168
|
+
"#{name}:#{group_name}"
|
163
169
|
end
|
164
170
|
|
165
171
|
def allocate_disk(snapshots)
|
@@ -275,18 +281,22 @@ module Judo
|
|
275
281
|
["pending", "running", "shutting_down", "degraded"].include?(ec2_state)
|
276
282
|
end
|
277
283
|
|
278
|
-
def start(
|
284
|
+
def start(options = {})
|
285
|
+
new_version = options[:version]
|
286
|
+
set_instance_type(options[:instance_type]) if options[:instance_type]
|
287
|
+
|
279
288
|
invalid "Already running" if running?
|
280
289
|
invalid "No config has been commited yet, type 'judo commit'" unless group.version > 0
|
281
|
-
|
282
|
-
task("
|
290
|
+
|
291
|
+
task("Updating server version") { update_version(options[:version]) } if options[:version]
|
292
|
+
task("Starting server #{name}") { launch_ec2(options[:boot]) }
|
283
293
|
task("Wait for server") { wait_for_running } if elastic_ip or has_volumes?
|
284
294
|
task("Attaching ip") { attach_ip } if elastic_ip
|
285
295
|
task("Attaching volumes") { attach_volumes } if has_volumes?
|
286
296
|
end
|
287
297
|
|
288
|
-
def restart(
|
289
|
-
stop(
|
298
|
+
def restart(options = {})
|
299
|
+
stop(options) if running?
|
290
300
|
start
|
291
301
|
end
|
292
302
|
|
@@ -310,7 +320,8 @@ module Judo
|
|
310
320
|
end
|
311
321
|
end
|
312
322
|
|
313
|
-
def stop(
|
323
|
+
def stop(options = {})
|
324
|
+
force = options[:force]
|
314
325
|
invalid "not running" unless running?
|
315
326
|
## EC2 terminate_isntaces
|
316
327
|
task("Terminating instance") { @base.ec2.terminate_instances([ instance_id ]) }
|
@@ -319,14 +330,14 @@ module Judo
|
|
319
330
|
remove "instance_id"
|
320
331
|
end
|
321
332
|
|
322
|
-
def launch_ec2
|
333
|
+
def launch_ec2(boot = nil)
|
323
334
|
# validate
|
324
335
|
|
325
336
|
## EC2 launch_instances
|
326
|
-
ud = user_data
|
337
|
+
ud = user_data(boot)
|
327
338
|
debug(ud)
|
328
339
|
result = @base.ec2.launch_instances(ami,
|
329
|
-
:instance_type =>
|
340
|
+
:instance_type => instance_type,
|
330
341
|
:availability_zone => config["availability_zone"],
|
331
342
|
:key_name => config["key_name"],
|
332
343
|
:group_ids => security_groups,
|
@@ -353,7 +364,7 @@ module Judo
|
|
353
364
|
end
|
354
365
|
|
355
366
|
def ia32?
|
356
|
-
["m1.small", "c1.medium"].include?(
|
367
|
+
["m1.small", "c1.medium"].include?(instance_type)
|
357
368
|
end
|
358
369
|
|
359
370
|
def ia64?
|
@@ -480,13 +491,15 @@ module Judo
|
|
480
491
|
@base.servers_state.delete(name)
|
481
492
|
end
|
482
493
|
|
483
|
-
def user_data
|
494
|
+
def user_data(judo_boot = nil)
|
484
495
|
<<USER_DATA
|
485
496
|
#!/bin/sh
|
486
497
|
|
487
498
|
export DEBIAN_FRONTEND="noninteractive"
|
488
499
|
export DEBIAN_PRIORITY="critical"
|
489
500
|
export JUDO_ID='#{name}'
|
501
|
+
export JUDO_BOOT='#{judo_boot}'
|
502
|
+
export JUDO_DATA='#{data}'
|
490
503
|
export SECRET='#{secret}'
|
491
504
|
apt-get update
|
492
505
|
apt-get install ruby rubygems ruby-dev irb libopenssl-ruby libreadline-ruby -y
|
@@ -527,7 +540,7 @@ USER_DATA
|
|
527
540
|
ip2 = other.elastic_ip
|
528
541
|
raise JudoError, "Server must have an elastic IP to swap" unless ip1 and ip2
|
529
542
|
|
530
|
-
task("Swapping Ip Addresses") do
|
543
|
+
task("Swapping Ip Addresses") do
|
531
544
|
@base.ec2.disassociate_address(ip1)
|
532
545
|
@base.ec2.disassociate_address(ip2)
|
533
546
|
|
@@ -543,5 +556,9 @@ USER_DATA
|
|
543
556
|
[group.name, name] <=> [s.group.name, s.name]
|
544
557
|
end
|
545
558
|
|
559
|
+
def new_secret
|
560
|
+
rand(2 ** 128).to_s(36)
|
561
|
+
end
|
562
|
+
|
546
563
|
end
|
547
564
|
end
|
data/lib/judo/snapshot.rb
CHANGED
@@ -17,7 +17,7 @@ module Judo
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def fetch_state
|
20
|
-
@base.sdb.get_attributes(
|
20
|
+
@base.sdb.get_attributes(@base.snapshot_domain, name)[:attributes]
|
21
21
|
end
|
22
22
|
|
23
23
|
def state
|
@@ -43,7 +43,7 @@ module Judo
|
|
43
43
|
devs = server.volumes.map do |dev,vol|
|
44
44
|
"#{dev}:#{@base.ec2.create_snapshot(vol)[:aws_id]}"
|
45
45
|
end
|
46
|
-
@base.sdb.put_attributes(
|
46
|
+
@base.sdb.put_attributes(@base.snapshot_domain, name, { "version" => server.version, "devs" => devs, "server" => server.name, "group" => server.group.name }, :replace)
|
47
47
|
server.add "snapshots", name
|
48
48
|
end
|
49
49
|
end
|
@@ -56,7 +56,7 @@ module Judo
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def delete
|
59
|
-
@base.sdb.delete_attributes(
|
59
|
+
@base.sdb.delete_attributes(@base.snapshot_domain, name)
|
60
60
|
server.remove "snapshots", name
|
61
61
|
end
|
62
62
|
|
@@ -98,7 +98,7 @@ module Judo
|
|
98
98
|
end
|
99
99
|
|
100
100
|
def fetch_state
|
101
|
-
@base.sdb.get_attributes(
|
101
|
+
@base.sdb.get_attributes(@base.snapshot_domain, name)[:attributes]
|
102
102
|
end
|
103
103
|
end
|
104
104
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 3
|
8
|
+
- 0
|
9
|
+
version: 0.3.0
|
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-18 00:00:00 -04:00
|
18
18
|
default_executable: judo
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|