[gnome-boxes/gnome-3-16] libvirt-sys-vm-importer: Adapt domain's disk config



commit 8497a3843d3087204ff474b04f305397ff43e016
Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
Date:   Tue Jul 21 23:17:39 2015 +0100

    libvirt-sys-vm-importer: Adapt domain's disk config
    
    When importing domains from system libvirt to session, we convert the
    disk contents to our default format (qcow2) so it's wrong to copy the
    original disk configuration verbatim. This patch fixes this issue by
    removing the copied domain disk config and adding a new one (just like
    we do for new VMs we create against installers.
    
    The code also ensures that newly added main disk doesn't conflict with
    any existing CD-ROM devices in domain configuration.

 src/libvirt-system-vm-importer.vala |   28 +++++++++++++++++++++-------
 1 files changed, 21 insertions(+), 7 deletions(-)
---
diff --git a/src/libvirt-system-vm-importer.vala b/src/libvirt-system-vm-importer.vala
index a1e2d0b..e865bd7 100644
--- a/src/libvirt-system-vm-importer.vala
+++ b/src/libvirt-system-vm-importer.vala
@@ -35,18 +35,32 @@ private class Boxes.LibvirtSystemVMImporter : Boxes.VMImporter {
         yield VMConfigurator.update_existing_domain (config, connection);
 
         var devices = config.get_devices ();
+        var filtered = new GLib.List<DomainDevice> ();
+        var hd_index = 0;
         foreach (var device in devices) {
-            if (!(device is DomainDisk))
-                continue;
+            if (device is DomainDisk) {
+                var disk = device as DomainDisk;
 
-            var disk = device as DomainDisk;
-            if (disk.get_source () == media.device_file) {
-                disk.set_source (volume.get_path ());
+                if (disk.get_source () == media.device_file)
+                    /* Remove the copied over main disk configuration. */
+                    continue;
 
-                break;
+                /* Let's ensure main disk configuration we're going to add, doesn't conflict with CD-ROM 
device. */
+                if (disk.get_guest_device_type () == DomainDiskGuestDeviceType.CDROM) {
+                    var dev = disk.get_target_dev ();
+                    var cd_index = ((uint8) dev[dev.length - 1] - 97);
+
+                    hd_index = (cd_index != 0)? 0 : cd_index + 1;
+                }
             }
+
+            filtered.prepend (device);
         }
-        config.set_devices (devices);
+        filtered.reverse ();
+        config.set_devices (filtered);
+
+        /* Add new disk configuration to match the corresponding target volume/media */
+        VMConfigurator.set_target_media_config (config, volume.get_path (), install_media, hd_index);
 
         return config;
     }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]