Module Rudy::Routines::Handlers::Disks

  1. lib/rudy/routines/handlers/disks.rb

Constants

ACTIONS = [:create, :destroy, :archive, :mount, :restore, :attach, :detach, :mount, :umount, :fstype].freeze

Public instance methods

any? (routine)
[show source]
    # File lib/rudy/routines/handlers/disks.rb, line 22
22:     def any?(routine)
23:       (routine.kind_of?(Hash) && routine.disks && 
24:       routine.disks.kind_of?(Hash) && !routine.disks.empty?) ? true : false
25:     end
archive (rbox, disk, index)
[show source]
     # File lib/rudy/routines/handlers/disks.rb, line 279
279:     def archive(rbox, disk, index)
280:       raise Rudy::Metadata::UnknownObject, disk.name unless disk.exists?
281:       disk.refresh!
282:       
283:       raise Rudy::Disks::NotAttached, disk.name if !disk.volume_attached?
284:       
285:       Rudy::Routines.rescue {
286:         li "Creating backup: #{back.name}"
287:         back = disk.archive
288:       }
289:     end
attach (rbox, disk, index)
[show source]
     # File lib/rudy/routines/handlers/disks.rb, line 137
137:     def attach(rbox, disk, index)
138:       
139:       Rudy::Routines.rescue {
140:         unless disk.volume_exists?
141:           msg = "Creating volume... "
142:           disk.create
143:           Rudy::Utils.waiter(2, 60, STDOUT, msg) { 
144:             disk.volume_available?
145:           }
146:         end
147:       }
148:       
149:       raise Rudy::Metadata::UnknownObject, disk.name unless disk.exists?
150:       disk.refresh!
151:       
152:       unless @@global.force
153:         raise Rudy::Disks::AlreadyAttached, disk.name if disk.volume_attached?
154:       end
155:       
156:       devices = rbox.stash.attached_volumes.collect { |v| v.device }
157:       if devices.member? disk.device
158:         li "Device ID #{disk.device} is taken. Using #{devices.sort.last.succ}"
159:         disk.device = devices.sort.last.succ 
160:         disk.save :replace
161:       end
162:       
163:       Rudy::Routines.rescue {
164:         msg = "Attaching #{disk.volid} to #{rbox.stash.instid}... "
165:         disk.volume_attach(rbox.stash.instid)
166:         Rudy::Utils.waiter(3, 30, STDOUT, msg) { 
167:           disk.volume_attached?
168:         }
169:       }
170:     end
create (rbox, disk, index)
[show source]
     # File lib/rudy/routines/handlers/disks.rb, line 83
 83:     def create(rbox, disk, index)
 84:       if disk.exists?
 85:         li "Disk found: #{disk.name}"
 86:         disk.refresh!          
 87:       end
 88:       
 89:       disk.index = index  # Needed for windows
 90:       
 91:       Rudy::Routines.rescue {
 92:         unless disk.volume_exists?
 93:           msg = "Creating volume... "
 94:           disk.create
 95:           Rudy::Utils.waiter(2, 60, STDOUT, msg) { 
 96:             disk.volume_available?
 97:           }
 98:         end
 99:       }
100:       
101:       Rudy::Routines.rescue {
102:         attach rbox, disk, index unless disk.volume_attached?
103:       }
104:       Rudy::Routines.rescue {
105:         format rbox, disk, index if disk.raw?
106:       }
107:       Rudy::Routines.rescue {
108:         mount rbox, disk, index unless disk.mounted?
109:       }
110:       disk.save :replace
111:     end
destroy (rbox, disk, index)
[show source]
     # File lib/rudy/routines/handlers/disks.rb, line 262
262:     def destroy(rbox, disk, index)
263:       raise Rudy::Metadata::UnknownObject, disk.name unless disk.exists?
264:       disk.refresh!
265:         
266:       umount rbox,disk,index if disk.mounted? && !rbox.nil? && !rbox.stash.windows?
267:       detach rbox,disk,index if disk.volume_attached?
268:       
269:       unless @@global.force
270:         raise Rudy::Disks::InUse, disk.name if disk.volume_attached?
271:       end
272:       
273:       Rudy::Routines.rescue {
274:         li "Destroying #{disk.name}"
275:         disk.destroy
276:       }
277:     end
detach (rbox, disk, index)
[show source]
     # File lib/rudy/routines/handlers/disks.rb, line 115
