From 5f4df6e62050ea70dc94b018d6749d889ab2eb3e Mon Sep 17 00:00:00 2001 From: Máhonfai Bálint Date: Thu, 9 Apr 2020 19:19:10 +0200 Subject: [PATCH] Add import disk to disk model --- circle/storage/models.py | 34 ++++++++++++++++++++++++---------- circle/storage/tasks/storage_tasks.py | 5 +++++ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/circle/storage/models.py b/circle/storage/models.py index 89942b9..dad6127 100644 --- a/circle/storage/models.py +++ b/circle/storage/models.py @@ -20,31 +20,30 @@ from __future__ import unicode_literals import logging -from os.path import join import uuid -import re +import re from celery.contrib.abortable import AbortableAsyncResult -from django.db.models import (Model, BooleanField, CharField, DateTimeField, - ForeignKey) +from celery.exceptions import TimeoutError from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse +from django.db.models import (Model, BooleanField, CharField, DateTimeField, + ForeignKey) from django.utils import timezone from django.utils.translation import ugettext_lazy as _, ugettext_noop from model_utils.models import TimeStampedModel +from os.path import join from sizefield.models import FileSizeField -from .tasks import local_tasks, storage_tasks -from celery.exceptions import TimeoutError from common.models import ( WorkerNotFound, HumanReadableException, humanize_exception, method_cache ) +from .tasks import local_tasks, storage_tasks logger = logging.getLogger(__name__) class DataStore(Model): - """Collection of virtual disks. """ name = CharField(max_length=100, unique=True, verbose_name=_('name')) @@ -119,7 +118,6 @@ class DataStore(Model): class Disk(TimeStampedModel): - """A virtual disk. """ TYPES = [('qcow2-norm', 'qcow2 normal'), ('qcow2-snap', 'qcow2 snapshot'), @@ -473,7 +471,23 @@ class Disk(TimeStampedModel): disk.save() return disk - def export(self, format, upload_link, timeout=600): + @classmethod + def import_disk(cls, user, name, download_link, timeout=3600): + params = {'name': name, + 'type': 'qcow2-norm'} + disk = cls.create(user, **params) + queue_name = disk.get_remote_queue_name('storage', priority='slow') + remote = storage_tasks.import_disk.apply_async( + args=[disk.get_disk_desc(), download_link], + queue=queue_name + ) + disk_size = remote.get(timeout=timeout) + disk.size = disk_size + disk.is_ready = True + disk.save() + return disk + + def export(self, format, upload_link, timeout=3600): exported_name = self.name if self.name != '' else self.filename queue_name = self.get_remote_queue_name('storage', priority='slow') @@ -563,7 +577,7 @@ class Disk(TimeStampedModel): @property def is_resizable(self): - return self.type in ('qcow2-norm', 'raw-rw', 'qcow2-snap', ) + return self.type in ('qcow2-norm', 'raw-rw', 'qcow2-snap',) @property def is_exportable(self): diff --git a/circle/storage/tasks/storage_tasks.py b/circle/storage/tasks/storage_tasks.py index db7d812..8b5985f 100644 --- a/circle/storage/tasks/storage_tasks.py +++ b/circle/storage/tasks/storage_tasks.py @@ -38,6 +38,11 @@ def download(disk_desc, url): pass +@celery.task(name='storagedriver.import_disk') +def import_disk(disk_desc, url): + pass + + @celery.task(name='storagedriver.export') def export(disk_desc, format): pass -- libgit2 0.26.0