[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