[Kimchi-devel] [PATCH] bug fix: Allow user updates the cdrom from local to remote file

Aline Manera alinefm at linux.vnet.ibm.com
Tue Aug 12 02:31:39 UTC 2014


dom.updateDeviceFlags() can not work well while updating cdrom configuration
from local to remote file.
Even passing a right xml to this API, it updates the vm xml like below:

    <disk type='network' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source protocol='nbd' name='/13.04/ubuntu-13.04-desktop-amd64.iso'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
    </disk>

Instead of:

    <disk type='network' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source protocol='http' name='/13.04/ubuntu-13.04-desktop-amd64.iso'>
        <host name='ubuntu-releases.cs.umn.edu' port='80'/>
      </source>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
    </disk>

In this case it is safe to manually update the vm xml to properly change the
cdrom configuration instead of using the libvirt API.

Signed-off-by: Aline Manera <alinefm at linux.vnet.ibm.com>
---
 src/kimchi/model/vmstorages.py | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/src/kimchi/model/vmstorages.py b/src/kimchi/model/vmstorages.py
index b5311db..d2da4aa 100644
--- a/src/kimchi/model/vmstorages.py
+++ b/src/kimchi/model/vmstorages.py
@@ -250,6 +250,21 @@ class VMStorageModel(object):
         xml = _get_storage_xml(dev_info, ignore_source)
 
         try:
+            # FIXME: dom.updateDeviceFlags() can not work well while updating
+            # cdrom configuration from local to remote file
+            # In this case it is safe to manually update the vm xml to properly
+            # change the cdrom configuration
+            if dev_info['type'] == 'cdrom' and params['src_type'] == 'network':
+                # check if the current cdrom is a local file
+                conn = self.conn.get()
+                dom = conn.lookupByName(vm_name)
+                root = ET.fromstring(dom.XMLDesc(0))
+                devices = root.find(".devices")
+                disk = devices.find(".disk/target[@dev='%s']/.." % dev_name)
+                if disk.attrib["type"] != 'network':
+                    devices.replace(disk, ET.fromstring(xml))
+                    conn.defineXML(ET.tostring(root))
+
             dom.updateDeviceFlags(xml, get_vm_config_flag(dom, 'all'))
         except Exception as e:
             raise OperationFailed("KCHVMSTOR0009E", {'error': e.message})
-- 
1.9.3




More information about the Kimchi-devel mailing list