[gnome-boxes/wip/image-import] tmp
- From: Zeeshan Ali Khattak <zeeshanak src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-boxes/wip/image-import] tmp
- Date: Mon, 3 Jun 2013 23:43:54 +0000 (UTC)
commit 4419b1c9da4159606d56f3863ea019b3c723b7c1
Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
Date: Wed Feb 13 16:32:33 2013 +0200
tmp
src/Makefile.am | 2 ++
src/installed-media.vala | 38 ++++++++++++++++++++++++++++++++++++++
src/installer-media.vala | 8 ++++++--
src/media-manager.vala | 8 +++++++-
src/util-app.vala | 7 +++++++
src/vm-configurator.vala | 28 +++++++++-------------------
src/vm-creator.vala | 11 ++++++-----
src/vm-importer.vala | 44 ++++++++++++++++++++++++++++++++++++++++++++
src/wizard-source.vala | 3 +++
src/wizard.vala | 4 ++--
10 files changed, 124 insertions(+), 29 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index 3c1b7c1..12c41db 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -87,6 +87,7 @@ gnome_boxes_SOURCES = \
editable-entry.vala \
i-properties-provider.vala \
installer-media.vala \
+ installed-media.vala \
iso-extractor.vala \
libvirt-broker.vala \
libvirt-machine.vala \
@@ -111,6 +112,7 @@ gnome_boxes_SOURCES = \
util-app.vala \
vm-configurator.vala \
vm-creator.vala \
+ vm-importer.vala \
vnc-display.vala \
wizard-source.vala \
wizard.vala \
diff --git a/src/installed-media.vala b/src/installed-media.vala
new file mode 100644
index 0000000..003cd97
--- /dev/null
+++ b/src/installed-media.vala
@@ -0,0 +1,38 @@
+// This file is part of GNOME Boxes. License: LGPLv2+
+
+using GVirConfig;
+
+private class Boxes.InstalledMedia : Boxes.InstallerMedia {
+ public override bool need_user_input_for_vm_creation { get { return false; } }
+ public override bool ready_to_create { get { return true; } }
+ public override bool live { get { return false; } }
+
+ public string format { get { return device_file.has_suffix (".qcow2")? "qcow2" : "raw"; } }
+
+ private string architecture = "x86_64"; // FIXME: Hardcode for now
+
+ public InstalledMedia (string path) throws GLib.Error {
+ if (!path.has_suffix (".qcow2") || !path.has_suffix (".img"))
+ throw new Boxes.Error.INVALID (_("Only QEMU QCOW Image (v2) and raw formats supported."));
+
+ device_file = path;
+ label = path;
+ from_image = true;
+ }
+
+ public override void setup_domain_config (Domain domain) {}
+
+ public override GLib.List<Pair<string,string>> get_vm_properties () {
+ var properties = new GLib.List<Pair<string,string>> ();
+
+ properties.append (new Pair<string,string> (_("System"), label));
+
+ return properties;
+ }
+
+ public override bool is_architecture_compatible (string architecture) {
+ var compatibility = compare_cpu_architectures (architecture, this.architecture);
+
+ return compatibility != CPUArchCompatibility.INCOMPATIBLE;
+ }
+}
diff --git a/src/installer-media.vala b/src/installer-media.vala
index 7b567ab..6d5db5b 100644
--- a/src/installer-media.vala
+++ b/src/installer-media.vala
@@ -32,7 +32,7 @@ private class Boxes.InstallerMedia : GLib.Object {
}
}
- public bool live { get { return os_media == null || os_media.live; } }
+ public virtual bool live { get { return os_media == null || os_media.live; } }
public InstallerMedia.from_iso_info (string path,
string label,
@@ -97,7 +97,7 @@ private class Boxes.InstallerMedia : GLib.Object {
return properties;
}
- public bool is_architecture_compatible (string architecture) {
+ public virtual bool is_architecture_compatible (string architecture) {
if (os_media == null) // Unknown media
return true;
@@ -106,6 +106,10 @@ private class Boxes.InstallerMedia : GLib.Object {
return compatibility != CPUArchCompatibility.INCOMPATIBLE;
}
+ public virtual VMCreator get_vm_creator () {
+ return new VMCreator (this);
+ }
+
protected void add_cd_config (Domain domain,
DomainDiskType type,
string iso_path,
diff --git a/src/media-manager.vala b/src/media-manager.vala
index 902f1b3..3943cfb 100644
--- a/src/media-manager.vala
+++ b/src/media-manager.vala
@@ -25,13 +25,19 @@ private class Boxes.MediaManager : Object {
public async InstallerMedia create_installer_media_for_path (string path,
Cancellable? cancellable = null) throws
GLib.Error {
- var media = yield new InstallerMedia.for_path (path, this, cancellable);
+ var media = is_mime_type (path, "application/x-cd-image") ?
+ yield new InstallerMedia.for_path (path, this, cancellable) :
+ new InstalledMedia (path);
return create_installer_media_from_media (media);
}
public async InstallerMedia? create_installer_media_from_config (GVirConfig.Domain config) {
var path = VMConfigurator.get_source_media_path (config);
+
+ if (VMConfigurator.is_import_config (config))
+ return new InstalledMedia (path);
+
var label = config.title;
Os? os = null;
diff --git a/src/util-app.vala b/src/util-app.vala
index 0370b0c..836c153 100644
--- a/src/util-app.vala
+++ b/src/util-app.vala
@@ -529,6 +529,13 @@ namespace Boxes {
return tokens[1];
}
+ public bool is_mime_type (string filename, string mime_type) {
+ var file_type = ContentType.guess (filename, null, null);
+ var supertype = ContentType.from_mime_type (mime_type);
+
+ return ContentType.is_a (file_type, supertype);
+ }
+
namespace UUID {
[CCode (cname = "uuid_generate", cheader_filename = "uuid/uuid.h")]
internal extern static void generate ([CCode (array_length = false)] uchar[] uuid);
diff --git a/src/vm-configurator.vala b/src/vm-configurator.vala
index 8e8cc67..ef7cc83 100644
--- a/src/vm-configurator.vala
+++ b/src/vm-configurator.vala
@@ -20,6 +20,7 @@ private class Boxes.VMConfigurator {
private const string OS_ID_XML = "<os-id>%s</os-id>";
private const string MEDIA_ID_XML = "<media-id>%s</media-id>";
+ private const string MEDIA_XML = "<media>%s</media>";
private const string NUM_REBOOTS_XML = "<num-reboots>%u</num-reboots>";
public static Domain create_domain_config (InstallerMedia install_media, string target_path,
Capabilities caps)
@@ -124,12 +125,12 @@ private class Boxes.VMConfigurator {
return get_os_state (domain) == LIVE_STATE;
}
- public static StorageVol create_volume_config (string name, int64 storage) throws GLib.Error {
+ public static StorageVol create_volume_config (string name, int64 storage, string format) throws
GLib.Error {
var volume = new StorageVol ();
volume.set_name (name);
volume.set_capacity (storage);
var target = new StorageVolTarget ();
- target.set_format ("qcow2");
+ target.set_format (format);
var permissions = get_default_permissions ();
target.set_permissions (permissions);
volume.set_target (target);
@@ -166,6 +167,10 @@ private class Boxes.VMConfigurator {
return get_custom_xml_node (domain, "media-id");
}
+ public static string? get_media (Domain domain) {
+ return get_custom_xml_node (domain, "media");
+ }
+
public static uint get_num_reboots (Domain domain) {
var str = get_custom_xml_node (domain, "num-reboots");
return (str != null)? int.parse (str) : 0;
@@ -287,23 +292,7 @@ private class Boxes.VMConfigurator {
}
public static string? get_source_media_path (Domain domain) {
- string path = null;
-
- var devices = domain.get_devices ();
- foreach (var device in devices) {
- if (!(device is DomainDisk))
- continue;
-
- var disk = device as DomainDisk;
- var disk_type = disk.get_guest_device_type ();
- if (disk_type == DomainDiskGuestDeviceType.CDROM) {
- path = disk.get_source ().dup ();
-
- break;
- }
- }
-
- return path;
+ return get_custom_xml_node (domain, "media");
}
private static string? get_custom_xml_node (Domain domain, string node_name) {
@@ -352,6 +341,7 @@ private class Boxes.VMConfigurator {
custom_xml += Markup.printf_escaped (OS_ID_XML, install_media.os.id);
if (install_media.os_media != null)
custom_xml += Markup.printf_escaped (MEDIA_ID_XML, install_media.os_media.id);
+ custom_xml += Markup.printf_escaped (MEDIA_XML, install_media.device_file);
}
if (num_reboots != 0)
diff --git a/src/vm-creator.vala b/src/vm-creator.vala
index 3bcdd02..10315e3 100644
--- a/src/vm-creator.vala
+++ b/src/vm-creator.vala
@@ -9,6 +9,7 @@ private class Boxes.VMCreator {
private const int INSTALL_COMPLETE_PERCENT = 99;
public InstallerMedia? install_media { get; private set; }
+ protected virtual string target_volume_format { get { return "qcow2"; } }
private Connection? connection { owned get { return App.app.default_connection; } }
private ulong state_changed_id;
@@ -60,7 +61,7 @@ private class Boxes.VMCreator {
return LibvirtBroker.get_default ().add_domain (App.app.default_source, App.app.default_connection,
domain);
}
- public void launch_vm (LibvirtMachine machine) throws GLib.Error {
+ public virtual async void launch_vm (LibvirtMachine machine) throws GLib.Error {
if (!(install_media is UnattendedInstaller) || !(install_media as
UnattendedInstaller).express_install) {
ulong signal_id = 0;
@@ -82,7 +83,7 @@ private class Boxes.VMCreator {
update_machine_info (machine);
}
- private async void continue_installation (LibvirtMachine machine) {
+ protected async void continue_installation (LibvirtMachine machine) {
install_media = yield MediaManager.get_instance ().create_installer_media_from_config
(machine.domain_config);
num_reboots = VMConfigurator.get_num_reboots (machine.domain_config);
var name = machine.domain.get_name ();
@@ -171,7 +172,7 @@ private class Boxes.VMCreator {
}
}
- private void update_machine_info (LibvirtMachine machine) {
+ protected virtual void update_machine_info (LibvirtMachine machine) {
if (VMConfigurator.is_install_config (machine.domain_config)) {
machine.info = _("Installing...");
@@ -180,7 +181,7 @@ private class Boxes.VMCreator {
machine.info = _("Live");
}
- private void set_post_install_config (LibvirtMachine machine) {
+ protected void set_post_install_config (LibvirtMachine machine) {
debug ("Setting post-installation configuration on '%s'", machine.name);
try {
var config = machine.domain.get_config (GVir.DomainXMLFlags.INACTIVE);
@@ -306,7 +307,7 @@ private class Boxes.VMCreator {
private async StorageVol create_target_volume (string name, int64 storage) throws GLib.Error {
var pool = yield get_storage_pool ();
- var config = VMConfigurator.create_volume_config (name, storage);
+ var config = VMConfigurator.create_volume_config (name, storage, target_volume_format);
var volume = pool.create_volume (config);
return volume;
diff --git a/src/vm-importer.vala b/src/vm-importer.vala
new file mode 100644
index 0000000..d25dbd1
--- /dev/null
+++ b/src/vm-importer.vala
@@ -0,0 +1,44 @@
+// This file is part of GNOME Boxes. License: LGPLv2+
+
+using Osinfo;
+using GVir;
+
+private class Boxes.VMImporter {
+ public InstalledMedia source_media { get { install_media as InstalledMedia; } }
+ protected override string target_volume_format { get { return source_media.format; } }
+
+ public VMImporter (InstalledMedia source_media) {
+ this.install_media = source_media;
+ }
+
+ public VMImporter.for_import_completion (LibvirtMachine machine) {
+ continue_installation.begin (machine);
+ }
+
+ public override void launch_vm (LibvirtMachine machine) throws GLib.Error {
+ machine.domain.start (0);
+
+ machine.vm_creator = this;
+ machine.config.access_last_time = get_real_time ();
+ update_machine_info (machine);
+
+
+ var source = File.new_for_path (source_media.device_file);
+ var destination_path = machine.storage_volume.get_path ();
+ var destination = File.new_for_path (destination_path);
+
+ yield copy_file (source, destination);
+
+ set_post_install_config (machine);
+ }
+
+ protected override async void continue_installation (LibvirtMachine machine) {
+ install_media = yield MediaManager.get_instance ().create_installer_media_from_config
(machine.domain_config);
+
+ launch_vm (machine);
+ }
+
+ protected override void update_machine_info (LibvirtMachine machine) {
+ machine.info = _("Importing...");
+ }
+}
diff --git a/src/wizard-source.vala b/src/wizard-source.vala
index 591223e..c1c5502 100644
--- a/src/wizard-source.vala
+++ b/src/wizard-source.vala
@@ -309,6 +309,9 @@ private class Boxes.WizardSource: GLib.Object {
dialog.local_only = true;
dialog.filter = new Gtk.FileFilter ();
dialog.filter.add_mime_type ("application/x-cd-image");
+ dialog.filter.add_pattern ("*.img");
+ dialog.filter.add_pattern ("*.disk");
+ dialog.filter.add_pattern ("*.qcow2");
var ret = false;
if (dialog.run () == Gtk.ResponseType.ACCEPT) {
uri = dialog.get_uri ();
diff --git a/src/wizard.vala b/src/wizard.vala
index 67f3669..f9b9ef1 100644
--- a/src/wizard.vala
+++ b/src/wizard.vala
@@ -203,7 +203,7 @@ private class Boxes.Wizard: Boxes.UI {
}
next_button.sensitive = false;
try {
- vm_creator.launch_vm (libvirt_machine);
+ yield vm_creator.launch_vm (libvirt_machine);
} catch (GLib.Error error) {
warning (error.message);
@@ -302,7 +302,7 @@ private class Boxes.Wizard: Boxes.UI {
yield install_media.prepare (progress, null);
- vm_creator = new VMCreator (install_media);
+ vm_creator = install_media.get_vm_creator ();
prep_progress.fraction = 1.0;
page = WizardPage.SETUP;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]