rudy 0.6.6 → 0.6.7
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +7 -0
- data/README.rdoc +10 -7
- data/bin/rudy +5 -2
- data/bin/rudy-ec2 +7 -6
- data/bin/rudy-s3 +3 -0
- data/bin/rudy-sdb +3 -0
- data/lib/annoy.rb +5 -4
- data/lib/rudy.rb +12 -3
- data/lib/rudy/aws/ec2/instance.rb +2 -4
- data/lib/rudy/cli/aws/ec2/candy.rb +15 -3
- data/lib/rudy/huxtable.rb +17 -14
- data/rudy.gemspec +3 -3
- metadata +3 -3
data/CHANGES.txt
CHANGED
@@ -7,11 +7,18 @@ RUDY, CHANGES
|
|
7
7
|
* TODO: Support for product codes
|
8
8
|
* TODO: HTTPS
|
9
9
|
|
10
|
+
#### 0.6.7 (2009-04-22) ###############################
|
11
|
+
|
12
|
+
* ADDED: rudy-ec2 status can now display EU status
|
13
|
+
* FIXED: Fixed bug on instance create. Instance.groups was nil, now it returns
|
14
|
+
empty Array.
|
15
|
+
|
10
16
|
#### 0.6.6 (2009-04-22) ###############################
|
11
17
|
|
12
18
|
* ADDED: Better error handling for Rudy::AWS::SDB
|
13
19
|
* FIXED: Ruby 1.9.1 compatability (including requiring aws-s3 >=0.6.1)
|
14
20
|
|
21
|
+
|
15
22
|
#### 0.6.5 (2009-04-20) ###############################
|
16
23
|
|
17
24
|
* FIXED: Startup and Shutdown routines now check machine group status first
|
data/README.rdoc
CHANGED
@@ -75,12 +75,14 @@ The <tt>-u root</tt> tells Rudy to open a connection as the root user. If you cr
|
|
75
75
|
== Dependencies:
|
76
76
|
|
77
77
|
* OpenSSH[http://www.openssh.com/]
|
78
|
-
*
|
79
|
-
* Net::
|
80
|
-
*
|
81
|
-
*
|
82
|
-
*
|
83
|
-
*
|
78
|
+
* Ruby 1.8.x, 1.9.x, or JRuby 1.2
|
79
|
+
* Net::SSH[http://net-ssh.rubyforge.org/]
|
80
|
+
* Net::SCP[http://net-ssh.rubyforge.org/]
|
81
|
+
* amazon-ec2[http://github.com/grempe/amazon-ec2]
|
82
|
+
* aws-s3[http://github.com/marcel/aws-s3]
|
83
|
+
* Rye[http://github.com/delano/rye]
|
84
|
+
* Drydock[http://github.com/delano/drydock]
|
85
|
+
* Caesars[http://github.com/delano/caesars]
|
84
86
|
|
85
87
|
|
86
88
|
== Common Errors
|
@@ -105,6 +107,7 @@ Although Rudy has been well tested and is currently being used in production in
|
|
105
107
|
|
106
108
|
== More Info
|
107
109
|
|
110
|
+
* Rudy-Introduction[http://blog.solutious.com/2009/04/21/rudy-deployment-introduction/]
|
108
111
|
* GitHub[http://github.com/solutious/rudy]
|
109
112
|
* Issues[http://github.com/solutious/rudy/issues]
|
110
113
|
* RubyForge[http://rubyforge.org/projects/rudy]
|
@@ -120,13 +123,13 @@ Although Rudy has been well tested and is currently being used in production in
|
|
120
123
|
* Colin Brumelle
|
121
124
|
* Everyone at Utrecht.rb[http://groups.google.com/group/utrecht-rb]
|
122
125
|
* Jamis Buck for writing Net::SSH and friends.
|
126
|
+
* Keshia Knight Pulliam
|
123
127
|
|
124
128
|
|
125
129
|
== Credits
|
126
130
|
|
127
131
|
* Rudy::AWS::SDB adapted from aws_sdb by Tim Dysinger (http://dysinger.net)
|
128
132
|
* Escape, Copyright (C) 2006,2007 Tanaka Akira <akr@fsij.org>
|
129
|
-
* Keshia Knight Pulliam (rudy@solutious.com)
|
130
133
|
* Delano Mandelbaum (delano@solutious.com)
|
131
134
|
|
132
135
|
|
data/bin/rudy
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
|
11
11
|
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib') # Put our local lib in first place
|
12
12
|
$:.unshift File.join(File.dirname(__FILE__), '..', 'vendor', 'highline-1.5.1', 'lib')
|
13
|
-
|
13
|
+
%w{amazon-ec2 drydock rye}.each { |dir| $:.unshift File.join(File.dirname(__FILE__), '..', '..', dir, 'lib') }
|
14
14
|
#require 'rubygems'
|
15
15
|
|
16
16
|
#$SAFE = 1 # require is unsafe in Ruby 1.9??
|
@@ -251,7 +251,7 @@ class RudyCLI < Rudy::CLI::Base
|
|
251
251
|
|
252
252
|
# ------------------------------------------- UGLY STUFFS --------
|
253
253
|
# ------------------------------------------------------------------
|
254
|
-
debug :
|
254
|
+
debug :on
|
255
255
|
default :machines
|
256
256
|
|
257
257
|
|
@@ -272,6 +272,9 @@ rescue Rudy::Error => ex
|
|
272
272
|
rescue => ex
|
273
273
|
STDERR.puts "ERROR (#{ex.class.to_s}): #{ex.message}"
|
274
274
|
STDERR.puts ex.backtrace if Drydock.debug?
|
275
|
+
rescue Interrupt
|
276
|
+
puts "#{$/}Exiting... "
|
277
|
+
exit 1
|
275
278
|
rescue SystemExit
|
276
279
|
# Don't balk
|
277
280
|
end
|
data/bin/rudy-ec2
CHANGED
@@ -29,11 +29,11 @@ module RudyCLI_EC2
|
|
29
29
|
|
30
30
|
desc "Amazon EC2 Elastic IP addresses"
|
31
31
|
usage "rudy-ec2 addresses"
|
32
|
+
usage "rudy-ec2 addresses -C"
|
32
33
|
usage "rudy-ec2 addresses -A -i instance-id address"
|
33
34
|
usage "rudy-ec2 addresses -A -i instance-id -n"
|
34
35
|
usage "rudy-ec2 addresses -N address"
|
35
36
|
usage "rudy-ec2 addresses -D address"
|
36
|
-
usage "rudy-ec2 addresses -C"
|
37
37
|
option :i, :instance, String, "Instance ID"
|
38
38
|
option :n, :newaddress, "Create and assign a new elastic IP"
|
39
39
|
action :A, :associate, "Associate an IP address to a running instance"
|
@@ -98,8 +98,7 @@ module RudyCLI_EC2
|
|
98
98
|
command_alias :groups, :g
|
99
99
|
|
100
100
|
desc "Amazon EC2 Machine Images (AMIs)"
|
101
|
-
usage "rudy-ec2
|
102
|
-
usage "rudy-ec2 image"
|
101
|
+
usage "rudy-ec2 images"
|
103
102
|
usage "rudy-ec2 images image-id"
|
104
103
|
usage "rudy-ec2 images -o 123456789012"
|
105
104
|
usage "rudy-ec2 images -o amazon"
|
@@ -119,11 +118,9 @@ module RudyCLI_EC2
|
|
119
118
|
command_alias :images, :im
|
120
119
|
|
121
120
|
desc "Amazon EC2 Instances"
|
122
|
-
usage "rudy-ec2 i"
|
123
|
-
usage "rudy-ec2 instance"
|
124
121
|
usage "rudy-ec2 instances"
|
125
122
|
usage "rudy-ec2 instances [-g group-name] [instance-ID]"
|
126
|
-
usage "rudy-ec2 instances -C -
|
123
|
+
usage "rudy-ec2 instances -C -m ami-235fba4a -s m1.small -k keypair-name"
|
127
124
|
usage "rudy-ec2 instances -C -a 255.255.255.255 -k keypair-name"
|
128
125
|
usage "rudy-ec2 instances -R instance-ID"
|
129
126
|
usage "rudy-ec2 instances -D instance-ID"
|
@@ -204,6 +201,7 @@ module RudyCLI_EC2
|
|
204
201
|
command_alias :volumes, :v
|
205
202
|
|
206
203
|
desc "Availability Zones"
|
204
|
+
usage "rudy-ec2 zones"
|
207
205
|
argv :name
|
208
206
|
command :zones => Rudy::CLI::AWS::EC2::Zones
|
209
207
|
command_alias :zones, :zone
|
@@ -234,6 +232,9 @@ rescue Rudy::Error => ex
|
|
234
232
|
rescue => ex
|
235
233
|
STDERR.puts "ERROR (#{ex.class.to_s}): #{ex.message}"
|
236
234
|
STDERR.puts ex.backtrace if Drydock.debug?
|
235
|
+
rescue Interrupt
|
236
|
+
puts "#{$/}Exiting... "
|
237
|
+
exit 1
|
237
238
|
rescue SystemExit
|
238
239
|
# Don't balk
|
239
240
|
end
|
data/bin/rudy-s3
CHANGED
data/bin/rudy-sdb
CHANGED
data/lib/annoy.rb
CHANGED
@@ -122,9 +122,7 @@ class Annoy
|
|
122
122
|
#writer.flush
|
123
123
|
#end
|
124
124
|
#response = Annoy.get_response(writer)
|
125
|
-
|
126
|
-
trap("SIGINT") { raise Annoy::GiveUp }
|
127
|
-
|
125
|
+
|
128
126
|
highline = HighLine.new
|
129
127
|
response = highline.ask(msg) { |q|
|
130
128
|
q.echo = '*' # Don't display response
|
@@ -132,11 +130,14 @@ class Annoy
|
|
132
130
|
q.whitespace = :strip # Remove whitespace from the response
|
133
131
|
q.answer_type = Integer if flavor == :numeric
|
134
132
|
}
|
135
|
-
|
133
|
+
|
136
134
|
ret = (response == answer)
|
137
135
|
writer.puts "Incorrect" unless ret
|
138
136
|
ret
|
139
137
|
end
|
138
|
+
rescue Interrupt
|
139
|
+
writer.puts $/, "Giving up!"
|
140
|
+
false
|
140
141
|
rescue Annoy::GiveUp => ex
|
141
142
|
writer.puts $/, "Giving up!"
|
142
143
|
false
|
data/lib/rudy.rb
CHANGED
@@ -65,7 +65,7 @@ module Rudy
|
|
65
65
|
unless defined?(MAJOR)
|
66
66
|
MAJOR = 0.freeze
|
67
67
|
MINOR = 6.freeze
|
68
|
-
TINY =
|
68
|
+
TINY = 7.freeze
|
69
69
|
end
|
70
70
|
def self.to_s; [MAJOR, MINOR, TINY].join('.'); end
|
71
71
|
def self.to_f; self.to_s.to_f; end
|
@@ -131,7 +131,7 @@ module Rudy
|
|
131
131
|
def sysinfo; @@sysinfo; end
|
132
132
|
|
133
133
|
class Error < RuntimeError
|
134
|
-
def initialize(obj); @obj = obj; end
|
134
|
+
def initialize(obj=nil); @obj = obj; end
|
135
135
|
def message; "#{self.class}: #{@obj}"; end
|
136
136
|
end
|
137
137
|
class InsecureKeyPermissions < Rudy::Error
|
@@ -142,7 +142,16 @@ module Rudy
|
|
142
142
|
end
|
143
143
|
end
|
144
144
|
class NoConfig < Rudy::Error
|
145
|
-
def message; "No
|
145
|
+
def message; "No configuration found!"; end
|
146
|
+
end
|
147
|
+
class NoGlobal < Rudy::Error
|
148
|
+
def message; "No globals defined!"; end
|
149
|
+
end
|
150
|
+
class NoMachinesConfig < Rudy::Error
|
151
|
+
def message; "No machines configuration. Check your configs!"; end
|
152
|
+
end
|
153
|
+
class NoRoutinesConfig < Rudy::Error
|
154
|
+
def message; "No routines configuration. Check your configs!"; end
|
146
155
|
end
|
147
156
|
class ServiceUnavailable < Rudy::Error
|
148
157
|
def message; "#{@obj} is not available. Check your internets!"; end
|
@@ -19,10 +19,8 @@ module Rudy::AWS
|
|
19
19
|
field :reason
|
20
20
|
field :groups => Array
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
def groups
|
25
|
-
@groups || []
|
22
|
+
def init
|
23
|
+
@groups ||= []
|
26
24
|
end
|
27
25
|
|
28
26
|
def liner_note
|
@@ -11,6 +11,11 @@ module AWS; module EC2;
|
|
11
11
|
end
|
12
12
|
def status
|
13
13
|
url = 'http://status.aws.amazon.com/rss/EC2.rss'
|
14
|
+
|
15
|
+
if (@@global.region || '').to_s.strip.match(/\Aeu/)
|
16
|
+
url = 'http://status.aws.amazon.com/rss/EC2EU.rss'
|
17
|
+
end
|
18
|
+
|
14
19
|
# TODO: Move to Rudy::AWS
|
15
20
|
ec2 = Rudy::Utils::RSSReader.run(url) || {}
|
16
21
|
|
@@ -21,14 +26,21 @@ module AWS; module EC2;
|
|
21
26
|
require 'json'
|
22
27
|
puts ec2.to_json
|
23
28
|
else
|
24
|
-
puts "
|
25
|
-
ec2[:
|
29
|
+
puts "#{ec2[:title]}"
|
30
|
+
puts "Updated: #{ec2[:pubdate]}"
|
31
|
+
(ec2[:items] || []).each do |i|
|
26
32
|
puts
|
27
33
|
puts '%s' % i[:title]
|
28
34
|
puts ' %s: %s' % [i[:pubdate], i[:description]]
|
29
|
-
|
35
|
+
end
|
36
|
+
if ec2.empty? || ec2[:items].empty?
|
37
|
+
puts "No announcements"
|
38
|
+
return
|
30
39
|
end
|
31
40
|
end
|
41
|
+
|
42
|
+
|
43
|
+
|
32
44
|
end
|
33
45
|
|
34
46
|
def ssh_valid?
|
data/lib/rudy/huxtable.rb
CHANGED
@@ -122,9 +122,10 @@ module Rudy
|
|
122
122
|
|
123
123
|
|
124
124
|
def user_keypairpath(name)
|
125
|
-
raise "No user provided" unless name
|
126
|
-
raise
|
127
|
-
raise
|
125
|
+
raise Rudy::Error, "No user provided" unless name
|
126
|
+
raise NoConfig unless @@config
|
127
|
+
raise NoMachinesConfig unless @@config.machines
|
128
|
+
raise NoGlobal unless @@global
|
128
129
|
zon, env, rol = @@global.zone, @@global.environment, @@global.role
|
129
130
|
#Caesars.enable_debug
|
130
131
|
path = @@config.machines.find_deferred(zon, env, rol, [:users, name, :keypair])
|
@@ -189,8 +190,8 @@ module Rudy
|
|
189
190
|
end
|
190
191
|
|
191
192
|
def current_machine_address(position='01')
|
192
|
-
raise
|
193
|
-
raise
|
193
|
+
raise NoConfig unless @@config
|
194
|
+
raise NoMachinesConfig unless @@config.machines
|
194
195
|
raise "Position cannot be nil" if position.nil?
|
195
196
|
addresses = [fetch_machine_param(:addresses)].flatten.compact
|
196
197
|
addresses[position.to_i-1]
|
@@ -232,6 +233,8 @@ module Rudy
|
|
232
233
|
# at least one definition in the config for this to return true
|
233
234
|
# That's how Rudy knows the current group is defined.
|
234
235
|
def known_machine_group?
|
236
|
+
raise NoConfig unless @@config
|
237
|
+
raise NoMachinesConfig unless @@config.machines
|
235
238
|
return false if !@@config && !@@global
|
236
239
|
zon, env, rol = @@global.zone, @@global.environment, @@global.role
|
237
240
|
conf = @@config.machines.find_deferred(@@global.region, zon, [env, rol])
|
@@ -265,9 +268,9 @@ module Rudy
|
|
265
268
|
# :size: 1
|
266
269
|
#
|
267
270
|
def fetch_routine_config(action)
|
268
|
-
raise
|
269
|
-
raise
|
270
|
-
raise
|
271
|
+
raise NoConfig unless @@config
|
272
|
+
raise NoRoutinesConfig unless @@config.routines
|
273
|
+
raise NoGlobal unless @@global
|
271
274
|
|
272
275
|
zon, env, rol = @@global.zone, @@global.environment, @@global.role
|
273
276
|
|
@@ -295,18 +298,18 @@ module Rudy
|
|
295
298
|
|
296
299
|
|
297
300
|
def fetch_machine_param(parameter)
|
298
|
-
raise
|
299
|
-
raise
|
300
|
-
raise
|
301
|
+
raise NoConfig unless @@config
|
302
|
+
raise NoMachinesConfig unless @@config.machines
|
303
|
+
raise NoGlobal unless @@global
|
301
304
|
top_level = @@config.machines.find(parameter)
|
302
305
|
mc = fetch_machine_config
|
303
306
|
mc[parameter] || top_level || nil
|
304
307
|
end
|
305
308
|
|
306
309
|
def fetch_machine_config
|
307
|
-
raise
|
308
|
-
raise
|
309
|
-
raise
|
310
|
+
raise NoConfig unless @@config
|
311
|
+
raise NoMachinesConfig unless @@config.machines
|
312
|
+
raise NoGlobal unless @@global
|
310
313
|
zon, env, rol = @@global.zone, @@global.environment, @@global.role
|
311
314
|
hashes = []
|
312
315
|
hashes << @@config.machines.find(env, rol)
|
data/rudy.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
@spec = Gem::Specification.new do |s|
|
2
2
|
s.name = "rudy"
|
3
3
|
s.rubyforge_project = 'rudy'
|
4
|
-
s.version = "0.6.
|
4
|
+
s.version = "0.6.7"
|
5
5
|
s.summary = "Rudy: Not your grandparent's deployment tool."
|
6
6
|
s.description = s.summary
|
7
7
|
s.author = "Delano Mandelbaum"
|
@@ -14,9 +14,9 @@
|
|
14
14
|
s.require_paths = %w[lib]
|
15
15
|
s.rubygems_version = '1.1.1'
|
16
16
|
|
17
|
-
s.add_dependency 'drydock', '>= 0.5.
|
17
|
+
s.add_dependency 'drydock', '>= 0.5.6'
|
18
18
|
s.add_dependency 'caesars', '>= 0.5.4'
|
19
|
-
s.add_dependency 'rye', '>= 0.5.
|
19
|
+
s.add_dependency 'rye', '>= 0.5.4'
|
20
20
|
|
21
21
|
s.add_dependency 'echoe'
|
22
22
|
s.add_dependency 'amazon-ec2', '>= 0.3.8' # Region fix
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rudy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Delano Mandelbaum
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0.5.
|
23
|
+
version: 0.5.6
|
24
24
|
version:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: caesars
|
@@ -40,7 +40,7 @@ dependencies:
|
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: 0.5.
|
43
|
+
version: 0.5.4
|
44
44
|
version:
|
45
45
|
- !ruby/object:Gem::Dependency
|
46
46
|
name: echoe
|