From b86972f5cc9e45caac2f27ca4da8914a4d8481d6 Mon Sep 17 00:00:00 2001 From: Guba Sándor <guba.sandor@cloud.bme.hu> Date: Thu, 6 Mar 2014 15:04:57 +0100 Subject: [PATCH] instance: added save_as_async and refactored save_as --- circle/vm/models/instance.py | 87 +++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------- 1 file changed, 47 insertions(+), 40 deletions(-) diff --git a/circle/vm/models/instance.py b/circle/vm/models/instance.py index 7adebfe..d9a8a7e 100644 --- a/circle/vm/models/instance.py +++ b/circle/vm/models/instance.py @@ -968,47 +968,54 @@ class Instance(AclBase, VirtualMachineDescModel, TimeStampedModel): for net in self.interface_set.all(): net.deploy() - def save_as_template(self, name, **kwargs): - # prepare parameters - kwargs.setdefault('name', name) - kwargs.setdefault('description', self.description) - kwargs.setdefault('parent', self.template) - kwargs.setdefault('num_cores', self.num_cores) - kwargs.setdefault('ram_size', self.ram_size) - kwargs.setdefault('max_ram_size', self.max_ram_size) - kwargs.setdefault('arch', self.arch) - kwargs.setdefault('priority', self.priority) - kwargs.setdefault('boot_menu', self.boot_menu) - kwargs.setdefault('raw_data', self.raw_data) - kwargs.setdefault('lease', self.lease) - kwargs.setdefault('access_method', self.access_method) - kwargs.setdefault('system', self.template.system - if self.template else None) - - def __try_save_disk(disk): - try: - return disk.save_as() # can do in parallel - except Disk.WrongDiskTypeError: - return disk - - # copy disks - disks = [__try_save_disk(disk) for disk in self.disks.all()] - kwargs.setdefault('disks', disks) + def save_as_template_async(self, name, user=None, **kwargs): + return local_tasks.save_as_template.apply_async( + args=[self, name, user, kwargs], queue="localhost.man") - # create template and do additional setup - tmpl = InstanceTemplate(**kwargs) - - # save template - tmpl.save() - try: - # create interface templates - for i in self.interface_set.all(): - i.save_as_template(tmpl) - except: - tmpl.delete() - raise - else: - return tmpl + def save_as_template(self, name, task_uuid=None, user=None, + timeout=300, **kwargs): + with instance_activity(code_suffix="save_as_template", instance=self, + task_uuid=task_uuid, user=user): + # prepare parameters + kwargs.setdefault('name', name) + kwargs.setdefault('description', self.description) + kwargs.setdefault('parent', self.template) + kwargs.setdefault('num_cores', self.num_cores) + kwargs.setdefault('ram_size', self.ram_size) + kwargs.setdefault('max_ram_size', self.max_ram_size) + kwargs.setdefault('arch', self.arch) + kwargs.setdefault('priority', self.priority) + kwargs.setdefault('boot_menu', self.boot_menu) + kwargs.setdefault('raw_data', self.raw_data) + kwargs.setdefault('lease', self.lease) + kwargs.setdefault('access_method', self.access_method) + kwargs.setdefault('system', self.template.system + if self.template else None) + + def __try_save_disk(disk): + try: + return disk.save_as() # can do in parallel + except Disk.WrongDiskTypeError: + return disk + + # create template and do additional setup + tmpl = InstanceTemplate(**kwargs) + tmpl.full_clean() + logger.info("Clean utani save") + tmpl.save() + tmpl.disks.add(*[__try_save_disk(disk) + for disk in self.disks.all()]) + # save template + tmpl.save() + try: + # create interface templates + for i in self.interface_set.all(): + i.save_as_template(tmpl) + except: + tmpl.delete() + raise + else: + return tmpl def shutdown_and_save_as_template(self, name, user=None, task_uuid=None, **kwargs): -- libgit2 0.26.0