bootstrap-vz/providers/ec2/volume.py
Anders Ingemann ff7c04c120 Support for partitions
MAJOR refactor. The volume is now abstracted into a model along with a partitionmap and partitions.
Volumes and partitions are now controlled via an FSM to ensure that commands are called in the proper sequence.
GRUB can now be installed properly onto loop devices by using dmsetup to fake a proper harddisk.
2013-10-27 18:11:12 +01:00

56 lines
1.5 KiB
Python

from base.fs.volume import Volume
from base.fs.exceptions import VolumeError
import time
class EBSVolume(Volume):
volume = None
def create(self, conn, zone):
super(EBSVolume, self).create(self)
import math
# TODO: Warn if volume size is not a multiple of 1024
size = int(math.ceil(self.partition_map.get_volume_size() / 1024))
self.volume = conn.create_volume(size, zone)
while self.volume.volume_state() != 'available':
time.sleep(5)
self.volume.update()
self.created = True
def attach(self, instance_id):
super(EBSVolume, self).attach(self)
import os.path
import string
for letter in string.ascii_lowercase:
dev_path = os.path.join('/dev', 'xvd' + letter)
if not os.path.exists(dev_path):
self.device_path = dev_path
self.ec2_device_path = os.path.join('/dev', 'sd' + letter)
break
if self.device_path is None:
raise VolumeError('Unable to find a free block device path for mounting the bootstrap volume')
self.volume.attach(instance_id, self.ec2_device_path)
while self.volume.attachment_state() != 'attached':
time.sleep(2)
self.volume.update()
def detach(self):
super(EBSVolume, self).detach(self)
self.volume.detach()
while self.volume.attachment_state() is not None:
time.sleep(2)
self.volume.update()
def delete(self):
super(EBSVolume, self).delete(self)
self.volume.delete()
def snapshot(self):
snapshot = self.volume.create_snapshot()
while snapshot.status != 'completed':
time.sleep(2)
snapshot.update()
return snapshot