[gnome-boxes] Be more robust when restarting installations
- From: Christophe Fergeau <teuf src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-boxes] Be more robust when restarting installations
- Date: Mon, 18 Feb 2013 19:44:43 +0000 (UTC)
commit 4bc7402d7775cec4e6d78cbc0b207adc7cd1846b
Author: Christophe Fergeau <cfergeau redhat com>
Date: Mon Feb 4 11:23:53 2013 +0100
Be more robust when restarting installations
When Boxes is restarted, it will automatically restart domains that
were doing an unattended installation. While doing that, the
code assumes the ISO image used to start the installation will still
be present in the domain XML configuration. However, this is not
necessarily true as it's possible that the installation was completed
outside of Boxes (using virt-viewer for example), and that the
user then ejected the ISO image using virsh or virt-manager.
In such a situation, Boxes will crash at startup, which should
never happen.
This commit adds null checks here and there and fixes the issue, but
hopefully a more elegant solution can be found...
https://bugzilla.gnome.org/show_bug.cgi?id=693134
src/media-manager.vala | 6 +++++-
src/vm-configurator.vala | 19 +++++++++++--------
src/vm-creator.vala | 7 +++++++
3 files changed, 23 insertions(+), 9 deletions(-)
---
diff --git a/src/media-manager.vala b/src/media-manager.vala
index 05b44b9..1e0c5b6 100644
--- a/src/media-manager.vala
+++ b/src/media-manager.vala
@@ -33,13 +33,16 @@ private class Boxes.MediaManager : Object {
return yield create_installer_media_from_media (media, on_installer_recognized);
}
- public async InstallerMedia create_installer_media_from_config (GVirConfig.Domain config) {
+ public async InstallerMedia? create_installer_media_from_config (GVirConfig.Domain config) {
var path = VMConfigurator.get_source_media_path (config);
var label = config.title;
Os? os = null;
Media? os_media = null;
+ if (path == null)
+ return null;
+
try {
var os_id = VMConfigurator.get_os_id (config);
if (os_id != null) {
@@ -57,6 +60,7 @@ private class Boxes.MediaManager : Object {
var resources = os_db.get_resources_for_os (os, architecture);
var media = new InstallerMedia.from_iso_info (path, label, os, os_media, resources);
+ return_val_if_fail (media != null, null);
try {
media = yield create_installer_media_from_media (media);
diff --git a/src/vm-configurator.vala b/src/vm-configurator.vala
index ca4d963..3764eaa 100644
--- a/src/vm-configurator.vala
+++ b/src/vm-configurator.vala
@@ -105,11 +105,12 @@ private class Boxes.VMConfigurator {
return domain;
}
- public static void post_install_setup (Domain domain, InstallerMedia install_media) {
+ public static void post_install_setup (Domain domain, InstallerMedia? install_media) {
set_post_install_os_config (domain);
domain.set_lifecycle (DomainLifecycleEvent.ON_REBOOT, DomainLifecycleAction.RESTART);
- install_media.setup_post_install_domain_config (domain);
+ if (install_media != null)
+ install_media.setup_post_install_domain_config (domain);
mark_as_installed (domain, install_media);
}
@@ -173,7 +174,7 @@ private class Boxes.VMConfigurator {
update_custom_xml (domain, install_media, num_reboots);
}
- private static void mark_as_installed (Domain domain, InstallerMedia install_media) {
+ private static void mark_as_installed (Domain domain, InstallerMedia? install_media) {
update_custom_xml (domain, install_media, 0, true);
}
@@ -335,7 +336,7 @@ private class Boxes.VMConfigurator {
}
private static void update_custom_xml (Domain domain,
- InstallerMedia install_media,
+ InstallerMedia? install_media,
uint num_reboots = 0,
bool installed = false) {
string custom_xml;
@@ -345,10 +346,12 @@ private class Boxes.VMConfigurator {
else
custom_xml = (install_media.live) ? LIVE_XML : INSTALLATION_XML;
- if (install_media.os != null)
- 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);
+ if (install_media != null) {
+ if (install_media.os != null)
+ 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);
+ }
if (num_reboots != 0)
custom_xml += NUM_REBOOTS_XML.printf (num_reboots);
diff --git a/src/vm-creator.vala b/src/vm-creator.vala
index 5de483f..287af92 100644
--- a/src/vm-creator.vala
+++ b/src/vm-creator.vala
@@ -80,6 +80,13 @@ private class Boxes.VMCreator {
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 ();
+
+ if (install_media == null) {
+ debug ("Could not find needed install media to continue installation, give up on automatic
installation");
+ set_post_install_config (machine);
+ return;
+ }
+
install_media.prepare_to_continue_installation (name);
state_changed_id = machine.notify["state"].connect (on_machine_state_changed);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]