Allow to upload volumes from files

This commit is contained in:
vic
2013-04-10 23:06:12 +04:00
parent 0c58a2603a
commit 68dad53549
4 changed files with 28 additions and 17 deletions

View File

@@ -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):

View File

@@ -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

View File

@@ -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):
"""

View File

@@ -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')