solutious-rudy 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +19 -1
- data/README.rdoc +66 -35
- data/Rakefile +1 -0
- data/Rudyfile +97 -6
- data/bin/ird +7 -4
- data/bin/rudy +120 -212
- data/bin/rudy-ec2 +240 -0
- data/bin/rudy-s3 +76 -0
- data/bin/rudy-sdb +67 -0
- data/lib/annoy.rb +61 -18
- data/lib/console.rb +10 -5
- data/lib/rudy/aws/ec2/address.rb +76 -40
- data/lib/rudy/aws/ec2/group.rb +138 -78
- data/lib/rudy/aws/ec2/image.rb +134 -12
- data/lib/rudy/aws/ec2/instance.rb +116 -89
- data/lib/rudy/aws/ec2/keypair.rb +26 -14
- data/lib/rudy/aws/ec2/snapshot.rb +23 -12
- data/lib/rudy/aws/ec2/volume.rb +198 -202
- data/lib/rudy/aws/ec2/zone.rb +77 -0
- data/lib/rudy/aws/ec2.rb +56 -25
- data/lib/rudy/aws/s3.rb +54 -0
- data/lib/rudy/aws/sdb/error.rb +46 -0
- data/lib/rudy/aws/sdb.rb +298 -0
- data/lib/rudy/aws.rb +29 -57
- data/lib/rudy/{metadata/backup.rb → backup.rb} +8 -8
- 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/{deploy.rb → candy.rb} +2 -6
- data/lib/rudy/cli/config.rb +25 -20
- data/lib/rudy/cli/disks.rb +18 -108
- data/lib/rudy/cli/machines.rb +94 -0
- data/lib/rudy/cli/routines.rb +47 -70
- data/lib/rudy/cli.rb +104 -89
- data/lib/rudy/config/objects.rb +5 -43
- data/lib/rudy/config.rb +8 -24
- data/lib/rudy/disks.rb +248 -0
- data/lib/rudy/global.rb +121 -0
- data/lib/rudy/huxtable.rb +232 -147
- data/lib/rudy/machines.rb +245 -0
- data/lib/rudy/metadata.rb +136 -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 +27 -8
- data/lib/rudy/routines/shutdown.rb +47 -32
- data/lib/rudy/routines/startup.rb +47 -37
- data/lib/rudy/routines.rb +30 -37
- data/lib/rudy/scm/svn.rb +1 -1
- data/lib/rudy/utils.rb +262 -4
- data/lib/rudy.rb +76 -248
- data/lib/storable.rb +19 -16
- data/lib/sysinfo.rb +1 -1
- data/rudy.gemspec +88 -68
- data/support/rudy-ec2-startup +5 -5
- data/test/05_config/00_setup_test.rb +3 -7
- data/test/20_sdb/00_setup_test.rb +2 -17
- data/test/20_sdb/10_domains_test.rb +18 -16
- data/test/25_ec2/00_setup_test.rb +5 -10
- data/test/25_ec2/10_keypairs_test.rb +13 -5
- data/test/25_ec2/20_groups_test.rb +48 -56
- data/test/25_ec2/30_addresses_test.rb +13 -10
- data/test/25_ec2/40_volumes_test.rb +11 -8
- data/test/25_ec2/50_snapshots_test.rb +17 -12
- data/test/26_ec2_instances/00_setup_test.rb +3 -8
- data/test/26_ec2_instances/10_instances_test.rb +21 -19
- data/test/30_sdb_metadata/00_setup_test.rb +2 -9
- data/test/30_sdb_metadata/10_disks_test.rb +47 -37
- data/test/30_sdb_metadata/20_backups_test.rb +9 -9
- data/test/helper.rb +5 -3
- 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/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/lib/highline.rb +758 -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 +81 -69
- data/lib/aws_sdb/error.rb +0 -42
- data/lib/aws_sdb/service.rb +0 -215
- data/lib/aws_sdb.rb +0 -3
- data/lib/rudy/aws/simpledb.rb +0 -71
- data/lib/rudy/cli/addresses.rb +0 -85
- data/lib/rudy/cli/backups.rb +0 -175
- data/lib/rudy/cli/domains.rb +0 -17
- data/lib/rudy/cli/groups.rb +0 -77
- data/lib/rudy/cli/images.rb +0 -111
- data/lib/rudy/cli/instances.rb +0 -142
- data/lib/rudy/cli/keypairs.rb +0 -47
- data/lib/rudy/cli/manager.rb +0 -51
- data/lib/rudy/cli/release.rb +0 -174
- data/lib/rudy/cli/volumes.rb +0 -121
- data/lib/rudy/command/addresses.rb +0 -69
- data/lib/rudy/command/backups.rb +0 -65
- data/lib/rudy/command/disks-old.rb +0 -322
- data/lib/rudy/command/disks.rb +0 -9
- data/lib/rudy/command/domains.rb +0 -34
- data/lib/rudy/command/groups.rb +0 -118
- data/lib/rudy/command/instances.rb +0 -278
- data/lib/rudy/command/keypairs.rb +0 -149
- data/lib/rudy/command/manager.rb +0 -65
- data/lib/rudy/command/volumes.rb +0 -127
- data/lib/rudy/metadata/disk.rb +0 -149
- data/lib/rudy/metadata/machine.rb +0 -34
- data/lib/rudy/routines/disk_handler.rb +0 -190
- data/lib/rudy/routines/script_runner.rb +0 -65
- data/test/50_commands/00_setup_test.rb +0 -11
- data/test/50_commands/10_keypairs_test.rb +0 -79
- data/test/50_commands/20_groups_test.rb +0 -77
- data/test/50_commands/40_volumes_test.rb +0 -55
- data/test/50_commands/50_instances_test.rb +0 -110
- data/tryouts/console_tryout.rb +0 -91
- data/tryouts/disks.rb +0 -55
- data/tryouts/nested_methods.rb +0 -36
- data/tryouts/session_tryout.rb +0 -46
data/lib/rudy/aws/ec2/volume.rb
CHANGED
@@ -1,234 +1,230 @@
|
|
1
1
|
|
2
2
|
|
3
3
|
module Rudy::AWS
|
4
|
-
|
4
|
+
module EC2
|
5
5
|
class Volume < Storable
|
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
|
-
|
6
|
+
@@sformat = "%s %10s;%4sGB; %s " # cram the terabyte
|
7
|
+
|
8
|
+
field :awsid
|
9
|
+
field :status
|
10
|
+
field :size
|
11
|
+
field :snapid
|
12
|
+
field :zone
|
13
|
+
field :create_time
|
14
|
+
field :attach_time
|
15
|
+
field :instid
|
16
|
+
field :device
|
17
|
+
|
18
|
+
def liner_note
|
19
|
+
info = attached? ? "attached to #{@instid}" : @status
|
20
|
+
"%s (%s)" % [(self.awsid || '').bright, info]
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_s(with_title=false)
|
24
|
+
line = @@sformat % [liner_note, @zone, @size, @device]
|
25
|
+
line << " <- %s" % [@snapid] if @snapid
|
26
|
+
line
|
27
|
+
end
|
28
|
+
|
29
|
+
def inspect
|
30
|
+
lines = [liner_note]
|
31
|
+
field_names.each do |n|
|
32
|
+
lines << sprintf(" %12s: %s", n, self.send(n)) if self.send(n)
|
33
|
+
end
|
34
|
+
lines.join($/)
|
35
|
+
end
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
# Alias for status
|
38
|
+
def state
|
39
|
+
status
|
40
|
+
end
|
40
41
|
|
41
|
-
|
42
|
-
(status &&
|
43
|
-
|
42
|
+
def available?; (status && status == "available"); end
|
43
|
+
def creating?; (status && status == "creating"); end
|
44
|
+
def deleting?; (status && status == "deleting"); end
|
45
|
+
def attached?; (status && status == "attached"); end
|
46
|
+
def in_use?; (status && status == "in-use"); end
|
44
47
|
|
45
|
-
def in_use?
|
46
|
-
(status && (status == "in-use"))
|
47
48
|
end
|
48
|
-
|
49
|
-
end
|
50
49
|
|
51
50
|
|
52
|
-
|
53
|
-
|
51
|
+
class Volumes
|
52
|
+
include Rudy::AWS::ObjectBase
|
53
|
+
include Rudy::AWS::EC2::Base
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
unless defined?(KNOWN_STATES)
|
56
|
+
KNOWN_STATES = [:available, :creating, :deleting, :attached, :detaching].freeze
|
57
|
+
end
|
58
58
|
|
59
|
-
|
60
|
-
|
61
|
-
|
59
|
+
# * +size+ the number of GB
|
60
|
+
def create(size, zone, snapid=nil)
|
61
|
+
opts = {
|
62
|
+
:availability_zone => zone.to_s,
|
63
|
+
:size => (size || 1).to_s
|
64
|
+
}
|
62
65
|
|
63
|
-
|
64
|
-
@aws.attach_volume(:volume_id => vol_id, :instance_id => inst_id, :device => device)
|
65
|
-
}
|
66
|
-
(ret['status'] == 'attaching')
|
67
|
-
end
|
68
|
-
|
69
|
-
def detach(vol_id)
|
70
|
-
vol_id = (vol_id.is_a?(Rudy::AWS::EC2::Volume)) ? vol_id.awsid : vol_id
|
66
|
+
opts[:snapshot_id] = snapid if snapid
|
71
67
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
68
|
+
# "status"=>"creating",
|
69
|
+
# "size"=>"1",
|
70
|
+
# "snapshotId"=>nil,
|
71
|
+
# "requestId"=>"d42ff744-48b5-4f47-a3f0-7aba57a13eb9",
|
72
|
+
# "availabilityZone"=>"us-east-1b",
|
73
|
+
# "createTime"=>"2009-03-17T20:10:48.000Z",
|
74
|
+
# "volumeId"=>"vol-48826421"
|
75
|
+
vol = execute_request({}) { @ec2.create_volume(opts) }
|
76
|
+
|
77
|
+
# TODO: use a waiter?
|
78
|
+
#Rudy.waiter(1, 30) do
|
79
|
+
# ret = @@ec2.volumes.available?(volume.awsid)
|
80
|
+
#end
|
81
|
+
|
82
|
+
reqid = vol['requestId']
|
83
|
+
Volumes.from_hash(vol) || nil
|
84
|
+
end
|
78
85
|
|
79
|
-
|
80
|
-
|
81
|
-
|
86
|
+
def destroy(vol_id)
|
87
|
+
vol_id = Volumes.get_vol_id(vol_id)
|
88
|
+
raise VolumeNotAvailable, vol_id unless available?(vol_id)
|
89
|
+
ret = execute_request({}) { @ec2.delete_volume(:volume_id => vol_id) }
|
90
|
+
(ret['return'] == 'true')
|
91
|
+
end
|
82
92
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
93
|
+
def attach(vol_id, inst_id, device)
|
94
|
+
vol_id = Volumes.get_vol_id(vol_id)
|
95
|
+
inst_id = inst_id.is_a?(Rudy::AWS::EC2::Instance) ? inst_id.awsid : inst_id
|
96
|
+
raise NoVolumeID unless vol_id
|
97
|
+
raise VolumeAlreadyAttached, vol_id if attached?(vol_id)
|
98
|
+
raise NoInstanceID unless inst_id
|
99
|
+
raise NoDevice unless device
|
87
100
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
vlist = execute_request({}) {
|
94
|
-
@aws.describe_volumes(opts)
|
101
|
+
opts = {
|
102
|
+
:volume_id => vol_id,
|
103
|
+
:instance_id => inst_id,
|
104
|
+
:device => device
|
95
105
|
}
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
rescue ::EC2::InternalError => ex
|
100
|
-
vlist = {}
|
101
|
-
end
|
102
|
-
volumes = {}
|
103
|
-
return volumes unless vlist['volumeSet'].is_a?(Hash)
|
104
|
-
vlist['volumeSet']['item'].each do |vol|
|
105
|
-
v = Volumes.from_hash(vol)
|
106
|
-
next if state && v.state != state.to_s
|
107
|
-
volumes[v.awsid] = v
|
108
|
-
end
|
109
|
-
volumes
|
110
|
-
end
|
111
|
-
|
106
|
+
ret = execute_request(false) { @ec2.attach_volume(opts) }
|
107
|
+
(ret['status'] == 'attaching')
|
108
|
+
end
|
112
109
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
opts[:snapshot_id] = snapid if snapid
|
121
|
-
|
122
|
-
# "status"=>"creating",
|
123
|
-
# "size"=>"1",
|
124
|
-
# "snapshotId"=>nil,
|
125
|
-
# "requestId"=>"d42ff744-48b5-4f47-a3f0-7aba57a13eb9",
|
126
|
-
# "availabilityZone"=>"us-east-1b",
|
127
|
-
# "createTime"=>"2009-03-17T20:10:48.000Z",
|
128
|
-
# "volumeId"=>"vol-48826421"
|
129
|
-
vol = execute_request({}) {
|
130
|
-
@aws.create_volume(opts)
|
131
|
-
}
|
132
|
-
|
133
|
-
reqid = vol['requestId']
|
134
|
-
Volumes.from_hash(vol) || nil
|
135
|
-
end
|
110
|
+
def detach(vol_id)
|
111
|
+
vol_id = Volumes.get_vol_id(vol_id)
|
112
|
+
raise NoVolumeID unless vol_id
|
113
|
+
raise VolumeNotAttached, vol_id unless attached?(vol_id)
|
114
|
+
ret = execute_request({}) { @ec2.detach_volume(:volume_id => vol_id) }
|
115
|
+
(ret['status'] == 'detaching')
|
116
|
+
end
|
136
117
|
|
137
118
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
@aws.delete_volume(:volume_id => vol_id)
|
142
|
-
}
|
143
|
-
(ret['return'] == 'true')
|
144
|
-
end
|
119
|
+
def list(state=nil, vol_id=[])
|
120
|
+
list_as_hash(state, vol_id).values
|
121
|
+
end
|
145
122
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
# createTime: "2009-03-17T20:10:48.000Z"
|
156
|
-
# volumeId: vol-48826421
|
157
|
-
# attachmentSet:
|
158
|
-
# item:
|
159
|
-
# - attachTime: "2009-03-17T21:49:54.000Z"
|
160
|
-
# status: attached
|
161
|
-
# device: /dev/sdh
|
162
|
-
# instanceId: i-956af3fc
|
163
|
-
# volumeId: vol-48826421
|
164
|
-
#
|
165
|
-
# requestId: 8fc30e5b-a9c3-4fe0-a979-0f71e639a7c7
|
166
|
-
vol = Rudy::AWS::EC2::Volume.new
|
167
|
-
vol.status = h['status']
|
168
|
-
vol.size = h['size']
|
169
|
-
vol.snapid = h['snapshotId']
|
170
|
-
vol.zone = h['availabilityZone']
|
171
|
-
vol.awsid = h['volumeId']
|
172
|
-
vol.create_time = h['createTime']
|
173
|
-
if h['attachmentSet'].is_a?(Hash)
|
174
|
-
item = h['attachmentSet']['item'].first
|
175
|
-
vol.status = item['status'] # Overwrite "available status". Possibly a bad idea.
|
176
|
-
vol.device = item['device']
|
177
|
-
vol.attach_time = item['attachTime']
|
178
|
-
vol.instid = item['instanceId']
|
179
|
-
end
|
180
|
-
vol
|
181
|
-
end
|
123
|
+
def list_as_hash(state=nil, vol_id=[])
|
124
|
+
state &&= state.to_sym
|
125
|
+
state = nil if state == :any
|
126
|
+
# A nil state is fine, but we don't want an unknown one!
|
127
|
+
raise UnknownState, state if state && !Volumes.known_state?(state)
|
128
|
+
|
129
|
+
opts = {
|
130
|
+
:volume_id => vol_id ? [vol_id].flatten : []
|
131
|
+
}
|
182
132
|
|
133
|
+
vlist = execute_request({}) { @ec2.describe_volumes(opts) }
|
134
|
+
|
135
|
+
volumes = {}
|
136
|
+
return volumes unless vlist['volumeSet'].is_a?(Hash)
|
137
|
+
vlist['volumeSet']['item'].each do |vol|
|
138
|
+
v = Volumes.from_hash(vol)
|
139
|
+
next if state && v.state != state.to_s
|
140
|
+
volumes[v.awsid] = v
|
141
|
+
end
|
142
|
+
volumes
|
143
|
+
end
|
183
144
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
def exists?(vol_id)
|
189
|
-
vol_id = (vol_id.is_a?(Rudy::AWS::EC2::Volume)) ? vol_id.awsid : vol_id
|
190
|
-
!get(vol_id).nil?
|
191
|
-
end
|
145
|
+
def any?(state=nil,vol_id=[])
|
146
|
+
!list(state, vol_id).nil?
|
147
|
+
end
|
192
148
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
149
|
+
def exists?(vol_id)
|
150
|
+
vol_id = Volumes.get_vol_id(vol_id)
|
151
|
+
vol = get(vol_id)
|
152
|
+
!vol.nil?
|
153
|
+
end
|
197
154
|
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
(vol && vol.status == "deleting")
|
203
|
-
end
|
155
|
+
def get(vol_id)
|
156
|
+
vol_id = Volumes.get_vol_id(vol_id)
|
157
|
+
list(:any, vol_id).first || nil
|
158
|
+
end
|
204
159
|
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
160
|
+
# deleting?, available?, etc...
|
161
|
+
%w[deleting available attached in-use].each do |state|
|
162
|
+
define_method("#{state.tr('-', '_')}?") do |vol_id|
|
163
|
+
vol_id = Volumes.get_vol_id(vol_id)
|
164
|
+
return false unless vol_id
|
165
|
+
vol = get(vol_id)
|
166
|
+
(vol && vol.status == state)
|
167
|
+
end
|
168
|
+
end
|
211
169
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
170
|
+
# Creates a Rudy::AWS::EC2::Volume object from:
|
171
|
+
#
|
172
|
+
# volumeSet:
|
173
|
+
# item:
|
174
|
+
# - status: available
|
175
|
+
# size: "1"
|
176
|
+
# snapshotId:
|
177
|
+
# availabilityZone: us-east-1b
|
178
|
+
# attachmentSet:
|
179
|
+
# createTime: "2009-03-17T20:10:48.000Z"
|
180
|
+
# volumeId: vol-48826421
|
181
|
+
# attachmentSet:
|
182
|
+
# item:
|
183
|
+
# - attachTime: "2009-03-17T21:49:54.000Z"
|
184
|
+
# status: attached
|
185
|
+
# device: /dev/sdh
|
186
|
+
# instanceId: i-956af3fc
|
187
|
+
# volumeId: vol-48826421
|
188
|
+
#
|
189
|
+
# requestId: 8fc30e5b-a9c3-4fe0-a979-0f71e639a7c7
|
190
|
+
#
|
191
|
+
def self.from_hash(h)
|
192
|
+
vol = Rudy::AWS::EC2::Volume.new
|
193
|
+
vol.status = h['status']
|
194
|
+
vol.size = h['size']
|
195
|
+
vol.snapid = h['snapshotId']
|
196
|
+
vol.zone = h['availabilityZone']
|
197
|
+
vol.awsid = h['volumeId']
|
198
|
+
vol.create_time = h['createTime']
|
199
|
+
if h['attachmentSet'].is_a?(Hash)
|
200
|
+
item = h['attachmentSet']['item'].first
|
201
|
+
vol.status = item['status'] # Overwrite "available status". Possibly a bad idea.
|
202
|
+
vol.device = item['device']
|
203
|
+
vol.attach_time = item['attachTime']
|
204
|
+
vol.instid = item['instanceId']
|
205
|
+
end
|
206
|
+
vol
|
207
|
+
end
|
208
|
+
|
209
|
+
# * +vol_id+ is a String or Rudy::AWS::EC2::Volume
|
210
|
+
# Returns the volume ID
|
211
|
+
def self.get_vol_id(vol_id)
|
212
|
+
(vol_id.is_a?(Rudy::AWS::EC2::Volume)) ? vol_id.awsid : vol_id
|
213
|
+
end
|
214
|
+
|
215
|
+
# Is +state+ a known EC2 volume state? See: KNOWN_STATES
|
216
|
+
def self.known_state?(state)
|
217
|
+
return false unless state
|
218
|
+
state &&= state.to_sym
|
219
|
+
KNOWN_STATES.member?(state)
|
220
|
+
end
|
218
221
|
|
219
|
-
def in_use?(vol_id)
|
220
|
-
vol_id = (vol_id.is_a?(Rudy::AWS::EC2::Volume)) ? vol_id.awsid : vol_id
|
221
|
-
return false unless vol_id
|
222
|
-
vol = get(vol_id)
|
223
|
-
(vol && (vol.status == "in-use"))
|
224
|
-
end
|
225
|
-
|
226
|
-
# Is +state+ a known EC2 volume state? See: KNOWN_STATES
|
227
|
-
def self.known_state?(state)
|
228
|
-
return false unless state
|
229
|
-
state &&= state.to_sym
|
230
|
-
KNOWN_STATES.member?(state)
|
231
222
|
end
|
232
223
|
end
|
233
224
|
end
|
234
|
-
|
225
|
+
|
226
|
+
|
227
|
+
class Rudy::AWS::EC2::Volumes
|
228
|
+
|
229
|
+
|
230
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
|
2
|
+
module Rudy::AWS
|
3
|
+
module EC2
|
4
|
+
|
5
|
+
class Zone < Storable
|
6
|
+
|
7
|
+
field :name
|
8
|
+
field :region
|
9
|
+
field :state
|
10
|
+
|
11
|
+
def liner_note
|
12
|
+
"%-10s %9s %s" % [self.name, self.region, self.state]
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_s(titles=false)
|
16
|
+
str = titles ? "%-20s %s#{$/}" % ['name', 'region', 'state'] : ""
|
17
|
+
str << liner_note
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
class Zones
|
23
|
+
include Rudy::AWS::ObjectBase
|
24
|
+
include Rudy::AWS::EC2::Base
|
25
|
+
|
26
|
+
def list(*names)
|
27
|
+
zones = list_as_hash(names)
|
28
|
+
zones &&= zones.values
|
29
|
+
zones
|
30
|
+
end
|
31
|
+
|
32
|
+
def list_as_hash(*names)
|
33
|
+
names = names.flatten
|
34
|
+
zlist = @ec2.describe_availability_zones(:zone_name => names)
|
35
|
+
return unless zlist['availabilityZoneInfo'].is_a?(Hash)
|
36
|
+
zones = {}
|
37
|
+
zlist['availabilityZoneInfo']['item'].each do |zhash|
|
38
|
+
zon = Zones.from_hash(zhash)
|
39
|
+
zones[zon.name] = zon
|
40
|
+
end
|
41
|
+
zones
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.from_hash(h)
|
45
|
+
zone = Rudy::AWS::EC2::Zone.new
|
46
|
+
zone.name = h['zoneName']
|
47
|
+
zone.region = h['regionName']
|
48
|
+
zone.state = h['zoneState']
|
49
|
+
zone
|
50
|
+
end
|
51
|
+
|
52
|
+
def any?
|
53
|
+
zones = list || []
|
54
|
+
!zones.empty?
|
55
|
+
end
|
56
|
+
|
57
|
+
def get(name)
|
58
|
+
zones = list(name) || []
|
59
|
+
return if zones.empty?
|
60
|
+
zones.first
|
61
|
+
end
|
62
|
+
|
63
|
+
def zone?(name)
|
64
|
+
begin
|
65
|
+
kp = get(name)
|
66
|
+
kp.is_a?(Rudy::AWS::EC2::Zone)
|
67
|
+
rescue => ex
|
68
|
+
false
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
|
data/lib/rudy/aws/ec2.rb
CHANGED
@@ -1,28 +1,59 @@
|
|
1
1
|
|
2
|
-
module Rudy
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
2
|
+
module Rudy; module AWS
|
3
|
+
module EC2
|
4
|
+
module Base
|
5
|
+
attr_accessor :ec2
|
6
|
+
def initialize(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
|
+
end
|
22
|
+
|
23
|
+
class NoRunningInstances < Rudy::Error; end
|
24
|
+
class MalformedResponse < Rudy::Error; end
|
25
|
+
class InvalidRegion < Rudy::Error; end
|
26
|
+
class UnknownState < Rudy::Error; end
|
27
|
+
class NoGroup < Rudy::Error; end
|
28
|
+
class NoKeyPair < Rudy::Error; end
|
29
|
+
class NoAMI < Rudy::Error; end
|
30
|
+
|
31
|
+
class NoAddress < Rudy::Error; end
|
32
|
+
class UnknownAddress < Rudy::Error; end
|
33
|
+
class NoInstanceID < Rudy::Error; end
|
34
|
+
class AddressAssociated < Rudy::Error; end
|
35
|
+
class ErrorCreatingAddress < Rudy::Error; end
|
36
|
+
class AddressNotAssociated < Rudy::Error; end
|
37
|
+
class InsecureKeyPairPermissions < Rudy::Error; end
|
38
|
+
|
39
|
+
class InsecureKeyPairPermissions < Rudy::Error; end
|
40
|
+
class ErrorCreatingKeyPair < Rudy::Error; end
|
41
|
+
class NoPrivateKeyFile < Rudy::Error; end
|
42
|
+
class KeyPairExists < Rudy::Error; end
|
43
|
+
class KeyPairAlreadyDefined < Rudy::Error
|
44
|
+
def message
|
45
|
+
"A keypair is defined for #{@obj}. Check your Rudy config."
|
46
|
+
end
|
24
47
|
end
|
25
|
-
|
48
|
+
|
49
|
+
class VolumeAlreadyAttached < Rudy::Error; end
|
50
|
+
class VolumeNotAvailable < Rudy::Error; end
|
51
|
+
class VolumeNotAttached < Rudy::Error; end
|
52
|
+
class NoInstanceID < Rudy::Error; end
|
53
|
+
class NoVolumeID < Rudy::Error; end
|
54
|
+
class UnknownState < Rudy::Error; end
|
55
|
+
class NoDevice < Rudy::Error; end
|
56
|
+
|
57
|
+
|
26
58
|
end
|
27
|
-
|
28
|
-
end
|
59
|
+
end; end
|
data/lib/rudy/aws/s3.rb
CHANGED
@@ -1,3 +1,57 @@
|
|
1
1
|
|
2
2
|
module Rudy::AWS
|
3
|
+
class S3
|
4
|
+
|
5
|
+
def initialize(access_key=nil, secret_key=nil, region=nil, debug=nil)
|
6
|
+
|
7
|
+
url ||= 'http://sdb.amazonaws.com'
|
8
|
+
# There is a bug with passing :server to EC2::Base.new so
|
9
|
+
# we'll use the environment variable for now.
|
10
|
+
#if region && Rudy::AWS.valid_region?(region)
|
11
|
+
# "#{region}.sdb.amazonaws.com"
|
12
|
+
#end
|
13
|
+
|
14
|
+
@access_key_id = access_key || ENV['AWS_ACCESS_KEY'] || ENV['AMAZON_ACCESS_KEY_ID']
|
15
|
+
@secret_access_key = secret_key || ENV['AWS_SECRET_KEY'] || ENV['AMAZON_SECRET_ACCESS_KEY']
|
16
|
+
@base_url = url
|
17
|
+
@debug = debug || StringIO.new
|
18
|
+
|
19
|
+
|
20
|
+
AWS::S3::Base.establish_connection!(
|
21
|
+
:access_key_id => @access_key_id,
|
22
|
+
:secret_access_key => @secret_access_key
|
23
|
+
)
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def list_buckets
|
28
|
+
::AWS::S3::Service.buckets
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_bucket(name)
|
32
|
+
::AWS::S3::Bucket.create(name)
|
33
|
+
end
|
34
|
+
|
35
|
+
def destroy_bucket(name)
|
36
|
+
::AWS::S3::Bucket.delete(name)
|
37
|
+
end
|
38
|
+
|
39
|
+
def find_bucket(name)
|
40
|
+
::AWS::S3::Bucket.delete(name)
|
41
|
+
end
|
42
|
+
|
43
|
+
def list_bucket_objects(name)
|
44
|
+
::AWS::S3::Bucket.objects(name)
|
45
|
+
end
|
46
|
+
|
47
|
+
#def store(path, bucket)
|
48
|
+
# fname = File.basename(path)
|
49
|
+
# S3Object.store(fname, open(path), bucket)
|
50
|
+
#end
|
51
|
+
|
52
|
+
def bucket_exists?(name)
|
53
|
+
b = find_bucket(name)
|
54
|
+
!b.nil?
|
55
|
+
end
|
56
|
+
end
|
3
57
|
end
|