[gnome-boxes] Be more robust when restarting installations



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]