115:     def detach(rbox, disk, index)
116:       
117:       raise Rudy::Metadata::UnknownObject, disk.name unless disk.exists?
118:       disk.refresh!
119:       
120:       unless @@global.force
121:         raise Rudy::Disks::NotAttached, disk.name unless disk.volume_attached?
122:       end
123:       
124:       umount rbox, disk, index if disk.mounted?
125:       raise Rudy::Disks::InUse, disk.name if disk.mounted?
126:       
127:       Rudy::Routines.rescue {
128:         msg = "Detaching #{disk.volid}..."
129:         disk.volume_detach 
130:         Rudy::Utils.waiter(2, 60, STDOUT, msg) { 
131:           disk.volume_available? 
132:         }
133:       }
134:       
135:     end
execute (type, routine, rset, lbox, argv=nil)
[show source]
    # File lib/rudy/routines/handlers/disks.rb, line 41
41:     def execute(type, routine, rset, lbox, argv=nil)
42:       original_user = rset.user
43:       rset.add_key user_keypairpath(current_machine_user)
44:       rset.switch_user current_machine_user
45:       
46:       routine.each_pair do |action, disks|
47:         unless respond_to?(action.to_sym)  
48:           Rudy::Huxtable.le %Q(DiskHandler: unknown action "#{action}")
49:           next
50:         end
51:         # A quick hack to take advantage of the threading in Rye::Set.
52:         # The action method does not run in the context of a Rye::Box
53:         # object so we need to send rset as an argument. 
54:         rset.batch do
55:           # Windows EC2 instances have 2 disks by default (C: and D:)
56:           volumes = self.stash.attached_volumes
57:           disks.each_pair do |path, props|
58:             # self contains the current instance of Rye::Box. 
59:             disk = Rudy::Disk.new(self.stash.position, path, props)
60:             disk.refresh! if disk.exists?  # We need the volume ID if available
61:             # don't include the current disk in the count. 
62:             volumes.reject! { |v| v.awsid == disk.volid } if disk.volid && disk.volume_attached?
63:             disk_index = volumes.size + 2
64:             Rudy::Routines::Handlers::Disks.send(action, self, disk, disk_index)
65:           end
66:         end
67: 
68:       end
69:       
70:       rset.switch_user original_user
71:     end
format (rbox, disk, index)
[show source]
     # File lib/rudy/routines/handlers/disks.rb, line 227
227:     def format(rbox, disk, index)
228:       raise Rudy::Metadata::UnknownObject, disk.name unless disk.exists?
229:       disk.refresh!
230:       
231:       attach rbox, disk unless disk.volume_attached?
232:       
233:       raise Rudy::Disks::NotAttached, disk.name if !disk.volume_attached?
234:       
235:       unless @@global.force
236:         raise Rudy::Disks::AlreadyFormatted, disk.name if !disk.raw?
237:       end
238:       
239:       if disk.fstype.nil? || disk.fstype.empty?
240:         disk.fstype = rbox.stash.default_fstype
241:       end
242:       
243:       print "Creating #{disk.fstype} filesystem for #{disk.path}... "
244:       if rbox.stash.windows?
245:         li "(index: #{index})"
246:         windows_diskpart_partition rbox, disk, index
247:         disk.mounted = true
248:       else
249:         li $/
250:         args = [:t, disk.fstype, :F, disk.device]
251:         rbox.sudo do
252:           rudy_mkfs *args
253:         end
254:       end
255:       
256:       disk.raw = false
257:       disk.save :replace
258:       sleep 1
259:       disk
260:     end
fstype (rbox, disk, index)
[show source]
    # File lib/rudy/routines/handlers/disks.rb, line 73
