2013-06-30 23:26:45 +02:00
|
|
|
from base import Task
|
|
|
|
from common import phases
|
2013-09-15 13:19:45 +02:00
|
|
|
from common.tasks import volume
|
2013-12-29 20:56:06 +01:00
|
|
|
from common.tasks import packages
|
|
|
|
from providers.virtualbox.tasks import guest_additions
|
2013-12-06 00:31:49 +01:00
|
|
|
from providers.ec2.tasks import ebs
|
2013-10-06 14:44:23 +02:00
|
|
|
from common.fs import remount
|
2013-10-06 14:06:01 +02:00
|
|
|
from shutil import copyfile
|
|
|
|
import os.path
|
2013-06-30 23:26:45 +02:00
|
|
|
import time
|
2013-07-09 20:45:57 +02:00
|
|
|
import logging
|
|
|
|
log = logging.getLogger(__name__)
|
2013-06-30 23:26:45 +02:00
|
|
|
|
|
|
|
|
2013-10-06 14:44:23 +02:00
|
|
|
class Snapshot(Task):
|
2013-07-14 23:16:37 +02:00
|
|
|
description = 'Creating a snapshot of the bootstrapped volume'
|
2013-12-29 20:56:06 +01:00
|
|
|
phase = phases.package_installation
|
2014-01-12 12:46:59 +01:00
|
|
|
predecessors = [packages.InstallPackages, guest_additions.InstallGuestAdditions]
|
2013-07-14 23:16:37 +02:00
|
|
|
|
2014-01-05 15:57:11 +01:00
|
|
|
@classmethod
|
|
|
|
def run(cls, info):
|
2013-10-06 14:44:23 +02:00
|
|
|
def mk_snapshot():
|
|
|
|
return info.volume.snapshot()
|
|
|
|
snapshot = remount(info.volume, mk_snapshot)
|
|
|
|
msg = 'A snapshot of the bootstrapped volume was created. ID: {id}'.format(id=snapshot.id)
|
2013-07-14 23:16:37 +02:00
|
|
|
log.info(msg)
|
|
|
|
|
|
|
|
|
2013-07-13 13:55:12 +02:00
|
|
|
class CreateFromSnapshot(Task):
|
2013-07-09 20:32:50 +02:00
|
|
|
description = 'Creating EBS volume from a snapshot'
|
2013-06-30 23:26:45 +02:00
|
|
|
phase = phases.volume_creation
|
2013-12-06 00:31:49 +01:00
|
|
|
successors = [ebs.Attach]
|
2013-06-30 23:26:45 +02:00
|
|
|
|
2014-01-05 15:57:11 +01:00
|
|
|
@classmethod
|
|
|
|
def run(cls, info):
|
2013-06-30 23:56:09 +02:00
|
|
|
snapshot = info.manifest.plugins['prebootstrapped']['snapshot']
|
2014-01-19 12:39:07 +01:00
|
|
|
ebs_volume = info.connection.create_volume(info.volume.size.get_qty_in('GiB'),
|
2013-12-06 00:31:49 +01:00
|
|
|
info.host['availabilityZone'],
|
|
|
|
snapshot=snapshot)
|
|
|
|
while ebs_volume.volume_state() != 'available':
|
2013-06-30 23:26:45 +02:00
|
|
|
time.sleep(5)
|
2013-12-06 00:31:49 +01:00
|
|
|
ebs_volume.update()
|
2013-07-09 20:45:57 +02:00
|
|
|
|
2013-12-06 00:31:49 +01:00
|
|
|
info.volume.volume = ebs_volume
|
2013-09-26 22:43:36 +02:00
|
|
|
set_fs_states(info.volume)
|
2013-09-15 13:19:45 +02:00
|
|
|
|
2013-07-09 20:45:57 +02:00
|
|
|
|
2013-07-14 23:16:37 +02:00
|
|
|
class CopyImage(Task):
|
2013-07-09 20:45:57 +02:00
|
|
|
description = 'Creating a snapshot of the bootstrapped volume'
|
2013-12-29 20:56:06 +01:00
|
|
|
phase = phases.package_installation
|
2014-01-12 12:46:59 +01:00
|
|
|
predecessors = [packages.InstallPackages, guest_additions.InstallGuestAdditions]
|
2013-07-09 20:45:57 +02:00
|
|
|
|
2014-01-05 15:57:11 +01:00
|
|
|
@classmethod
|
|
|
|
def run(cls, info):
|
2013-12-28 13:56:48 +01:00
|
|
|
loopback_backup_name = 'volume-{id}.{ext}.backup'.format(id=info.run_id, ext=info.volume.extension)
|
2013-09-15 16:59:56 +02:00
|
|
|
destination = os.path.join(info.manifest.bootstrapper['workspace'], loopback_backup_name)
|
2013-10-06 14:34:03 +02:00
|
|
|
|
|
|
|
def mk_snapshot():
|
|
|
|
copyfile(info.volume.image_path, destination)
|
|
|
|
remount(info.volume, mk_snapshot)
|
2013-09-15 16:59:56 +02:00
|
|
|
msg = 'A copy of the bootstrapped volume was created. Path: {path}'.format(path=destination)
|
2013-07-09 20:45:57 +02:00
|
|
|
log.info(msg)
|
2013-07-14 23:16:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
class CreateFromImage(Task):
|
|
|
|
description = 'Creating loopback image from a copy'
|
|
|
|
phase = phases.volume_creation
|
2013-11-21 15:54:42 +01:00
|
|
|
successors = [volume.Attach]
|
2013-07-14 23:16:37 +02:00
|
|
|
|
2014-01-05 15:57:11 +01:00
|
|
|
@classmethod
|
|
|
|
def run(cls, info):
|
2013-09-15 16:59:56 +02:00
|
|
|
info.volume.image_path = os.path.join(info.workspace, 'volume.{ext}'.format(ext=info.volume.extension))
|
2013-09-15 13:19:45 +02:00
|
|
|
loopback_backup_path = info.manifest.plugins['prebootstrapped']['image']
|
|
|
|
copyfile(loopback_backup_path, info.volume.image_path)
|
2013-10-06 14:06:01 +02:00
|
|
|
|
2013-09-26 22:43:36 +02:00
|
|
|
set_fs_states(info.volume)
|
|
|
|
|
|
|
|
|
|
|
|
def set_fs_states(volume):
|
2013-10-05 22:01:05 +02:00
|
|
|
volume.fsm.current = 'detached'
|
2013-09-15 13:19:45 +02:00
|
|
|
|
2013-09-26 22:43:36 +02:00
|
|
|
p_map = volume.partition_map
|
|
|
|
partitions_state = 'attached'
|
|
|
|
from base.fs.partitionmaps.none import NoPartitions
|
|
|
|
if isinstance(p_map, NoPartitions):
|
|
|
|
partitions_state = 'formatted'
|
|
|
|
else:
|
2013-10-05 22:01:05 +02:00
|
|
|
p_map.fsm.current = 'unmapped'
|
2013-09-15 13:19:45 +02:00
|
|
|
partitions_state = 'unmapped_fmt'
|
2013-09-26 22:43:36 +02:00
|
|
|
for partition in p_map.partitions:
|
2013-10-05 22:01:05 +02:00
|
|
|
partition.fsm.current = partitions_state
|