Allow to upload volumes from files
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user