diff --git a/circle/vm/operations.py b/circle/vm/operations.py index 457404e..81ee1b8 100644 --- a/circle/vm/operations.py +++ b/circle/vm/operations.py @@ -26,6 +26,7 @@ from django.utils.translation import ugettext_lazy as _ from celery.exceptions import TimeLimitExceeded from common.operations import Operation, register_operation +from storage.models import Disk from .tasks.local_tasks import ( abortable_async_instance_operation, abortable_async_node_operation, ) @@ -119,6 +120,47 @@ class AddDiskOperation(InstanceOperation): register_operation(AddDiskOperation) +class CreateDiskOperation(InstanceOperation): + activity_code_suffix = 'create_disk' + id = 'create_disk' + name = _("create disk") + description = _("Create empty disk for the VM.") + + def check_precond(self): + super(AddDiskOperation, self).check_precond() + # TODO remove check when hot-attach is implemented + if self.instance.status not in ['STOPPED']: + raise self.instance.WrongStateError(self.instance) + + def _operation(self, user, size): + # TODO implement with hot-attach when it'll be available + disk = Disk.create(owner=user, size=size) + self.instance.disks.add(disk) + +register_operation(CreateDiskOperation) + + +class DownloadDiskOperation(InstanceOperation): + activity_code_suffix = 'download_disk' + id = 'download_disk' + name = _("download disk") + description = _("Download disk for the VM.") + abortable = True + + def check_precond(self): + super(AddDiskOperation, self).check_precond() + # TODO remove check when hot-attach is implemented + if self.instance.status not in ['STOPPED']: + raise self.instance.WrongStateError(self.instance) + + def _operation(self, user, url): + # TODO implement with hot-attach when it'll be available + disk = Disk.download(owner=user, url=url) + self.instance.disks.add(disk) + +register_operation(DownloadDiskOperation) + + class DeployOperation(InstanceOperation): activity_code_suffix = 'deploy' id = 'deploy'