[gnome-boxes] machine: can_delete prop now public settable



commit 5b4cfdaba656b4ac7f27b27b495fa72d87705c45
Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
Date:   Wed May 4 15:45:15 2016 +0100

    machine: can_delete prop now public settable
    
    https://bugzilla.gnome.org/show_bug.cgi?id=710307

 src/libvirt-broker.vala  |   52 +++++++++++++++++++++++++++++++++++++++++----
 src/libvirt-machine.vala |   10 ++++----
 src/machine.vala         |    2 +-
 src/media-manager.vala   |    2 +
 src/vm-configurator.vala |    4 +-
 5 files changed, 57 insertions(+), 13 deletions(-)
---
diff --git a/src/libvirt-broker.vala b/src/libvirt-broker.vala
index d7d81c2..04ba131 100644
--- a/src/libvirt-broker.vala
+++ b/src/libvirt-broker.vala
@@ -85,9 +85,9 @@ private class Boxes.LibvirtBroker : Boxes.Broker {
     }
 
     // Existing == Existed before Boxes was launched
-    private async void try_add_existing_domain (CollectionSource source,
-                                                GVir.Connection  connection,
-                                                GVir.Domain      domain) {
+    private async LibvirtMachine? try_add_existing_domain (CollectionSource source,
+                                                           GVir.Connection  connection,
+                                                           GVir.Domain      domain) {
         try {
             var machine = yield add_domain (source, connection, domain);
             var config = machine.domain_config;
@@ -106,8 +106,12 @@ private class Boxes.LibvirtBroker : Boxes.Broker {
                 debug ("Continuing cloning of '%s', ..", machine.name);
                 new LibvirtVMCloner.for_cloning_completion (machine);
             }
+
+            return machine;
         } catch (GLib.Error error) {
             warning ("Failed to create source '%s': %s", source.name, error.message);
+
+            return null;
         }
     }
 
@@ -124,8 +128,46 @@ private class Boxes.LibvirtBroker : Boxes.Broker {
 
         connections.insert (source.name, connection);
 
-        foreach (var domain in connection.get_domains ())
-            yield try_add_existing_domain (source, connection, domain);
+        var clones = new GLib.List<LibvirtMachine> ();
+        foreach (var domain in connection.get_domains ()) {
+            var machine = yield try_add_existing_domain (source, connection, domain);
+
+            if (VMConfigurator.is_libvirt_cloning_config (machine.domain_config))
+                clones.append (machine);
+        }
+
+        foreach (var clone in clones) {
+            var disk_path = (clone.vm_creator as VMImporter).source_media.device_file;
+            LibvirtMachine? cloned = null;
+
+            foreach (var item in App.app.collection.items.data) {
+                if (!(item is LibvirtMachine))
+                    continue;
+
+                var machine = item as LibvirtMachine;
+                var volume = machine.storage_volume;
+                if (volume != null && volume.get_path () == disk_path) {
+                    cloned = machine;
+
+                    break;
+                }
+            }
+
+            if (cloned == null) {
+                warning ("Failed to find source machine of clone %s", clone.name);
+
+                continue;
+            }
+
+            cloned.can_delete = false;
+            ulong under_construct_id = 0;
+            under_construct_id = clone.notify["under-construction"].connect (() => {
+                if (!clone.under_construction) {
+                    cloned.can_delete = true;
+                    clone.disconnect (under_construct_id);
+                }
+            });
+        }
 
         connection.domain_removed.connect ((connection, domain) => {
             var machine = domain.get_data<LibvirtMachine> ("machine");
diff --git a/src/libvirt-machine.vala b/src/libvirt-machine.vala
index b9506ff..5536980 100644
--- a/src/libvirt-machine.vala
+++ b/src/libvirt-machine.vala
@@ -694,14 +694,14 @@ private class Boxes.LibvirtMachine: Boxes.Machine {
 
             var media = new LibvirtClonedMedia (storage_volume.get_path (), config);
             var vm_cloner = media.get_vm_creator ();
-            var cloned = yield vm_cloner.create_vm (null);
-            vm_cloner.launch_vm (cloned);
+            var clone_machine = yield vm_cloner.create_vm (null);
+            vm_cloner.launch_vm (clone_machine);
 
             ulong under_construct_id = 0;
-            under_construct_id = cloned.notify["under-construction"].connect (() => {
-                if (!cloned.under_construction) {
+            under_construct_id = clone_machine.notify["under-construction"].connect (() => {
+                if (!clone_machine.under_construction) {
                     can_delete = true;
-                    cloned.disconnect (under_construct_id);
+                    clone_machine.disconnect (under_construct_id);
                 }
             });
         } catch (GLib.Error error) {
diff --git a/src/machine.vala b/src/machine.vala
index 5903200..5440c5e 100644
--- a/src/machine.vala
+++ b/src/machine.vala
@@ -17,7 +17,7 @@ private abstract class Boxes.Machine: Boxes.CollectionItem, Boxes.IPropertiesPro
     public virtual bool can_save { get { return false; } }
     public abstract bool can_restart { get; }
     public abstract bool can_clone { get; }
-    public bool can_delete { get; protected set; default = true; }
+    public bool can_delete { get; set; default = true; }
     public bool under_construction { get; protected set; default = false; }
 
     public signal void got_error (string message);
diff --git a/src/media-manager.vala b/src/media-manager.vala
index 88803b3..c02a870 100644
--- a/src/media-manager.vala
+++ b/src/media-manager.vala
@@ -44,6 +44,8 @@ private class Boxes.MediaManager : Object {
                 return yield new InstalledMedia.guess_os (path, this);
             else if (VMConfigurator.is_libvirt_system_import_config (config))
                 return new LibvirtMedia (path, config);
+            else if (VMConfigurator.is_libvirt_cloning_config (config))
+                return new LibvirtClonedMedia (path, config);
         } catch (GLib.Error error) {
                 debug ("%s", error.message);
 
diff --git a/src/vm-configurator.vala b/src/vm-configurator.vala
index 6cb4756..4b8918f 100644
--- a/src/vm-configurator.vala
+++ b/src/vm-configurator.vala
@@ -424,10 +424,10 @@ private class Boxes.VMConfigurator {
 
         if (installed)
             custom_xml = INSTALLED_XML;
-        else if (install_media is LibvirtMedia)
-            custom_xml = LIBVIRT_SYS_IMPORT_XML;
         else if (install_media is LibvirtClonedMedia)
             custom_xml = LIBVIRT_CLONING_XML;
+        else if (install_media is LibvirtMedia)
+            custom_xml = LIBVIRT_SYS_IMPORT_XML;
         else if (install_media is InstalledMedia)
             custom_xml = IMPORT_XML;
         else


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