From 68f25a1b74a8b8291dde3b1a0eb091100bb83e30 Mon Sep 17 00:00:00 2001 From: Christian Hopps Date: Fri, 13 Sep 2024 23:32:47 -0400 Subject: [PATCH] tests: update munet 0.14.14, 0.14.15 - improvement to remote CLI - 0.14.15 fixed a small bug in 0.14.14 Signed-off-by: Christian Hopps --- tests/topotests/munet/cli.py | 38 +++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/tests/topotests/munet/cli.py b/tests/topotests/munet/cli.py index cd642d423a65..d273a30ead48 100644 --- a/tests/topotests/munet/cli.py +++ b/tests/topotests/munet/cli.py @@ -745,7 +745,7 @@ def flush(self): await writer.drain() -async def remote_cli(unet, prompt, title, background): +async def remote_cli(unet, prompt, title, background, remote_wait=False): """Open a CLI in a new window.""" try: if not unet.cli_sockpath: @@ -756,7 +756,12 @@ async def remote_cli(unet, prompt, title, background): unet.cli_sockpath = sockpath logging.info("server created on :\n%s\n", sockpath) - wait_tmux = bool(os.getenv("TMUX", "")) and not sys.stdin.isatty() + if remote_wait: + wait_tmux = bool(os.getenv("TMUX", "")) + wait_x11 = not wait_tmux and bool(os.getenv("DISPLAY", "")) + else: + wait_tmux = False + wait_x11 = False # Open a new window with a new CLI python_path = await unet.async_get_exec_path(["python3", "python"]) @@ -778,14 +783,21 @@ async def remote_cli(unet, prompt, title, background): if channel is not None: Commander.tmux_wait_gen += 1 - unet.run_in_window(cmd, title=title, background=False, wait_for=channel) + pane_info = unet.run_in_window( + cmd, title=title, background=False, wait_for=channel + ) if wait_tmux and channel: from .base import commander # pylint: disable=import-outside-toplevel + logger.debug("Waiting on TMUX CLI window") await commander.async_cmd_raises( [commander.get_exec_path("tmux"), "wait", channel] ) + elif wait_x11 and isinstance(pane_info, subprocess.Popen): + logger.debug("Waiting on xterm CLI process %s", pane_info) + if hasattr(asyncio, "to_thread"): + await asyncio.to_thread(pane_info.wait) # pylint: disable=no-member except Exception as error: logging.error("cli server: unexpected exception: %s", error) @@ -926,8 +938,22 @@ def cli( prompt=None, background=True, ): + # In the case of no tty a remote_cli will be used, and we want it to wait on finish + # of the spawned cli.py script, otherwise it returns back here and exits async loop + # which kills the server side CLI socket operation. + remote_wait = not sys.stdin.isatty() + asyncio.run( - async_cli(unet, histfile, sockpath, force_window, title, prompt, background) + async_cli( + unet, + histfile, + sockpath, + force_window, + title, + prompt, + background, + remote_wait=remote_wait, + ) ) @@ -939,12 +965,14 @@ async def async_cli( title=None, prompt=None, background=True, + remote_wait=False, ): if prompt is None: prompt = "munet> " if force_window or not sys.stdin.isatty(): - await remote_cli(unet, prompt, title, background) + await remote_cli(unet, prompt, title, background, remote_wait) + return if not unet: logger.debug("client-cli using sockpath %s", sockpath)