[gnome-boxes] libvirt-machine: Implement cloning



commit 79b748d9611453e759819d52b25916951f9cd8bb
Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
Date:   Tue May 3 22:02:07 2016 +0100

    libvirt-machine: Implement cloning
    
    https://bugzilla.gnome.org/show_bug.cgi?id=710307

 src/libvirt-broker.vala  |    3 +++
 src/libvirt-machine.vala |   30 ++++++++++++++++++++++++++++--
 src/vm-configurator.vala |    8 ++++++++
 3 files changed, 39 insertions(+), 2 deletions(-)
---
diff --git a/src/libvirt-broker.vala b/src/libvirt-broker.vala
index 0a5b920..d7d81c2 100644
--- a/src/libvirt-broker.vala
+++ b/src/libvirt-broker.vala
@@ -102,6 +102,9 @@ private class Boxes.LibvirtBroker : Boxes.Broker {
             } else if (VMConfigurator.is_libvirt_system_import_config (config)) {
                 debug ("Continuing import of '%s', ..", machine.name);
                 new LibvirtVMImporter.for_import_completion (machine);
+            } else if (VMConfigurator.is_libvirt_cloning_config (config)) {
+                debug ("Continuing cloning of '%s', ..", machine.name);
+                new LibvirtVMCloner.for_cloning_completion (machine);
             }
         } catch (GLib.Error error) {
             warning ("Failed to create source '%s': %s", source.name, error.message);
diff --git a/src/libvirt-machine.vala b/src/libvirt-machine.vala
index 295ef71..b9506ff 100644
--- a/src/libvirt-machine.vala
+++ b/src/libvirt-machine.vala
@@ -33,7 +33,7 @@ private class Boxes.LibvirtMachine: Boxes.Machine {
     public override bool suspend_at_exit { get { return connection == App.app.default_connection && 
!run_in_bg; } }
     public override bool can_save { get { return !saving && state != MachineState.SAVED && !importing; } }
     public override bool can_restart { get { return state == MachineState.RUNNING || state == 
MachineState.SAVED; } }
-    public override bool can_clone { get { return false; } }
+    public override bool can_clone { get { return !importing; } }
     protected override bool should_autosave {
         get {
             return (base.should_autosave &&
@@ -682,7 +682,33 @@ private class Boxes.LibvirtMachine: Boxes.Machine {
         try_shutdown ();
     }
 
-    public override async void clone () {}
+    public override async void clone () {
+        debug ("Cloning '%s'..", domain_config.name);
+        can_delete = false;
+
+        try {
+            // Any better way of cloning the config?
+            var xml = domain_config.to_xml ();
+            var config = new GVirConfig.Domain.from_xml (xml);
+            config.set_uuid (null);
+
+            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);
+
+            ulong under_construct_id = 0;
+            under_construct_id = cloned.notify["under-construction"].connect (() => {
+                if (!cloned.under_construction) {
+                    can_delete = true;
+                    cloned.disconnect (under_construct_id);
+                }
+            });
+        } catch (GLib.Error error) {
+            warning ("Failed to clone %s: %s", domain_config.name, error.message);
+            can_delete = true;
+        }
+    }
 
     public string? get_ip_address () {
         if (system_virt_connection == null || !is_on)
diff --git a/src/vm-configurator.vala b/src/vm-configurator.vala
index d39456f..6cb4756 100644
--- a/src/vm-configurator.vala
+++ b/src/vm-configurator.vala
@@ -15,11 +15,13 @@ private class Boxes.VMConfigurator {
     private const string INSTALLATION_STATE = "installation";
     private const string IMPORT_STATE = "importing";
     private const string LIBVIRT_SYS_IMPORT_STATE = "libvirt-system-importing";
+    private const string LIBVIRT_CLONING_STATE = "libvirt-cloning";
     private const string INSTALLED_STATE = "installed";
     private const string LIVE_XML = "<os-state>" + LIVE_STATE + "</os-state>";
     private const string INSTALLATION_XML = "<os-state>" + INSTALLATION_STATE + "</os-state>";
     private const string IMPORT_XML = "<os-state>" + IMPORT_STATE + "</os-state>";
     private const string LIBVIRT_SYS_IMPORT_XML = "<os-state>" + LIBVIRT_SYS_IMPORT_STATE + "</os-state>";
+    private const string LIBVIRT_CLONING_XML = "<os-state>" + LIBVIRT_CLONING_STATE + "</os-state>";
     private const string INSTALLED_XML = "<os-state>" + INSTALLED_STATE + "</os-state>";
 
     private const string OS_ID_XML = "<os-id>%s</os-id>";
@@ -138,6 +140,10 @@ private class Boxes.VMConfigurator {
         return get_os_state (domain) == LIBVIRT_SYS_IMPORT_STATE;
     }
 
+    public static bool is_libvirt_cloning_config (Domain domain) {
+        return get_os_state (domain) == LIBVIRT_CLONING_STATE;
+    }
+
     public static bool is_boxes_installed (Domain domain) {
         return get_os_state (domain) == INSTALLED_STATE;
     }
@@ -420,6 +426,8 @@ private class Boxes.VMConfigurator {
             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 InstalledMedia)
             custom_xml = IMPORT_XML;
         else


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