[gnome-boxes] libvirt-machine: Implement cloning
- From: Zeeshan Ali Khattak <zeeshanak src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-boxes] libvirt-machine: Implement cloning
- Date: Wed, 4 May 2016 15:14:30 +0000 (UTC)
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]