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.
Files changed (99) hide show
  1. data/CHANGES.txt +8 -9
  2. data/README.rdoc +48 -7
  3. data/Rakefile +102 -7
  4. data/Rudyfile +28 -0
  5. data/bin/ird +162 -0
  6. data/bin/rudy +287 -93
  7. data/lib/annoy.rb +227 -0
  8. data/lib/aws_sdb/service.rb +1 -1
  9. data/lib/console.rb +20 -4
  10. data/lib/escape.rb +305 -0
  11. data/lib/rudy.rb +265 -125
  12. data/lib/rudy/aws.rb +61 -26
  13. data/lib/rudy/aws/ec2.rb +20 -296
  14. data/lib/rudy/aws/ec2/address.rb +121 -0
  15. data/lib/rudy/aws/ec2/group.rb +241 -0
  16. data/lib/rudy/aws/ec2/image.rb +46 -0
  17. data/lib/rudy/aws/ec2/instance.rb +407 -0
  18. data/lib/rudy/aws/ec2/keypair.rb +92 -0
  19. data/lib/rudy/aws/ec2/snapshot.rb +87 -0
  20. data/lib/rudy/aws/ec2/volume.rb +234 -0
  21. data/lib/rudy/aws/simpledb.rb +33 -15
  22. data/lib/rudy/cli.rb +142 -0
  23. data/lib/rudy/cli/addresses.rb +85 -0
  24. data/lib/rudy/cli/backups.rb +175 -0
  25. data/lib/rudy/{command → cli}/config.rb +18 -13
  26. data/lib/rudy/cli/deploy.rb +12 -0
  27. data/lib/rudy/cli/disks.rb +125 -0
  28. data/lib/rudy/cli/domains.rb +17 -0
  29. data/lib/rudy/cli/groups.rb +77 -0
  30. data/lib/rudy/{command → cli}/images.rb +18 -6
  31. data/lib/rudy/cli/instances.rb +142 -0
  32. data/lib/rudy/cli/keypairs.rb +47 -0
  33. data/lib/rudy/cli/manager.rb +51 -0
  34. data/lib/rudy/{command → cli}/release.rb +10 -10
  35. data/lib/rudy/cli/routines.rb +80 -0
  36. data/lib/rudy/cli/volumes.rb +121 -0
  37. data/lib/rudy/command/addresses.rb +62 -39
  38. data/lib/rudy/command/backups.rb +60 -170
  39. data/lib/rudy/command/disks-old.rb +322 -0
  40. data/lib/rudy/command/disks.rb +5 -209
  41. data/lib/rudy/command/domains.rb +34 -0
  42. data/lib/rudy/command/groups.rb +105 -48
  43. data/lib/rudy/command/instances.rb +263 -70
  44. data/lib/rudy/command/keypairs.rb +149 -0
  45. data/lib/rudy/command/manager.rb +65 -0
  46. data/lib/rudy/command/volumes.rb +110 -49
  47. data/lib/rudy/config.rb +90 -70
  48. data/lib/rudy/config/objects.rb +67 -0
  49. data/lib/rudy/huxtable.rb +253 -0
  50. data/lib/rudy/metadata/backup.rb +23 -48
  51. data/lib/rudy/metadata/disk.rb +79 -68
  52. data/lib/rudy/metadata/machine.rb +34 -0
  53. data/lib/rudy/routines.rb +54 -0
  54. data/lib/rudy/routines/disk_handler.rb +190 -0
  55. data/lib/rudy/routines/release.rb +15 -0
  56. data/lib/rudy/routines/script_runner.rb +65 -0
  57. data/lib/rudy/routines/shutdown.rb +42 -0
  58. data/lib/rudy/routines/startup.rb +48 -0
  59. data/lib/rudy/utils.rb +57 -2
  60. data/lib/storable.rb +11 -5
  61. data/lib/sysinfo.rb +274 -0
  62. data/rudy.gemspec +84 -20
  63. data/support/randomize-root-password +45 -0
  64. data/support/rudy-ec2-startup +5 -5
  65. data/support/update-ec2-ami-tools +20 -0
  66. data/test/05_config/00_setup_test.rb +24 -0
  67. data/test/05_config/30_machines_test.rb +69 -0
  68. data/test/20_sdb/00_setup_test.rb +31 -0
  69. data/test/20_sdb/10_domains_test.rb +113 -0
  70. data/test/25_ec2/00_setup_test.rb +34 -0
  71. data/test/25_ec2/10_keypairs_test.rb +33 -0
  72. data/test/25_ec2/20_groups_test.rb +139 -0
  73. data/test/25_ec2/30_addresses_test.rb +35 -0
  74. data/test/25_ec2/40_volumes_test.rb +46 -0
  75. data/test/25_ec2/50_snapshots_test.rb +69 -0
  76. data/test/26_ec2_instances/00_setup_test.rb +33 -0
  77. data/test/26_ec2_instances/10_instances_test.rb +81 -0
  78. data/test/26_ec2_instances/50_images_test.rb +13 -0
  79. data/test/30_sdb_metadata/00_setup_test.rb +28 -0
  80. data/test/30_sdb_metadata/10_disks_test.rb +99 -0
  81. data/test/30_sdb_metadata/20_backups_test.rb +102 -0
  82. data/test/50_commands/00_setup_test.rb +11 -0
  83. data/test/50_commands/10_keypairs_test.rb +79 -0
  84. data/test/50_commands/20_groups_test.rb +77 -0
  85. data/test/50_commands/40_volumes_test.rb +55 -0
  86. data/test/50_commands/50_instances_test.rb +110 -0
  87. data/test/coverage.txt +51 -0
  88. data/test/helper.rb +35 -0
  89. data/tryouts/disks.rb +55 -0
  90. data/tryouts/nested_methods.rb +36 -0
  91. data/tryouts/session_tryout.rb +48 -0
  92. metadata +94 -25
  93. data/bin/rudy-ec2 +0 -108
  94. data/lib/rudy/command/base.rb +0 -839
  95. data/lib/rudy/command/deploy.rb +0 -12
  96. data/lib/rudy/command/environment.rb +0 -74
  97. data/lib/rudy/command/machines.rb +0 -170
  98. data/lib/rudy/command/metadata.rb +0 -41
  99. 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
@@ -1,213 +1,9 @@
1
1
 
2
2
 
3
3
  module Rudy
4
- module Command
5
- class Disks < Rudy::Command::Base
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