judo 0.3.6 → 0.3.7
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/Rakefile +1 -1
- data/TODO +0 -1
- data/VERSION +1 -1
- data/bin/judo +11 -13
- data/default/config.json +8 -0
- data/default/setup.sh +3 -0
- data/default/userdata.erb +37 -0
- data/lib/judo.rb +1 -0
- data/lib/judo/base.rb +11 -28
- data/lib/judo/commandline_helpers.rb +3 -13
- data/lib/judo/group.rb +32 -95
- data/lib/judo/server.rb +75 -40
- metadata +6 -3
data/Rakefile
CHANGED
@@ -8,7 +8,7 @@ Jeweler::Tasks.new do |s|
|
|
8
8
|
s.email = "orion@heroku.com"
|
9
9
|
s.homepage = "http://github.com/orionz/judo"
|
10
10
|
s.rubyforge_project = "judo"
|
11
|
-
s.files = FileList["[A-Z]*", "{bin,lib,spec}/**/*"]
|
11
|
+
s.files = FileList["[A-Z]*", "{bin,default,lib,spec}/**/*"]
|
12
12
|
s.executables = %w(judo)
|
13
13
|
s.add_dependency "aws", [">= 2.3.8"]
|
14
14
|
s.add_dependency "json"
|
data/TODO
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.7
|
data/bin/judo
CHANGED
@@ -10,9 +10,7 @@ defaults = Judo::Base.default_options(Dir.pwd)
|
|
10
10
|
|
11
11
|
options = {}
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
ARGV.unshift "-h" unless action
|
13
|
+
ARGV.unshift "-h" if ARGV.size == 0
|
16
14
|
|
17
15
|
optparse = OptionParser.new do|opts|
|
18
16
|
opts.banner = <<banner
|
@@ -70,14 +68,16 @@ banner
|
|
70
68
|
opts.on( '-r', '--repo DIR', 'Specify the location of the repo dir' ) do |dir|
|
71
69
|
options[:repo] = dir
|
72
70
|
end
|
73
|
-
opts.on( '-D', '--data DATA', 'Specify an instance specific string to be used during boot on create or launch' ) do |data|
|
74
|
-
options[:data] = data
|
75
|
-
end
|
76
71
|
opts.on( '-t', '--type TYPE', 'Specify an instance type different from the config on server start' ) do |type|
|
77
72
|
options[:instance_type] = type
|
78
73
|
end
|
79
|
-
opts.on( '-
|
80
|
-
|
74
|
+
opts.on( '-D', '--data KEY=VALUE', 'Specify metadata to attach to a server at creation time' ) do |data|
|
75
|
+
key,value = data.split("=")
|
76
|
+
(options[:metadata] ||= {})[key] = value
|
77
|
+
end
|
78
|
+
opts.on( '-B', '--boot KEY=VALUE', 'Specify special boot parameters' ) do |data|
|
79
|
+
key,value = data.split("=")
|
80
|
+
(options[:boot] ||= {})[key] = value
|
81
81
|
end
|
82
82
|
opts.on( '-i', '--ip IP', 'Specify an exsiting elastic_ip address on server creation' ) do |ip|
|
83
83
|
options[:elastic_ip] = ip
|
@@ -104,9 +104,6 @@ banner
|
|
104
104
|
opts.on( '-g', '--group GROUP', 'Specify the default group of the repo dir' ) do |group|
|
105
105
|
options[:group] = group
|
106
106
|
end
|
107
|
-
opts.on( '-n', '--note NOTE', 'Add a note to a server as you create or launch it') do |note|
|
108
|
-
options[:note] = note
|
109
|
-
end
|
110
107
|
opts.on( '-v', '--version VERSION', 'Update the servers config version on create/start/launch' ) do |version|
|
111
108
|
options[:version] = version
|
112
109
|
end
|
@@ -118,6 +115,7 @@ end
|
|
118
115
|
|
119
116
|
optparse.parse!
|
120
117
|
|
118
|
+
action = ARGV.shift
|
121
119
|
judo = Judo::Base.new(defaults.merge(options))
|
122
120
|
judo.check_version if action != "setup"
|
123
121
|
|
@@ -141,7 +139,7 @@ begin
|
|
141
139
|
when "snapshots" then do_snapshots(judo, ARGV)
|
142
140
|
when "config" then
|
143
141
|
puts "Judo DB Version: #{judo.db_version}"
|
144
|
-
puts "Judo
|
142
|
+
puts "Judo Key Pair: #{judo.key_name}"
|
145
143
|
puts "Judo Bucket: #{judo.bucket_name}"
|
146
144
|
when "rename" then
|
147
145
|
raise JudoError, "usage: judo rename SERVER SERVER" unless ARGV.size == 2
|
@@ -174,7 +172,7 @@ begin
|
|
174
172
|
snapshot.animate(new_server).start(options)
|
175
173
|
when "destroy" then
|
176
174
|
raise JudoError, "You must specify what servers to destroy" if ARGV.empty?
|
177
|
-
|
175
|
+
find_servers(judo, ARGV) do |i|
|
178
176
|
i.destroy
|
179
177
|
end
|
180
178
|
else
|
data/default/config.json
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
{
|
2
|
+
"ami32":"ami-2d4aa444", // public ubuntu 10.04 ami - 32 bit
|
3
|
+
"ami64":"ami-fd4aa494", // public ubuntu 10.04 ami - 64 bit
|
4
|
+
"user":"ubuntu", // this is for ssh acccess - defaults to ubuntu not root
|
5
|
+
"security_group":"judo",
|
6
|
+
"my_data": "world world",
|
7
|
+
"availability_zone":"us-east-1d"
|
8
|
+
}
|
data/default/setup.sh
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
<%
|
3
|
+
|
4
|
+
## the variables available for use in the erb are as follows
|
5
|
+
|
6
|
+
## id - this is random string that uniqily identifies the server for its lifetime
|
7
|
+
## name - the name of the server
|
8
|
+
## group_name - the name of group the server is in
|
9
|
+
## domain - this is the JUDO_DOMAIN currently running
|
10
|
+
## secret - this is a 128bit random string assigned to an instance at creation time - great for passwords
|
11
|
+
## metadata - a hash of metadata associated with the server with --data KEY=VALUE
|
12
|
+
## boot - a hash of boot options passed to the server with --boot KEY=VALUE
|
13
|
+
## first_boot? - is set to true or false depending on if this is the instance's first boot
|
14
|
+
## url - the URL to the group verson file in the s3 bucket
|
15
|
+
|
16
|
+
%>
|
17
|
+
|
18
|
+
export JUDO_ID='<%= id %>'
|
19
|
+
export JUDO_NAME='<%= name %>'
|
20
|
+
export JUDO_DOMAIN='<%= domain %>'
|
21
|
+
export JUDO_SECRET='<%= secret %>'
|
22
|
+
export JUDO_FIRST_BOOT='<%= first_boot? %>'
|
23
|
+
|
24
|
+
export DEBIAN_FRONTEND="noninteractive"
|
25
|
+
export DEBIAN_PRIORITY="critical"
|
26
|
+
apt-get update
|
27
|
+
apt-get install -y ruby rubygems ruby-dev irb libopenssl-ruby libreadline-ruby
|
28
|
+
|
29
|
+
cd /tmp/ ; curl --silent '<%= url %>' | tar xvz ; cd <%= group_name %>
|
30
|
+
|
31
|
+
gem install kuzushi --no-rdoc --no-ri --version
|
32
|
+
echo 'export PATH=`ruby -r rubygems -e "puts Gem.bindir"`:$PATH' >> /etc/profile ; . /etc/profile
|
33
|
+
export LOG=/var/log/kuzushi.log
|
34
|
+
|
35
|
+
kuzushi-setup >> $LOG ## this will properly mount / configure and formal all ebs drives
|
36
|
+
bash setup.sh >> $LOG
|
37
|
+
|
data/lib/judo.rb
CHANGED
data/lib/judo/base.rb
CHANGED
@@ -1,27 +1,3 @@
|
|
1
|
-
|
2
|
-
=begin
|
3
|
-
module Aws
|
4
|
-
class Ec2
|
5
|
-
API_VERSION = "2009-11-30" ## this didnt work
|
6
|
-
def start_instances(instance_id)
|
7
|
-
link = generate_request("StartInstances", { 'InstanceId' => instance_id } )
|
8
|
-
request_info(link, QEc2TerminateInstancesParser.new(:logger => @logger))
|
9
|
-
rescue Exception
|
10
|
-
on_exception
|
11
|
-
end
|
12
|
-
|
13
|
-
def stop_instances(instance_id)
|
14
|
-
link = generate_request("StopInstances", { 'InstanceId' => instance_id } )
|
15
|
-
puts link.inspect
|
16
|
-
result = request_info(link, QEc2TerminateInstancesParser.new(:logger => @logger))
|
17
|
-
puts result.inspect
|
18
|
-
rescue Exception
|
19
|
-
on_exception
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
=end
|
24
|
-
|
25
1
|
module Judo
|
26
2
|
class Base
|
27
3
|
attr_accessor :judo_dir, :repo, :group, :domain
|
@@ -162,9 +138,17 @@ module Judo
|
|
162
138
|
rand(2**32).to_s(36)
|
163
139
|
end
|
164
140
|
|
141
|
+
def default_group_dir
|
142
|
+
File.expand_path(File.dirname(__FILE__) + "/../../default")
|
143
|
+
end
|
144
|
+
|
145
|
+
def default_file(name)
|
146
|
+
"#{default_group_dir}/#{name}"
|
147
|
+
end
|
148
|
+
|
165
149
|
def mk_server_name(group)
|
166
150
|
index = servers.map { |s| (s.name =~ /^#{s.group.name}.(\d*)$/); $1.to_i }.sort.last.to_i + 1
|
167
|
-
"#{group
|
151
|
+
"#{group}.#{index}"
|
168
152
|
end
|
169
153
|
|
170
154
|
def create_server(name, group, options)
|
@@ -452,9 +436,8 @@ module Judo
|
|
452
436
|
def default_config
|
453
437
|
<<DEFAULT
|
454
438
|
{
|
455
|
-
"
|
456
|
-
"
|
457
|
-
"ami64":"ami-55739e3c", // public ubuntu 9.10 ami - 64 bit
|
439
|
+
"ami32":"ami-2d4aa444", // public ubuntu 10.04 ami - 32 bit
|
440
|
+
"ami64":"ami-fd4aa494", // public ubuntu 10.04 ami - 64 bit
|
458
441
|
"user":"ubuntu",
|
459
442
|
"security_group":"judo",
|
460
443
|
"availability_zone":"us-east-1d"
|
@@ -46,19 +46,6 @@ module JudoCommandLineHelpers
|
|
46
46
|
servers.flatten.each { |s| judo_yield(s, blk) if blk }
|
47
47
|
end
|
48
48
|
|
49
|
-
def find_either(judo, args, &blk)
|
50
|
-
results = []
|
51
|
-
args.each do |arg|
|
52
|
-
server,group = split(arg)
|
53
|
-
if server != ""
|
54
|
-
results << judo.servers.select { |s| s.name == server }
|
55
|
-
else
|
56
|
-
results << judo.groups.select { |g| g.name == group }
|
57
|
-
end
|
58
|
-
end
|
59
|
-
results.flatten.each { |i| judo_yield(i, blk) if blk }
|
60
|
-
end
|
61
|
-
|
62
49
|
def find_servers(judo, args, use_default = true, &blk)
|
63
50
|
servers = judo.servers if args.empty?
|
64
51
|
servers ||= args.map { |a| find_server(judo, a, use_default) }.flatten
|
@@ -161,6 +148,9 @@ module JudoCommandLineHelpers
|
|
161
148
|
printf " %-24s: %s\n",k, i[k]
|
162
149
|
end
|
163
150
|
end
|
151
|
+
sub_info("METADATA", server.metadata.keys) do |key|
|
152
|
+
printf(" %-24s: %s\n", key, server.metadata[key] )
|
153
|
+
end
|
164
154
|
sub_info("VOLUMES", server.ec2_volumes) do |v|
|
165
155
|
printf " %-13s %-10s %-10s %4d %-10s %-8s\n",
|
166
156
|
v[:aws_id],
|
data/lib/judo/group.rb
CHANGED
@@ -8,12 +8,12 @@ module Judo
|
|
8
8
|
@version = version
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
@
|
11
|
+
def userdata(version)
|
12
|
+
(@userdata ||= {})[version] ||= load_userdata(version)
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
16
|
-
@
|
15
|
+
def config(version)
|
16
|
+
(@config ||= {})[version] ||= load_config(version)
|
17
17
|
end
|
18
18
|
|
19
19
|
def server_ids
|
@@ -24,8 +24,14 @@ module Judo
|
|
24
24
|
@base.servers.select { |s| server_ids.include?(s.name) }
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
28
|
-
|
27
|
+
def load_userdata(version)
|
28
|
+
@base.s3_get(version_userdata_file(version))
|
29
|
+
rescue Aws::AwsError
|
30
|
+
raise JudoError, "No userdata stored: try 'judo commit #{to_s}'"
|
31
|
+
end
|
32
|
+
|
33
|
+
def load_config(version)
|
34
|
+
JSON.load @base.s3_get(version_config_file(version))
|
29
35
|
rescue Aws::AwsError
|
30
36
|
raise JudoError, "No config stored: try 'judo commit #{to_s}'"
|
31
37
|
end
|
@@ -35,41 +41,34 @@ module Judo
|
|
35
41
|
end
|
36
42
|
|
37
43
|
def compile
|
38
|
-
tmpdir = "/tmp/kuzushi/#{name}"
|
39
44
|
@base.task("Compiling #{self} version #{version + 1}") do
|
40
45
|
@version = @version + 1
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
Dir.chdir(
|
45
|
-
attachments(new_config).each do |to,from|
|
46
|
-
FileUtils.mkdir_p(File.dirname(to))
|
47
|
-
if from =~ /^http:\/\//
|
48
|
-
# puts "curl '#{from}'"
|
49
|
-
system "curl '#{from}' > #{to}"
|
50
|
-
# puts "#{to} is #{File.stat(to).size} bytes"
|
51
|
-
else
|
52
|
-
FileUtils.cp(from,to)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
File.open("config.json", "w") { |f| f.write(new_config.to_json) }
|
56
|
-
Dir.chdir("..") do
|
46
|
+
raise JudoError, "can not find group folder #{dir}" unless File.exists?(dir)
|
47
|
+
conf = JSON.parse(read_file('config.json'))
|
48
|
+
raise JudoError, "config option 'import' no longer supported" if conf["import"]
|
49
|
+
Dir.chdir(@base.repo) do |d|
|
57
50
|
puts ""
|
58
51
|
system "tar czvf #{tar_file} #{name}"
|
59
52
|
puts "Uploading config to s3..."
|
60
|
-
@base.s3_put(version_config_file,
|
53
|
+
@base.s3_put(version_config_file(@version), conf.to_json)
|
54
|
+
puts "Uploading userdata.erb to s3..."
|
55
|
+
@base.s3_put(version_userdata_file(@version), read_file('userdata.erb'))
|
61
56
|
puts "Uploading tar file to s3..."
|
62
57
|
@base.s3_put(tar_file, File.new(tar_file).read(File.stat(tar_file).size))
|
63
|
-
|
58
|
+
File.delete(tar_file)
|
64
59
|
end
|
65
60
|
set_version
|
66
61
|
end
|
67
62
|
end
|
68
63
|
|
69
|
-
def version_config_file
|
64
|
+
def version_config_file(version)
|
70
65
|
"#{name}.#{version}.json"
|
71
66
|
end
|
72
67
|
|
68
|
+
def version_userdata_file(version)
|
69
|
+
"#{name}.#{version}.erb"
|
70
|
+
end
|
71
|
+
|
73
72
|
def tar_file
|
74
73
|
"#{name}.#{version}.tar.gz"
|
75
74
|
end
|
@@ -78,66 +77,6 @@ module Judo
|
|
78
77
|
@url = @base.s3_url(tar_file)
|
79
78
|
end
|
80
79
|
|
81
|
-
def cp_file
|
82
|
-
FileUtil.mkdir_p(tmpdir)
|
83
|
-
end
|
84
|
-
|
85
|
-
def extract_file(type, name, files)
|
86
|
-
path = "#{dir}/#{type}s/#{name}"
|
87
|
-
found = Dir[path]
|
88
|
-
if not found.empty?
|
89
|
-
found.each { |f| files["#{type}s/#{File.basename(f)}"] = f }
|
90
|
-
elsif parent
|
91
|
-
parent.extract_file(type, name, files)
|
92
|
-
else
|
93
|
-
raise "Cannot find file #{name} of type #{type}"
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def extract(config, files)
|
98
|
-
config.each do |key,value|
|
99
|
-
[value].flatten.each do |v| ### cover "packages" : ["a","b"], "packages" : "a", "packages":[{ "file" : "foo.pkg"}]
|
100
|
-
if v.is_a? Hash
|
101
|
-
extract(v, files)
|
102
|
-
else
|
103
|
-
case key
|
104
|
-
when *[ "init", "before", "after" ]
|
105
|
-
extract_file(:script, v, files) unless v =~ /^#!/
|
106
|
-
when "package"
|
107
|
-
files["packages/#{v}_i386.deb"] = "#{config["source"]}#{v}_i386.deb"
|
108
|
-
files["packages/#{v}_amd64.deb"] = "#{config["source"]}#{v}_amd64.deb"
|
109
|
-
when "local_packages"
|
110
|
-
extract_file(:package, "#{v}_i386.deb", files)
|
111
|
-
extract_file(:package, "#{v}_amd64.deb", files)
|
112
|
-
when "git"
|
113
|
-
## do nothing - is a remote
|
114
|
-
when "template"
|
115
|
-
extract_file(:template, v, files)
|
116
|
-
when "source"
|
117
|
-
extract_file(:file, v, files) unless config["template"] or config["package"]
|
118
|
-
when "file"
|
119
|
-
## this is getting messy
|
120
|
-
extract_file(:file, File.basename(v), files) unless config["template"] or config["source"] or config["git"]
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
files
|
126
|
-
end
|
127
|
-
|
128
|
-
def attachments(c = config)
|
129
|
-
extract(c, {})
|
130
|
-
end
|
131
|
-
|
132
|
-
def raw_config
|
133
|
-
@raw_config ||= read_config
|
134
|
-
end
|
135
|
-
|
136
|
-
def parent
|
137
|
-
@parent ||= @base.groups.detect { |p| p.name == raw_config["import"] }
|
138
|
-
(@parent ||= Judo::Group.new(@base, raw_config["import"], 0 )) if raw_config["import"] ## make a mock incase the parent was never committed
|
139
|
-
@parent
|
140
|
-
end
|
141
80
|
|
142
81
|
def destroy
|
143
82
|
servers.each { |s| s.destroy }
|
@@ -148,22 +87,20 @@ module Judo
|
|
148
87
|
end
|
149
88
|
end
|
150
89
|
|
151
|
-
def all_configs
|
152
|
-
parent ? parent.all_configs.clone.unshift(raw_config) : [ raw_config ]
|
153
|
-
end
|
154
|
-
|
155
90
|
def dir
|
156
91
|
"#{@base.repo}/#{name}/"
|
157
92
|
end
|
158
93
|
|
159
|
-
def
|
160
|
-
|
94
|
+
def default_userdata_file
|
95
|
+
File.expand_path(File.dirname(__FILE__) + "/../../default/userdata.erb")
|
161
96
|
end
|
162
97
|
|
163
|
-
def
|
164
|
-
|
98
|
+
def read_file(name)
|
99
|
+
File.read("#{dir}/#{name}")
|
165
100
|
rescue Errno::ENOENT
|
166
|
-
|
101
|
+
default = @base.default_file(name)
|
102
|
+
puts "File #{name} not found: using #{default} instead"
|
103
|
+
File.read default
|
167
104
|
end
|
168
105
|
|
169
106
|
def delete_server(server)
|
data/lib/judo/server.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
module Judo
|
2
2
|
class Server
|
3
|
-
attr_accessor :id
|
3
|
+
attr_accessor :id
|
4
4
|
|
5
5
|
def initialize(base, id, group, version = nil)
|
6
6
|
@base = base
|
7
7
|
@id = id
|
8
|
-
@
|
8
|
+
@group = group
|
9
|
+
@judo_domain = base.domain
|
9
10
|
end
|
10
11
|
|
11
12
|
def create(name, options)
|
@@ -14,8 +15,7 @@ module Judo
|
|
14
15
|
options[:virgin] = true if options[:virgin].nil?
|
15
16
|
|
16
17
|
snapshots = options[:snapshots]
|
17
|
-
|
18
|
-
data = options[:data] ## instance specific data passed in JUDO_DATA
|
18
|
+
metadata = options[:metadata]
|
19
19
|
ip = options[:elastic_ip] ## if the ip was allocated beforehand
|
20
20
|
virgin = options[:virgin] ## should the server init?
|
21
21
|
clone = options[:clone] ## if it was cloned from a snapshot
|
@@ -27,11 +27,11 @@ module Judo
|
|
27
27
|
raise JudoError, "there is already a server with id #{id}" if @base.servers.detect { |s| s.id == id and s != self}
|
28
28
|
|
29
29
|
task("Creating server #{name}") do
|
30
|
-
update
|
31
|
-
"
|
30
|
+
update("name" => name, "group" => group_name,
|
31
|
+
"virgin" => virgin, "elastic_ip" => ip,
|
32
32
|
"secret" => new_secret, "version" => version,
|
33
|
-
"
|
34
|
-
|
33
|
+
"clone" => clone, "created_at" => Time.now.to_i)
|
34
|
+
set_metadata(metadata) if metadata
|
35
35
|
@base.sdb.put_attributes(@base.base_domain, "groups", group_name => id)
|
36
36
|
end
|
37
37
|
|
@@ -41,8 +41,37 @@ module Judo
|
|
41
41
|
self
|
42
42
|
end
|
43
43
|
|
44
|
+
def set_metadata(new_metadata)
|
45
|
+
puts new_metadata.inspect
|
46
|
+
clean_metadata = new_metadata.inject({}) { |buf,(k,v)|
|
47
|
+
puts [ buf, k , v ].inspect
|
48
|
+
buf[k.to_s] = v.to_s; buf }
|
49
|
+
puts clean_metadata.inspect
|
50
|
+
keys_to_remove = clean_metadata.keys - clean_metadata.keys
|
51
|
+
@metadata = clean_metadata
|
52
|
+
update encode_metadata(clean_metadata) unless clean_metadata.empty?
|
53
|
+
keys_to_remove.each { |key| remove key }
|
54
|
+
end
|
55
|
+
|
56
|
+
def encode_metadata(data)
|
57
|
+
data.inject({}) { |buf,(key,value)| buf["metadata_#{key.to_s}"] = [value].to_json; buf }
|
58
|
+
end
|
59
|
+
|
60
|
+
def metadata
|
61
|
+
@metadata ||= get_metadata
|
62
|
+
end
|
63
|
+
|
64
|
+
def get_metadata
|
65
|
+
state.inject({}) do |buf,(key,value)|
|
66
|
+
if key =~ /^metadata_(.*)/
|
67
|
+
buf[$1] = JSON.load(value.first)
|
68
|
+
end
|
69
|
+
buf
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
44
73
|
def group
|
45
|
-
@
|
74
|
+
@group_obj ||= @base.groups.detect { |g| g.name == @group }
|
46
75
|
end
|
47
76
|
|
48
77
|
def fetch_state
|
@@ -53,10 +82,6 @@ module Judo
|
|
53
82
|
@base.servers_state[id] ||= fetch_state
|
54
83
|
end
|
55
84
|
|
56
|
-
def get(key)
|
57
|
-
state[key] && [state[key]].flatten.first
|
58
|
-
end
|
59
|
-
|
60
85
|
def created_at
|
61
86
|
Time.at(get("created_at").to_i)
|
62
87
|
end
|
@@ -125,6 +150,10 @@ module Judo
|
|
125
150
|
!!clone
|
126
151
|
end
|
127
152
|
|
153
|
+
def first_boot?
|
154
|
+
virgin?
|
155
|
+
end
|
156
|
+
|
128
157
|
def virgin?
|
129
158
|
get("virgin").to_s == "true" ## I'm going to set it to true and it will come back from the db as "true" -> could be "false" or false or nil also
|
130
159
|
end
|
@@ -141,6 +170,12 @@ module Judo
|
|
141
170
|
(state["volumes"] || []).inject({}) { |out, kv| k, v = kv.split(':'); out[k] = v; out }
|
142
171
|
end
|
143
172
|
|
173
|
+
######## begin simple DB access #######
|
174
|
+
|
175
|
+
def get(key)
|
176
|
+
state[key] && [state[key]].flatten.first
|
177
|
+
end
|
178
|
+
|
144
179
|
def update(attrs)
|
145
180
|
@base.sdb.put_attributes(@base.server_domain, id, attrs, :replace)
|
146
181
|
state.merge! attrs
|
@@ -170,11 +205,11 @@ module Judo
|
|
170
205
|
|
171
206
|
def instance_type
|
172
207
|
## need instance_size to be backward compatible - needed for configs made before v 0.3.0
|
173
|
-
get("instance_type") || config["instance_type"] || config["instance_size"]
|
208
|
+
get("instance_type") || config["instance_type"] || config["instance_size"] || "m1.small"
|
174
209
|
end
|
175
210
|
|
176
211
|
def config
|
177
|
-
group.config
|
212
|
+
group.config(version)
|
178
213
|
end
|
179
214
|
|
180
215
|
def to_s
|
@@ -295,6 +330,7 @@ module Judo
|
|
295
330
|
end
|
296
331
|
|
297
332
|
def start(options = {})
|
333
|
+
@boot= options[:boot]
|
298
334
|
new_version = options[:version]
|
299
335
|
set_instance_type(options[:instance_type]) if options[:instance_type]
|
300
336
|
|
@@ -302,7 +338,7 @@ module Judo
|
|
302
338
|
invalid "No config has been commited yet, type 'judo commit'" unless group.version > 0
|
303
339
|
|
304
340
|
task("Updating server version") { update_version(options[:version]) } if options[:version]
|
305
|
-
task("Starting server #{name}") { launch_ec2
|
341
|
+
task("Starting server #{name}") { launch_ec2 }
|
306
342
|
task("Wait for server") { wait_for_running } if elastic_ip or has_volumes?
|
307
343
|
task("Attaching ip") { attach_ip } if elastic_ip
|
308
344
|
task("Attaching volumes") { attach_volumes } if has_volumes?
|
@@ -344,11 +380,11 @@ module Judo
|
|
344
380
|
update "stopped_at" => Time.now.to_i
|
345
381
|
end
|
346
382
|
|
347
|
-
def launch_ec2
|
383
|
+
def launch_ec2
|
348
384
|
# validate
|
349
385
|
|
350
386
|
## EC2 launch_instances
|
351
|
-
ud = user_data
|
387
|
+
ud = user_data
|
352
388
|
debug(ud)
|
353
389
|
result = @base.ec2.launch_instances(ami,
|
354
390
|
:instance_type => instance_type,
|
@@ -361,7 +397,9 @@ module Judo
|
|
361
397
|
|
362
398
|
def debug(str)
|
363
399
|
return unless ENV['JUDO_DEBUG'] == "1"
|
364
|
-
puts "<
|
400
|
+
puts "<DEBUG>"
|
401
|
+
puts str
|
402
|
+
puts "</DEBUG>"
|
365
403
|
end
|
366
404
|
|
367
405
|
def security_groups
|
@@ -516,29 +554,18 @@ module Judo
|
|
516
554
|
@base.servers_state.delete(id)
|
517
555
|
end
|
518
556
|
|
519
|
-
def user_data
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
export DEBIAN_FRONTEND="noninteractive"
|
524
|
-
export DEBIAN_PRIORITY="critical"
|
525
|
-
export JUDO_ID='#{id}'
|
526
|
-
export JUDO_NAME='#{name}'
|
527
|
-
export JUDO_DOMAIN='#{@base.domain}'
|
528
|
-
export JUDO_BOOT='#{judo_boot}'
|
529
|
-
export JUDO_DATA='#{data}'
|
530
|
-
export SECRET='#{secret}'
|
531
|
-
apt-get update
|
532
|
-
apt-get install ruby rubygems ruby-dev irb libopenssl-ruby libreadline-ruby -y
|
533
|
-
gem install kuzushi --no-rdoc --no-ri
|
534
|
-
GEM_BIN=`ruby -r rubygems -e "puts Gem.bindir"`
|
535
|
-
echo "$GEM_BIN/kuzushi #{virgin? && "init" || "start"} '#{url}'" > /var/log/kuzushi.log
|
536
|
-
$GEM_BIN/kuzushi #{virgin? && "init" || "start"} '#{url}' >> /var/log/kuzushi.log 2>&1
|
537
|
-
USER_DATA
|
557
|
+
def user_data
|
558
|
+
erb = group.userdata(version)
|
559
|
+
debug erb
|
560
|
+
ERB.new(erb, 0, '<>').result(binding)
|
538
561
|
end
|
539
562
|
|
540
563
|
def url
|
541
|
-
|
564
|
+
group.s3_url
|
565
|
+
end
|
566
|
+
|
567
|
+
def domain
|
568
|
+
@base.domain
|
542
569
|
end
|
543
570
|
|
544
571
|
def validate
|
@@ -596,12 +623,20 @@ USER_DATA
|
|
596
623
|
end
|
597
624
|
|
598
625
|
def <=>(s)
|
599
|
-
[group.
|
626
|
+
[group.to_s, name.to_s] <=> [s.group.to_s, s.name.to_s]
|
600
627
|
end
|
601
628
|
|
602
629
|
def new_secret
|
603
630
|
rand(2 ** 128).to_s(36)
|
604
631
|
end
|
605
632
|
|
633
|
+
def group_name
|
634
|
+
@group
|
635
|
+
end
|
636
|
+
|
637
|
+
def boot
|
638
|
+
@boot || {}
|
639
|
+
end
|
640
|
+
|
606
641
|
end
|
607
642
|
end
|
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
|
+
- 7
|
9
|
+
version: 0.3.7
|
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-31 00:00:00 -04:00
|
18
18
|
default_executable: judo
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -58,6 +58,9 @@ files:
|
|
58
58
|
- TODO
|
59
59
|
- VERSION
|
60
60
|
- bin/judo
|
61
|
+
- default/config.json
|
62
|
+
- default/setup.sh
|
63
|
+
- default/userdata.erb
|
61
64
|
- lib/judo.rb
|
62
65
|
- lib/judo/base.rb
|
63
66
|
- lib/judo/commandline_helpers.rb
|