judo 0.4.4 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/bin/judo +26 -58
- data/default/setup.sh +1 -1
- data/default/userdata.erb +0 -4
- data/lib/judo.rb +1 -1
- data/lib/judo/base.rb +90 -239
- data/lib/judo/cli_helpers.rb +157 -0
- data/lib/judo/group.rb +28 -56
- data/lib/judo/patch.rb +13 -0
- data/lib/judo/server.rb +42 -105
- data/lib/judo/snapshot.rb +11 -24
- metadata +8 -14
- data/TODO +0 -15
- data/lib/judo/commandline_helpers.rb +0 -144
- data/spec/base.rb +0 -21
- data/spec/base_spec.rb +0 -9
- data/spec/server_spec.rb +0 -9
data/lib/judo/snapshot.rb
CHANGED
@@ -1,14 +1,4 @@
|
|
1
1
|
module Judo
|
2
|
-
### sdb
|
3
|
-
### name {
|
4
|
-
### "version" => [ server.version ],
|
5
|
-
### "devs" => [ "/dev/sde1:snap-abc123", "/dev/sde2:snap-abc456" ],
|
6
|
-
### "server" => server.id
|
7
|
-
### "group" => server.group.name
|
8
|
-
### "virgin" => server.virgin
|
9
|
-
### "note" => server.note
|
10
|
-
### "data" => server.data
|
11
|
-
### "created_at" => unixtime
|
12
2
|
class Snapshot
|
13
3
|
attr_accessor :name, :server_id
|
14
4
|
|
@@ -46,12 +36,9 @@ module Judo
|
|
46
36
|
get("version").to_i
|
47
37
|
end
|
48
38
|
|
49
|
-
def
|
50
|
-
get("
|
51
|
-
|
52
|
-
|
53
|
-
def data
|
54
|
-
get("data")
|
39
|
+
def metadata
|
40
|
+
metadata_json = get("metadata_json")
|
41
|
+
JSON.load(metadata_json) if metadata_json
|
55
42
|
end
|
56
43
|
|
57
44
|
def virgin
|
@@ -72,26 +59,25 @@ module Judo
|
|
72
59
|
@base.sdb.put_attributes(@base.snapshot_domain, name, {
|
73
60
|
"version" => server.version,
|
74
61
|
"virgin" => server.virgin?,
|
75
|
-
"
|
76
|
-
"data" => server.data,
|
62
|
+
"metadata_json" => server.get("metadata_json"),
|
77
63
|
"devs" => devs,
|
78
64
|
"server" => server.id,
|
79
65
|
"group" => server.group.name,
|
80
66
|
"created_at" => Time.now.to_i.to_s
|
81
67
|
}, :replace)
|
82
|
-
server.add "snapshots", name
|
83
68
|
end
|
84
69
|
end
|
85
70
|
|
86
|
-
def animate(
|
71
|
+
def animate(new_server_name)
|
87
72
|
raise JudoError, "cannot animate, snapshotting not complete" unless completed?
|
88
|
-
@base.create_server(
|
73
|
+
@base.create_server(new_server_name, group_name,
|
74
|
+
:version => version, :snapshots => devs, :virgin => virgin,
|
75
|
+
:metadata => metadata , :clone => name, :instance_type => server.instance_type)
|
89
76
|
end
|
90
77
|
|
91
78
|
def delete
|
92
|
-
|
79
|
+
raise JudoError, "cannot delete, snapshotting not complete" unless completed?
|
93
80
|
@base.sdb.delete_attributes(@base.snapshot_domain, name)
|
94
|
-
server.remove("snapshots", name) if server
|
95
81
|
end
|
96
82
|
|
97
83
|
def get(key)
|
@@ -124,7 +110,8 @@ module Judo
|
|
124
110
|
end
|
125
111
|
|
126
112
|
def progress
|
127
|
-
|
113
|
+
min_percent = ec2_data.map { |s| s[:aws_progress].to_i }.min
|
114
|
+
"#{min_percent}%"
|
128
115
|
end
|
129
116
|
|
130
117
|
def size(snap_id)
|
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
|
+
- 5
|
8
|
+
- 0
|
9
|
+
version: 0.5.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-06-
|
17
|
+
date: 2010-06-11 00:00:00 -07:00
|
18
18
|
default_executable: judo
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -63,11 +63,9 @@ extensions: []
|
|
63
63
|
|
64
64
|
extra_rdoc_files:
|
65
65
|
- README.markdown
|
66
|
-
- TODO
|
67
66
|
files:
|
68
67
|
- README.markdown
|
69
68
|
- Rakefile
|
70
|
-
- TODO
|
71
69
|
- VERSION
|
72
70
|
- bin/judo
|
73
71
|
- default/config.json
|
@@ -76,13 +74,11 @@ files:
|
|
76
74
|
- default/userdata.erb
|
77
75
|
- lib/judo.rb
|
78
76
|
- lib/judo/base.rb
|
79
|
-
- lib/judo/
|
77
|
+
- lib/judo/cli_helpers.rb
|
80
78
|
- lib/judo/group.rb
|
79
|
+
- lib/judo/patch.rb
|
81
80
|
- lib/judo/server.rb
|
82
81
|
- lib/judo/snapshot.rb
|
83
|
-
- spec/base.rb
|
84
|
-
- spec/base_spec.rb
|
85
|
-
- spec/server_spec.rb
|
86
82
|
has_rdoc: true
|
87
83
|
homepage: http://github.com/orionz/judo
|
88
84
|
licenses: []
|
@@ -113,7 +109,5 @@ rubygems_version: 1.3.6
|
|
113
109
|
signing_key:
|
114
110
|
specification_version: 3
|
115
111
|
summary: The gentle way to manage and control ec2 instances
|
116
|
-
test_files:
|
117
|
-
|
118
|
-
- spec/base_spec.rb
|
119
|
-
- spec/server_spec.rb
|
112
|
+
test_files: []
|
113
|
+
|
data/TODO
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
### NEEDED for new gem launch
|
2
|
-
|
3
|
-
### [ ] round robin or specified availability_zone
|
4
|
-
### [ ] implement auto security_group creation and setup
|
5
|
-
### [ ] start and stop services in parallel
|
6
|
-
### [ ] retry volume creation timeout (happened once)
|
7
|
-
|
8
|
-
### MAYBE
|
9
|
-
### [ ] ebs backed root disk + start/stop
|
10
|
-
### [ ] two phase delete
|
11
|
-
### [ ] write specs
|
12
|
-
### [ ] store git commit hash with commit to block a judo commit if there is newer material stored
|
13
|
-
### [ ] use amazon's new conditional write tools so we never have problems from concurrent updates
|
14
|
-
### [ ] zerigo integration for automatic DNS setup
|
15
|
-
|
@@ -1,144 +0,0 @@
|
|
1
|
-
module JudoCommandLineHelpers
|
2
|
-
|
3
|
-
def each_server(judo, args, &blk)
|
4
|
-
raise JudoError, "No servers specified - use :all for all servers" if args.empty?
|
5
|
-
servers = judo.find_servers_by_name_or_groups_with_not(args)
|
6
|
-
servers.each do |server|
|
7
|
-
begin
|
8
|
-
blk.call(server)
|
9
|
-
rescue JudoInvalid => e
|
10
|
-
puts "#{server} - #{e.message}"
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def mk_server_names(judo, args, &blk)
|
16
|
-
args.each do |arg|
|
17
|
-
name,group = arg.split(":")
|
18
|
-
raise JudoError, "You must specify a group on create and launch" unless group
|
19
|
-
names = if name =~ /^[12345]$/
|
20
|
-
(1..(name.to_i)).each do
|
21
|
-
blk.call(judo.mk_server_name(group), group)
|
22
|
-
end
|
23
|
-
elsif name == ""
|
24
|
-
blk.call(judo.mk_server_name(group), group)
|
25
|
-
elsif name =~ /^\d+$/
|
26
|
-
raise JudoError, "You can batch-create between 1 and 5 servers" if count < 1 or count > 5
|
27
|
-
else
|
28
|
-
blk.call(name, group)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def mk_groups(judo, args, &blk)
|
34
|
-
args.each do |name|
|
35
|
-
if name =~ /:(.+)$/
|
36
|
-
blk.call(judo.get_group($1))
|
37
|
-
else
|
38
|
-
raise JudoError, "Invalid group name '#{name}'"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def mk_servers(judo, options, args, start)
|
44
|
-
mk_server_names(judo, args) do |name, group|
|
45
|
-
begin
|
46
|
-
server = judo.create_server(name, group, options)
|
47
|
-
server.start(options) if start
|
48
|
-
rescue JudoInvalid => e
|
49
|
-
puts "#{server} - #{e.message}"
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def do_groups(judo)
|
55
|
-
printf " SERVER GROUPS\n"
|
56
|
-
judo.groups.each do |g|
|
57
|
-
printf "%-18s %s servers\n", g.name, g.servers.size
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def do_volumes(judo)
|
62
|
-
vols = judo.volumes.sort { |a,b| [ a[:assigned_to].to_s, a[:instance_id].to_s ] <=> [ b[:assigned_to].to_s, b[:instance_id].to_s ] }
|
63
|
-
|
64
|
-
format = "%13s %6s %12s %-10s %-16s %-16s\n"
|
65
|
-
printf format, "AWS_ID", "SIZE", "AWS_STATUS", "AWS_DEVICE", "ATTACHED TO", "CONFIGURED FOR"
|
66
|
-
printf "%s\n", ("-" * 80)
|
67
|
-
|
68
|
-
vols.each do |v|
|
69
|
-
attached = v[:attached_to] ? v[:attached_to].name : v[:instance_id]
|
70
|
-
assigned = v[:assigned_to] ? v[:assigned_to].name : ""
|
71
|
-
printf format, v[:id], v[:size], v[:status], v[:device], attached, assigned
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def do_ips(judo)
|
76
|
-
ips = judo.ips.sort { |a,b| a[:assigned_to].to_s <=> b[:assigned_to].to_s }
|
77
|
-
|
78
|
-
format = "%15s %20s %20s\n"
|
79
|
-
printf format, "IP", "ATTACHED TO", "CONFIGURED FOR"
|
80
|
-
printf "%s\n", ("-"*57)
|
81
|
-
|
82
|
-
ips.each do |ip|
|
83
|
-
attached = ip[:attached_to] ? ip[:attached_to].name : ip[:instance_id]
|
84
|
-
assigned = ip[:assigned_to] ? ip[:assigned_to].name : ""
|
85
|
-
printf format, ip[:ip], attached, assigned
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def do_snapshots(judo, args)
|
90
|
-
printf " SNAPSHOTS\n"
|
91
|
-
printf "%s\n", ("-" * 80)
|
92
|
-
judo.snapshots.each do |snapshot|
|
93
|
-
printf "%-15s %-25s %-15s %-10s %s\n", snapshot.name, snapshot.server_name, snapshot.group_name, snapshot.version_desc, "ebs:#{snapshot.ec2_ids.size}"
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def do_list(judo, args)
|
98
|
-
printf " SERVERS\n"
|
99
|
-
printf "%s\n", ("-" * 80)
|
100
|
-
args << ":all" if args.empty?
|
101
|
-
each_server(judo,args) do |s|
|
102
|
-
printf "%-32s %-12s %-7s %-11s %-11s %-10s %-3s %s\n", s.name, s.group.name, s.version_desc, s.get("instance_id"), s.size_desc, s.ec2_state, "ebs:#{s.volumes.keys.size}", s.has_ip? ? "ip" : ""
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
def sub_info(header, data, &block)
|
107
|
-
return if data == []
|
108
|
-
return if data == {}
|
109
|
-
return if data.nil?
|
110
|
-
puts " [ #{header} ]"
|
111
|
-
[ data ].flatten.each do |d|
|
112
|
-
block.call(d)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
def do_info(judo, server)
|
117
|
-
puts "[ #{server} ]"
|
118
|
-
printf " %-24s: %s\n", "ID", server.id
|
119
|
-
printf " %-24s: %s\n", "Group", server.group.name
|
120
|
-
printf " %-24s: %s\n", "Note", server.note if server.note
|
121
|
-
printf " %-24s: %s\n", "Animated From", server.clone if server.clone
|
122
|
-
printf " %-24s: %s\n", "Elastic Ip", server.elastic_ip if server.elastic_ip
|
123
|
-
sub_info("EC2", server.ec2_instance) do |i|
|
124
|
-
[:aws_instance_id, :ssh_key_name, :aws_availability_zone, :aws_state, :aws_image_id, :dns_name, :aws_instance_type, :private_dns_name, :aws_launch_time, :aws_groups ].each do |k|
|
125
|
-
printf " %-24s: %s\n",k, i[k]
|
126
|
-
end
|
127
|
-
end
|
128
|
-
sub_info("METADATA", server.metadata.keys) do |key|
|
129
|
-
printf(" %-24s: %s\n", key, server.metadata[key] )
|
130
|
-
end
|
131
|
-
sub_info("VOLUMES", server.ec2_volumes) do |v|
|
132
|
-
printf " %-13s %-10s %-10s %4d %-10s %-8s\n",
|
133
|
-
v[:aws_id],
|
134
|
-
v[:aws_status],
|
135
|
-
v[:zone],
|
136
|
-
v[:aws_size],
|
137
|
-
v[:aws_attachment_status],
|
138
|
-
v[:aws_device]
|
139
|
-
end
|
140
|
-
sub_info("SNAPSHOTS", server.snapshots) do |s|
|
141
|
-
printf " %-10s %-15s %-8s %-5s\n", s.name, s.group_name, s.version_desc, "#{s.ec2_ids.size}v"
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
data/spec/base.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../lib/judo'
|
2
|
-
|
3
|
-
require 'bacon'
|
4
|
-
require 'mocha/standalone'
|
5
|
-
require 'mocha/object'
|
6
|
-
|
7
|
-
class Bacon::Context
|
8
|
-
include Mocha::API
|
9
|
-
|
10
|
-
def initialize(name, &block)
|
11
|
-
@name = name
|
12
|
-
@before, @after = [
|
13
|
-
[lambda { mocha_setup }],
|
14
|
-
[lambda { mocha_verify ; mocha_teardown }]
|
15
|
-
]
|
16
|
-
@block = block
|
17
|
-
end
|
18
|
-
|
19
|
-
def xit(desc, &bk)
|
20
|
-
end
|
21
|
-
end
|
data/spec/base_spec.rb
DELETED