Commit dcf38ab6 by carpoon

extend export and import tasks

extend export and import tasks with identity and mode
add new export method to datastore
parent 0505e140
......@@ -513,16 +513,19 @@ class Disk(TimeStampedModel):
return disk
@classmethod
def import_disk(cls, user, name, download_link, port, task):
def import_disk(cls, task, user, name, download_link, port, store_identity_file, store_ssh_mode):
params = {'name': name,
'type': 'qcow2-norm'}
disk = cls.__create(user=user, params=params)
datastore = DataStore.objects.filter(name='default').get().name
disk = cls.__create(user=user, datastore=datastore, params=params)
queue_name = disk.get_remote_queue_name('storage', priority='slow')
remote = storage_tasks.import_disk.apply_async(
kwargs={
"disk_desc": disk.get_disk_desc(),
"url": download_link,
"port": port
"port": port,
"store_identity_file": store_identity_file,
"store_ssh_mode": store_ssh_mode,
},
queue=queue_name
)
......@@ -533,14 +536,27 @@ class Disk(TimeStampedModel):
disk.save()
return disk
def export(self, disk_format, upload_link, port, task):
def export_disk(self, task, disk_format, upload_link, port, store_identity_file, store_ssh_mode):
queue_name = self.get_remote_queue_name('storage', priority='slow')
remote = storage_tasks.export_disk.apply_async(
kwargs={
"disk_desc": self.get_disk_desc(),
"disk_format": disk_format,
"upload_link": upload_link,
"port": port
"port": port,
"store_identity_file": store_identity_file,
"store_ssh_mode": store_ssh_mode,
},
queue=queue_name)
return self._run_abortable_task(remote, task)
def export_disk_to_datastore(self, task, disk_format, datastore):
queue_name = self.get_remote_queue_name('storage', priority='slow')
remote = storage_tasks.export_disk_to_datastore.apply_async(
kwargs={
"disk_desc": self.get_disk_desc(),
"disk_format": disk_format,
"datastore": datastore,
},
queue=queue_name)
return self._run_abortable_task(remote, task)
......
......@@ -47,12 +47,17 @@ def download(disk_desc, url, resize):
@celery.task(name='storagedriver.import_disk')
def import_disk(disk_desc, url, port):
def import_disk(disk_desc, url, port, identity, mode):
pass
@celery.task(name='storagedriver.export_disk')
def export_disk(disk_desc, disk_format, url, port):
def export_disk(disk_desc, disk_format, url, port, identity, mode):
pass
@celery.task(name='storagedriver.export_disk_to_datastore')
def export_disk_to_datastore(disk_desc, disk_format, datastore):
pass
......
......@@ -49,6 +49,7 @@ from manager.scheduler import SchedulerError
from monitor.client import Client
from storage.models import Disk
from storage.tasks import storage_tasks
from storage.models import DataStore
from .models import (
Instance, InstanceActivity, InstanceTemplate, Interface, Node,
NodeActivity, pwgen
......@@ -57,6 +58,7 @@ from .tasks import agent_tasks, vm_tasks
from .tasks.local_tasks import (
abortable_async_instance_operation, abortable_async_node_operation,
)
from django.conf import settings
try:
# Python 2: "unicode" is built-in
......@@ -387,9 +389,6 @@ class DownloadDiskOperation(InstanceOperation):
"is: '%(checksum)s' (id: %(disk_id)s)."), url=url, checksum=disk.checksum, disk_id=str(disk.id))
@register_operation
class ImportDiskOperation(InstanceOperation):
id = 'import_disk'
......@@ -412,7 +411,8 @@ class ImportDiskOperation(InstanceOperation):
def _operation(self, user, name, disk_path, task):
store = Store(user)
download_link, port = store.request_ssh_download(disk_path)
disk = Disk.import_disk(user, name, download_link, port, task)
ogging.debug(settings)
disk = Disk.import_disk(task, user, name, download_link, port, settings.STORE_IDENTITY_FILE, settings.STORE_SSH_MODE)
self.instance.disks.add(disk)
......@@ -433,11 +433,17 @@ class ExportDiskOperation(InstanceOperation):
except NoStoreException:
raise PermissionDenied
def _operation(self, user, disk, exported_name, disk_format, task):
store = Store(user)
upload_link, port = store.request_ssh_upload()
file_name = disk.export(disk_format, upload_link, port, task)
store.ssh_upload_finished(file_name, exported_name + '.' + disk_format)
def _operation(self, user, disk, exported_name, disk_format, export_target, task):
if export_target == "user_store":
store = Store(user)
upload_link, port = store.request_ssh_upload()
file_name = disk.export_disk(task, disk_format, upload_link, port, settings.STORE_IDENTITY_FILE, settings.STORE_SSH_MODE)
store.ssh_upload_finished(file_name, exported_name + '.' + disk_format)
elif export_target == "datastore":
datastore = DataStore.objects.filter(name=settings.EXPORT_DATASTORE).get()
disk.export_disk_to_datastore(task, disk_format, datastore.path)
else:
raise Exception("Invalid export target")
@register_operation
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment