prebootstrapped: Support folder backing (for docker)

This commit is contained in:
Anders Ingemann 2016-06-05 13:25:46 +02:00
parent 2ffc4dd6c3
commit df7df19fb9
4 changed files with 51 additions and 12 deletions

View file

@ -21,6 +21,8 @@ Settings
~~~~~~~~
- ``snapshot``: ID of the EBS snapshot to use. This setting only works
with EBS backed EC2 configurations.
with the volume backing ``ebs``.
- ``image``: Path to the loopbackvolume snapshot. This setting works
with all configurable volume backings except EBS.
with the volume backings ``raw``, ``s3``, ``vdi``, ``vmdk``
- ``folder``: Path to the folder copy. This setting works
with the volume backing ``folder``

View file

@ -1,11 +1,9 @@
from tasks import Snapshot
from tasks import CopyImage
from tasks import CreateFromSnapshot
from tasks import CreateFromImage
import tasks
from bootstrapvz.providers.ec2.tasks import ebs
from bootstrapvz.providers.virtualbox.tasks import guest_additions
from bootstrapvz.common.tasks import loopback
from bootstrapvz.common.tasks import volume
from bootstrapvz.common.tasks import folder
from bootstrapvz.common.tasks import locale
from bootstrapvz.common.tasks import apt
from bootstrapvz.common.tasks import bootstrap
@ -23,6 +21,7 @@ def resolve_tasks(taskset, manifest):
settings = manifest.plugins['prebootstrapped']
skip_tasks = [ebs.Create,
loopback.Create,
folder.Create,
filesystem.Format,
partitioning.PartitionVolume,
@ -38,20 +37,28 @@ def resolve_tasks(taskset, manifest):
]
if manifest.volume['backing'] == 'ebs':
if settings.get('snapshot', None) is not None:
taskset.add(CreateFromSnapshot)
taskset.add(tasks.CreateFromSnapshot)
[taskset.discard(task) for task in skip_tasks]
else:
taskset.add(Snapshot)
taskset.add(tasks.Snapshot)
elif manifest.volume['backing'] == 'folder':
if settings.get('folder', None) is not None:
taskset.add(tasks.CreateFromFolder)
[taskset.discard(task) for task in skip_tasks]
else:
taskset.add(tasks.CopyFolder)
else:
if settings.get('image', None) is not None:
taskset.add(CreateFromImage)
taskset.add(tasks.CreateFromImage)
[taskset.discard(task) for task in skip_tasks]
else:
taskset.add(CopyImage)
taskset.add(tasks.CopyImage)
def resolve_rollback_tasks(taskset, manifest, completed, counter_task):
if manifest.volume['backing'] == 'ebs':
counter_task(taskset, CreateFromSnapshot, volume.Delete)
counter_task(taskset, tasks.CreateFromSnapshot, volume.Delete)
elif manifest.volume['backing'] == 'folder':
counter_task(taskset, tasks.CreateFromFolder, folder.Delete)
else:
counter_task(taskset, CreateFromImage, volume.Delete)
counter_task(taskset, tasks.CreateFromImage, volume.Delete)

View file

@ -14,6 +14,7 @@ properties:
- s3
- vdi
- vmdk
- folder
required: [backing]
plugins:
type: object
@ -23,4 +24,5 @@ properties:
properties:
image: {type: string}
snapshot: {type: string}
folder: {type: string}
additionalProperties: false

View file

@ -5,6 +5,7 @@ from bootstrapvz.common.tasks import packages
from bootstrapvz.providers.virtualbox.tasks import guest_additions
from bootstrapvz.providers.ec2.tasks import ebs
from bootstrapvz.common.fs import unmounted
from bootstrapvz.common.tools import log_check_call
from shutil import copyfile
import os.path
import time
@ -75,6 +76,33 @@ class CreateFromImage(Task):
set_fs_states(info.volume)
class CopyFolder(Task):
description = 'Creating a copy of the bootstrap folder'
phase = phases.package_installation
predecessors = [packages.InstallPackages, guest_additions.InstallGuestAdditions]
@classmethod
def run(cls, info):
folder_backup_name = '{id}.{ext}.backup'.format(id=info.run_id, ext=info.volume.extension)
destination = os.path.join(info.manifest.bootstrapper['workspace'], folder_backup_name)
log_check_call(['cp', '-a', info.volume.path, destination])
msg = 'A copy of the bootstrapped volume was created. Path: ' + destination
log.info(msg)
class CreateFromFolder(Task):
description = 'Creating bootstrap folder from a copy'
phase = phases.volume_creation
successors = [volume.Attach]
@classmethod
def run(cls, info):
info.root = os.path.join(info.workspace, 'root')
log_check_call(['cp', '-a', info.manifest.plugins['prebootstrapped']['folder'], info.root])
info.volume.path = info.root
info.volume.fsm.current = 'attached'
def set_fs_states(volume):
volume.fsm.current = 'detached'