solutious-rudy 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +8 -9
- data/README.rdoc +48 -7
- data/Rakefile +102 -7
- data/Rudyfile +28 -0
- data/bin/ird +162 -0
- data/bin/rudy +287 -93
- data/lib/annoy.rb +227 -0
- data/lib/aws_sdb/service.rb +1 -1
- data/lib/console.rb +20 -4
- data/lib/escape.rb +305 -0
- data/lib/rudy.rb +265 -125
- data/lib/rudy/aws.rb +61 -26
- data/lib/rudy/aws/ec2.rb +20 -296
- data/lib/rudy/aws/ec2/address.rb +121 -0
- data/lib/rudy/aws/ec2/group.rb +241 -0
- data/lib/rudy/aws/ec2/image.rb +46 -0
- data/lib/rudy/aws/ec2/instance.rb +407 -0
- data/lib/rudy/aws/ec2/keypair.rb +92 -0
- data/lib/rudy/aws/ec2/snapshot.rb +87 -0
- data/lib/rudy/aws/ec2/volume.rb +234 -0
- data/lib/rudy/aws/simpledb.rb +33 -15
- data/lib/rudy/cli.rb +142 -0
- data/lib/rudy/cli/addresses.rb +85 -0
- data/lib/rudy/cli/backups.rb +175 -0
- data/lib/rudy/{command → cli}/config.rb +18 -13
- data/lib/rudy/cli/deploy.rb +12 -0
- data/lib/rudy/cli/disks.rb +125 -0
- data/lib/rudy/cli/domains.rb +17 -0
- data/lib/rudy/cli/groups.rb +77 -0
- data/lib/rudy/{command → cli}/images.rb +18 -6
- data/lib/rudy/cli/instances.rb +142 -0
- data/lib/rudy/cli/keypairs.rb +47 -0
- data/lib/rudy/cli/manager.rb +51 -0
- data/lib/rudy/{command → cli}/release.rb +10 -10
- data/lib/rudy/cli/routines.rb +80 -0
- data/lib/rudy/cli/volumes.rb +121 -0
- data/lib/rudy/command/addresses.rb +62 -39
- data/lib/rudy/command/backups.rb +60 -170
- data/lib/rudy/command/disks-old.rb +322 -0
- data/lib/rudy/command/disks.rb +5 -209
- data/lib/rudy/command/domains.rb +34 -0
- data/lib/rudy/command/groups.rb +105 -48
- data/lib/rudy/command/instances.rb +263 -70
- data/lib/rudy/command/keypairs.rb +149 -0
- data/lib/rudy/command/manager.rb +65 -0
- data/lib/rudy/command/volumes.rb +110 -49
- data/lib/rudy/config.rb +90 -70
- data/lib/rudy/config/objects.rb +67 -0
- data/lib/rudy/huxtable.rb +253 -0
- data/lib/rudy/metadata/backup.rb +23 -48
- data/lib/rudy/metadata/disk.rb +79 -68
- data/lib/rudy/metadata/machine.rb +34 -0
- data/lib/rudy/routines.rb +54 -0
- data/lib/rudy/routines/disk_handler.rb +190 -0
- data/lib/rudy/routines/release.rb +15 -0
- data/lib/rudy/routines/script_runner.rb +65 -0
- data/lib/rudy/routines/shutdown.rb +42 -0
- data/lib/rudy/routines/startup.rb +48 -0
- data/lib/rudy/utils.rb +57 -2
- data/lib/storable.rb +11 -5
- data/lib/sysinfo.rb +274 -0
- data/rudy.gemspec +84 -20
- data/support/randomize-root-password +45 -0
- data/support/rudy-ec2-startup +5 -5
- data/support/update-ec2-ami-tools +20 -0
- data/test/05_config/00_setup_test.rb +24 -0
- data/test/05_config/30_machines_test.rb +69 -0
- data/test/20_sdb/00_setup_test.rb +31 -0
- data/test/20_sdb/10_domains_test.rb +113 -0
- data/test/25_ec2/00_setup_test.rb +34 -0
- data/test/25_ec2/10_keypairs_test.rb +33 -0
- data/test/25_ec2/20_groups_test.rb +139 -0
- data/test/25_ec2/30_addresses_test.rb +35 -0
- data/test/25_ec2/40_volumes_test.rb +46 -0
- data/test/25_ec2/50_snapshots_test.rb +69 -0
- data/test/26_ec2_instances/00_setup_test.rb +33 -0
- data/test/26_ec2_instances/10_instances_test.rb +81 -0
- data/test/26_ec2_instances/50_images_test.rb +13 -0
- data/test/30_sdb_metadata/00_setup_test.rb +28 -0
- data/test/30_sdb_metadata/10_disks_test.rb +99 -0
- data/test/30_sdb_metadata/20_backups_test.rb +102 -0
- data/test/50_commands/00_setup_test.rb +11 -0
- data/test/50_commands/10_keypairs_test.rb +79 -0
- data/test/50_commands/20_groups_test.rb +77 -0
- data/test/50_commands/40_volumes_test.rb +55 -0
- data/test/50_commands/50_instances_test.rb +110 -0
- data/test/coverage.txt +51 -0
- data/test/helper.rb +35 -0
- data/tryouts/disks.rb +55 -0
- data/tryouts/nested_methods.rb +36 -0
- data/tryouts/session_tryout.rb +48 -0
- metadata +94 -25
- data/bin/rudy-ec2 +0 -108
- data/lib/rudy/command/base.rb +0 -839
- data/lib/rudy/command/deploy.rb +0 -12
- data/lib/rudy/command/environment.rb +0 -74
- data/lib/rudy/command/machines.rb +0 -170
- data/lib/rudy/command/metadata.rb +0 -41
- data/lib/rudy/metadata.rb +0 -26
@@ -0,0 +1,322 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Rudy
|
4
|
+
class Disks
|
5
|
+
include Rudy::Huxtable
|
6
|
+
|
7
|
+
def initialize(opts={})
|
8
|
+
super(opts)
|
9
|
+
@disk_handler = Rudy::Routines::DiskHandler.new(opts)
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
def list(opts={})
|
15
|
+
opts = {
|
16
|
+
:all => false
|
17
|
+
}.merge(opts)
|
18
|
+
disk = find_disk(opts[:disk] || opts[:path]) || create_disk_from_opts(opts)
|
19
|
+
query = opts[:all] ? disk.to_query([], [:zone, :environment, :role, :position, :path]) : disk.to_query
|
20
|
+
items = execute_query(query)
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
def create(opts={})
|
25
|
+
disk = create_disk_from_opts(opts)
|
26
|
+
switch_user(:root)
|
27
|
+
|
28
|
+
raise "#{disk.path} is already defined for that machine" if is_defined?(disk)
|
29
|
+
raise "Device #{disk.device} is already defined for that machine" if device_used?(disk)
|
30
|
+
raise "No size given" unless disk.size.kind_of?(Integer)
|
31
|
+
raise "No path defined" if disk.path.nil?
|
32
|
+
raise "Not enough info (#{disk.name})" unless disk.valid?
|
33
|
+
|
34
|
+
begin
|
35
|
+
|
36
|
+
rvolumes = Rudy::Volumes.new(opts)
|
37
|
+
vol = rvolumes.create(disk.size, disk.zone)
|
38
|
+
disk.awsid = vol.awsid
|
39
|
+
save(disk)
|
40
|
+
|
41
|
+
rescue => ex
|
42
|
+
@logger.puts "Error creating #{disk.name}: #{ex.message}".color(:red)
|
43
|
+
@logger.puts ex.backtrace if debug?
|
44
|
+
if vol
|
45
|
+
@logger.puts "Destroying Volume #{vol.awsid}...".color(:red)
|
46
|
+
destroy(disk)
|
47
|
+
end
|
48
|
+
return
|
49
|
+
end
|
50
|
+
|
51
|
+
disk
|
52
|
+
end
|
53
|
+
|
54
|
+
def attach(disk, machine=nil)
|
55
|
+
disk_obj = find_disk(disk)
|
56
|
+
|
57
|
+
#if instance && @ec2.instances.attached_volume?(instance.awsid, disk_obj.device)
|
58
|
+
# raise "Skipping disk for #{disk_obj.path} (device #{disk_obj.device} is in use)"
|
59
|
+
#
|
60
|
+
#end
|
61
|
+
end
|
62
|
+
|
63
|
+
def destroy(disk, instance=nil)
|
64
|
+
disk_obj = find_disk(disk)
|
65
|
+
raise "Disk #{disk} cannot be found" unless disk_obj
|
66
|
+
is_mounted = is_mounted?(disk_obj)
|
67
|
+
is_attached = is_attached?(disk_obj)
|
68
|
+
is_available = @volumes.attached?(disk_obj.awsid)
|
69
|
+
raise "Disk is in use (unmount it or use force)" if is_mounted && !@global.force
|
70
|
+
raise "Disk is attached (unattach it or use force)" if is_attached && !@global.force
|
71
|
+
|
72
|
+
begin
|
73
|
+
|
74
|
+
if @global.force
|
75
|
+
unmount(instance, disk_obj) if is_mounted
|
76
|
+
@volumes.detach(disk_obj.awsid) if is_attached
|
77
|
+
@volumes.destroy(disk_obj.awsid)
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
if disk_obj.awsid && !disk_obj.awsid.empty?
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
rescue => ex
|
86
|
+
puts "Error while detaching volume #{disk_obj.awsid}: #{ex.message}"
|
87
|
+
puts ex.backtrace if debug?
|
88
|
+
puts "Continuing..."
|
89
|
+
ensure
|
90
|
+
puts "Deleteing metadata for #{disk_obj.name}"
|
91
|
+
@sdb.destroy(RUDY_DOMAIN, disk_obj.name)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
# TODO: These are broken! They don't even look at rtype!
|
98
|
+
def find_from_volume(vol_id)
|
99
|
+
query = "['awsid' = '#{vol_id}']"
|
100
|
+
items = execute_query(query) || {}
|
101
|
+
items.values.first
|
102
|
+
end
|
103
|
+
def find_from_path(path)
|
104
|
+
query = "['path' = '#{path}']"
|
105
|
+
items = execute_query(query) || {}
|
106
|
+
items.values.first
|
107
|
+
end
|
108
|
+
|
109
|
+
def get(name)
|
110
|
+
disk = @sdb.get_attributes(RUDY_DOMAIN, name)
|
111
|
+
return nil unless disk && disk.is_a?(Hash) && !disk.empty?
|
112
|
+
Rudy::MetaData::Disk.from_hash(disk) || nil
|
113
|
+
end
|
114
|
+
|
115
|
+
def save(disk)
|
116
|
+
@sdb.store(RUDY_DOMAIN, disk.name, disk.to_hash, :replace)
|
117
|
+
end
|
118
|
+
|
119
|
+
def is_defined?(disk)
|
120
|
+
# We don't care about the path, but we do care about the device
|
121
|
+
# which is not part of the disk's name.
|
122
|
+
disk_obj = find_disk(disk)
|
123
|
+
raise "Disk #{opts[:disk] || opts[:path]} cannot be found" unless disk_obj
|
124
|
+
query = disk_obj.to_query
|
125
|
+
!(@sdb.query_with_attributes(RUDY_DOMAIN, query) || {}).empty?
|
126
|
+
end
|
127
|
+
|
128
|
+
def is_mounted?(disk)
|
129
|
+
disk_obj = find_disk(disk)
|
130
|
+
raise "Disk #{opts[:disk] || opts[:path]} cannot be found" unless disk_obj
|
131
|
+
end
|
132
|
+
|
133
|
+
def device_used?(disk)
|
134
|
+
disk_obj = find_disk(disk)
|
135
|
+
raise "Disk #{opts[:disk] || opts[:path]} cannot be found" unless disk_obj
|
136
|
+
# We don't care about the path, but we do care about the device
|
137
|
+
# which is not part of the disk's name.
|
138
|
+
query = disk.to_query(:device, :path)
|
139
|
+
!(@sdb.query_with_attributes(RUDY_DOMAIN, query) || {}).empty?
|
140
|
+
end
|
141
|
+
|
142
|
+
|
143
|
+
# * +disk+ is a disk name (disk-zone-...), a path, or a Rudy::MetaData::Disk object
|
144
|
+
# An exception is raised in the following cases:
|
145
|
+
# * The disk belongs to a different environment or role than what's in @globals.
|
146
|
+
# Returns the disk object or false if not found.
|
147
|
+
def find_disk(disk)
|
148
|
+
return false unless disk
|
149
|
+
return disk if disk.is_a?(Rudy::MetaData::Disk)
|
150
|
+
|
151
|
+
disc_obj = nil
|
152
|
+
|
153
|
+
# If a disk name was supplied, the user knows what she's looking for.
|
154
|
+
# If we don't find it, we can throw an error.
|
155
|
+
if Rudy.is_id?(:disk, disk)
|
156
|
+
disc_obj = get(disk)
|
157
|
+
|
158
|
+
# Otherwise we assume it's a path
|
159
|
+
else
|
160
|
+
disc_obj = find_from_path(disk)
|
161
|
+
end
|
162
|
+
|
163
|
+
# TODO: This used to throw an exception. Some users of this method may need to throw their own.
|
164
|
+
return false unless disc_obj
|
165
|
+
|
166
|
+
# If a user specifies a disk that doesn't match the global
|
167
|
+
# values for environment and role, we need to throw an error.
|
168
|
+
unless @global.environment.to_s == disc_obj.environment.to_s
|
169
|
+
raise "The disk is in another machine environment"
|
170
|
+
end
|
171
|
+
unless @global.role.to_s == disc_obj.role.to_s
|
172
|
+
raise "The disk is in another machine role"
|
173
|
+
end
|
174
|
+
|
175
|
+
disc_obj
|
176
|
+
end
|
177
|
+
|
178
|
+
|
179
|
+
|
180
|
+
private
|
181
|
+
|
182
|
+
def execute_query(query)
|
183
|
+
items = @sdb.query_with_attributes(RUDY_DOMAIN, query)
|
184
|
+
return nil if !items || items.empty?
|
185
|
+
clean_items = {}
|
186
|
+
items.flatten.each do |disk|
|
187
|
+
next unless disk.is_a?(Hash)
|
188
|
+
name = disk.delete("Name")
|
189
|
+
clean_items[name] = Rudy::MetaData::Disk.from_hash(disk)
|
190
|
+
end
|
191
|
+
clean_items
|
192
|
+
end
|
193
|
+
|
194
|
+
|
195
|
+
def create_disk_from_opts(opts)
|
196
|
+
disk = Rudy::MetaData::Disk.new
|
197
|
+
[:region, :zone, :environment, :role, :position].each do |n|
|
198
|
+
disk.send("#{n}=", @global.send(n)) if @global.send(n)
|
199
|
+
end
|
200
|
+
|
201
|
+
[:path, :device, :size].each do |n|
|
202
|
+
disk.send("#{n}=", opts[n]) if opts[n]
|
203
|
+
end
|
204
|
+
|
205
|
+
disk
|
206
|
+
end
|
207
|
+
|
208
|
+
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
|
213
|
+
|
214
|
+
__END__
|
215
|
+
|
216
|
+
|
217
|
+
# TODO: This is a fresh copy paster.
|
218
|
+
#def restore(machine, opts)
|
219
|
+
# disk = find_disk(opts[:disk] || opts[:path])
|
220
|
+
# raise "Disk #{opts[:disk] || opts[:path]} cannot be found" unless disk
|
221
|
+
# disk_routine.each_pair do |path,props|
|
222
|
+
# from = props[:from] || "unknown"
|
223
|
+
# unless from.to_s == "backup"
|
224
|
+
# puts "Sorry! You can currently only restore from backup. Check your routines config."
|
225
|
+
# next
|
226
|
+
# end
|
227
|
+
#
|
228
|
+
# begin
|
229
|
+
# puts "Restoring disk for #{path}"
|
230
|
+
#
|
231
|
+
# zon = props[:zone] || @global.zone
|
232
|
+
# env = props[:environment] || @global.environment
|
233
|
+
# rol = props[:role] || @global.role
|
234
|
+
# pos = props[:position] || @global.position
|
235
|
+
# puts "Looking for backup from #{zon}-#{env}-#{rol}-#{pos}"
|
236
|
+
# backup = find_most_recent_backup(zon, env, rol, pos, path)
|
237
|
+
#
|
238
|
+
# unless backup
|
239
|
+
# puts "No backups found"
|
240
|
+
# next
|
241
|
+
# end
|
242
|
+
#
|
243
|
+
# puts "Found: #{backup.name}".bright
|
244
|
+
#
|
245
|
+
# disk = Rudy::MetaData::Disk.new
|
246
|
+
# disk.path = path
|
247
|
+
# [:region, :zone, :environment, :role, :position].each do |n|
|
248
|
+
# disk.send("#{n}=", @global.send(n)) if @global.send(n)
|
249
|
+
# end
|
250
|
+
#
|
251
|
+
# disk.device = props[:device]
|
252
|
+
# size = (backup.size.to_i > props[:size].to_i) ? backup.size : props[:size]
|
253
|
+
# disk.size = size.to_i
|
254
|
+
#
|
255
|
+
#
|
256
|
+
# if Rudy::MetaData::Disk.is_defined?(@sdb, disk)
|
257
|
+
# puts "The disk #{disk.name} already exists."
|
258
|
+
# puts "You probably need to define when to destroy the disk."
|
259
|
+
# puts "Skipping..."
|
260
|
+
# next
|
261
|
+
# end
|
262
|
+
#
|
263
|
+
# if @ec2.instances.attached_volume?(machine.awsid, disk.device)
|
264
|
+
# puts "Skipping disk for #{disk.path} (device #{disk.device} is in use)"
|
265
|
+
# next
|
266
|
+
# end
|
267
|
+
#
|
268
|
+
# # NOTE: It's important to use Caesars' hash syntax b/c the disk property
|
269
|
+
# # "size" conflicts with Hash#size which is what we'll get if there's no
|
270
|
+
# # size defined.
|
271
|
+
# unless disk.size.kind_of?(Integer)
|
272
|
+
# puts "Skipping disk for #{disk.path} (size not defined)"
|
273
|
+
# next
|
274
|
+
# end
|
275
|
+
#
|
276
|
+
# if disk.path.nil?
|
277
|
+
# puts "Skipping disk for #{disk.path} (no path defined)"
|
278
|
+
# next
|
279
|
+
# end
|
280
|
+
#
|
281
|
+
# unless disk.valid?
|
282
|
+
# puts "Skipping #{disk.name} (not enough info)"
|
283
|
+
# next
|
284
|
+
# end
|
285
|
+
#
|
286
|
+
# puts "Creating volume... (from #{backup.awsid})".bright
|
287
|
+
# volume = @ec2.volumes.create(disk.size, @global.zone, backup.awsid)
|
288
|
+
#
|
289
|
+
# puts "Attaching #{volume[:aws_id]} to #{machine.awsid}".bright
|
290
|
+
# @ec2.volumes.attach(machine.awsid, volume[:aws_id], disk.device)
|
291
|
+
# sleep 3
|
292
|
+
#
|
293
|
+
# puts "Mounting #{disk.device} to #{disk.path}".bright
|
294
|
+
# ssh_command machine.dns_name_public, keypairpath, @global.user, "mkdir -p #{disk.path} && mount -t ext3 #{disk.device} #{disk.path}"
|
295
|
+
#
|
296
|
+
# puts "Creating disk metadata for #{disk.name}"
|
297
|
+
# disk.awsid = volume[:aws_id]
|
298
|
+
# Rudy::MetaData::Disk.save(@sdb, disk)
|
299
|
+
#
|
300
|
+
# sleep 1
|
301
|
+
# rescue => ex
|
302
|
+
# puts "There was an error restoring #{path}: #{ex.message}"
|
303
|
+
# puts ex.backtrace if Drydock.debug?
|
304
|
+
# #if disk
|
305
|
+
# # puts "Removing metadata for #{disk.name}"
|
306
|
+
# # Rudy::MetaData::Disk.destroy(@sdb, disk)
|
307
|
+
# #end
|
308
|
+
# end
|
309
|
+
# puts
|
310
|
+
# end
|
311
|
+
#
|
312
|
+
#
|
313
|
+
#end
|
314
|
+
#
|
315
|
+
#
|
316
|
+
#
|
317
|
+
#def device_to_path(machine, device)
|
318
|
+
# # /dev/sdr 10321208 154232 9642688 2% /rilli/app
|
319
|
+
# dfoutput = ssh_command(machine.dns_name_public, keypairpath, @global.user, "df #{device} | tail -1").chomp
|
320
|
+
# dfvals = dfoutput.scan(/(#{device}).+\s(.+?)$/).flatten # ["/dev/sdr", "/rilli/app"]
|
321
|
+
# dfvals.last
|
322
|
+
#end
|
data/lib/rudy/command/disks.rb
CHANGED
@@ -1,213 +1,9 @@
|
|
1
1
|
|
2
2
|
|
3
3
|
module Rudy
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
def disk
|
8
|
-
criteria = [@global.zone]
|
9
|
-
criteria += [@global.environment, @global.role] unless @option.all
|
10
|
-
Rudy::MetaData::Disk.list(@sdb, *criteria).each do |disk|
|
11
|
-
backups = Rudy::MetaData::Backup.for_disk(@sdb, disk, 2)
|
12
|
-
print_disk(disk, backups)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def create_disk_valid?
|
17
|
-
raise "No filesystem path specified" unless @option.path
|
18
|
-
raise "No size specified" unless @option.size
|
19
|
-
@instances = @ec2.instances.list(machine_group)
|
20
|
-
raise "There are no instances running in #{machine_group}" if !@instances || @instances.empty?
|
21
|
-
true
|
22
|
-
end
|
23
|
-
|
24
|
-
def create_disk
|
25
|
-
puts "Creating #{@option.path} for #{machine_group}"
|
26
|
-
switch_user("root")
|
27
|
-
exit unless are_you_sure?(2)
|
28
|
-
machine = @instances.values.first # NOTE: DANGER! Should handle position.
|
29
|
-
|
30
|
-
disk = Rudy::MetaData::Disk.new
|
31
|
-
[:region, :zone, :environment, :role, :position].each do |n|
|
32
|
-
disk.send("#{n}=", @global.send(n)) if @global.send(n)
|
33
|
-
end
|
34
|
-
[:path, :device, :size].each do |n|
|
35
|
-
disk.send("#{n}=", @option.send(n)) if @option.send(n)
|
36
|
-
end
|
37
|
-
|
38
|
-
raise "Not enough info was provided to define a disk (#{disk.name})" unless disk.valid?
|
39
|
-
raise "The device #{disk.device} is already in use on that machine" if Rudy::MetaData::Disk.is_defined?(@sdb, disk)
|
40
|
-
# TODO: Check disk path
|
41
|
-
puts "Creating disk metadata for #{disk.name}"
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
puts "Creating volume... (#{disk.size}GB in #{@global.zone})"
|
46
|
-
volume = @ec2.volumes.create(@global.zone, disk.size)
|
47
|
-
sleep 3
|
48
|
-
|
49
|
-
disk.awsid = volume[:aws_id]
|
50
|
-
disk.raw_volume = true # This value is not saved.
|
51
|
-
Rudy::MetaData::Disk.save(@sdb, disk)
|
52
|
-
|
53
|
-
execute_attach_disk(disk, machine)
|
54
|
-
|
55
|
-
print_disk(disk)
|
56
|
-
end
|
57
|
-
|
58
|
-
|
59
|
-
def destroy_disk_valid?
|
60
|
-
raise "No disk specified" if argv.empty?
|
61
|
-
|
62
|
-
if @argv.diskname =~ /^disk-/
|
63
|
-
@disk = Rudy::MetaData::Disk.get(@sdb, @argv.diskname)
|
64
|
-
else
|
65
|
-
disk = Rudy::MetaData::Disk.new
|
66
|
-
[:zone, :environment, :role, :position].each do |n|
|
67
|
-
disk.send("#{n}=", @global.send(n)) if @global.send(n)
|
68
|
-
end
|
69
|
-
disk.path = @argv.diskname
|
70
|
-
@disk = Rudy::MetaData::Disk.get(@sdb, disk.name)
|
71
|
-
end
|
72
|
-
|
73
|
-
raise "No such disk: #{@argv.diskname}" unless @disk
|
74
|
-
raise "The disk is in another machine environment" unless @global.environment.to_s == @disk.environment.to_s
|
75
|
-
raise "The disk is in another machine role" unless @global.role.to_s == @disk.role.to_s
|
76
|
-
@instances = @ec2.instances.list(machine_group)
|
77
|
-
true
|
78
|
-
end
|
79
|
-
|
80
|
-
def destroy_disk
|
81
|
-
puts "Destroying #{@disk.name} and #{@disk.awsid}"
|
82
|
-
switch_user("root")
|
83
|
-
exit unless are_you_sure?(5)
|
84
|
-
|
85
|
-
machine = @instances.values.first # NOTE: DANGER! Should handle position.
|
86
|
-
|
87
|
-
execute_unattach_disk(@disk, machine)
|
88
|
-
execute_destroy_disk(@disk, machine)
|
89
|
-
|
90
|
-
puts "Done."
|
91
|
-
end
|
92
|
-
|
93
|
-
def attach_disk_valid?
|
94
|
-
destroy_disk_valid?
|
95
|
-
raise "There are no instances running in #{machine_group}" if !@instances || @instances.empty?
|
96
|
-
true
|
97
|
-
end
|
98
|
-
|
99
|
-
def attach_disk
|
100
|
-
puts "Attaching #{name}"
|
101
|
-
switch_user("root")
|
102
|
-
are_you_sure?(4)
|
103
|
-
|
104
|
-
machine = @instances.values.first # AK! Assumes single machine
|
105
|
-
|
106
|
-
execute_attach_disk(@disk, machine)
|
107
|
-
|
108
|
-
puts
|
109
|
-
ssh_command machine[:dns_name], keypairpath, @global.user, "df -h" # Display current mounts
|
110
|
-
puts
|
111
|
-
|
112
|
-
puts "Done!"
|
113
|
-
end
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
def unattach_disk_valid?
|
119
|
-
destroy_disk_valid?
|
120
|
-
true
|
121
|
-
end
|
122
|
-
|
123
|
-
def unattach_disk
|
124
|
-
puts "Unattaching #{@disk.name} from #{machine_group}"
|
125
|
-
switch_user("root")
|
126
|
-
are_you_sure?(4)
|
127
|
-
|
128
|
-
machine = @instances.values.first
|
129
|
-
|
130
|
-
execute_unattach_disk(@disk, machine)
|
131
|
-
|
132
|
-
puts "Done!"
|
133
|
-
end
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
def execute_unattach_disk(disk, machine)
|
138
|
-
begin
|
139
|
-
|
140
|
-
if machine
|
141
|
-
puts "Unmounting #{disk.path}...".att(:bright)
|
142
|
-
ssh_command machine[:dns_name], keypairpath, global.user, "umount #{disk.path}"
|
143
|
-
sleep 1
|
144
|
-
end
|
145
|
-
|
146
|
-
if @ec2.volumes.attached?(disk.awsid)
|
147
|
-
puts "Unattaching #{disk.awsid}".att(:bright)
|
148
|
-
@ec2.volumes.detach(disk.awsid)
|
149
|
-
sleep 5
|
150
|
-
end
|
151
|
-
|
152
|
-
rescue => ex
|
153
|
-
puts "Error while unattaching volume #{disk.awsid}: #{ex.message}"
|
154
|
-
puts ex.backtrace if Drydock.debug?
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
def execute_destroy_disk(disk, machine)
|
159
|
-
begin
|
160
|
-
|
161
|
-
if disk
|
162
|
-
|
163
|
-
if disk.awsid && @ec2.volumes.available?(disk.awsid)
|
164
|
-
puts "Destroying #{disk.path} (#{disk.awsid})".att(:bright)
|
165
|
-
@ec2.volumes.destroy(disk.awsid)
|
166
|
-
end
|
167
|
-
|
168
|
-
end
|
169
|
-
|
170
|
-
rescue => ex
|
171
|
-
puts "Error while destroying volume #{disk.awsid}: #{ex.message}"
|
172
|
-
puts ex.backtrace if Drydock.debug?
|
173
|
-
ensure
|
174
|
-
puts "Deleteing metadata for #{disk.name}".att(:bright)
|
175
|
-
Rudy::MetaData::Disk.destroy(@sdb, disk)
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
def execute_attach_disk(disk, machine)
|
180
|
-
begin
|
181
|
-
unless @ec2.instances.attached_volume?(machine[:aws_instance_id], disk.device)
|
182
|
-
puts "Attaching #{disk.awsid} to #{machine[:aws_instance_id]}".att(:bright)
|
183
|
-
@ec2.volumes.attach(machine[:aws_instance_id], disk.awsid, disk.device)
|
184
|
-
sleep 3
|
185
|
-
end
|
186
|
-
|
187
|
-
if disk.raw_volume
|
188
|
-
puts "Creating the filesystem (mkfs.ext3 -F #{disk.device})".att(:bright)
|
189
|
-
ssh_command machine[:dns_name], keypairpath, @global.user, "mkfs.ext3 -F #{disk.device}"
|
190
|
-
sleep 1
|
191
|
-
end
|
192
|
-
|
193
|
-
puts "Mounting #{disk.path} to #{disk.device}".att(:bright)
|
194
|
-
ssh_command machine[:dns_name], keypairpath, @global.user, "mkdir -p #{disk.path} && mount -t ext3 #{disk.device} #{disk.path}"
|
195
|
-
|
196
|
-
sleep 1
|
197
|
-
rescue => ex
|
198
|
-
puts "There was an error attaching #{disk.name}: #{ex.message}"
|
199
|
-
puts ex.backtrace if Drydock.debug?
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
|
-
end
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
|
-
|
208
|
-
__END__
|
209
|
-
|
4
|
+
class Disks
|
5
|
+
include Rudy::Huxtable
|
210
6
|
|
211
|
-
|
212
|
-
|
213
|
-
|
7
|
+
|
8
|
+
end
|
9
|
+
end
|