summaryrefslogtreecommitdiff
path: root/tests/topotests/munet/cli.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/topotests/munet/cli.py')
-rw-r--r--tests/topotests/munet/cli.py56
1 files changed, 52 insertions, 4 deletions
diff --git a/tests/topotests/munet/cli.py b/tests/topotests/munet/cli.py
index 01a7091512..d273a30ead 100644
--- a/tests/topotests/munet/cli.py
+++ b/tests/topotests/munet/cli.py
@@ -745,7 +745,7 @@ async def cli_client_connected(unet, background, reader, writer):
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,6 +756,13 @@ async def remote_cli(unet, prompt, title, background):
unet.cli_sockpath = sockpath
logging.info("server created on :\n%s\n", sockpath)
+ 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"])
us = os.path.realpath(__file__)
@@ -765,7 +772,32 @@ async def remote_cli(unet, prompt, title, background):
if prompt:
cmd += f" --prompt='{prompt}'"
cmd += " " + unet.cli_sockpath
- unet.run_in_window(cmd, title=title, background=False)
+
+ channel = None
+ if wait_tmux:
+ from .base import Commander # pylint: disable=import-outside-toplevel
+
+ channel = "{}-{}".format(os.getpid(), Commander.tmux_wait_gen)
+ logger.info("XXX channel is %s", channel)
+ # If we don't have a tty to pause on pause for tmux windows to exit
+ if channel is not None:
+ Commander.tmux_wait_gen += 1
+
+ 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)
@@ -906,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,
+ )
)
@@ -919,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)