mirror of
https://github.com/retspen/webvirtcloud
synced 2025-07-31 12:41:08 +00:00
Add editing disk capability to instance. Add instance disk options like io, discard, detect zeroes. rewrite detach disk
This commit is contained in:
parent
c05729158a
commit
f2ba2b58b0
4 changed files with 244 additions and 157 deletions
|
|
@ -388,10 +388,13 @@ class wvmInstance(wvmConnect):
|
|||
def get_disk_devices(self):
|
||||
def disks(doc):
|
||||
result = []
|
||||
dev = volume = storage = src_file = bus = None
|
||||
disk_format = used_size = disk_size = disk_cache = None
|
||||
|
||||
for disk in doc.xpath('/domain/devices/disk'):
|
||||
dev = volume = storage = src_file = bus = None
|
||||
disk_format = used_size = disk_size = None
|
||||
disk_cache = disk_io = disk_discard = disk_zeroes = 'default'
|
||||
readonly = shareable = serial = None
|
||||
|
||||
device = disk.xpath('@device')[0]
|
||||
if device == 'disk':
|
||||
try:
|
||||
|
|
@ -406,6 +409,23 @@ class wvmInstance(wvmConnect):
|
|||
disk_cache = disk.xpath('driver/@cache')[0]
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
disk_io = disk.xpath('driver/@io')[0]
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
disk_discard = disk.xpath('driver/@discard')[0]
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
disk_zeroes = disk.xpath('driver/@detect_zeroes')[0]
|
||||
except:
|
||||
pass
|
||||
|
||||
readonly = True if disk.xpath('readonly') else False
|
||||
shareable = True if disk.xpath('shareable') else False
|
||||
serial = disk.xpath('serial')[0].text if disk.xpath('serial') else None
|
||||
|
||||
try:
|
||||
vol = self.get_volume_by_path(src_file)
|
||||
volume = vol.name()
|
||||
|
|
@ -421,7 +441,9 @@ class wvmInstance(wvmConnect):
|
|||
finally:
|
||||
result.append(
|
||||
{'dev': dev, 'bus': bus, 'image': volume, 'storage': storage, 'path': src_file,
|
||||
'format': disk_format, 'size': disk_size, 'used': used_size, 'cache': disk_cache})
|
||||
'format': disk_format, 'size': disk_size, 'used': used_size,
|
||||
'cache': disk_cache, 'io': disk_io, 'discard': disk_discard, 'detect_zeroes': disk_zeroes,
|
||||
'readonly': readonly, 'shareable': shareable, 'serial': serial})
|
||||
return result
|
||||
|
||||
return util.get_xml_path(self._XMLDesc(0), func=disks)
|
||||
|
|
@ -620,39 +642,88 @@ class wvmInstance(wvmConnect):
|
|||
xmldom = ElementTree.tostring(tree)
|
||||
self._defineXML(xmldom)
|
||||
|
||||
def attach_disk(self, source, target, sourcetype='file', device='disk', driver='qemu', subdriver='raw', cache='none', targetbus='ide'):
|
||||
xml_disk = "<disk type='%s' device='%s'>" % (sourcetype, device)
|
||||
if device == 'cdrom':
|
||||
xml_disk += "<driver name='%s' type='%s'/>" % (driver, subdriver)
|
||||
elif device == 'disk':
|
||||
xml_disk += "<driver name='%s' type='%s' cache='%s'/>" % (driver, subdriver, cache)
|
||||
def attach_disk(self, source, target_dev, target_bus='ide', disk_type='file',
|
||||
disk_device='disk', driver_name='qemu', driver_type='raw',
|
||||
readonly=False, shareable=False, serial=None,
|
||||
cache_mode=None, io_mode=None, discard_mode=None, detect_zeroes_mode=None):
|
||||
|
||||
additionals = ''
|
||||
if cache_mode is not None and cache_mode != 'default':
|
||||
additionals += "cache='%s' " % cache_mode
|
||||
if io_mode is not None and io_mode != 'default':
|
||||
additionals += "io='%s' " % io_mode
|
||||
if discard_mode is not None and discard_mode != 'default':
|
||||
additionals += "discard='%s' " % discard_mode
|
||||
if detect_zeroes_mode is not None and detect_zeroes_mode != 'default':
|
||||
additionals += "detect_zeroes='%s' " % detect_zeroes_mode
|
||||
|
||||
xml_disk = "<disk type='%s' device='%s'>" % (disk_type, disk_device)
|
||||
if disk_device == 'cdrom':
|
||||
xml_disk += "<driver name='%s' type='%s'/>" % (driver_name, driver_type)
|
||||
elif disk_device == 'disk':
|
||||
xml_disk += "<driver name='%s' type='%s' %s/>" % (driver_name, driver_type, additionals)
|
||||
xml_disk += """<source file='%s'/>
|
||||
<target dev='%s' bus='%s'/>
|
||||
</disk>
|
||||
""" % (source, target, targetbus)
|
||||
<target dev='%s' bus='%s'/>""" % (source, target_dev, target_bus)
|
||||
if readonly:
|
||||
xml_disk += """<readonly/>"""
|
||||
if shareable:
|
||||
xml_disk += """<shareable/>"""
|
||||
if serial is not None and serial != 'None' and serial != '':
|
||||
xml_disk += """<serial>%s</serial>""" % serial
|
||||
xml_disk += """</disk>"""
|
||||
if self.get_status() == 1:
|
||||
self.instance.attachDeviceFlags(xml_disk, VIR_DOMAIN_AFFECT_LIVE)
|
||||
self.instance.attachDeviceFlags(xml_disk, VIR_DOMAIN_AFFECT_CONFIG)
|
||||
if self.get_status() == 5:
|
||||
self.instance.attachDeviceFlags(xml_disk, VIR_DOMAIN_AFFECT_CONFIG)
|
||||
|
||||
def detach_disk(self, dev):
|
||||
tree = ElementTree.fromstring(self._XMLDesc(0))
|
||||
def detach_disk(self, target_dev):
|
||||
tree = etree.fromstring(self._XMLDesc(0))
|
||||
|
||||
for disk in tree.findall("./devices/disk"):
|
||||
target = disk.find("target")
|
||||
if target.get("dev") == dev:
|
||||
devices = tree.find('devices')
|
||||
devices.remove(disk)
|
||||
disk_el = tree.xpath("./devices/disk/target[@dev='{}']".format(target_dev))[0].getparent()
|
||||
xml_disk = etree.tostring(disk_el)
|
||||
devices = tree.find('devices')
|
||||
devices.remove(disk_el)
|
||||
|
||||
if self.get_status() == 1:
|
||||
xml_disk = ElementTree.tostring(disk)
|
||||
ret = self.instance.detachDevice(xml_disk)
|
||||
xmldom = self._XMLDesc(VIR_DOMAIN_XML_SECURE)
|
||||
if self.get_status() == 5:
|
||||
xmldom = ElementTree.tostring(tree)
|
||||
break
|
||||
self._defineXML(xmldom)
|
||||
if self.get_status() == 1:
|
||||
self.instance.detachDeviceFlags(xml_disk, VIR_DOMAIN_AFFECT_LIVE)
|
||||
self.instance.detachDeviceFlags(xml_disk, VIR_DOMAIN_AFFECT_CONFIG)
|
||||
if self.get_status() == 5:
|
||||
self.instance.detachDeviceFlags(xml_disk, VIR_DOMAIN_AFFECT_CONFIG)
|
||||
|
||||
def edit_disk(self, target_dev, source, readonly, shareable, target_bus, serial, format, cache_mode, io_mode, discard_mode, detect_zeroes_mode):
|
||||
tree = etree.fromstring(self._XMLDesc(0))
|
||||
disk_el = tree.xpath("./devices/disk/target[@dev='{}']".format(target_dev))[0].getparent()
|
||||
old_disk_type = disk_el.get('type')
|
||||
old_disk_device = disk_el.get('device')
|
||||
old_driver_name = disk_el.xpath('driver/@name')[0]
|
||||
|
||||
additionals = ''
|
||||
if cache_mode is not None and cache_mode != 'default':
|
||||
additionals += "cache='%s' " % cache_mode
|
||||
if io_mode is not None and io_mode != 'default':
|
||||
additionals += "io='%s' " % io_mode
|
||||
if discard_mode is not None and discard_mode != 'default':
|
||||
additionals += "discard='%s' " % discard_mode
|
||||
if detect_zeroes_mode is not None and detect_zeroes_mode != 'default':
|
||||
additionals += "detect_zeroes='%s' " % detect_zeroes_mode
|
||||
|
||||
xml_disk = "<disk type='%s' device='%s'>" % (old_disk_type, old_disk_device)
|
||||
if old_disk_device == 'cdrom':
|
||||
xml_disk += "<driver name='%s' type='%s'/>" % (old_driver_name, format)
|
||||
elif old_disk_device == 'disk':
|
||||
xml_disk += "<driver name='%s' type='%s' %s/>" % (old_driver_name, format, additionals)
|
||||
xml_disk += """<source file='%s'/>
|
||||
<target dev='%s' bus='%s'/>""" % (source, target_dev, target_bus)
|
||||
if readonly:
|
||||
xml_disk += """<readonly/>"""
|
||||
if shareable:
|
||||
xml_disk += """<shareable/>"""
|
||||
if serial is not None and serial != 'None' and serial != '':
|
||||
xml_disk += """<serial>%s</serial>""" % serial
|
||||
xml_disk += """</disk>"""
|
||||
|
||||
self.instance.updateDeviceFlags(xml_disk, VIR_DOMAIN_AFFECT_CONFIG)
|
||||
|
||||
def cpu_usage(self):
|
||||
cpu_usage = {}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue