From 68dad535492bdc3be2b456217d84f795f4ec90bc Mon Sep 17 00:00:00 2001 From: vic Date: Wed, 10 Apr 2013 23:06:12 +0400 Subject: [PATCH] Allow to upload volumes from files --- src/devops/driver/libvirt/libvirt_driver.py | 17 +++-------------- src/devops/helpers/helpers.py | 15 +++++++++++++++ src/devops/manager.py | 10 +++++++--- src/devops/models.py | 3 +++ 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/devops/driver/libvirt/libvirt_driver.py b/src/devops/driver/libvirt/libvirt_driver.py index cb2b1f70..582c8391 100644 --- a/src/devops/driver/libvirt/libvirt_driver.py +++ b/src/devops/driver/libvirt/libvirt_driver.py @@ -3,6 +3,7 @@ from time import sleep import libvirt from devops.driver.libvirt.libvirt_xml_builder import LibvirtXMLBuilder from devops.helpers import scancodes +from devops.helpers.helpers import _get_file_size from devops.helpers.retry import retry import xml.etree.ElementTree as ET import ipaddr @@ -351,25 +352,13 @@ class DevopsDriver(object): def volume_path(self, volume): return self.conn.storageVolLookupByKey(volume.uuid).path() - def _get_file_size(self, file): - """ - :type file: file - :rtype : int - """ - current = file.tell() - try: - file.seek(0, 2) - size = file.tell() - finally: - file.seek(current) - return size - @retry(count=2) def volume_upload(self, volume, path): + size = _get_file_size(path) with open(path, 'rb') as f: self.conn.storageVolLookupByKey(volume.uuid).upload( stream=f, offset=0, - length=self._get_file_size(f), flags=0) + length=size, flags=0) @retry() def volume_delete(self, volume): diff --git a/src/devops/helpers/helpers.py b/src/devops/helpers/helpers.py index 8e004987..2a3c79ac 100644 --- a/src/devops/helpers/helpers.py +++ b/src/devops/helpers/helpers.py @@ -360,3 +360,18 @@ def xmlrpcmethod(uri, method): def generate_mac(): return "64:{0:02x}:{1:02x}:{2:02x}:{3:02x}:{4:02x}".format( *bytearray(os.urandom(5))) + + +def _get_file_size(path): + """ + :type file: String + :rtype : int + """ + with open(path) as file: + current = file.tell() + try: + file.seek(0, 2) + size = file.tell() + finally: + file.seek(current) + return size \ No newline at end of file diff --git a/src/devops/manager.py b/src/devops/manager.py index 9684fc07..297d769e 100644 --- a/src/devops/manager.py +++ b/src/devops/manager.py @@ -2,7 +2,7 @@ import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "devops.settings") import ipaddr -from devops.helpers.helpers import generate_mac +from devops.helpers.helpers import generate_mac, _get_file_size from devops.helpers.network import IpNetworksPool from devops.models import Address, Interface, Node, Network, Environment, Volume, DiskDevice, ExternalModel @@ -107,8 +107,12 @@ class Manager(object): name=name, environment=environment, capacity=capacity, format=format) - def upload(self, path): - pass + def volume_upload(self, name, path, format='qcow2', environment=None): + capacity = _get_file_size(path) + volume = self.volume_create( + name=name, capacity=capacity, format=format, environment=environment) + volume.upload(path) + return volume def _generate_mac(self): """ diff --git a/src/devops/models.py b/src/devops/models.py index 17159a92..ac0f7800 100644 --- a/src/devops/models.py +++ b/src/devops/models.py @@ -329,6 +329,9 @@ class Volume(ExternalModel): self.capacity = self.get_capacity() self.format = self.get_format() + def upload(self, path): + self.driver.volume_upload(self, path) + class DiskDevice(models.Model): device = choices('disk', 'cdrom')