[virt-tools-list] [virt-manager] [PATCH 9/9] create: Show state/details of container bootstrap
Cole Robinson
crobinso at redhat.com
Fri Jun 23 18:40:00 UTC 2017
On 06/22/2017 10:54 AM, Radostin Stoyanov wrote:
> ---
> 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
Similarly just use os.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."""
*beginning
Generally looks okay though
- Cole
> + 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,
>
More information about the virt-tools-list
mailing list