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
@@ -0,0 +1,98 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Rudy::AWS
|
4
|
+
module EC2
|
5
|
+
class Snapshot < Storable
|
6
|
+
@@sformat = "%s <- %10s; %s"
|
7
|
+
|
8
|
+
field :awsid
|
9
|
+
field :progress
|
10
|
+
field :created
|
11
|
+
field :volid
|
12
|
+
field :status
|
13
|
+
|
14
|
+
def liner_note
|
15
|
+
t = Time.parse(@created)
|
16
|
+
info = t.strftime("%Y-%m-%d %H:%M:%S")
|
17
|
+
"%s (%s)" % [(self.awsid || '').bright, info]
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_s(with_title=false)
|
21
|
+
@@sformat % [liner_note, @volid, @status]
|
22
|
+
end
|
23
|
+
|
24
|
+
def completed?
|
25
|
+
self.status && self.status == 'completed'
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
class Snapshots
|
31
|
+
include Rudy::AWS::ObjectBase
|
32
|
+
include Rudy::AWS::EC2::Base
|
33
|
+
|
34
|
+
def list(snap_id=[])
|
35
|
+
snapshots = list_as_hash(snap_id)
|
36
|
+
if snapshots
|
37
|
+
snapshots = snapshots.values.sort { |a,b| a.created <=> b.created }
|
38
|
+
end
|
39
|
+
snapshots
|
40
|
+
end
|
41
|
+
def list_as_hash(snap_id=[])
|
42
|
+
snap_id = [snap_id].flatten.compact
|
43
|
+
slist = @ec2.describe_snapshots(:snapshot_id => snap_id)
|
44
|
+
return unless slist['snapshotSet'].is_a?(Hash)
|
45
|
+
snapshots = {}
|
46
|
+
slist['snapshotSet']['item'].each do |snap|
|
47
|
+
kp = self.class.from_hash(snap)
|
48
|
+
snapshots[kp.awsid] = kp
|
49
|
+
end
|
50
|
+
snapshots
|
51
|
+
end
|
52
|
+
|
53
|
+
def create(vol_id)
|
54
|
+
vol_id = (vol_id.is_a?(Rudy::AWS::EC2::Volume)) ? vol_id.awsid : vol_id
|
55
|
+
shash = @ec2.create_snapshot(:volume_id => vol_id)
|
56
|
+
snap = Snapshots.from_hash(shash)
|
57
|
+
snap
|
58
|
+
end
|
59
|
+
|
60
|
+
def destroy(snap_id)
|
61
|
+
ret = @ec2.delete_snapshot(:snapshot_id => snap_id)
|
62
|
+
(ret && ret['return'] == 'true')
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
def Snapshots.from_hash(h)
|
67
|
+
#snapshotSet:
|
68
|
+
# item:
|
69
|
+
# - snapshotId: snap-5493653d
|
70
|
+
# volumeId: vol-0836d761
|
71
|
+
# status: completed
|
72
|
+
# startTime: "2009-03-29T20:15:10.000Z"
|
73
|
+
# progress: 100%
|
74
|
+
vol = Rudy::AWS::EC2::Snapshot.new
|
75
|
+
vol.awsid = h['snapshotId']
|
76
|
+
vol.volid = h['volumeId']
|
77
|
+
vol.created = h['startTime']
|
78
|
+
vol.progress = h['progress']
|
79
|
+
vol.status = h['status']
|
80
|
+
vol
|
81
|
+
end
|
82
|
+
|
83
|
+
def any?
|
84
|
+
!(list_as_hash || {}).empty?
|
85
|
+
end
|
86
|
+
|
87
|
+
def get(snap_id)
|
88
|
+
list(snap_id).first || nil
|
89
|
+
end
|
90
|
+
|
91
|
+
def exists?(id)
|
92
|
+
!get(snap_id).nil?
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,230 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Rudy::AWS
|
4
|
+
module EC2
|
5
|
+
class Volume < Storable
|
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
|
+
|
37
|
+
# Alias for status
|
38
|
+
def state
|
39
|
+
status
|
40
|
+
end
|
41
|
+
|
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
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
class Volumes
|
52
|
+
include Rudy::AWS::ObjectBase
|
53
|
+
include Rudy::AWS::EC2::Base
|
54
|
+
|
55
|
+
unless defined?(KNOWN_STATES)
|
56
|
+
KNOWN_STATES = [:available, :creating, :deleting, :attached, :detaching].freeze
|
57
|
+
end
|
58
|
+
|
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
|
+
}
|
65
|
+
|
66
|
+
opts[:snapshot_id] = snapid if snapid
|
67
|
+
|
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
|
85
|
+
|
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
|
92
|
+
|
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
|
100
|
+
|
101
|
+
opts = {
|
102
|
+
:volume_id => vol_id,
|
103
|
+
:instance_id => inst_id,
|
104
|
+
:device => device
|
105
|
+
}
|
106
|
+
ret = execute_request(false) { @ec2.attach_volume(opts) }
|
107
|
+
(ret['status'] == 'attaching')
|
108
|
+
end
|
109
|
+
|
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
|
117
|
+
|
118
|
+
|
119
|
+
def list(state=nil, vol_id=[])
|
120
|
+
list_as_hash(state, vol_id).values
|
121
|
+
end
|
122
|
+
|
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
|
+
}
|
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
|
144
|
+
|
145
|
+
def any?(state=nil,vol_id=[])
|
146
|
+
!list(state, vol_id).nil?
|
147
|
+
end
|
148
|
+
|
149
|
+
def exists?(vol_id)
|
150
|
+
vol_id = Volumes.get_vol_id(vol_id)
|
151
|
+
vol = get(vol_id)
|
152
|
+
!vol.nil?
|
153
|
+
end
|
154
|
+
|
155
|
+
def get(vol_id)
|
156
|
+
vol_id = Volumes.get_vol_id(vol_id)
|
157
|
+
list(:any, vol_id).first || nil
|
158
|
+
end
|
159
|
+
|
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
|
169
|
+
|
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
|
221
|
+
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
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/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
|