73:     def fstype(rbox, disk, index)
74:       
75:       raise Rudy::Metadata::UnknownObject, disk.name unless disk.exists?
76:       disk.refresh!
77:       
78:       #p rbox.rudy_blkid :s, 'TYPE', :o, 'value', disk.device
79:       
80:     end
mount (rbox, disk, index)
[show source]
     # File lib/rudy/routines/handlers/disks.rb, line 172
172:     def mount(rbox, disk, index)
173:       
174:       raise Rudy::Metadata::UnknownObject, disk.name unless disk.exists?
175:       disk.refresh!
176:       
177:       if rbox.stash.windows?
178:         Rudy::Huxtable.li "Skipping for Windows"
179:         return 
180:       end
181:       
182:       attach rbox, disk unless disk.volume_attached?
183:       
184:       unless @@global.force
185:         raise Rudy::Disks::NotAttached, disk.name if !disk.volume_attached?
186:         raise Rudy::Disks::NotFormatted, disk.name if disk.raw?
187:         raise Rudy::Disks::AlreadyMounted, disk.name if disk.mounted?
188:       end
189:       
190:       li "Mounting at #{disk.path}... "
191:       
192:       rbox.sudo do
193:         mkdir(:p, disk.path)
194:         mount(:t, disk.fstype, disk.device, disk.path)
195:       end
196:             
197:       disk.mounted = true
198:       disk.save :replace
199:       sleep 1
200: 
201:     end
paths (routine)
[show source]
    # File lib/rudy/routines/handlers/disks.rb, line 35
35:     def paths(routine)
36:       return nil unless disks?(routine)
37:       routine.disks.values.collect { |d| d.keys }.flatten
38:     end
raise_early_exceptions (type, batch, rset, lbox, argv=nil)
[show source]
    # File lib/rudy/routines/handlers/disks.rb, line 18
18:     def raise_early_exceptions(type, batch, rset, lbox, argv=nil)
19:       
20:     end
restore (rbox, disk, index)
[show source]
     # File lib/rudy/routines/handlers/disks.rb, line 291
291:     def restore(rbox, disk, index)
292: 
293:       if disk.exists?
294:         li "Disk found: #{disk.name}"
295:         disk.refresh!       
296:       end
297:       
298:       unless @@global.force
299:         raise Rudy::Disks::AlreadyAttached, disk.name if disk.volume_attached?
300:       end
301:       
302:       latest_backup = disk.backups.last
303:       
304:       if latest_backup.fstype.nil? || latest_backup.fstype.empty?
305:         latest_backup.fstype = rbox.stash.default_fstype
306:       end
307:       
308:       disk.size, disk.fstype = latest_backup.size, latest_backup.fstype
309:       
310:       li "Backup found: #{latest_backup.name}"
311:       
312:       Rudy::Routines.rescue {
313:         unless disk.volume_exists?
314:           msg = "Creating volume... "
315:           disk.create latest_backup.size, latest_backup.zone, latest_backup.snapid
316:           Rudy::Utils.waiter(2, 60, STDOUT, msg) { 
317:             disk.volume_available?
318:           }
319:           disk.raw = false
320:           disk.save :replace  
321:         end
322:       }
323:       
324:       attach rbox, disk, index unless disk.volume_attached?
325:       mount rbox, disk, index unless disk.mounted?
326:       
327:       disk.save :replace
328: 
329:     end
umount (rbox, disk, index)
[show source]
     # File lib/rudy/routines/handlers/disks.rb, line 204
204:     def umount(rbox, disk, index)
205:       
206:       raise Rudy::Metadata::UnknownObject, disk.name unless disk.exists?
207:       disk.refresh!
208:       
209:       unless @@global.force
210:         raise Rudy::Disks::NotAttached, disk.name if !disk.volume_attached?
211:         raise Rudy::Disks::NotMounted, disk.name if !disk.mounted?
212:       end
213:       
214:       li "Unmounting #{disk.path}... "
215:       
216:       unless rbox.nil? || rbox.stash.windows?
217:         rbox.sudo { umount disk.path }
218:       end
219:       
220:       disk.mounted = false
221:       disk.save :replace
222:       sleep 2
223:       
224:     end
unmount (rbox, disk, index)

Alias for umount