From patchwork Thu Jun 20 17:36:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jeremy Spewock X-Patchwork-Id: 141446 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id C8A76454AC; Thu, 20 Jun 2024 19:37:15 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4D76D42E4D; Thu, 20 Jun 2024 19:37:11 +0200 (CEST) Received: from mail-pg1-f227.google.com (mail-pg1-f227.google.com [209.85.215.227]) by mails.dpdk.org (Postfix) with ESMTP id 060A8402E2 for ; Thu, 20 Jun 2024 19:37:09 +0200 (CEST) Received: by mail-pg1-f227.google.com with SMTP id 41be03b00d2f7-6c53a315c6eso842350a12.3 for ; Thu, 20 Jun 2024 10:37:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iol.unh.edu; s=unh-iol; t=1718905028; x=1719509828; darn=dpdk.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=RnWp1lKva3YnU513AxSLHWON2A+WA+PqBmnwc5K/YeU=; b=cAGIeowiEcBFb1FZg+OOUMLHJcJ7mYf/Po0Fb1/mDbNgDIg2Iu917OhIs9HU8+wzYw mQCB8OvX6eA19FiCkIJHDDXtGnTLlmCNXEEKPZPqvkOU5SJG6XVttw7dbn7TESxzmA0w CMZDFrNA89kiIs4S8jh6Mk4kaQZzkFoJs9Liw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718905028; x=1719509828; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RnWp1lKva3YnU513AxSLHWON2A+WA+PqBmnwc5K/YeU=; b=tDutXj0wjoVrtwWNR8ds1v6s0z9xNf9/PS6mLP+ymvVymZrqZSxZpqEEB2hjFTpMLe odPXzKbxh5MVsOKWpNuIJk76xHfcT8HaAVrGgYRC1fE2cVSaNHr1ukXXKLM90Xr85Wdu 6oUl6KaEM6ZtcCzDtMwfCPw4PEWPFHbEJzMnQ4vFgUa7kDUPgtn4CrA9Or5qNIRxykcY QubuAjTxHOXJlGrdbszaQcpkEZGJZRgO9N0Yxr3WNOeaNpPZFKijG33fxui0Szi5OhU/ eB+YY6HmUitiHPNqRP5cbQnj64yczssvRDbNfcZb2IrJadu6ywAc5q/53ARxvSlWnbB6 85Sg== X-Gm-Message-State: AOJu0YznAqFvJp0sAwzhrSRLF9CVlNkZ/RTuVjk0XCwMmmylmVvIvlAu w0AirizuI3TrtzSBuRMxPI+W3DhsAuLkXgiBPQZXvxg3DipbYaRRFkBdznlXxPQntUiEzdoOdg1 nqTW0NYyuX4qkTiGe6yuFUtWGLEl29TPD X-Google-Smtp-Source: AGHT+IGcz92Dzq7MA7aByy9rS/ddFnh1ATdX2+xnXF/NJVzTp8YiOIacVHeV0Sd7bEvoFaVQNikXKyvk2RP6 X-Received: by 2002:a17:90b:3d8:b0:2c7:ab00:f605 with SMTP id 98e67ed59e1d1-2c7b5cc6b21mr6336208a91.20.1718905028073; Thu, 20 Jun 2024 10:37:08 -0700 (PDT) Received: from postal.iol.unh.edu (postal.iol.unh.edu. [132.177.123.84]) by smtp-relay.gmail.com with ESMTPS id 98e67ed59e1d1-2c7e649f8e3sm146934a91.15.2024.06.20.10.37.07 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 20 Jun 2024 10:37:08 -0700 (PDT) X-Relaying-Domain: iol.unh.edu Received: from iol.unh.edu (unknown [IPv6:2606:4100:3880:1257::1083]) by postal.iol.unh.edu (Postfix) with ESMTP id DABFC605C373; Thu, 20 Jun 2024 13:37:06 -0400 (EDT) From: jspewock@iol.unh.edu To: yoan.picchi@foss.arm.com, juraj.linkes@pantheon.tech, thomas@monjalon.net, Luca.Vizzarro@arm.com, wathsala.vithanage@arm.com, Honnappa.Nagarahalli@arm.com, paul.szczepanek@arm.com, npratte@iol.unh.edu, probb@iol.unh.edu Cc: dev@dpdk.org, Jeremy Spewock Subject: [PATCH v4 1/3] dts: Improve output gathering in interactive shells Date: Thu, 20 Jun 2024 13:36:07 -0400 Message-ID: <20240620173609.15375-2-jspewock@iol.unh.edu> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240620173609.15375-1-jspewock@iol.unh.edu> References: <20240501161623.26672-1-jspewock@iol.unh.edu> <20240620173609.15375-1-jspewock@iol.unh.edu> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Jeremy Spewock The current implementation of consuming output from interactive shells relies on being able to find an expected prompt somewhere within the output buffer after sending the command. This is useful in situations where the prompt does not appear in the output itself, but in some practical cases (such as the starting of an XML-RPC server for scapy) the prompt exists in one of the commands sent to the shell and this can cause the command to exit early and creates a race condition between the server starting and the first command being sent to the server. This patch addresses this problem by searching for a line that strictly ends with the provided prompt, rather than one that simply contains it, so that the detection that a command is finished is more consistent. It also adds a catch to detect when a command times out before finding the prompt or the underlying SSH session dies so that the exception can be wrapped into a more explicit one and be more consistent with the non-interactive shells. Bugzilla ID: 1359 Fixes: 88489c0501af ("dts: add smoke tests") Signed-off-by: Jeremy Spewock Reviewed-by: Juraj Linkeš --- dts/framework/exception.py | 66 ++++++++++++------- .../remote_session/interactive_shell.py | 49 ++++++++++---- 2 files changed, 80 insertions(+), 35 deletions(-) diff --git a/dts/framework/exception.py b/dts/framework/exception.py index 74fd2af3b6..f45f789825 100644 --- a/dts/framework/exception.py +++ b/dts/framework/exception.py @@ -51,26 +51,6 @@ class DTSError(Exception): severity: ClassVar[ErrorSeverity] = ErrorSeverity.GENERIC_ERR -class SSHTimeoutError(DTSError): - """The SSH execution of a command timed out.""" - - #: - severity: ClassVar[ErrorSeverity] = ErrorSeverity.SSH_ERR - _command: str - - def __init__(self, command: str): - """Define the meaning of the first argument. - - Args: - command: The executed command. - """ - self._command = command - - def __str__(self) -> str: - """Add some context to the string representation.""" - return f"{self._command} execution timed out." - - class SSHConnectionError(DTSError): """An unsuccessful SSH connection.""" @@ -98,8 +78,42 @@ def __str__(self) -> str: return message -class SSHSessionDeadError(DTSError): - """The SSH session is no longer alive.""" +class _SSHTimeoutError(DTSError): + """The execution of a command via SSH timed out. + + This class is private and meant to be raised as its interactive and non-interactive variants. + """ + + #: + severity: ClassVar[ErrorSeverity] = ErrorSeverity.SSH_ERR + _command: str + + def __init__(self, command: str): + """Define the meaning of the first argument. + + Args: + command: The executed command. + """ + self._command = command + + def __str__(self) -> str: + """Add some context to the string representation.""" + return f"{self._command} execution timed out." + + +class SSHTimeoutError(_SSHTimeoutError): + """The execution of a command on a non-interactive SSH session timed out.""" + + +class InteractiveSSHTimeoutError(_SSHTimeoutError): + """The execution of a command on an interactive SSH session timed out.""" + + +class _SSHSessionDeadError(DTSError): + """The SSH session is no longer alive. + + This class is private and meant to be raised as its interactive and non-interactive variants. + """ #: severity: ClassVar[ErrorSeverity] = ErrorSeverity.SSH_ERR @@ -118,6 +132,14 @@ def __str__(self) -> str: return f"SSH session with {self._host} has died." +class SSHSessionDeadError(_SSHSessionDeadError): + """Non-interactive SSH session has died.""" + + +class InteractiveSSHSessionDeadError(_SSHSessionDeadError): + """Interactive SSH session as died.""" + + class ConfigurationError(DTSError): """An invalid configuration.""" diff --git a/dts/framework/remote_session/interactive_shell.py b/dts/framework/remote_session/interactive_shell.py index 254aa29f89..6aa5281d6a 100644 --- a/dts/framework/remote_session/interactive_shell.py +++ b/dts/framework/remote_session/interactive_shell.py @@ -21,6 +21,10 @@ from paramiko import Channel, channel # type: ignore[import-untyped] +from framework.exception import ( + InteractiveSSHSessionDeadError, + InteractiveSSHTimeoutError, +) from framework.logger import DTSLogger from framework.params import Params from framework.settings import SETTINGS @@ -53,7 +57,10 @@ class InteractiveShell(ABC): #: Extra characters to add to the end of every command #: before sending them. This is often overridden by subclasses and is - #: most commonly an additional newline character. + #: most commonly an additional newline character. This additional newline + #: character is used to force the line that is currently awaiting input + #: into the stdout buffer so that it can be consumed and checked against + #: the expected prompt. _command_extra_chars: ClassVar[str] = "" #: Path to the executable to start the interactive application. @@ -134,23 +141,39 @@ def send_command( Returns: All output in the buffer before expected string. + + Raises: + InteractiveSSHSessionDeadError: The session died while executing the command. + InteractiveSSHTimeoutError: If command was sent but prompt could not be found in + the output before the timeout. """ self._logger.info(f"Sending: '{command}'") if prompt is None: prompt = self._default_prompt - self._stdin.write(f"{command}{self._command_extra_chars}\n") - self._stdin.flush() out: str = "" - for line in self._stdout: - if skip_first_line: - skip_first_line = False - continue - if prompt in line and not line.rstrip().endswith( - command.rstrip() - ): # ignore line that sent command - break - out += line - self._logger.debug(f"Got output: {out}") + try: + self._stdin.write(f"{command}{self._command_extra_chars}\n") + self._stdin.flush() + for line in self._stdout: + if skip_first_line: + skip_first_line = False + continue + if line.rstrip().endswith(prompt): + break + out += line + except TimeoutError as e: + self._logger.exception(e) + self._logger.debug( + f"Prompt ({prompt}) was not found in output from command before timeout." + ) + raise InteractiveSSHTimeoutError(command) from e + except OSError as e: + self._logger.exception(e) + raise InteractiveSSHSessionDeadError( + self._node.main_session.interactive_session.hostname + ) from e + finally: + self._logger.debug(f"Got output: {out}") return out def close(self) -> None: From patchwork Thu Jun 20 17:36:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jeremy Spewock X-Patchwork-Id: 141447 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 91E4A454AC; Thu, 20 Jun 2024 19:37:23 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 8065942E6D; Thu, 20 Jun 2024 19:37:23 +0200 (CEST) Received: from mail-pg1-f228.google.com (mail-pg1-f228.google.com [209.85.215.228]) by mails.dpdk.org (Postfix) with ESMTP id 406D142E4B for ; Thu, 20 Jun 2024 19:37:10 +0200 (CEST) Received: by mail-pg1-f228.google.com with SMTP id 41be03b00d2f7-6e5fd488d9fso822656a12.3 for ; Thu, 20 Jun 2024 10:37:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iol.unh.edu; s=unh-iol; t=1718905029; x=1719509829; darn=dpdk.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=8ZEh229GgjQ6ERkXgNJI96+OBD4IfkZtQ5+dA8bljvw=; b=RmBAnCg0SsX+TO8QvALG8xsL6OzQEbegA9O1Ny2wTXEUf+G9eROK6ZOQos0VIAjtn+ wHPJnsHIDYHwqm5OiAmf5HYTA+YkriCBEzSSZaa+/o1NSo3OriFJFykeNUjf3Vu4wbcu cFCR9OgRVkSZ0zeR2b6M5ieGOoxgZRGwpGl8E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718905029; x=1719509829; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8ZEh229GgjQ6ERkXgNJI96+OBD4IfkZtQ5+dA8bljvw=; b=IhKZKFdiSj9Mt+2n1KjpcTonHKayrYQBOq8hi2hYE0Bv7WC1VDz6Yf+urN3xqzgjK1 hOIHC9YlkahTEmZ6a2ytHU+4EHaG66Y6WFrAUbLFchQ8Kb+csfKyXigz5iHEX/vSW9L9 B88DjUyxypwe6Rn3aH1+c4xqKO3uZbBuJYYIuzbgl5cf+8HpniV+gzjzf10ehGaNpyhY Ek0EHWUtdIbZy8/a5qEbSfG4lTEX4eIQNdwT7DpgBkwWMCqtxjKc64wyEnnMs5f/lu+W cubwAn+1qHA4YhkIZqQ8VcMmMKVBm6OprImZVVHbeADOtMtwwal8jD1teGJz3g4QScYm csVw== X-Gm-Message-State: AOJu0Yy5DRz26FOEw5L8NVpkpHBQut/1fx497X36EFSH/BCh6r+7uzA1 cKP5aj4dJcJ+uFljI2/zqb2nzLxHTUUiLr3Fjfcz5KO+5ZY8rXqBJUK6W9l02GL0YiQ3foUF8eE gMlRGH1nY+OGjI1rwNqnyW4BybTBvM5U6 X-Google-Smtp-Source: AGHT+IFZaDkyN4NKShVrb++tvIIj6aZ889mDFGZIdQN71GElKpf5+BRcGDNVvgdCGlM+JJMQb4vnkTYNKYQT X-Received: by 2002:a05:6a20:751a:b0:1b5:b214:efb8 with SMTP id adf61e73a8af0-1bcbb59287dmr6125705637.34.1718905029354; Thu, 20 Jun 2024 10:37:09 -0700 (PDT) Received: from postal.iol.unh.edu (postal.iol.unh.edu. [132.177.123.84]) by smtp-relay.gmail.com with ESMTPS id 41be03b00d2f7-6fee39a7aa5sm632731a12.30.2024.06.20.10.37.09 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 20 Jun 2024 10:37:09 -0700 (PDT) X-Relaying-Domain: iol.unh.edu Received: from iol.unh.edu (unknown [IPv6:2606:4100:3880:1257::1083]) by postal.iol.unh.edu (Postfix) with ESMTP id 1410B605C376; Thu, 20 Jun 2024 13:37:08 -0400 (EDT) From: jspewock@iol.unh.edu To: yoan.picchi@foss.arm.com, juraj.linkes@pantheon.tech, thomas@monjalon.net, Luca.Vizzarro@arm.com, wathsala.vithanage@arm.com, Honnappa.Nagarahalli@arm.com, paul.szczepanek@arm.com, npratte@iol.unh.edu, probb@iol.unh.edu Cc: dev@dpdk.org, Jeremy Spewock Subject: [PATCH v4 2/3] dts: Add missing docstring from XML-RPC server Date: Thu, 20 Jun 2024 13:36:08 -0400 Message-ID: <20240620173609.15375-3-jspewock@iol.unh.edu> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240620173609.15375-1-jspewock@iol.unh.edu> References: <20240501161623.26672-1-jspewock@iol.unh.edu> <20240620173609.15375-1-jspewock@iol.unh.edu> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Jeremy Spewock When this XML-RPC server implementation was added, the docstring had to be shortened in order to reduce the chances of this race condition being encountered. Now that this race condition issue is resolved, the full docstring can be restored. Signed-off-by: Jeremy Spewock Reviewed-by: Juraj Linkeš --- .../testbed_model/traffic_generator/scapy.py | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/dts/framework/testbed_model/traffic_generator/scapy.py b/dts/framework/testbed_model/traffic_generator/scapy.py index bf58ad1c5e..c3648134fc 100644 --- a/dts/framework/testbed_model/traffic_generator/scapy.py +++ b/dts/framework/testbed_model/traffic_generator/scapy.py @@ -128,9 +128,53 @@ def scapy_send_packets(xmlrpc_packets: list[xmlrpc.client.Binary], send_iface: s class QuittableXMLRPCServer(SimpleXMLRPCServer): - """Basic XML-RPC server. + r"""Basic XML-RPC server. The server may be augmented by functions serializable by the :mod:`marshal` module. + + Example: + :: + + def hello_world(): + # to be sent to the XML-RPC server + print("Hello World!") + + # start the XML-RPC server on the remote node + # this is done by starting a Python shell on the remote node + from framework.remote_session import PythonShell + # the example assumes you're already connected to a tg_node + session = tg_node.create_interactive_shell(PythonShell, timeout=5, privileged=True) + + # then importing the modules needed to run the server + # and the modules for any functions later added to the server + session.send_command("import xmlrpc") + session.send_command("from xmlrpc.server import SimpleXMLRPCServer") + + # sending the source code of this class to the Python shell + from xmlrpc.server import SimpleXMLRPCServer + src = inspect.getsource(QuittableXMLRPCServer) + src = "\n".join([l for l in src.splitlines() if not l.isspace() and l != ""]) + spacing = "\n" * 4 + session.send_command(spacing + src + spacing) + + # then starting the server with: + command = "s = QuittableXMLRPCServer(('0.0.0.0', {listen_port}));s.serve_forever()" + session.send_command(command, "XMLRPC OK") + + # now the server is running on the remote node and we can add functions to it + # first connect to the server from the execution node + import xmlrpc.client + server_url = f"http://{tg_node.config.hostname}:8000" + rpc_server_proxy = xmlrpc.client.ServerProxy(server_url) + + # get the function bytes to send + import marshal + function_bytes = marshal.dumps(hello_world.__code__) + rpc_server_proxy.add_rpc_function(hello_world.__name__, function_bytes) + + # now we can execute the function on the server + xmlrpc_binary_recv: xmlrpc.client.Binary = rpc_server_proxy.hello_world() + print(str(xmlrpc_binary_recv)) """ def __init__(self, *args, **kwargs): From patchwork Thu Jun 20 17:36:09 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jeremy Spewock X-Patchwork-Id: 141448 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9182A454AC; Thu, 20 Jun 2024 19:37:31 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A78D742E7C; Thu, 20 Jun 2024 19:37:24 +0200 (CEST) Received: from mail-il1-f228.google.com (mail-il1-f228.google.com [209.85.166.228]) by mails.dpdk.org (Postfix) with ESMTP id 9B670427A9 for ; Thu, 20 Jun 2024 19:37:13 +0200 (CEST) Received: by mail-il1-f228.google.com with SMTP id e9e14a558f8ab-376012bcc33so3863225ab.2 for ; Thu, 20 Jun 2024 10:37:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iol.unh.edu; s=unh-iol; t=1718905033; x=1719509833; darn=dpdk.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2kZE70eiZYrOhJLvU0G/HWcobLr4RrPfyBBoRhVSZ0A=; b=fLuHANWkdtk98LV/m0LAdw16NDPrctANmzunM25t7E00StsVIaRwmPI3B2Rxf/nBNe Vpho5iWOSWl2g/zH6mB8LRKOSxGjPszIKpeqAdCt5t1Wj9VPg89Iu8zaZ+UE3tCRKeoO XnGuvuAXxhAIJBWXaLZNV+IiQ7r08z8QMxMfQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718905033; x=1719509833; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2kZE70eiZYrOhJLvU0G/HWcobLr4RrPfyBBoRhVSZ0A=; b=Mhp46pYMLurBXwTfMvB27a3jSrcEEgmav2nscN9XA7tfeJpaFvl738ABy8pFUhk1Yq tQaTFV6nv3GDo40NEW9D1Db1QbARn6sEEygeevgPAjanZsEaN1k8om+6i8hSbpT6AuQO z/trJM8BtcSomy4XLJQAkQ7MEzxZXDxURCcd6W25ThdUDAMIAUDltnYlV7aoRUDxKavW 3zeArIRyczNXQJvDGmaRu9r/JISDl4qxVSrkXu5/traCvK1LNhyxTg6VKvdD8ZdaQGW7 HYbtjkIB8+LUXXu4uq8hodEcUy1kH+3oNMMYKOw3IrdKf9Ob4KhfeOq4+iTO6W5ONKPa eSog== X-Gm-Message-State: AOJu0Yy/2q4vkGUHoCNX8xERhEd0tqczTnQt0ZcZf8LEeC9nOjZkreZR 8imoR5LOoItJUhrxAbV/VCOJ5dPwBfuwwCjMRzFrlPpR4yYTv4VqfLL1wEF+8fBxErqbbfqA5ag MheHDDxfyxYRJE0GJyhZEamuVMJgdWClt X-Google-Smtp-Source: AGHT+IHr2++dARfDudNSPJ2ugLs0HMz9fV00b6Q7ex6CEClXYeFGezy12T8TrPvNkk9dkzAmGKugX/Tt0ofM X-Received: by 2002:a05:6e02:1ca2:b0:376:1fae:463a with SMTP id e9e14a558f8ab-3761fae4930mr54370915ab.32.1718905032940; Thu, 20 Jun 2024 10:37:12 -0700 (PDT) Received: from postal.iol.unh.edu (postal.iol.unh.edu. [132.177.123.84]) by smtp-relay.gmail.com with ESMTPS id 41be03b00d2f7-6fee286da58sm614826a12.22.2024.06.20.10.37.12 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 20 Jun 2024 10:37:12 -0700 (PDT) X-Relaying-Domain: iol.unh.edu Received: from iol.unh.edu (unknown [IPv6:2606:4100:3880:1257::1083]) by postal.iol.unh.edu (Postfix) with ESMTP id 97DB7605C373; Thu, 20 Jun 2024 13:37:11 -0400 (EDT) From: jspewock@iol.unh.edu To: yoan.picchi@foss.arm.com, juraj.linkes@pantheon.tech, thomas@monjalon.net, Luca.Vizzarro@arm.com, wathsala.vithanage@arm.com, Honnappa.Nagarahalli@arm.com, paul.szczepanek@arm.com, npratte@iol.unh.edu, probb@iol.unh.edu Cc: dev@dpdk.org, Jeremy Spewock Subject: [PATCH v4 3/3] dts: Improve logging for interactive shells Date: Thu, 20 Jun 2024 13:36:09 -0400 Message-ID: <20240620173609.15375-4-jspewock@iol.unh.edu> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240620173609.15375-1-jspewock@iol.unh.edu> References: <20240501161623.26672-1-jspewock@iol.unh.edu> <20240620173609.15375-1-jspewock@iol.unh.edu> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Jeremy Spewock The messages being logged by interactive shells currently are using the same logger as the node they were created from. Because of this, when sending interactive commands, the logs make no distinction between when you are sending a command directly to the host and when you are using an interactive shell on the host. This change adds names to interactive shells so that they are able to use their own loggers with distinct names. Signed-off-by: Jeremy Spewock Reviewed-by: Juraj Linkeš --- dts/framework/remote_session/dpdk_shell.py | 3 ++- dts/framework/remote_session/interactive_shell.py | 9 +++++++-- dts/framework/remote_session/testpmd_shell.py | 2 ++ dts/framework/testbed_model/traffic_generator/scapy.py | 4 +++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/dts/framework/remote_session/dpdk_shell.py b/dts/framework/remote_session/dpdk_shell.py index 296639f37d..9b4ff47334 100644 --- a/dts/framework/remote_session/dpdk_shell.py +++ b/dts/framework/remote_session/dpdk_shell.py @@ -81,6 +81,7 @@ def __init__( append_prefix_timestamp: bool = True, start_on_init: bool = True, app_params: EalParams = EalParams(), + name: str | None = None, ) -> None: """Extends :meth:`~.interactive_shell.InteractiveShell.__init__`. @@ -95,7 +96,7 @@ def __init__( append_prefix_timestamp, ) - super().__init__(node, privileged, timeout, start_on_init, app_params) + super().__init__(node, privileged, timeout, start_on_init, app_params, name) def _update_real_path(self, path: PurePath) -> None: """Extends :meth:`~.interactive_shell.InteractiveShell._update_real_path`. diff --git a/dts/framework/remote_session/interactive_shell.py b/dts/framework/remote_session/interactive_shell.py index 6aa5281d6a..c92fdbfcdf 100644 --- a/dts/framework/remote_session/interactive_shell.py +++ b/dts/framework/remote_session/interactive_shell.py @@ -25,7 +25,7 @@ InteractiveSSHSessionDeadError, InteractiveSSHTimeoutError, ) -from framework.logger import DTSLogger +from framework.logger import DTSLogger, get_dts_logger from framework.params import Params from framework.settings import SETTINGS from framework.testbed_model.node import Node @@ -73,6 +73,7 @@ def __init__( timeout: float = SETTINGS.timeout, start_on_init: bool = True, app_params: Params = Params(), + name: str | None = None, ) -> None: """Create an SSH channel during initialization. @@ -84,9 +85,13 @@ def __init__( and no output is gathered within the timeout, an exception is thrown. start_on_init: Start interactive shell automatically after object initialisation. app_params: The command line parameters to be passed to the application on startup. + name: Name for the interactive shell to use for logging. This name will be appended to + the name of the underlying node which it is running on. """ self._node = node - self._logger = node._logger + if name is None: + name = type(self).__name__ + self._logger = get_dts_logger(f"{node.name}.{name}") self._app_params = app_params self._privileged = privileged self._timeout = timeout diff --git a/dts/framework/remote_session/testpmd_shell.py b/dts/framework/remote_session/testpmd_shell.py index ec22f72221..1f00556187 100644 --- a/dts/framework/remote_session/testpmd_shell.py +++ b/dts/framework/remote_session/testpmd_shell.py @@ -605,6 +605,7 @@ def __init__( ascending_cores: bool = True, append_prefix_timestamp: bool = True, start_on_init: bool = True, + name: str | None = None, **app_params: Unpack[TestPmdParamsDict], ) -> None: """Overrides :meth:`~.dpdk_shell.DPDKShell.__init__`. Changes app_params to kwargs.""" @@ -617,6 +618,7 @@ def __init__( append_prefix_timestamp, start_on_init, TestPmdParams(**app_params), + name, ) def start(self, verify: bool = True) -> None: diff --git a/dts/framework/testbed_model/traffic_generator/scapy.py b/dts/framework/testbed_model/traffic_generator/scapy.py index c3648134fc..ca0ea6aca3 100644 --- a/dts/framework/testbed_model/traffic_generator/scapy.py +++ b/dts/framework/testbed_model/traffic_generator/scapy.py @@ -261,7 +261,9 @@ def __init__(self, tg_node: Node, config: ScapyTrafficGeneratorConfig): self._tg_node.config.os == OS.linux ), "Linux is the only supported OS for scapy traffic generation" - self.session = PythonShell(self._tg_node, timeout=5, privileged=True) + self.session = PythonShell( + self._tg_node, timeout=5, privileged=True, name="ScapyXMLRPCServer" + ) # import libs in remote python console for import_statement in SCAPY_RPC_SERVER_IMPORTS: