diff --git a/bootstrapvz/base/main.py b/bootstrapvz/base/main.py index 7330fd4..5f1980b 100644 --- a/bootstrapvz/base/main.py +++ b/bootstrapvz/base/main.py @@ -105,7 +105,7 @@ def run(opts): rollback_tasklist.tasks.add(counter) # Ask the provider and plugins for tasks they'd like to add to the rollback tasklist # Any additional arguments beyond the first two are passed directly to the provider and plugins - rollback_tasklist.load('resolve_rollback_tasks', manifest, counter_task) + rollback_tasklist.load('resolve_rollback_tasks', manifest, tasklist.tasks_completed, counter_task) # Run the rollback tasklist rollback_tasklist.run(info=bootstrap_info, dry_run=opts['--dry-run']) diff --git a/bootstrapvz/common/task_groups.py b/bootstrapvz/common/task_groups.py index a39ff97..1bc7303 100644 --- a/bootstrapvz/common/task_groups.py +++ b/bootstrapvz/common/task_groups.py @@ -4,6 +4,7 @@ from tasks import host from tasks import boot from tasks import bootstrap from tasks import volume +from tasks import loopback from tasks import filesystem from tasks import partitioning from tasks import cleanup @@ -144,3 +145,23 @@ def get_fs_specific_group(manifest): cleanup_group = [cleanup.ClearMOTD, cleanup.CleanTMP, ] + + +rollback_map = {workspace.CreateWorkspace: workspace.DeleteWorkspace, + loopback.Create: volume.Delete, + volume.Attach: volume.Detach, + partitioning.MapPartitions: partitioning.UnmapPartitions, + filesystem.CreateMountDir: filesystem.DeleteMountDir, + filesystem.MountRoot: filesystem.UnmountRoot, + } + + +def get_standard_rollback_tasks(completed): + rollback_tasks = set() + for task in completed: + if task not in rollback_map: + continue + counter = rollback_map[task] + if task in completed and counter not in completed: + rollback_tasks.add(counter) + return rollback_tasks diff --git a/bootstrapvz/plugins/minimize_size/__init__.py b/bootstrapvz/plugins/minimize_size/__init__.py index f5ab69c..4dfacde 100644 --- a/bootstrapvz/plugins/minimize_size/__init__.py +++ b/bootstrapvz/plugins/minimize_size/__init__.py @@ -21,5 +21,5 @@ def resolve_tasks(taskset, manifest): taskset.add(tasks.ShrinkVolume) -def resolve_rollback_tasks(taskset, manifest, counter_task): +def resolve_rollback_tasks(taskset, manifest, completed, counter_task): counter_task(tasks.AddFolderMounts, tasks.RemoveFolderMounts) diff --git a/bootstrapvz/plugins/prebootstrapped/__init__.py b/bootstrapvz/plugins/prebootstrapped/__init__.py index c0bafe7..31014e7 100644 --- a/bootstrapvz/plugins/prebootstrapped/__init__.py +++ b/bootstrapvz/plugins/prebootstrapped/__init__.py @@ -50,7 +50,7 @@ def resolve_tasks(taskset, manifest): taskset.add(CopyImage) -def resolve_rollback_tasks(taskset, manifest, counter_task): +def resolve_rollback_tasks(taskset, manifest, completed, counter_task): if manifest.volume['backing'] == 'ebs': counter_task(CreateFromSnapshot, volume.Delete) else: diff --git a/bootstrapvz/plugins/vagrant/__init__.py b/bootstrapvz/plugins/vagrant/__init__.py index e0b1fc1..6f7d8da 100644 --- a/bootstrapvz/plugins/vagrant/__init__.py +++ b/bootstrapvz/plugins/vagrant/__init__.py @@ -30,5 +30,5 @@ def resolve_tasks(taskset, manifest): ]) -def resolve_rollback_tasks(taskset, manifest, counter_task): +def resolve_rollback_tasks(taskset, manifest, completed, counter_task): counter_task(tasks.CreateVagrantBoxDir, tasks.RemoveVagrantBoxDir) diff --git a/bootstrapvz/providers/azure/__init__.py b/bootstrapvz/providers/azure/__init__.py index 3fd668f..688991e 100644 --- a/bootstrapvz/providers/azure/__init__.py +++ b/bootstrapvz/providers/azure/__init__.py @@ -1,3 +1,4 @@ +from bootstrapvz.common import task_groups import tasks.packages import tasks.boot import tasks.image @@ -24,7 +25,6 @@ def validate_manifest(data, validator, error): def resolve_tasks(taskset, manifest): - from bootstrapvz.common import task_groups taskset.update(task_groups.get_standard_groups(manifest)) taskset.update([tasks.packages.DefaultPackages, @@ -39,10 +39,5 @@ def resolve_tasks(taskset, manifest): ]) -def resolve_rollback_tasks(taskset, manifest, counter_task): - counter_task(loopback.Create, volume.Delete) - counter_task(filesystem.CreateMountDir, filesystem.DeleteMountDir) - counter_task(partitioning.MapPartitions, partitioning.UnmapPartitions) - counter_task(filesystem.MountRoot, filesystem.UnmountRoot) - counter_task(volume.Attach, volume.Detach) - counter_task(workspace.CreateWorkspace, workspace.DeleteWorkspace) +def resolve_rollback_tasks(taskset, manifest, completed, counter_task): + taskset.update(task_groups.get_standard_rollback_tasks(completed)) diff --git a/bootstrapvz/providers/ec2/__init__.py b/bootstrapvz/providers/ec2/__init__.py index 9fd9ea8..b5cb505 100644 --- a/bootstrapvz/providers/ec2/__init__.py +++ b/bootstrapvz/providers/ec2/__init__.py @@ -1,3 +1,4 @@ +from bootstrapvz.common import task_groups import tasks.packages import tasks.connection import tasks.host @@ -47,7 +48,6 @@ def validate_manifest(data, validator, error): def resolve_tasks(taskset, manifest): - from bootstrapvz.common import task_groups taskset.update(task_groups.get_standard_groups(manifest)) taskset.update(task_groups.ssh_group) @@ -97,17 +97,8 @@ def resolve_tasks(taskset, manifest): ]) -def resolve_rollback_tasks(taskset, manifest, counter_task): +def resolve_rollback_tasks(taskset, manifest, completed, counter_task): + taskset.update(task_groups.get_standard_rollback_tasks(completed)) counter_task(tasks.ebs.Create, volume.Delete) counter_task(tasks.ebs.Attach, volume.Detach) - - counter_task(loopback.Create, volume.Delete) - counter_task(volume.Attach, volume.Detach) - - counter_task(partitioning.MapPartitions, partitioning.UnmapPartitions) - counter_task(filesystem.CreateMountDir, filesystem.DeleteMountDir) - - counter_task(filesystem.MountRoot, filesystem.UnmountRoot) - counter_task(volume.Attach, volume.Detach) - counter_task(workspace.CreateWorkspace, workspace.DeleteWorkspace) counter_task(tasks.ami.BundleImage, tasks.ami.RemoveBundle) diff --git a/bootstrapvz/providers/gce/__init__.py b/bootstrapvz/providers/gce/__init__.py index 3616c76..fd53d66 100644 --- a/bootstrapvz/providers/gce/__init__.py +++ b/bootstrapvz/providers/gce/__init__.py @@ -1,3 +1,4 @@ +import bootstrapvz.common.task_groups import tasks.apt import tasks.boot import tasks.configuration @@ -48,10 +49,5 @@ def resolve_tasks(tasklist, manifest): tasklist.add(tasks.image.RegisterImage) -def resolve_rollback_tasks(tasklist, manifest, counter_task): - counter_task(loopback.Create, volume.Delete) - counter_task(filesystem.CreateMountDir, filesystem.DeleteMountDir) - counter_task(partitioning.MapPartitions, partitioning.UnmapPartitions) - counter_task(filesystem.MountRoot, filesystem.UnmountRoot) - counter_task(volume.Attach, volume.Detach) - counter_task(workspace.CreateWorkspace, workspace.DeleteWorkspace) +def resolve_rollback_tasks(tasklist, manifest, completed, counter_task): + taskset.update(task_groups.get_standard_rollback_tasks(completed)) diff --git a/bootstrapvz/providers/kvm/__init__.py b/bootstrapvz/providers/kvm/__init__.py index 522a0d7..254fe95 100644 --- a/bootstrapvz/providers/kvm/__init__.py +++ b/bootstrapvz/providers/kvm/__init__.py @@ -1,3 +1,4 @@ +from bootstrapvz.common import task_groups import tasks.packages from bootstrapvz.common.tasks import volume from bootstrapvz.common.tasks import loopback @@ -22,7 +23,6 @@ def validate_manifest(data, validator, error): def resolve_tasks(taskset, manifest): - from bootstrapvz.common import task_groups taskset.update(task_groups.get_standard_groups(manifest)) taskset.update([tasks.packages.DefaultPackages, @@ -39,10 +39,5 @@ def resolve_tasks(taskset, manifest): taskset.update([virtio.VirtIO]) -def resolve_rollback_tasks(taskset, manifest, counter_task): - counter_task(loopback.Create, volume.Delete) - counter_task(filesystem.CreateMountDir, filesystem.DeleteMountDir) - counter_task(partitioning.MapPartitions, partitioning.UnmapPartitions) - counter_task(filesystem.MountRoot, filesystem.UnmountRoot) - counter_task(volume.Attach, volume.Detach) - counter_task(workspace.CreateWorkspace, workspace.DeleteWorkspace) +def resolve_rollback_tasks(taskset, manifest, completed, counter_task): + taskset.update(task_groups.get_standard_rollback_tasks(completed)) diff --git a/bootstrapvz/providers/virtualbox/__init__.py b/bootstrapvz/providers/virtualbox/__init__.py index d8152e8..26faf45 100644 --- a/bootstrapvz/providers/virtualbox/__init__.py +++ b/bootstrapvz/providers/virtualbox/__init__.py @@ -1,3 +1,4 @@ +from bootstrapvz.common import task_groups import tasks.packages from bootstrapvz.common.tasks import volume from bootstrapvz.common.tasks import loopback @@ -20,7 +21,6 @@ def validate_manifest(data, validator, error): def resolve_tasks(taskset, manifest): - from bootstrapvz.common import task_groups taskset.update(task_groups.get_standard_groups(manifest)) taskset.update([tasks.packages.DefaultPackages, @@ -36,10 +36,5 @@ def resolve_tasks(taskset, manifest): ]) -def resolve_rollback_tasks(taskset, manifest, counter_task): - counter_task(loopback.Create, volume.Delete) - counter_task(filesystem.CreateMountDir, filesystem.DeleteMountDir) - counter_task(partitioning.MapPartitions, partitioning.UnmapPartitions) - counter_task(filesystem.MountRoot, filesystem.UnmountRoot) - counter_task(volume.Attach, volume.Detach) - counter_task(workspace.CreateWorkspace, workspace.DeleteWorkspace) +def resolve_rollback_tasks(taskset, manifest, completed, counter_task): + taskset.update(task_groups.get_standard_rollback_tasks(completed))