judo 0.0.9 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -2
- data/VERSION +1 -1
- data/bin/judo +102 -212
- data/lib/judo.rb +18 -0
- data/lib/judo/base.rb +199 -0
- data/lib/judo/commandline_helpers.rb +151 -0
- data/lib/judo/config.rb +133 -0
- data/lib/judo/group.rb +221 -0
- data/lib/judo/server.rb +513 -0
- data/lib/judo/setup.rb +114 -0
- data/spec/base.rb +1 -1
- data/spec/base_spec.rb +9 -0
- metadata +16 -26
- data/lib/all.rb +0 -12
- data/lib/config.rb +0 -105
- data/lib/group.rb +0 -185
- data/lib/server.rb +0 -491
- data/lib/setup.rb +0 -114
data/Rakefile
CHANGED
@@ -10,8 +10,7 @@ Jeweler::Tasks.new do |s|
|
|
10
10
|
s.rubyforge_project = "judo"
|
11
11
|
s.files = FileList["[A-Z]*", "{bin,lib,spec}/**/*"]
|
12
12
|
s.executables = %w(judo)
|
13
|
-
s.add_dependency "aws", [">= 2.3.
|
14
|
-
s.add_dependency "thor", [">= 0.13.4"]
|
13
|
+
s.add_dependency "aws", [">= 2.3.5"]
|
15
14
|
s.add_dependency "json"
|
16
15
|
end
|
17
16
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/bin/judo
CHANGED
@@ -1,217 +1,107 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
|
5
|
-
require '
|
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
|
-
top_counter = group.servers.map { |s| (s.name =~ /^#{s.group}.(\d*)$/); $1.to_i }.sort.last.to_i
|
44
|
-
n.times do |i|
|
45
|
-
top_counter += 1
|
46
|
-
server = group.create_server "#{group}.#{top_counter}"
|
47
|
-
server.allocate_resources
|
48
|
-
server.start if start
|
49
|
-
end
|
50
|
-
else
|
51
|
-
server = group.create_server name
|
52
|
-
server.allocate_resources
|
53
|
-
server.start if start
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
desc "restart NAME", "restart a running server"
|
58
|
-
def restart(*names)
|
59
|
-
servers(*names) do |server|
|
60
|
-
server.restart
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
desc "stop [NAMES]", "stop a persistent server"
|
65
|
-
def stop(*names)
|
66
|
-
servers(*names) do |server|
|
67
|
-
server.stop
|
68
|
-
server.destroy if server.generic?
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
desc "destroy NAMES", "destroy a persistent server"
|
73
|
-
def destroy(*names)
|
74
|
-
raise "Must specify names of servers to destroy" if names.empty?
|
75
|
-
servers(*names) do |server|
|
76
|
-
server.destroy
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
desc "info [NAMES]", "show server config"
|
81
|
-
def info(*names)
|
82
|
-
servers(*names) do |server|
|
83
|
-
require 'pp'
|
84
|
-
puts "#{server}"
|
85
|
-
if server.ec2_instance and not server.ec2_instance.empty?
|
86
|
-
puts "\t[ EC2 ]"
|
87
|
-
[: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|
|
88
|
-
printf "\t %-24s: %s\n",k, server.ec2_instance[k]
|
89
|
-
end
|
90
|
-
end
|
91
|
-
puts "\t[ VOLUMES ]"
|
92
|
-
server.ec2_volumes.each do |v|
|
93
|
-
printf "\t %-13s %-10s %-10s %4d %-10s %-8s\n",
|
94
|
-
v[:aws_id],
|
95
|
-
v[:aws_status],
|
96
|
-
v[:zone],
|
97
|
-
v[:aws_size],
|
98
|
-
v[:aws_attachment_status],
|
99
|
-
v[:aws_device]
|
100
|
-
end
|
101
|
-
# pp ({ :name => server.name , :group => server.group, :volumes => server.volumes, :hostname => server.hostname })
|
102
|
-
# pp server.volumes.inspect
|
103
|
-
# puts server.state.inspect
|
104
|
-
## EC2 describe_volumes
|
105
|
-
# puts " #{dev.to_s}:#{Judo::Config.ec2.describe_volumes([vol_id])}"
|
106
|
-
# end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
desc "list [NAMES]", "list all servers"
|
111
|
-
def list(*names)
|
112
|
-
if group = Judo::Group.current
|
113
|
-
printf " SERVER IN GROUP #{group.name}\n"
|
114
|
-
servers(*names) do |s|
|
115
|
-
printf "%-18s %-4s %-11s %-11s %-13s %-10s %-10s %s\n", s.name, s.version_desc, s.state["instance_id"], s.instance_size, s.ami, s.ec2_state, "#{s.volumes.keys.size} volumes", s.ip
|
116
|
-
end
|
117
|
-
else
|
118
|
-
printf " SERVER GROUPS\n"
|
119
|
-
Judo::Group.all.each do |g|
|
120
|
-
printf "%-18s %s servers\n", g.name, g.servers.size
|
121
|
-
end
|
122
|
-
# printf " UNGROUPED SERVERS\n"
|
123
|
-
# servers.each do |s|
|
124
|
-
# printf "%-18s %-11s %-11s %-13s %-10s %-10s %s\n", s.name, s.state["instance_id"], s.state["security_group"], s.ami, s.ec2_state, "#{s.volumes.keys.size} volumes", s.ip
|
125
|
-
# end
|
126
|
-
# else
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
desc "console [NAMES]", "get console output for server or first available"
|
131
|
-
def console(*names)
|
132
|
-
servers(*names) do |server|
|
133
|
-
puts server.console_output
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
desc "init", "create a new judo repository in the current directory"
|
138
|
-
def init
|
139
|
-
Judo::Setup.new.init
|
140
|
-
end
|
141
|
-
|
142
|
-
desc "volumes", "list all volumes"
|
143
|
-
def volumes
|
144
|
-
format = "%13s %6s %12s %-10s %-16s %-16s\n"
|
145
|
-
printf format, "AWS_ID", "SIZE", "AWS_STATUS", "AWS_DEVICE", "ATTACHED TO", "CONFIGURED FOR"
|
146
|
-
printf "%s\n", ("-" * 80)
|
147
|
-
### EC2 describe_volumes
|
148
|
-
Judo::Config.ec2.describe_volumes.map do |volume|
|
149
|
-
[ volume[:aws_id], volume[:aws_size], volume[:aws_status], volume[:aws_device] || "", instance_id_to_judo(volume[:aws_instance_id]) || volume[:aws_instance_id] || "", volume_id_to_judo(volume[:aws_id]) ]
|
150
|
-
end.sort { |a,b| [ a[5].to_s, a[3].to_s ] <=> [ b[5].to_s, b[3].to_s ] }.each do |d|
|
151
|
-
printf format, *d
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
desc "ips", "list all ips"
|
156
|
-
def ips
|
157
|
-
format = "%15s %20s %20s\n"
|
158
|
-
printf format, "IP", "ATTACHED TO", "CONFIGURED FOR"
|
159
|
-
printf "%s\n", ("-"*57)
|
160
|
-
## EC2 describe_addresses
|
161
|
-
Judo::Config.ec2.describe_addresses.map do |ip|
|
162
|
-
[ ip[:public_ip], instance_id_to_judo(ip[:instance_id]) || ip[:instance_id], ip_to_judo(ip[:public_ip]) ]
|
163
|
-
end.sort { |a,b| a[2].to_s <=> b[2].to_s }.each do |d|
|
164
|
-
printf format, *d
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
desc "commit", "push configs and files to couchdb"
|
169
|
-
def commit
|
170
|
-
get_current.compile
|
171
|
-
end
|
3
|
+
require 'optparse'
|
4
|
+
require File.dirname(__FILE__) + '/../lib/judo'
|
5
|
+
require File.dirname(__FILE__) + '/../lib/judo/commandline_helpers'
|
6
|
+
|
7
|
+
include JudoCommandLineHelpers
|
8
|
+
|
9
|
+
defaults = Judo::Base.default_options(Dir.pwd)
|
10
|
+
|
11
|
+
options = {}
|
12
|
+
|
13
|
+
action = ARGV.shift
|
14
|
+
|
15
|
+
ARGV.unshift "-h" unless action
|
16
|
+
|
17
|
+
optparse = OptionParser.new do|opts|
|
18
|
+
opts.banner = <<banner
|
19
|
+
Usage: judo launch [options] SERVER ...
|
20
|
+
judo create [options] SERVER ...
|
21
|
+
judo destroy [options] SERVER ...
|
22
|
+
|
23
|
+
# SERVER can be formatted as NAME or NAME:GROUP or +N or +N:GROUP
|
24
|
+
# where N is the number of servers to create or launch
|
25
|
+
# 'launch' only differs from 'create' in that it immediately starts the server
|
26
|
+
|
27
|
+
judo start [options] [SERVER ...]
|
28
|
+
judo stop [options] [SERVER ...]
|
29
|
+
judo restart [options] [SERVER ...]
|
30
|
+
|
31
|
+
judo commit [options] GROUP
|
32
|
+
|
33
|
+
judo info [options] [SERVER ...]
|
34
|
+
judo console [options] [SERVER ...] ## shows AWS console output
|
35
|
+
judo ssh [options] [SERVER ...] ## ssh's into the server
|
36
|
+
|
37
|
+
# SERVER can be formatted as NAME or NAME:GROUP
|
38
|
+
# or :GROUP to indicate the whole group.
|
39
|
+
# If no servers are listed all servers are assumed.
|
40
|
+
|
41
|
+
judo list [options] ## lists all servers
|
42
|
+
judo groups [options] ## lists all groups
|
172
43
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
Judo::Server.all.detect { |s| s.volumes.invert[volume] }
|
205
|
-
end
|
206
|
-
|
207
|
-
def ip_to_judo(ip)
|
208
|
-
Judo::Server.all.detect { |s| s.elastic_ip == ip }
|
209
|
-
end
|
210
|
-
|
211
|
-
def instance_id_to_judo(instance_id)
|
212
|
-
Judo::Server.all.detect { |s| s.instance_id and s.instance_id == instance_id }
|
213
|
-
end
|
214
|
-
end
|
44
|
+
judo volumes [options] ## shows all EBS volumes and what they are attached to
|
45
|
+
judo ips [options] ## shows all elastic ips and what they are attached to
|
46
|
+
|
47
|
+
banner
|
48
|
+
|
49
|
+
# start stop create destroy launch restart info console
|
50
|
+
# list volumes ips
|
51
|
+
|
52
|
+
opts.on( '-c', '--config DIR', 'Specify the location of the config dir' ) do |dir|
|
53
|
+
defaults[:judo_dir] = dir
|
54
|
+
defaults.merge(Judo::Base.default_options(Dir.pwd, dir))
|
55
|
+
end
|
56
|
+
opts.on( '-r', '--repo DIR', 'Specify the location of the repo dir' ) do |dir|
|
57
|
+
options[:repo] = dir
|
58
|
+
end
|
59
|
+
opts.on( '-a', '--accessid ID', 'Specify the AWS access ID' ) do |id|
|
60
|
+
options[:access_id] = id
|
61
|
+
end
|
62
|
+
opts.on( '-s', '--secret KEY', 'Specify the AWS access secret key' ) do |key|
|
63
|
+
options[:access_key] = key
|
64
|
+
end
|
65
|
+
opts.on( '-b', '--bucket BUCKET', 'Specify the AWS S3 bucket to use' ) do |bucket|
|
66
|
+
options[:bucket] = bucket
|
67
|
+
end
|
68
|
+
opts.on( '-g', '--group GROUP', 'Specify the default group of the repo dir' ) do |group|
|
69
|
+
options[:group] = group
|
70
|
+
end
|
71
|
+
opts.on( '-h', '--help', 'Display this screen' ) do
|
72
|
+
puts opts
|
73
|
+
exit
|
74
|
+
end
|
215
75
|
end
|
216
76
|
|
217
|
-
|
77
|
+
optparse.parse!
|
78
|
+
|
79
|
+
judo = Judo::Base.new(defaults.merge(options))
|
80
|
+
|
81
|
+
begin
|
82
|
+
case action
|
83
|
+
when "ips" then do_ips(judo)
|
84
|
+
when "volumes" then do_volumes(judo)
|
85
|
+
when "list" then do_list(judo, ARGV)
|
86
|
+
when "groups" then do_groups(judo)
|
87
|
+
when "info" then find_servers(judo, ARGV) { |s| do_info(judo, s) }
|
88
|
+
when "console" then find_servers(judo, ARGV) { |s| puts server.console_output }
|
89
|
+
when "commit" then find_groups(judo, ARGV) { |g| g.compile }
|
90
|
+
when "ssh" then find_servers(judo, ARGV) { |s| s.connect_ssh }
|
91
|
+
when "start" then find_servers(judo, ARGV) { |s| s.start }
|
92
|
+
when "restart" then find_servers(judo, ARGV) { |s| s.restart }
|
93
|
+
when "stop" then find_servers(judo, ARGV) { |s| s.stop }
|
94
|
+
when "create" then mk_servers(judo, ARGV) { |s| s.create }
|
95
|
+
when "launch" then mk_servers(judo, ARGV) { |s| s.create; s.start }
|
96
|
+
when "destroy" then
|
97
|
+
raise JudoError, "You must specify what servers to destroy" if ARGV.empty?
|
98
|
+
find_either(judo, ARGV) do |i|
|
99
|
+
i.destroy
|
100
|
+
end
|
101
|
+
else
|
102
|
+
raise JudoError, "No such action #{action}"
|
103
|
+
end
|
104
|
+
rescue JudoError => e
|
105
|
+
puts "Error: #{e.message}"
|
106
|
+
exit 1
|
107
|
+
end
|
data/lib/judo.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'socket'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'right_aws'
|
7
|
+
require 'json'
|
8
|
+
require 'pp'
|
9
|
+
|
10
|
+
class JudoError < RuntimeError ; end
|
11
|
+
class JudoInvalid < RuntimeError ; end
|
12
|
+
|
13
|
+
require File.dirname(__FILE__) + '/judo/base'
|
14
|
+
require File.dirname(__FILE__) + '/judo/config'
|
15
|
+
require File.dirname(__FILE__) + '/judo/group'
|
16
|
+
require File.dirname(__FILE__) + '/judo/server'
|
17
|
+
require File.dirname(__FILE__) + '/judo/setup'
|
18
|
+
|
data/lib/judo/base.rb
ADDED
@@ -0,0 +1,199 @@
|
|
1
|
+
module Judo
|
2
|
+
class Base
|
3
|
+
attr_accessor :judo_dir, :repo, :group
|
4
|
+
|
5
|
+
def initialize(options)
|
6
|
+
@judo_dir = options[:judo_dir]
|
7
|
+
@repo = options[:repo]
|
8
|
+
@group = options[:group]
|
9
|
+
@bucket_name = options[:bucket]
|
10
|
+
@access_id = options[:access_id]
|
11
|
+
@access_secret = options[:access_secret]
|
12
|
+
end
|
13
|
+
|
14
|
+
def volumes
|
15
|
+
@volumes ||= ec2.describe_volumes.map do |v|
|
16
|
+
{
|
17
|
+
:id => v[:aws_id],
|
18
|
+
:size => v[:aws_size],
|
19
|
+
:status => v[:aws_status],
|
20
|
+
:device => v[:aws_device],
|
21
|
+
:instance_id => v[:aws_instance_id],
|
22
|
+
:attached_to => instance_id_to_judo(v[:aws_instance_id]),
|
23
|
+
:assigned_to => servers.detect { |s| s.volumes.invert[v[:aws_id]] }
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def ips
|
29
|
+
@ips ||= ec2.describe_addresses.map do |ip|
|
30
|
+
{
|
31
|
+
:ip => ip[:public_ip],
|
32
|
+
:instance_id => ip[:instance_id],
|
33
|
+
:attached_to => instance_id_to_judo(ip[:instance_id]),
|
34
|
+
:assigned_to => ip_to_judo(ip[:public_ip])
|
35
|
+
}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.default_options(pwd, dir = find_judo_dir(pwd))
|
40
|
+
config = YAML.load File.read("#{dir}/config.yml")
|
41
|
+
repo_dir = config["repo"] || File.dirname(dir)
|
42
|
+
group_config = Dir["#{repo_dir}/*/config.json"].detect { |d| File.dirname(d) == pwd }
|
43
|
+
{
|
44
|
+
:judo_dir => dir,
|
45
|
+
:group => group_config ? File.basename(File.dirname(group_config)) : nil,
|
46
|
+
:repo => repo_dir,
|
47
|
+
:bucket => config["s3_bucket"],
|
48
|
+
:access_id => config["access_id"],
|
49
|
+
:access_secret => config["access_secret"]
|
50
|
+
}.delete_if { |key,value| value.nil? }
|
51
|
+
rescue Object => e
|
52
|
+
puts e.inspect
|
53
|
+
{}
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.find_judo_dir(check)
|
57
|
+
if check == "/"
|
58
|
+
if File.exists?("#{ENV['HOME']}/.judo")
|
59
|
+
"#{ENV['HOME']}/.judo"
|
60
|
+
else
|
61
|
+
nil
|
62
|
+
end
|
63
|
+
else
|
64
|
+
File.exists?(check + "/.judo") ? check + "/.judo" : find_judo_dir(File.dirname(check))
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def sdb
|
69
|
+
@sdb ||= Aws::SdbInterface.new(access_id, access_secret, :logger => Logger.new(nil))
|
70
|
+
end
|
71
|
+
|
72
|
+
def fetch_servers_state
|
73
|
+
s = {}
|
74
|
+
sdb.select("select * from #{Judo::Server.domain}")[:items].each do |group|
|
75
|
+
group.each do |key,val|
|
76
|
+
s[key] = val
|
77
|
+
end
|
78
|
+
end
|
79
|
+
s
|
80
|
+
end
|
81
|
+
|
82
|
+
def servers_state
|
83
|
+
@servers_state ||= fetch_servers_state
|
84
|
+
end
|
85
|
+
|
86
|
+
def servers
|
87
|
+
@servers ||= servers_state.map { |name,data| Judo::Server.new(self, name, data["group"].first) }
|
88
|
+
end
|
89
|
+
|
90
|
+
def new_server(name, group)
|
91
|
+
s = Judo::Server.new(self, name, group)
|
92
|
+
servers << s
|
93
|
+
s
|
94
|
+
end
|
95
|
+
|
96
|
+
def get_group(name)
|
97
|
+
group = groups.detect { |g| g.to_s == name }
|
98
|
+
group ||= Judo::Group.new(self, name, 0)
|
99
|
+
group
|
100
|
+
end
|
101
|
+
|
102
|
+
def task(msg, &block)
|
103
|
+
printf "---> %-24s ", "#{msg}..."
|
104
|
+
STDOUT.flush
|
105
|
+
start = Time.now
|
106
|
+
result = block.call
|
107
|
+
result = "done" unless result.is_a? String
|
108
|
+
finish = Time.now
|
109
|
+
time = sprintf("%0.1f", finish - start)
|
110
|
+
puts "#{result} (#{time}s)"
|
111
|
+
result
|
112
|
+
end
|
113
|
+
|
114
|
+
def groups
|
115
|
+
@groups ||= group_versions.map { |name,ver| Judo::Group.new(self, name, ver.first.to_i ) }
|
116
|
+
end
|
117
|
+
|
118
|
+
def reload_ec2_instances
|
119
|
+
@ec2_instance = nil
|
120
|
+
end
|
121
|
+
|
122
|
+
def ec2_instances
|
123
|
+
@ec2_instance ||= ec2.describe_instances
|
124
|
+
end
|
125
|
+
|
126
|
+
def ec2
|
127
|
+
@ec2 ||= Aws::Ec2.new(access_id, access_secret, :logger => Logger.new(nil))
|
128
|
+
end
|
129
|
+
|
130
|
+
def groups_config
|
131
|
+
@groups_config ||= sdb.get_attributes("judo_config", "groups")[:attributes]
|
132
|
+
end
|
133
|
+
|
134
|
+
def group_versions
|
135
|
+
@group_version ||= sdb.get_attributes("judo_config", "group_versions")[:attributes]
|
136
|
+
end
|
137
|
+
|
138
|
+
def ip_to_judo(ip)
|
139
|
+
servers.detect { |s| s.elastic_ip == ip }
|
140
|
+
end
|
141
|
+
|
142
|
+
def instance_id_to_judo(instance_id)
|
143
|
+
servers.detect { |s| s.instance_id and s.instance_id == instance_id }
|
144
|
+
end
|
145
|
+
|
146
|
+
def s3
|
147
|
+
@s3 ||= Aws::S3.new(access_id, access_secret, :logger => Logger.new(nil))
|
148
|
+
end
|
149
|
+
|
150
|
+
def bucket
|
151
|
+
@bucket ||= s3.bucket(bucket_name)
|
152
|
+
end
|
153
|
+
|
154
|
+
def s3_url(k)
|
155
|
+
Aws::S3Generator::Key.new(bucket, k).get
|
156
|
+
end
|
157
|
+
|
158
|
+
def s3_get(k)
|
159
|
+
bucket.get(k)
|
160
|
+
end
|
161
|
+
|
162
|
+
def s3_put(k, file)
|
163
|
+
bucket.put(k, file)
|
164
|
+
end
|
165
|
+
|
166
|
+
def repo
|
167
|
+
raise JudoError, "no repo dir specified" unless @repo
|
168
|
+
raise JudoError, "repo dir not found" unless File.exists?(@repo)
|
169
|
+
@repo
|
170
|
+
end
|
171
|
+
|
172
|
+
def access_id
|
173
|
+
@access_id || (raise JudoError, "no AWS Access ID specified")
|
174
|
+
end
|
175
|
+
|
176
|
+
def access_secret
|
177
|
+
@access_secret || (raise JudoError, "no AWS Secret Key specified")
|
178
|
+
end
|
179
|
+
|
180
|
+
def bucket_name
|
181
|
+
@bucket_name || (raise JudoError, "no S3 bucket name specified")
|
182
|
+
end
|
183
|
+
|
184
|
+
def db_version
|
185
|
+
1
|
186
|
+
end
|
187
|
+
|
188
|
+
def get_db_version
|
189
|
+
version = @sdb.get_attributes("judo_config", "judo")[:attributes]["dbversion"]
|
190
|
+
version and version.first.to_i or db_version
|
191
|
+
end
|
192
|
+
|
193
|
+
def check_version
|
194
|
+
## FIXME - call this somewhere
|
195
|
+
raise JduoError, "judo db is newer than the current gem - upgrade judo and try again" if get_db_version > db_version
|
196
|
+
end
|
197
|
+
|
198
|
+
end
|
199
|
+
end
|