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