[virt-tools-list] [virt-manager] [PATCH 9/9] create: Show state/details of container bootstrap

Radostin Stoyanov rstoyanov1 at gmail.com
Thu Jun 22 14:54:06 UTC 2017


---
 virtManager/create.py | 39 ++++++++++++++++++++++++++++++++++++---
 1 file changed, 36 insertions(+), 3 deletions(-)

diff --git a/virtManager/create.py b/virtManager/create.py
index 7396aba..d540bae 100644
--- a/virtManager/create.py
+++ b/virtManager/create.py
@@ -18,10 +18,12 @@
 # MA 02110-1301 USA.
 #
 
+import fcntl
 import logging
 import threading
 import time
 import subprocess
+from os import O_NONBLOCK
 from os.path import exists, isdir
 try:
     import commands  # Python2 only
@@ -32,6 +34,7 @@ from gi.repository import GObject
 from gi.repository import Gtk
 from gi.repository import Gdk
 from gi.repository import Pango
+from gi.repository import Vte
 
 import virtinst
 from virtinst import util
@@ -2551,9 +2554,26 @@ class vmmCreate(vmmGObjectUI):
 
     def _create_directory_tree(self, asyncjob, src, dest, user, passwd):
         """
-        Call virt-bootstrap and wait until exitCode is returned
+        Call virt-bootstrap and show state/details
         """
 
+        def feed_Vte_terminal(terminal, data):
+            """Set the cursor of new line in Vte terminal at the beinging."""
+            terminal.feed(data.replace("\n", "\r\n"))
+
+        def non_block_read(block):
+            """Read stdout/stderr."""
+            fd = block.fileno()
+            fl = fcntl.fcntl(fd, fcntl.F_GETFL)
+            fcntl.fcntl(fd, fcntl.F_SETFL, fl | O_NONBLOCK)
+            try:
+                return block.read()
+            except:
+                return ''
+
+        meter = asyncjob.get_meter()
+        asyncjob.details_enable(Vte.Terminal(), feed_Vte_terminal)
+
         cmd = ["virt-bootstrap", src, dest]
         if user:
             cmd += ["--username", user]
@@ -2566,11 +2586,24 @@ class vmmCreate(vmmGObjectUI):
                                           stdout=subprocess.PIPE,
                                           stderr=subprocess.PIPE)
 
-        stdout, stderr = bootstrap_proc.communicate()
+        output = []
+        while bootstrap_proc.poll() is None:
+            stdout = non_block_read(bootstrap_proc.stdout)
+            stderr = non_block_read(bootstrap_proc.stderr)
+            if stdout:
+                asyncjob.details_update(stdout)
+            if stderr:
+                asyncjob.details_update(stderr)
+                output.append(stderr)
+                # Show the content of messages with type "Info"
+                if stderr.startswith('INFO:'):
+                    meter.start(
+                        text=_(" ".join(stderr.split('\n')[0].split(':')[2:])))
+
 
         if bootstrap_proc.returncode != 0:
             asyncjob.set_error("virt-bootstrap did not complete successfully",
-                               "{}\n{}".format(stdout, stderr))
+                               "\n".join(output))
 
     def _container_image_bootstrap(self, src, dest,
                                    src_auth_user=None,
-- 
2.9.4




More information about the virt-tools-list mailing list