diff --git a/circle/vm/operations.py b/circle/vm/operations.py index 315131e..d968474 100644 --- a/circle/vm/operations.py +++ b/circle/vm/operations.py @@ -343,6 +343,11 @@ class SaveAsTemplateOperation(InstanceOperation): v = 1 return "%s v%d" % (name, v) + def on_abort(self, activity, error): + if getattr(self, 'disks'): + for disk in self.disks: + disk.destroy() + def _operation(self, activity, user, system, timeout=300, name=None, with_shutdown=True, task=None, **kwargs): if with_shutdown: @@ -380,16 +385,20 @@ class SaveAsTemplateOperation(InstanceOperation): except Disk.WrongDiskTypeError: return disk + self.disks = [] with activity.sub_activity('saving_disks'): - disks = [__try_save_disk(disk) - for disk in self.instance.disks.all()] + for disk in self.instance.disks.all(): + self.disks.append(__try_save_disk(disk)) + + for disk in self.disks: + disk.set_level(user, 'owner') # create template and do additional setup tmpl = InstanceTemplate(**params) tmpl.full_clean() # Avoiding database errors. tmpl.save() try: - tmpl.disks.add(*disks) + tmpl.disks.add(*self.disks) # create interface templates for i in self.instance.interface_set.all(): i.save_as_template(tmpl)