solutious-rudy 0.8.5 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +55 -14
- data/README.rdoc +26 -34
- data/Rudyfile +27 -32
- data/bin/rudy +47 -27
- data/bin/rudy-ec2 +2 -16
- data/bin/rudy-s3 +0 -10
- data/bin/rudy-sdb +11 -12
- data/lib/rudy.rb +49 -89
- data/lib/rudy/aws.rb +2 -43
- data/lib/rudy/aws/ec2.rb +57 -20
- data/lib/rudy/aws/ec2/address.rb +10 -11
- data/lib/rudy/aws/ec2/group.rb +10 -9
- data/lib/rudy/aws/ec2/image.rb +8 -8
- data/lib/rudy/aws/ec2/instance.rb +15 -16
- data/lib/rudy/aws/ec2/keypair.rb +14 -19
- data/lib/rudy/aws/ec2/snapshot.rb +16 -9
- data/lib/rudy/aws/ec2/volume.rb +37 -24
- data/lib/rudy/aws/ec2/zone.rb +5 -4
- data/lib/rudy/aws/s3.rb +2 -1
- data/lib/rudy/aws/sdb.rb +35 -86
- data/lib/rudy/backups.rb +24 -0
- data/lib/rudy/cli.rb +5 -131
- data/lib/rudy/cli/aws/ec2/addresses.rb +19 -27
- data/lib/rudy/cli/aws/ec2/candy.rb +32 -7
- data/lib/rudy/cli/aws/ec2/groups.rb +9 -13
- data/lib/rudy/cli/aws/ec2/images.rb +5 -133
- data/lib/rudy/cli/aws/ec2/instances.rb +25 -25
- data/lib/rudy/cli/aws/ec2/keypairs.rb +7 -11
- data/lib/rudy/cli/aws/ec2/snapshots.rb +5 -9
- data/lib/rudy/cli/aws/ec2/volumes.rb +22 -23
- data/lib/rudy/cli/aws/ec2/zones.rb +2 -3
- data/lib/rudy/cli/aws/sdb/domains.rb +5 -6
- data/lib/rudy/cli/aws/sdb/objects.rb +33 -0
- data/lib/rudy/cli/aws/sdb/select.rb +23 -0
- data/lib/rudy/cli/backups.rb +38 -0
- data/lib/rudy/cli/base.rb +98 -0
- data/lib/rudy/cli/candy.rb +1 -2
- data/lib/rudy/cli/config.rb +7 -4
- data/lib/rudy/cli/disks.rb +6 -8
- data/lib/rudy/cli/execbase.rb +53 -0
- data/lib/rudy/cli/machines.rb +14 -18
- data/lib/rudy/cli/metadata.rb +24 -10
- data/lib/rudy/cli/routines.rb +31 -5
- data/lib/rudy/config.rb +17 -22
- data/lib/rudy/config/objects.rb +44 -30
- data/lib/rudy/disks.rb +25 -0
- data/lib/rudy/exceptions.rb +95 -0
- data/lib/rudy/global.rb +46 -23
- data/lib/rudy/guidelines.rb +3 -2
- data/lib/rudy/huxtable.rb +66 -57
- data/lib/rudy/machines.rb +41 -263
- data/lib/rudy/metadata.rb +212 -38
- data/lib/rudy/metadata/backup.rb +123 -78
- data/lib/rudy/metadata/disk.rb +152 -170
- data/lib/rudy/metadata/machine.rb +179 -0
- data/lib/rudy/mixins.rb +2 -1
- data/lib/rudy/mixins/hash.rb +3 -1
- data/lib/rudy/mixins/symbol.rb +8 -0
- data/lib/rudy/routines.rb +127 -344
- data/lib/rudy/routines/base.rb +226 -0
- data/lib/rudy/routines/handlers/base.rb +48 -0
- data/lib/rudy/routines/handlers/depends.rb +49 -0
- data/lib/rudy/routines/handlers/disks.rb +239 -0
- data/lib/rudy/routines/handlers/group.rb +42 -0
- data/lib/rudy/routines/handlers/host.rb +72 -0
- data/lib/rudy/routines/handlers/keypair.rb +70 -0
- data/lib/rudy/routines/handlers/machines.rb +15 -0
- data/lib/rudy/routines/handlers/script.rb +85 -0
- data/lib/rudy/routines/handlers/user.rb +41 -0
- data/lib/rudy/routines/passthrough.rb +19 -23
- data/lib/rudy/routines/reboot.rb +82 -51
- data/lib/rudy/routines/shutdown.rb +61 -14
- data/lib/rudy/routines/startup.rb +111 -17
- data/lib/rudy/utils.rb +12 -59
- data/rudy.gemspec +85 -25
- data/tryouts/01_mixins/01_hash_tryouts.rb +20 -0
- data/tryouts/10_require_time/10_rudy_tryouts.rb +33 -0
- data/tryouts/10_require_time/15_global_tryouts.rb +58 -0
- data/tryouts/12_config/10_load_config_tryouts.rb +43 -0
- data/tryouts/12_config/20_defaults_tryouts.rb +16 -0
- data/tryouts/12_config/30_accounts_tryouts.rb +17 -0
- data/tryouts/12_config/40_machines_tryouts.rb +53 -0
- data/tryouts/12_config/50_commands_tryouts.rb +17 -0
- data/tryouts/12_config/60_routines_tryouts.rb +16 -0
- data/tryouts/15_huxtable/10_huxtable_tryouts.rb +47 -0
- data/tryouts/15_huxtable/20_user_tryouts.rb +47 -0
- data/tryouts/20_simpledb/10_domains_tryouts.rb +36 -0
- data/tryouts/20_simpledb/20_objects_tryouts.rb +56 -0
- data/tryouts/25_ec2/10_keypairs_tryouts.rb +54 -0
- data/tryouts/25_ec2/20_groups_tryouts.rb +56 -0
- data/tryouts/25_ec2/21_groups_authorize_address_tryouts.rb +53 -0
- data/tryouts/25_ec2/22_groups_authorize_account_tryouts.rb +54 -0
- data/tryouts/25_ec2/30_addresses_tryouts.rb +42 -0
- data/tryouts/25_ec2/40_volumes_tryouts.rb +53 -0
- data/tryouts/25_ec2/50_snapshots_tryouts.rb +75 -0
- data/tryouts/26_ec2_instances/10_instance_tryouts.rb +107 -0
- data/tryouts/26_ec2_instances/50_images_tryouts.rb +7 -0
- data/tryouts/30_metadata/10_include_tryouts.rb +45 -0
- data/tryouts/30_metadata/13_object_tryouts.rb +19 -0
- data/tryouts/30_metadata/50_disk_tryouts.rb +115 -0
- data/tryouts/30_metadata/51_disk_digest_tryouts.rb +24 -0
- data/tryouts/30_metadata/53_disk_list_tryouts.rb +35 -0
- data/tryouts/30_metadata/56_disk_volume_tryouts.rb +68 -0
- data/tryouts/30_metadata/60_backup_tryouts.rb +101 -0
- data/tryouts/30_metadata/63_backup_list_tryouts.rb +38 -0
- data/tryouts/30_metadata/64_backup_disk_tryouts.rb +65 -0
- data/tryouts/30_metadata/66_backup_snapshot_tryouts.rb +76 -0
- data/tryouts/30_metadata/70_machine_tryouts.rb +85 -0
- data/tryouts/30_metadata/73_machine_list_tryouts.rb +58 -0
- data/tryouts/30_metadata/76_machine_instance_tryouts.rb +64 -0
- data/tryouts/30_metadata/77_machines_tryouts.rb +45 -0
- data/tryouts/40_routines/10_keypair_handler_tryouts.rb +52 -0
- data/tryouts/40_routines/11_group_handler_tryouts.rb +36 -0
- data/tryouts/80_cli/10_rudyec2_tryouts.rb +8 -0
- data/tryouts/80_cli/60_rudy_tryouts.rb +41 -0
- data/tryouts/failer +6 -0
- data/tryouts/misc/console_tryout.rb +91 -0
- data/tryouts/misc/disks_tryout.rb +48 -0
- data/tryouts/misc/drydock_tryout.rb +48 -0
- data/tryouts/misc/nested_methods.rb +103 -0
- data/tryouts/misc/session_tryout.rb +46 -0
- data/tryouts/misc/tryouts.rb +33 -0
- data/tryouts/misc/usage_tryout.rb +23 -0
- metadata +119 -31
- data/bin/ird +0 -153
- data/lib/rudy/metadata/backups.rb +0 -67
- data/lib/rudy/metadata/debug.rb +0 -38
- data/lib/rudy/metadata/disks.rb +0 -67
- data/lib/rudy/metadata/objectbase.rb +0 -108
- data/lib/rudy/routines/helper.rb +0 -76
- data/lib/rudy/routines/helpers/dependshelper.rb +0 -34
- data/lib/rudy/routines/helpers/diskhelper.rb +0 -403
- data/lib/rudy/routines/helpers/scripthelper.rb +0 -197
- data/lib/rudy/routines/helpers/userhelper.rb +0 -37
- data/support/rudy-ec2-startup +0 -200
data/bin/rudy-ec2
CHANGED
@@ -20,7 +20,6 @@ require 'rudy/cli'
|
|
20
20
|
module RudyCLI_EC2
|
21
21
|
extend Drydock
|
22
22
|
|
23
|
-
debug :off
|
24
23
|
default :instances
|
25
24
|
|
26
25
|
# ----------------------------------- AMAZON EC2 COMMANDS --------
|
@@ -105,11 +104,6 @@ module RudyCLI_EC2
|
|
105
104
|
option :o, :owner, String, "Amazon Account Number or one of: amazon, self"
|
106
105
|
option :l, :all, "Display all registered machine images (warning: slow)"
|
107
106
|
#option :p, :private, "Private images only"
|
108
|
-
option :b, :bucket, String, "The name of the bucket that will store the image"
|
109
|
-
option :n, :name, String, "The name of the image file (to create)"
|
110
|
-
option :u, :user, String, "Username to connect as (used for creating an image)"
|
111
|
-
action :C, :create, "Create an image"
|
112
|
-
#action :P, :prepare, "Prepare a running instance to be used as an image"
|
113
107
|
action :R, :register, "Register an image"
|
114
108
|
action :D, :destroy, "Deregister an image (does not remove image files from S3)"
|
115
109
|
argv :ami
|
@@ -142,14 +136,14 @@ module RudyCLI_EC2
|
|
142
136
|
command_alias :instances, :in
|
143
137
|
command_alias :instances, :i
|
144
138
|
|
145
|
-
about "Amazon EC2
|
139
|
+
about "Amazon EC2 EC2::Keypairs"
|
146
140
|
usage "rudy-ec2 keypairs"
|
147
141
|
usage "rudy-ec2 keypairs -C name"
|
148
142
|
usage "rudy-ec2 keypairs -D name"
|
149
143
|
action :D, :destroy, "Unregister keypair from EC2 (this is permanent!)"
|
150
144
|
action :C, :create, "Create and register a keypair with EC2"
|
151
145
|
argv :name
|
152
|
-
command :keypairs => Rudy::CLI::AWS::EC2::
|
146
|
+
command :keypairs => Rudy::CLI::AWS::EC2::Keypairs
|
153
147
|
command_alias :keypairs, :keypair
|
154
148
|
command_alias :keypairs, :k
|
155
149
|
|
@@ -211,12 +205,6 @@ module RudyCLI_EC2
|
|
211
205
|
|
212
206
|
end
|
213
207
|
|
214
|
-
#puts Rudy::Utils.banner("THIS IS RUBY #{RUBY_VERSION}") if Drydock.debug?
|
215
|
-
|
216
|
-
# We call Drydock specifically otherwise it will run at_exit. Rye also
|
217
|
-
# uses at_exit for shutting down the ssh-agent. Ruby executes at_exit
|
218
|
-
# blocks in reverse order so if Drydock is required first, it's block
|
219
|
-
# will run after Rye shuts down the ssh-agent.
|
220
208
|
begin
|
221
209
|
Drydock.run!(ARGV, STDIN) if Drydock.run? && !Drydock.has_run?
|
222
210
|
rescue Drydock::ArgError, Drydock::OptError => ex
|
@@ -233,8 +221,6 @@ rescue => ex
|
|
233
221
|
rescue Interrupt
|
234
222
|
puts "#{$/}Exiting... "
|
235
223
|
exit 1
|
236
|
-
rescue SystemExit
|
237
|
-
# Don't balk
|
238
224
|
end
|
239
225
|
|
240
226
|
|
data/bin/rudy-s3
CHANGED
@@ -44,18 +44,10 @@ module RudyCLI_S3
|
|
44
44
|
# ------------------------------------------------------------------
|
45
45
|
|
46
46
|
default :buckets
|
47
|
-
debug :off
|
48
|
-
|
49
47
|
|
50
48
|
end
|
51
49
|
|
52
50
|
|
53
|
-
#puts Rudy::Utils.banner("THIS IS RUBY #{RUBY_VERSION}") if Drydock.debug?
|
54
|
-
|
55
|
-
# We call Drydock specifically otherwise it will run at_exit. Rye also
|
56
|
-
# uses at_exit for shutting down the ssh-agent. Ruby executes at_exit
|
57
|
-
# blocks in reverse order so if Drydock is required first, it's block
|
58
|
-
# will run after Rye shuts down the ssh-agent.
|
59
51
|
begin
|
60
52
|
Drydock.run!(ARGV, STDIN) if Drydock.run? && !Drydock.has_run?
|
61
53
|
rescue Drydock::ArgError, Drydock::OptError => ex
|
@@ -72,7 +64,5 @@ rescue => ex
|
|
72
64
|
rescue Interrupt
|
73
65
|
puts "#{$/}Exiting... "
|
74
66
|
exit 1
|
75
|
-
rescue SystemExit
|
76
|
-
# Don't balk
|
77
67
|
end
|
78
68
|
|
data/bin/rudy-sdb
CHANGED
@@ -28,24 +28,25 @@ module RudyCLI_SDB
|
|
28
28
|
action :D, :destroy, "Destroy a domain"
|
29
29
|
argv :name
|
30
30
|
command :domains => Rudy::CLI::AWS::SDB::Domains
|
31
|
+
command_alias :domains, :domain
|
32
|
+
|
33
|
+
about "Displays objects contained in a SimpleDB domain"
|
34
|
+
argv :name, :key
|
35
|
+
command :objects => Rudy::CLI::AWS::SDB::Objects
|
36
|
+
command_alias :objects, :object
|
37
|
+
|
38
|
+
about "Execute a SimpleDB select query"
|
39
|
+
argv :query
|
40
|
+
command :query => Rudy::CLI::AWS::SDB::Select
|
31
41
|
|
32
42
|
|
33
43
|
# -------------------------------- RUDY-SDB MISCELLANEOUS --------
|
34
44
|
# ------------------------------------------------------------------
|
35
45
|
|
36
46
|
default :domains
|
37
|
-
debug :off
|
38
|
-
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
47
|
|
43
|
-
|
48
|
+
end
|
44
49
|
|
45
|
-
# We call Drydock specifically otherwise it will run at_exit. Rye also
|
46
|
-
# uses at_exit for shutting down the ssh-agent. Ruby executes at_exit
|
47
|
-
# blocks in reverse order so if Drydock is required first, it's block
|
48
|
-
# will run after Rye shuts down the ssh-agent.
|
49
50
|
begin
|
50
51
|
Drydock.run!(ARGV, STDIN) if Drydock.run? && !Drydock.has_run?
|
51
52
|
rescue Drydock::ArgError, Drydock::OptError => ex
|
@@ -62,7 +63,5 @@ rescue => ex
|
|
62
63
|
rescue Interrupt
|
63
64
|
puts "#{$/}Exiting... "
|
64
65
|
exit 1
|
65
|
-
rescue SystemExit
|
66
|
-
# Don't balk
|
67
66
|
end
|
68
67
|
|
data/lib/rudy.rb
CHANGED
@@ -4,32 +4,35 @@ unless defined?(RUDY_HOME)
|
|
4
4
|
RUDY_LIB = File.join(File.dirname(__FILE__), '..', 'lib')
|
5
5
|
end
|
6
6
|
|
7
|
-
local_libs = %w{net-ssh net-scp amazon-ec2 aws-s3 caesars drydock rye storable sysinfo annoy}
|
8
|
-
|
7
|
+
local_libs = %w{net-ssh net-scp amazon-ec2 aws-s3 caesars drydock rye storable sysinfo annoy gibbler}
|
8
|
+
local_libs.each { |dir| $:.unshift File.join(RUDY_HOME, '..', dir, 'lib') }
|
9
9
|
#require 'rubygems'
|
10
10
|
|
11
|
+
begin; require 'json'; rescue LoadError; end # Silence!
|
12
|
+
|
11
13
|
require 'digest/md5'
|
12
14
|
require 'stringio'
|
13
15
|
require 'ostruct'
|
14
16
|
require 'yaml'
|
15
|
-
require 'json'
|
16
17
|
require 'logger'
|
17
18
|
require 'socket'
|
18
19
|
require 'timeout'
|
20
|
+
require 'gibbler'
|
19
21
|
require 'tempfile'
|
20
22
|
require 'rudy/mixins'
|
23
|
+
require 'gibbler/aliases'
|
21
24
|
require 'storable'
|
22
25
|
require 'sysinfo'
|
26
|
+
require 'attic'
|
23
27
|
require 'annoy'
|
24
28
|
require 'rye'
|
25
29
|
|
26
30
|
|
27
|
-
|
28
31
|
# = Rudy
|
29
32
|
#
|
30
33
|
#
|
31
34
|
# Rudy is a development and deployment tool for the Amazon Elastic Compute Cloud
|
32
|
-
# (EC2). <a href="http://solutious.com/
|
35
|
+
# (EC2). <a href="http://solutious.com/projects/rudy/getting-started">Getting Started</a> today!
|
33
36
|
#
|
34
37
|
#
|
35
38
|
module Rudy
|
@@ -38,8 +41,8 @@ module Rudy
|
|
38
41
|
module VERSION #:nodoc:
|
39
42
|
unless defined?(MAJOR)
|
40
43
|
MAJOR = 0.freeze
|
41
|
-
MINOR =
|
42
|
-
TINY =
|
44
|
+
MINOR = 9.freeze
|
45
|
+
TINY = 0.freeze
|
43
46
|
end
|
44
47
|
def self.to_s; [MAJOR, MINOR, TINY].join('.'); end
|
45
48
|
def self.to_f; self.to_s.to_f; end
|
@@ -59,109 +62,66 @@ module Rudy
|
|
59
62
|
|
60
63
|
CONFIG_DIR = File.join(@@sysinfo.home, '.rudy').freeze
|
61
64
|
CONFIG_FILE = File.join(Rudy::CONFIG_DIR, 'config').freeze
|
65
|
+
SSH_KEY_DIR = File.expand_path('~/.ssh').freeze
|
62
66
|
|
63
|
-
DEFAULT_REGION = :'us-east-1'.freeze
|
64
67
|
DEFAULT_ZONE = :'us-east-1b'.freeze
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
DEFAULT_USER = :'rudy'.freeze
|
70
|
-
|
68
|
+
DEFAULT_REGION = DEFAULT_ZONE.to_s.gsub(/[a-z]$/, '').to_sym.freeze
|
69
|
+
DEFAULT_ENVIRONMENT = :stage.freeze
|
70
|
+
DEFAULT_ROLE = :app.freeze
|
71
|
+
|
71
72
|
DEFAULT_EC2_HOST = "ec2.amazonaws.com"
|
72
73
|
DEFAULT_EC2_PORT = 443
|
73
74
|
|
74
75
|
MAX_INSTANCES = 5.freeze
|
75
76
|
|
76
|
-
SUPPORTED_SCM_NAMES = [:svn, :git].freeze
|
77
|
-
|
78
77
|
ID_MAP = {
|
79
|
-
:
|
80
|
-
:
|
81
|
-
:backup => 'back',
|
82
|
-
:machine => 'm',
|
83
|
-
:volume => 'vol',
|
84
|
-
:snapshot => 'snap',
|
85
|
-
:kernel => 'aki',
|
86
|
-
:image => 'ami',
|
87
|
-
:ram => 'ari',
|
88
|
-
:log => 'log',
|
89
|
-
:key => 'key',
|
90
|
-
:awspk => 'pk',
|
91
|
-
:awscert => 'cert',
|
78
|
+
:instance => 'i',
|
79
|
+
:machine => 'm',
|
92
80
|
:reservation => 'r',
|
93
|
-
:
|
94
|
-
:
|
81
|
+
:pkey => 'pk',
|
82
|
+
:volume => 'vol',
|
83
|
+
:kernel => 'aki',
|
84
|
+
:image => 'ami',
|
85
|
+
:ramdisk => 'ari',
|
86
|
+
:group => 'grp',
|
87
|
+
:log => 'log',
|
88
|
+
:key => 'key',
|
89
|
+
:dns_public => 'ec2',
|
90
|
+
:disk => 'disk',
|
91
|
+
:backup => 'back',
|
92
|
+
:snapshot => 'snap',
|
93
|
+
:cert => 'cert',
|
94
|
+
:dns_private => 'domU'
|
95
95
|
}.freeze
|
96
96
|
|
97
97
|
end
|
98
98
|
|
99
|
-
def Rudy.debug?; @@debug == true; end
|
100
99
|
def Rudy.quiet?; @@quiet == true; end
|
101
|
-
def Rudy.yes?; @@yes == true; end
|
102
|
-
def Rudy.enable_debug; @@debug = true; end
|
103
100
|
def Rudy.enable_quiet; @@quiet = true; end
|
104
|
-
def Rudy.enable_yes; @@yes = true; end
|
105
|
-
def Rudy.disable_debug; @@debug = false; end
|
106
101
|
def Rudy.disable_quiet; @@quiet = false; end
|
102
|
+
|
103
|
+
def Rudy.yes?; @@yes == true; end
|
104
|
+
def Rudy.enable_yes; @@yes = true; end
|
107
105
|
def Rudy.disable_yes; @@yes = false; end
|
108
106
|
|
107
|
+
def Rudy.debug?; @@debug == true; end
|
108
|
+
def Rudy.enable_debug; @@debug = true; end
|
109
|
+
def Rudy.disable_debug; @@debug = false; end
|
110
|
+
|
111
|
+
|
109
112
|
def Rudy.sysinfo; @@sysinfo; end
|
110
113
|
def sysinfo; @@sysinfo; end
|
111
114
|
|
112
|
-
class Error < RuntimeError
|
113
|
-
def initialize(obj=nil); @obj = obj; end
|
114
|
-
def message; "#{self.class}: #{@obj}"; end
|
115
|
-
end
|
116
|
-
class InsecureKeyPermissions < Rudy::Error
|
117
|
-
def message
|
118
|
-
lines = ["Insecure file permissions for #{@obj}"]
|
119
|
-
lines << "Try: chmod 600 #{@obj}"
|
120
|
-
lines.join($/)
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
#--
|
125
|
-
# TODO: Update exception Syntax based on:
|
126
|
-
# http://blog.rubybestpractices.com/posts/gregory/anonymous_class_hacks.html
|
127
|
-
#++
|
128
|
-
class NoConfig < Rudy::Error
|
129
|
-
def message; "No configuration found!"; end
|
130
|
-
end
|
131
|
-
class NoGlobal < Rudy::Error
|
132
|
-
def message; "No globals defined!"; end
|
133
|
-
end
|
134
|
-
class NoMachinesConfig < Rudy::Error
|
135
|
-
def message; "No machines configuration. Check your configs!"; end
|
136
|
-
end
|
137
|
-
class NoRoutinesConfig < Rudy::Error
|
138
|
-
def message; "No routines configuration. Check your configs!"; end
|
139
|
-
end
|
140
|
-
class ServiceUnavailable < Rudy::Error
|
141
|
-
def message; "#{@obj} is not available. Check your internets!"; end
|
142
|
-
end
|
143
|
-
class MachineGroupAlreadyRunning < Rudy::Error
|
144
|
-
def message; "Machine group #{@obj} is already running."; end
|
145
|
-
end
|
146
|
-
class MachineGroupNotRunning < Rudy::Error
|
147
|
-
def message; "Machine group #{@obj} is not running."; end
|
148
|
-
end
|
149
|
-
class MachineGroupNotDefined < Rudy::Error
|
150
|
-
def message; "#{@obj} is not defined in machines config."; end
|
151
|
-
end
|
152
|
-
class PrivateKeyFileExists < Rudy::Error
|
153
|
-
def message; "Private key #{@obj} already exists."; end
|
154
|
-
end
|
155
|
-
class PrivateKeyNotFound < Rudy::Error
|
156
|
-
def message; "Private key file #{@obj} not found."; end
|
157
|
-
end
|
158
115
|
end
|
159
116
|
|
160
|
-
require 'rudy/
|
161
|
-
require 'rudy/
|
162
|
-
require 'rudy/
|
163
|
-
require 'rudy/
|
164
|
-
require 'rudy/
|
165
|
-
require 'rudy/
|
166
|
-
require 'rudy/
|
117
|
+
require 'rudy/exceptions'
|
118
|
+
require 'rudy/utils' # The
|
119
|
+
require 'rudy/global' # order
|
120
|
+
require 'rudy/config' # of
|
121
|
+
require 'rudy/huxtable' # requires
|
122
|
+
require 'rudy/aws' # is
|
123
|
+
require 'rudy/metadata' # super
|
124
|
+
require 'rudy/machines' # important.
|
125
|
+
require 'rudy/backups'
|
126
|
+
require 'rudy/disks'
|
167
127
|
require 'rudy/routines'
|
data/lib/rudy/aws.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
|
3
|
-
require 'EC2' #
|
4
|
-
|
3
|
+
require 'EC2' # amazon-ec2 gem
|
4
|
+
|
5
5
|
|
6
6
|
module Rudy
|
7
7
|
module AWS
|
@@ -20,48 +20,7 @@ module Rudy
|
|
20
20
|
def escape!(str)
|
21
21
|
str.to_s.tr!("[\0\n\r\032\\\\]", '').gsub!(/([\'\"])/, '\\1\\1')
|
22
22
|
end
|
23
|
-
|
24
|
-
module ObjectBase
|
25
|
-
include Rudy::Huxtable
|
26
|
-
|
27
|
-
protected
|
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
23
|
|
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 ex.message
|
56
|
-
#STDERR.puts ex.backtrace
|
57
|
-
raise SocketError, "Check your Internets!" unless @@global.offline
|
58
|
-
ensure
|
59
|
-
response ||= default
|
60
|
-
end
|
61
|
-
response
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
24
|
require 'rudy/aws/sdb'
|
66
25
|
require 'rudy/aws/ec2'
|
67
26
|
require 'rudy/aws/s3'
|
data/lib/rudy/aws/ec2.rb
CHANGED
@@ -1,23 +1,59 @@
|
|
1
1
|
|
2
2
|
module Rudy; module AWS
|
3
3
|
module EC2
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
4
|
+
# include Rudy::Huxtable
|
5
|
+
|
6
|
+
def self.connect(access_key=nil, secret_key=nil, region=nil, logger=nil)
|
7
|
+
|
8
|
+
if region
|
9
|
+
raise InvalidRegion, region unless Rudy::AWS.valid_region?(region)
|
10
|
+
host = "#{region}.ec2.amazonaws.com"
|
11
|
+
elsif ENV['EC2_URL']
|
12
|
+
host = URL.parse(ENV['EC2_URL']).host
|
13
|
+
end
|
14
|
+
|
15
|
+
host ||= DEFAULT_EC2_HOST
|
16
|
+
port ||= DEFAULT_EC2_PORT
|
17
|
+
|
18
|
+
@@ec2 ||= ::EC2::Base.new(:port => port, :server=> host, :access_key_id => access_key, :secret_access_key => secret_key)
|
19
|
+
@@logger = logger
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
|
24
|
+
# Execute AWS requests safely. This will trap errors and return
|
25
|
+
# a default value (if specified).
|
26
|
+
# * +default+ A default response value
|
27
|
+
# * +request+ A block which contains the AWS request
|
28
|
+
# Returns the return value from the request is returned untouched
|
29
|
+
# or the default value on error or if the request returned nil.
|
30
|
+
def self.execute_request(default=nil, timeout=nil, &request)
|
31
|
+
timeout ||= 15
|
32
|
+
raise "No block provided" unless request
|
33
|
+
response = nil
|
34
|
+
begin
|
35
|
+
Timeout::timeout(timeout) do
|
36
|
+
response = request.call
|
13
37
|
end
|
38
|
+
# Raise the EC2 exceptions
|
39
|
+
rescue ::EC2::Error, ::EC2::InvalidInstanceIDMalformed => ex
|
40
|
+
raise Rudy::AWS::Error, ex.message
|
41
|
+
|
42
|
+
# NOTE: The InternalError is returned for non-existent volume IDs.
|
43
|
+
# It's probably a bug so we're ignoring it -- Dave.
|
44
|
+
rescue ::EC2::InternalError => ex
|
45
|
+
raise Rudy::AWS::Error, ex.message
|
14
46
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
47
|
+
rescue Timeout::Error => ex
|
48
|
+
STDERR.puts "Timeout (#{timeout}): #{ex.message}!"
|
49
|
+
rescue SocketError => ex
|
50
|
+
#STDERR.puts ex.message
|
51
|
+
#STDERR.puts ex.backtrace
|
52
|
+
raise SocketError, "Check your Internets!" unless @@global.offline
|
53
|
+
ensure
|
54
|
+
response ||= default
|
20
55
|
end
|
56
|
+
response
|
21
57
|
end
|
22
58
|
|
23
59
|
class NoRunningInstances < Rudy::Error; end
|
@@ -25,7 +61,7 @@ module Rudy; module AWS
|
|
25
61
|
class InvalidRegion < Rudy::Error; end
|
26
62
|
class UnknownState < Rudy::Error; end
|
27
63
|
class NoGroup < Rudy::Error; end
|
28
|
-
class
|
64
|
+
class NoKeypair < Rudy::Error; end
|
29
65
|
class NoAMI < Rudy::Error; end
|
30
66
|
|
31
67
|
class NoAddress < Rudy::Error; end
|
@@ -34,13 +70,13 @@ module Rudy; module AWS
|
|
34
70
|
class AddressAssociated < Rudy::Error; end
|
35
71
|
class ErrorCreatingAddress < Rudy::Error; end
|
36
72
|
class AddressNotAssociated < Rudy::Error; end
|
37
|
-
class
|
73
|
+
class InsecureKeypairPermissions < Rudy::Error; end
|
38
74
|
|
39
|
-
class
|
40
|
-
class
|
75
|
+
class InsecureKeypairPermissions < Rudy::Error; end
|
76
|
+
class ErrorCreatingKeypair < Rudy::Error; end
|
41
77
|
class NoPrivateKeyFile < Rudy::Error; end
|
42
|
-
class
|
43
|
-
class
|
78
|
+
class KeypairExists < Rudy::Error; end
|
79
|
+
class KeypairAlreadyDefined < Rudy::Error
|
44
80
|
def message
|
45
81
|
"A keypair is defined for #{@obj}. Check your Rudy config."
|
46
82
|
end
|
@@ -49,6 +85,7 @@ module Rudy; module AWS
|
|
49
85
|
class VolumeAlreadyAttached < Rudy::Error; end
|
50
86
|
class VolumeNotAvailable < Rudy::Error; end
|
51
87
|
class VolumeNotAttached < Rudy::Error; end
|
88
|
+
class UnknownVolume < Rudy::Error; end
|
52
89
|
class NoInstanceID < Rudy::Error; end
|
53
90
|
class NoVolumeID < Rudy::Error; end
|
54
91
|
class UnknownState < Rudy::Error; end
|