rudy 0.4.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +54 -30
- data/README.rdoc +100 -12
- data/Rakefile +103 -8
- data/Rudyfile +119 -0
- data/bin/ird +175 -0
- data/bin/rudy +259 -156
- data/bin/rudy-ec2 +228 -95
- data/bin/rudy-s3 +76 -0
- data/bin/rudy-sdb +67 -0
- data/lib/annoy.rb +270 -0
- data/lib/console.rb +30 -9
- data/lib/escape.rb +305 -0
- data/lib/rudy.rb +151 -182
- data/lib/rudy/aws.rb +56 -49
- data/lib/rudy/aws/ec2.rb +47 -292
- data/lib/rudy/aws/ec2/address.rb +157 -0
- data/lib/rudy/aws/ec2/group.rb +301 -0
- data/lib/rudy/aws/ec2/image.rb +168 -0
- data/lib/rudy/aws/ec2/instance.rb +434 -0
- data/lib/rudy/aws/ec2/keypair.rb +104 -0
- data/lib/rudy/aws/ec2/snapshot.rb +98 -0
- data/lib/rudy/aws/ec2/volume.rb +230 -0
- data/lib/rudy/aws/ec2/zone.rb +77 -0
- data/lib/rudy/aws/s3.rb +54 -0
- data/lib/rudy/aws/sdb.rb +298 -0
- data/lib/rudy/aws/sdb/error.rb +46 -0
- data/lib/rudy/{metadata/backup.rb → backup.rb} +26 -51
- data/lib/rudy/cli.rb +157 -0
- data/lib/rudy/cli/aws/ec2/addresses.rb +105 -0
- data/lib/rudy/cli/aws/ec2/candy.rb +208 -0
- data/lib/rudy/cli/aws/ec2/groups.rb +121 -0
- data/lib/rudy/cli/aws/ec2/images.rb +196 -0
- data/lib/rudy/cli/aws/ec2/instances.rb +194 -0
- data/lib/rudy/cli/aws/ec2/keypairs.rb +53 -0
- data/lib/rudy/cli/aws/ec2/snapshots.rb +49 -0
- data/lib/rudy/cli/aws/ec2/volumes.rb +104 -0
- data/lib/rudy/cli/aws/ec2/zones.rb +22 -0
- data/lib/rudy/cli/aws/s3/buckets.rb +50 -0
- data/lib/rudy/cli/aws/s3/store.rb +22 -0
- data/lib/rudy/cli/aws/sdb/domains.rb +41 -0
- data/lib/rudy/cli/candy.rb +8 -0
- data/lib/rudy/{command → cli}/config.rb +34 -24
- data/lib/rudy/cli/disks.rb +35 -0
- data/lib/rudy/cli/machines.rb +94 -0
- data/lib/rudy/cli/routines.rb +57 -0
- data/lib/rudy/config.rb +77 -72
- data/lib/rudy/config/objects.rb +29 -0
- data/lib/rudy/disks.rb +248 -0
- data/lib/rudy/global.rb +121 -0
- data/lib/rudy/huxtable.rb +340 -0
- data/lib/rudy/machines.rb +245 -0
- data/lib/rudy/metadata.rb +123 -13
- data/lib/rudy/routines.rb +47 -0
- data/lib/rudy/routines/helpers/diskhelper.rb +101 -0
- data/lib/rudy/routines/helpers/scripthelper.rb +91 -0
- data/lib/rudy/routines/release.rb +34 -0
- data/lib/rudy/routines/shutdown.rb +57 -0
- data/lib/rudy/routines/startup.rb +58 -0
- data/lib/rudy/scm/svn.rb +1 -1
- data/lib/rudy/utils.rb +322 -4
- data/lib/storable.rb +26 -17
- data/lib/sysinfo.rb +274 -0
- data/lib/tryouts.rb +6 -13
- data/rudy.gemspec +128 -42
- data/support/randomize-root-password +45 -0
- data/support/rudy-ec2-startup +9 -9
- data/support/update-ec2-ami-tools +20 -0
- data/test/05_config/00_setup_test.rb +20 -0
- data/test/05_config/30_machines_test.rb +69 -0
- data/test/20_sdb/00_setup_test.rb +16 -0
- data/test/20_sdb/10_domains_test.rb +115 -0
- data/test/25_ec2/00_setup_test.rb +29 -0
- data/test/25_ec2/10_keypairs_test.rb +41 -0
- data/test/25_ec2/20_groups_test.rb +131 -0
- data/test/25_ec2/30_addresses_test.rb +38 -0
- data/test/25_ec2/40_volumes_test.rb +49 -0
- data/test/25_ec2/50_snapshots_test.rb +74 -0
- data/test/26_ec2_instances/00_setup_test.rb +28 -0
- data/test/26_ec2_instances/10_instances_test.rb +83 -0
- data/test/26_ec2_instances/50_images_test.rb +13 -0
- data/test/30_sdb_metadata/00_setup_test.rb +21 -0
- data/test/30_sdb_metadata/10_disks_test.rb +109 -0
- data/test/30_sdb_metadata/20_backups_test.rb +102 -0
- data/test/coverage.txt +51 -0
- data/test/helper.rb +36 -0
- data/vendor/highline-1.5.1/CHANGELOG +222 -0
- data/vendor/highline-1.5.1/INSTALL +35 -0
- data/vendor/highline-1.5.1/LICENSE +7 -0
- data/vendor/highline-1.5.1/README +63 -0
- data/vendor/highline-1.5.1/Rakefile +82 -0
- data/vendor/highline-1.5.1/TODO +6 -0
- data/vendor/highline-1.5.1/examples/ansi_colors.rb +38 -0
- data/vendor/highline-1.5.1/examples/asking_for_arrays.rb +18 -0
- data/vendor/highline-1.5.1/examples/basic_usage.rb +75 -0
- data/vendor/highline-1.5.1/examples/color_scheme.rb +32 -0
- data/vendor/highline-1.5.1/examples/limit.rb +12 -0
- data/vendor/highline-1.5.1/examples/menus.rb +65 -0
- data/vendor/highline-1.5.1/examples/overwrite.rb +19 -0
- data/vendor/highline-1.5.1/examples/page_and_wrap.rb +322 -0
- data/vendor/highline-1.5.1/examples/password.rb +7 -0
- data/vendor/highline-1.5.1/examples/trapping_eof.rb +22 -0
- data/vendor/highline-1.5.1/examples/using_readline.rb +17 -0
- data/vendor/highline-1.5.1/lib/highline.rb +758 -0
- data/vendor/highline-1.5.1/lib/highline/color_scheme.rb +120 -0
- data/vendor/highline-1.5.1/lib/highline/compatibility.rb +17 -0
- data/vendor/highline-1.5.1/lib/highline/import.rb +43 -0
- data/vendor/highline-1.5.1/lib/highline/menu.rb +395 -0
- data/vendor/highline-1.5.1/lib/highline/question.rb +463 -0
- data/vendor/highline-1.5.1/lib/highline/system_extensions.rb +193 -0
- data/vendor/highline-1.5.1/setup.rb +1360 -0
- data/vendor/highline-1.5.1/test/tc_color_scheme.rb +56 -0
- data/vendor/highline-1.5.1/test/tc_highline.rb +823 -0
- data/vendor/highline-1.5.1/test/tc_import.rb +54 -0
- data/vendor/highline-1.5.1/test/tc_menu.rb +429 -0
- data/vendor/highline-1.5.1/test/ts_all.rb +15 -0
- metadata +141 -38
- data/lib/aws_sdb.rb +0 -3
- data/lib/aws_sdb/error.rb +0 -42
- data/lib/aws_sdb/service.rb +0 -215
- data/lib/rudy/aws/simpledb.rb +0 -53
- data/lib/rudy/command/addresses.rb +0 -46
- data/lib/rudy/command/backups.rb +0 -175
- data/lib/rudy/command/base.rb +0 -841
- data/lib/rudy/command/deploy.rb +0 -12
- data/lib/rudy/command/disks.rb +0 -213
- data/lib/rudy/command/environment.rb +0 -73
- data/lib/rudy/command/groups.rb +0 -61
- data/lib/rudy/command/images.rb +0 -91
- data/lib/rudy/command/instances.rb +0 -85
- data/lib/rudy/command/machines.rb +0 -161
- data/lib/rudy/command/metadata.rb +0 -41
- data/lib/rudy/command/release.rb +0 -174
- data/lib/rudy/command/volumes.rb +0 -66
- data/lib/rudy/metadata/disk.rb +0 -138
- data/tryouts/console_tryout.rb +0 -91
data/lib/rudy.rb
CHANGED
@@ -1,209 +1,178 @@
|
|
1
1
|
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
puts "Sorry! We're using the right_aws gem and it doesn't support Ruby 1.9 (md5 error)."
|
6
|
-
exit 1
|
2
|
+
unless defined?(RUDY_HOME)
|
3
|
+
RUDY_HOME = File.join(File.dirname(__FILE__), '..')
|
4
|
+
RUDY_LIB = File.join(File.dirname(__FILE__), '..', 'lib')
|
7
5
|
end
|
8
6
|
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
require 'tempfile'
|
8
|
+
require 'digest/md5'
|
9
|
+
require 'stringio'
|
10
|
+
require 'ostruct'
|
11
|
+
require 'yaml'
|
12
|
+
require 'socket'
|
13
|
+
require 'timeout'
|
14
|
+
require 'tempfile'
|
18
15
|
|
19
|
-
|
20
|
-
|
16
|
+
require 'storable'
|
17
|
+
require 'console'
|
18
|
+
require 'sysinfo'
|
19
|
+
require 'annoy'
|
21
20
|
|
22
|
-
|
23
|
-
require 'net/ssh/gateway'
|
24
|
-
require 'net/ssh/multi'
|
25
|
-
require 'net/scp'
|
26
|
-
|
27
|
-
rescue LoadError => ex
|
28
|
-
puts "Problem requiring: #{ex.message}"
|
29
|
-
exit 1
|
30
|
-
end
|
21
|
+
require 'rye'
|
31
22
|
|
23
|
+
require 'net/ssh'
|
24
|
+
require 'net/scp'
|
25
|
+
require 'net/ssh/multi'
|
26
|
+
require 'net/ssh/gateway'
|
32
27
|
|
33
28
|
|
34
|
-
|
35
|
-
|
36
|
-
|
29
|
+
require 'logger'
|
30
|
+
|
31
|
+
# = Rudy
|
32
|
+
#
|
33
|
+
# == About
|
34
|
+
#
|
35
|
+
# Rudy is a development and deployment tool for the Amazon Elastic Compute Cloud
|
36
|
+
# (EC2). See README.rdoc for more information.
|
37
|
+
#
|
38
|
+
# == Status: Alpha
|
39
|
+
#
|
40
|
+
# The current release (0.6) is not ready for general production use. Use it for
|
41
|
+
# exploring EC2 and operating your development / ad-hoc instances. We've put in
|
42
|
+
# a lot of effort to make sure Rudy plays safe, but it's possible we missed
|
43
|
+
# something. That's why we consider it alpha code.
|
44
|
+
#
|
45
|
+
# To get started right away, try:
|
46
|
+
#
|
47
|
+
# $ rudy -h
|
48
|
+
# $ rudy show-commands
|
49
|
+
#
|
50
|
+
# Also:
|
51
|
+
#
|
52
|
+
# $ rudy-ec2 -h
|
53
|
+
# $ rudy-ec2 show-commands
|
54
|
+
#
|
55
|
+
# And if you're feeling particularly saucey, try Rudy's REPL interface:
|
56
|
+
#
|
57
|
+
# $ ird
|
58
|
+
#
|
59
|
+
#
|
60
|
+
#
|
61
|
+
module Rudy
|
62
|
+
extend self
|
37
63
|
|
38
|
-
|
39
|
-
|
64
|
+
module VERSION #:nodoc:
|
65
|
+
unless defined?(MAJOR)
|
66
|
+
MAJOR = 0.freeze
|
67
|
+
MINOR = 6.freeze
|
68
|
+
TINY = 0.freeze
|
69
|
+
end
|
70
|
+
def self.to_s; [MAJOR, MINOR, TINY].join('.'); end
|
71
|
+
def self.to_f; self.to_s.to_f; end
|
72
|
+
end
|
40
73
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
74
|
+
unless defined?(Rudy::DOMAIN) # We can assume all constants are defined
|
75
|
+
# SimpleDB accepts dashes in the domain name on creation and with the query syntax.
|
76
|
+
# However, with select syntax it says: "The specified query expression syntax is not valid"
|
77
|
+
DOMAIN = "rudy_state".freeze
|
78
|
+
DELIM = '-'.freeze
|
46
79
|
|
47
|
-
|
80
|
+
CONFIG_DIR = File.join(ENV['HOME'] || ENV['USERPROFILE'], '.rudy').freeze
|
81
|
+
CONFIG_FILE = File.join(Rudy::CONFIG_DIR, 'config').freeze
|
82
|
+
|
83
|
+
DEFAULT_REGION = 'us-east-1'.freeze
|
84
|
+
DEFAULT_ZONE = 'us-east-1b'.freeze
|
85
|
+
DEFAULT_ENVIRONMENT = 'stage'.freeze
|
86
|
+
DEFAULT_ROLE = 'app'.freeze
|
87
|
+
DEFAULT_POSITION = '01'.freeze
|
88
|
+
|
89
|
+
DEFAULT_USER = 'rudy'.freeze
|
90
|
+
|
91
|
+
DEFAULT_EC2_HOST = "ec2.amazonaws.com"
|
92
|
+
DEFAULT_EC2_PORT = 443
|
93
|
+
|
94
|
+
MAX_INSTANCES = 3.freeze
|
95
|
+
|
96
|
+
SUPPORTED_SCM_NAMES = [:svn, :git].freeze
|
48
97
|
|
49
|
-
|
98
|
+
ID_MAP = {
|
99
|
+
:instance => 'i',
|
100
|
+
:disk => 'disk',
|
101
|
+
:backup => 'back',
|
102
|
+
:machine => 'm',
|
103
|
+
:volume => 'vol',
|
104
|
+
:snapshot => 'snap',
|
105
|
+
:kernel => 'aki',
|
106
|
+
:image => 'ami',
|
107
|
+
:ram => 'ari',
|
108
|
+
:log => 'log',
|
109
|
+
:key => 'key',
|
110
|
+
:awspk => 'pk',
|
111
|
+
:awscert => 'cert',
|
112
|
+
:reservation => 'r',
|
113
|
+
:dns_public => 'ec2',
|
114
|
+
:dns_private => 'domU',
|
115
|
+
}.freeze
|
116
|
+
|
117
|
+
@@quiet = false
|
118
|
+
@@debug = false
|
119
|
+
@@sysinfo = SystemInfo.new.freeze
|
120
|
+
|
121
|
+
end
|
50
122
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
123
|
+
def Rudy.debug?; @@debug == true; end
|
124
|
+
def Rudy.quiet?; @@quiet == true; end
|
125
|
+
def Rudy.enable_debug; @@debug = true; end
|
126
|
+
def Rudy.enable_quiet; @@quiet = true; end
|
127
|
+
def Rudy.disable_debug; @@debug = false; end
|
128
|
+
def Rudy.disable_quiet; @@quiet = false; end
|
129
|
+
|
130
|
+
def Rudy.sysinfo; @@sysinfo; end
|
131
|
+
def sysinfo; @@sysinfo; end
|
132
|
+
|
133
|
+
class Error < RuntimeError
|
134
|
+
def initialize(obj); @obj = obj; end
|
135
|
+
def message; "#{self.class}: #{@obj}"; end
|
136
|
+
end
|
137
|
+
class InsecureKeyPermissions < Rudy::Error
|
138
|
+
def message
|
139
|
+
lines = ["Insecure file permissions for #{@obj}"]
|
140
|
+
lines << "Try: chmod 600 #{@obj}"
|
141
|
+
lines.join($/)
|
60
142
|
end
|
61
143
|
end
|
62
|
-
|
63
|
-
|
64
|
-
# "some other machine". We do this by checking if
|
65
|
-
# the file /etc/ec2/instance-id exists. This
|
66
|
-
# file is written by /etc/init.d/rudy-ec2-startup.
|
67
|
-
# NOTE: Is there a way to know definitively that this is EC2?
|
68
|
-
# We could make a request to the metadata IP addresses.
|
69
|
-
def self.in_situ?
|
70
|
-
File.exists?('/etc/ec2/instance-id')
|
144
|
+
class NoConfig < Rudy::Error
|
145
|
+
def message; "No AWS credentials. Check your configs!"; end
|
71
146
|
end
|
72
|
-
|
73
|
-
|
74
|
-
require 'rudy/aws'
|
75
|
-
require 'rudy/config'
|
76
|
-
require 'rudy/metadata'
|
77
|
-
require 'rudy/utils'
|
78
|
-
require 'rudy/command/base'
|
79
|
-
|
80
|
-
# Require Command, MetaData, and SCM classes
|
81
|
-
begin
|
82
|
-
# TODO: Use autoload
|
83
|
-
Dir.glob(File.join(RUDY_LIB, 'rudy', '{command,metadata,scm}', "*.rb")).each do |path|
|
84
|
-
require path
|
147
|
+
class ServiceUnavailable < Rudy::Error
|
148
|
+
def message; "#{@obj} is not available. Check your internets!"; end
|
85
149
|
end
|
86
|
-
|
87
|
-
|
88
|
-
exit 1
|
89
|
-
end
|
90
|
-
|
91
|
-
|
92
|
-
# Capture STDOUT or STDERR to prevent it from being printed.
|
93
|
-
#
|
94
|
-
# capture(:stdout) do
|
95
|
-
# ...
|
96
|
-
# end
|
97
|
-
#
|
98
|
-
def capture(stream)
|
99
|
-
#raise "We can only capture STDOUT or STDERR" unless stream == :stdout || stream == :stderr
|
100
|
-
|
101
|
-
# I'm using this to trap the annoying right_aws "peer certificate" warning.
|
102
|
-
# TODO: discover source of annoying right_aws warning and give it a hiding.
|
103
|
-
begin
|
104
|
-
stream = stream.to_s
|
105
|
-
eval "$#{stream} = StringIO.new"
|
106
|
-
yield
|
107
|
-
result = eval("$#{stream}").read
|
108
|
-
ensure
|
109
|
-
eval("$#{stream} = #{stream.upcase}")
|
150
|
+
class MachineGroupAlreadyRunning < Rudy::Error
|
151
|
+
def message; "Machine group #{@obj} is already running."; end
|
110
152
|
end
|
111
|
-
|
112
|
-
|
113
|
-
end
|
114
|
-
|
115
|
-
|
116
|
-
def write_to_file(filename, content, type)
|
117
|
-
type = (type == :append) ? 'a' : 'w'
|
118
|
-
f = File.open(filename,type)
|
119
|
-
f.puts content
|
120
|
-
f.close
|
121
|
-
end
|
122
|
-
|
123
|
-
def are_you_sure?(len=3)
|
124
|
-
if Drydock.debug?
|
125
|
-
puts 'DEBUG: skipping "are you sure" check'
|
126
|
-
return true
|
153
|
+
class MachineGroupNotRunning < Rudy::Error
|
154
|
+
def message; "Machine group #{@obj} is not running."; end
|
127
155
|
end
|
128
|
-
|
129
|
-
|
130
|
-
challenge = strand len
|
131
|
-
STDOUT.print "Are you sure? To continue type \"#{challenge}\": "
|
132
|
-
STDOUT.flush
|
133
|
-
if ((STDIN.gets || "").gsub(/["']/, '') =~ /^#{challenge}$/)
|
134
|
-
true
|
135
|
-
else
|
136
|
-
puts "Nothing changed"
|
137
|
-
exit 0
|
138
|
-
end
|
139
|
-
else
|
140
|
-
true
|
156
|
+
class MachineGroupNotDefined < Rudy::Error
|
157
|
+
def message; "#{@obj} is not defined in machines config."; end
|
141
158
|
end
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
def strand( len=8, safe=true )
|
148
|
-
chars = ("a".."z").to_a + ("0".."9").to_a
|
149
|
-
chars = [("a".."h").to_a, "j", "k", "m", "n", ("p".."z").to_a, ("2".."9").to_a].flatten if safe
|
150
|
-
newpass = ""
|
151
|
-
1.upto(len) { |i| newpass << chars[rand(chars.size-1)] }
|
152
|
-
newpass
|
153
|
-
end
|
154
|
-
|
155
|
-
def sh(command, chdir=false, verbose=false)
|
156
|
-
prevdir = Dir.pwd
|
157
|
-
Dir.chdir chdir if chdir
|
158
|
-
puts command if verbose
|
159
|
-
system(command)
|
160
|
-
Dir.chdir prevdir if chdir
|
161
|
-
end
|
162
|
-
|
163
|
-
def ssh_command(host, keypair, user, command=false, printonly=false, verbose=false)
|
164
|
-
#puts "CONNECTING TO #{host}..."
|
165
|
-
cmd = "ssh -q -i #{keypair} #{user}@#{host} "
|
166
|
-
cmd += " '#{command}'" if command
|
167
|
-
puts cmd if verbose
|
168
|
-
return cmd if printonly
|
169
|
-
# backticks returns STDOUT
|
170
|
-
# exec replaces current process (it's just like running ssh)
|
171
|
-
(command) ? `#{cmd}` : Kernel.exec(cmd)
|
172
|
-
end
|
173
|
-
|
174
|
-
|
175
|
-
def scp_command(host, keypair, user, paths, to_path, to_local=false, verbose=false, printonly=false)
|
176
|
-
|
177
|
-
paths = [paths] unless paths.is_a?(Array)
|
178
|
-
from_paths = ""
|
179
|
-
if to_local
|
180
|
-
paths.each do |path|
|
181
|
-
from_paths << "#{user}@#{host}:#{path} "
|
182
|
-
end
|
183
|
-
puts "Copying FROM remote TO this machine", $/
|
184
|
-
|
185
|
-
else
|
186
|
-
to_path = "#{user}@#{host}:#{to_path}"
|
187
|
-
from_paths = paths.join(' ')
|
188
|
-
puts "Copying FROM this machine TO remote", $/
|
159
|
+
class PrivateKeyFileExists < Rudy::Error
|
160
|
+
def message; "Private key #{@obj} already exists."; end
|
161
|
+
end
|
162
|
+
class PrivateKeyNotFound < Rudy::Error
|
163
|
+
def message; "Private key file #{@obj} not found."; end
|
189
164
|
end
|
190
|
-
|
191
|
-
|
192
|
-
cmd = "scp -i #{keypair} #{from_paths} #{to_path}"
|
193
|
-
|
194
|
-
puts "CONNECTING TO #{host}..."
|
195
|
-
puts cmd if verbose
|
196
|
-
printonly ? (puts cmd) : system(cmd)
|
197
165
|
end
|
198
166
|
|
167
|
+
require 'rudy/utils' # The
|
168
|
+
require 'rudy/global' # order
|
169
|
+
require 'rudy/config' # of
|
170
|
+
require 'rudy/huxtable' # requires
|
171
|
+
require 'rudy/aws' # is
|
172
|
+
require 'rudy/metadata' # important
|
199
173
|
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
lines = str.split($/)
|
204
|
-
lspaces = (lines.inject(0) {|total,line| total += (line.scan(/^\s+/).first || '').size } / lines.size) + 1
|
205
|
-
lines.collect { |line| line.gsub(/^\s{#{lspaces}}/, '') }.join($/)
|
206
|
-
end
|
207
|
-
|
174
|
+
require 'rudy/machines'
|
175
|
+
require 'rudy/disks'
|
176
|
+
require 'rudy/routines'
|
208
177
|
|
209
178
|
|
data/lib/rudy/aws.rb
CHANGED
@@ -1,68 +1,75 @@
|
|
1
1
|
|
2
2
|
|
3
|
-
|
3
|
+
require 'EC2' # What a
|
4
|
+
require 'aws_sdb' # motley
|
5
|
+
require 'aws/s3' # crew
|
4
6
|
|
5
7
|
module Rudy
|
6
8
|
module AWS
|
7
|
-
|
8
|
-
module ObjectBase
|
9
|
-
attr_accessor :aws
|
10
|
-
def initialize(aws_connection)
|
11
|
-
@aws = aws_connection
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
class EC2
|
16
|
-
@@logger = StringIO.new
|
17
|
-
|
18
|
-
attr_reader :instances
|
19
|
-
attr_reader :images
|
20
|
-
attr_reader :addresses
|
21
|
-
attr_reader :groups
|
22
|
-
attr_reader :volumes
|
23
|
-
attr_reader :snapshots
|
24
|
-
attr_reader :aws
|
25
|
-
|
26
|
-
def initialize(access_key, secret_key)
|
27
|
-
@aws = RightAws::Ec2.new(access_key, secret_key, {:logger => Logger.new(@@logger)})
|
28
|
-
@instances = Rudy::AWS::EC2::Instances.new(@aws)
|
29
|
-
@images = Rudy::AWS::EC2::Images.new(@aws)
|
30
|
-
@groups = Rudy::AWS::EC2::Groups.new(@aws)
|
31
|
-
@addresses = Rudy::AWS::EC2::Addresses.new(@aws)
|
32
|
-
@snapshots = Rudy::AWS::EC2::Snapshots.new(@aws)
|
33
|
-
@volumes = Rudy::AWS::EC2::Volumes.new(@aws)
|
34
|
-
end
|
9
|
+
extend self
|
35
10
|
|
36
|
-
|
37
|
-
|
38
|
-
class S3
|
39
|
-
@@logger = StringIO.new
|
40
|
-
|
41
|
-
attr_reader :aws
|
42
|
-
|
43
|
-
def initialize(access_key, secret_key)
|
44
|
-
@aws = RightAws::S3.new(access_key, secret_key, {:logger => Logger.new(@@logger)})
|
45
|
-
end
|
11
|
+
unless defined?(Rudy::AWS::VALID_REGIONS)
|
12
|
+
VALID_REGIONS = ['eu-west-1', 'us-east-1'].freeze
|
46
13
|
end
|
47
14
|
|
48
|
-
|
49
|
-
@@logger = StringIO.new
|
15
|
+
def valid_region?(r); VALID_REGIONS.member?(r.to_s || ''); end
|
50
16
|
|
51
|
-
|
52
|
-
|
17
|
+
# Modifies +str+ by removing <tt>[\0\n\r\032\\\\]</tt> and escaping <tt>[\'\"]</tt>
|
18
|
+
def escape(str)
|
19
|
+
str.to_s.tr("[\0\n\r\032\\\\]", '').gsub(/([\'\"])/, '\\1\\1')
|
20
|
+
end
|
21
|
+
def escape!(str)
|
22
|
+
str.to_s.tr!("[\0\n\r\032\\\\]", '').gsub!(/([\'\"])/, '\\1\\1')
|
23
|
+
end
|
53
24
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
@domains = Rudy::AWS::SimpleDB::Domains.new(@aws)
|
58
|
-
end
|
25
|
+
module ObjectBase
|
26
|
+
|
27
|
+
protected
|
59
28
|
|
29
|
+
# Execute AWS requests safely. This will trap errors and return
|
30
|
+
# a default value (if specified).
|
31
|
+
# * +default+ A default response value
|
32
|
+
# * +request+ A block which contains the AWS request
|
33
|
+
# Returns the return value from the request is returned untouched
|
34
|
+
# or the default value on error or if the request returned nil.
|
35
|
+
def execute_request(default=nil, timeout=nil, &request)
|
36
|
+
timeout ||= 30
|
37
|
+
raise "No block provided" unless request
|
38
|
+
response = nil
|
39
|
+
begin
|
40
|
+
Timeout::timeout(timeout) do
|
41
|
+
response = request.call
|
42
|
+
end
|
43
|
+
# Raise the EC2 exceptions
|
44
|
+
rescue ::EC2::Error, ::EC2::InvalidInstanceIDMalformed => ex
|
45
|
+
raise Rudy::AWS::Error, ex.message
|
46
|
+
|
47
|
+
# NOTE: The InternalError is returned for non-existent volume IDs.
|
48
|
+
# It's probably a bug so we're ignoring it -- Dave.
|
49
|
+
rescue ::EC2::InternalError => ex
|
50
|
+
raise Rudy::AWS::Error, ex.message
|
51
|
+
|
52
|
+
rescue Timeout::Error => ex
|
53
|
+
STDERR.puts "Timeout (#{timeout}): #{ex.message}!"
|
54
|
+
rescue SocketError => ex
|
55
|
+
STDERR.puts "Socket Error. Check your Internets!"
|
56
|
+
STDERR.puts ex.message
|
57
|
+
STDERR.puts ex.backtrace
|
58
|
+
ensure
|
59
|
+
response ||= default
|
60
|
+
end
|
61
|
+
response
|
62
|
+
end
|
60
63
|
end
|
61
64
|
|
62
|
-
require 'rudy/aws/
|
65
|
+
require 'rudy/aws/sdb'
|
63
66
|
require 'rudy/aws/ec2'
|
64
67
|
require 'rudy/aws/s3'
|
65
68
|
|
69
|
+
Rudy::Utils.require_glob(RUDY_LIB, 'rudy', 'aws', '{ec2,s3,sdb}', "*.rb")
|
70
|
+
|
71
|
+
class Error < ::EC2::Error; end
|
66
72
|
end
|
67
73
|
|
68
74
|
end
|
75
|
+
|