[virt-tools-list] [virt-manager] [PATCH v4 1/4] create: Call virt-bootstrap asynchronously

Radostin Stoyanov rstoyanov1 at gmail.com
Thu Jul 13 07:49:28 UTC 2017


The bootstrap method is called at the end of the "create dialog" (when
"Finish" button is clicked).

We handle two cases:

1. When virt-bootstrap fails. User re-clicks the 'Finish' button and we
reattempt the container bootstrap.

2. When virt-bootstrap succeeds, but something later in the install
fails, like XML define. If user re-clicks 'Finish' we don't attempt
virt-bootstrap again, just use the directory path.
This is achieved by unchecking the 'install-oscontainer-bootstrap'
checkbox is unchecked if virt-bootstrap succeeds.

Log messages from the virtBootstrap's logger are stored in string
buffer and shown in case of failure.
---
 virtManager/create.py | 57 +++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 55 insertions(+), 2 deletions(-)

diff --git a/virtManager/create.py b/virtManager/create.py
index 662c200..a3d8ac4 100644
--- a/virtManager/create.py
+++ b/virtManager/create.py
@@ -21,6 +21,7 @@
 import logging
 import pkgutil
 import os
+import cStringIO
 import threading
 import time
 
@@ -2476,8 +2477,22 @@ class vmmCreate(vmmGObjectUI):
         """
         Launch the async job to start the install
         """
+        bootstrap_args = dict()
+        # If creating new container and "container bootstrap" is enabled
+        if (self._guest.os.is_container()
+                and self._get_config_oscontainer_bootstrap()):
+            bootstrap_arg_keys = {
+                'src': self._get_config_oscontainer_source_url,
+                'dest': self.widget("install-oscontainer-fs").get_text,
+                'user': self._get_config_oscontainer_source_username,
+                'passwd': self._get_config_oscontainer_source_password,
+                'insecure': self._get_config_oscontainer_isecure
+            }
+            for key, getter in bootstrap_arg_keys.iteritems():
+                bootstrap_args[key] = getter()
+
         parentobj = self._customize_window or self
-        progWin = vmmAsyncJob(self._do_async_install, [guest],
+        progWin = vmmAsyncJob(self._do_async_install, [guest, bootstrap_args],
                               self._install_finished_cb, [parentobj],
                               _("Creating Virtual Machine"),
                               _("The virtual machine is now being "
@@ -2488,12 +2503,16 @@ class vmmCreate(vmmGObjectUI):
                               parentobj.topwin)
         progWin.run()
 
-    def _do_async_install(self, asyncjob, guest):
+    def _do_async_install(self, asyncjob, guest, bootstrap_args):
         """
         Kick off the actual install
         """
         meter = asyncjob.get_meter()
 
+        if bootstrap_args:
+            # Start container bootstrap
+            self._create_directory_tree(asyncjob, bootstrap_args)
+
         # Build a list of pools we should refresh, if we are creating storage
         refresh_pools = []
         for disk in guest.get_devices("disk"):
@@ -2578,3 +2597,37 @@ class vmmCreate(vmmGObjectUI):
             self.err.show_err(_("Error continue install: %s") % str(e))
 
         return True
+
+
+    def _create_directory_tree(self, asyncjob, bootstrap_args):
+        """
+        Call bootstrap method from virtBootstrap.
+        """
+        import virtBootstrap
+
+        # Use string buffer to store log messages
+        log_stream = cStringIO.StringIO()
+
+        # Get virt-bootstrap logger
+        vbLogger = logging.getLogger('virtBootstrap')
+        vbLogger.setLevel(logging.DEBUG)
+        vbLogger.addHandler(logging.StreamHandler(log_stream))
+
+        # Key word arguments to be passed
+        kwargs = {'uri': bootstrap_args['src'],
+                  'dest': bootstrap_args['dest'],
+                  'not_secure': bootstrap_args['insecure']}
+        if bootstrap_args['user'] and bootstrap_args['passwd']:
+            kwargs['username'] = bootstrap_args['user']
+            kwargs['password'] = bootstrap_args['passwd']
+
+        logging.debug('Start container bootstrap')
+        try:
+            virtBootstrap.bootstrap(**kwargs)
+            # Success - uncheck the 'install-oscontainer-bootstrap' checkbox
+
+            def cb():
+                self.widget("install-oscontainer-bootstrap").set_active(False)
+            self.idle_add(cb)
+        except Exception as err:
+            asyncjob.set_error(err, log_stream.getvalue())
-- 
2.9.4




More information about the virt-tools-list mailing list