DPDK patches and discussions
 help / color / mirror / Atom feed
From: "Juraj Linkeš" <juraj.linkes@pantheon.tech>
To: thomas@monjalon.net, Honnappa.Nagarahalli@arm.com,
	ohilyard@iol.unh.edu, lijuan.tu@intel.com, kda@semihalf.com,
	bruce.richardson@intel.com
Cc: dev@dpdk.org, "Juraj Linkeš" <juraj.linkes@pantheon.tech>
Subject: [PATCH v6 05/10] dts: add remote session abstraction
Date: Thu, 13 Oct 2022 10:35:12 +0000	[thread overview]
Message-ID: <20221013103517.3443997-6-juraj.linkes@pantheon.tech> (raw)
In-Reply-To: <20221013103517.3443997-1-juraj.linkes@pantheon.tech>

The abstraction allows for easy switching of implementations of remote
connections (ssh, telnet, etc.). It implements some common features,
such as logging of commands and their outputs and history bookkeeping
and defines methods that must be implemented by derived classes.

Signed-off-by: Owen Hilyard <ohilyard@iol.unh.edu>
Signed-off-by: Juraj Linkeš <juraj.linkes@pantheon.tech>
---
 dts/framework/remote_session/__init__.py      |   5 +
 .../remote_session/remote_session.py          | 100 ++++++++++++++++++
 dts/framework/settings.py                     |  12 +++
 3 files changed, 117 insertions(+)
 create mode 100644 dts/framework/remote_session/__init__.py
 create mode 100644 dts/framework/remote_session/remote_session.py

diff --git a/dts/framework/remote_session/__init__.py b/dts/framework/remote_session/__init__.py
new file mode 100644
index 0000000000..d924d8aaa9
--- /dev/null
+++ b/dts/framework/remote_session/__init__.py
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2022 PANTHEON.tech s.r.o.
+#
+
+from .remote_session import RemoteSession
diff --git a/dts/framework/remote_session/remote_session.py b/dts/framework/remote_session/remote_session.py
new file mode 100644
index 0000000000..7c499c32e3
--- /dev/null
+++ b/dts/framework/remote_session/remote_session.py
@@ -0,0 +1,100 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2010-2014 Intel Corporation
+# Copyright(c) 2022 PANTHEON.tech s.r.o.
+# Copyright(c) 2022 University of New Hampshire
+#
+
+import dataclasses
+from abc import ABC, abstractmethod
+from typing import Optional
+
+from framework.config import NodeConfiguration
+from framework.logger import DTSLOG
+from framework.settings import SETTINGS
+
+
+@dataclasses.dataclass(slots=True, frozen=True)
+class HistoryRecord:
+    name: str
+    command: str
+    output: str | int
+
+
+class RemoteSession(ABC):
+    name: str
+    hostname: str
+    ip: str
+    port: Optional[int]
+    username: str
+    password: str
+    logger: DTSLOG
+    history: list[HistoryRecord]
+    _node_config: NodeConfiguration
+
+    def __init__(
+        self,
+        node_config: NodeConfiguration,
+        session_name: str,
+        logger: DTSLOG,
+    ):
+        self._node_config = node_config
+
+        self.name = session_name
+        self.hostname = node_config.hostname
+        self.ip = self.hostname
+        self.port = None
+        if ":" in self.hostname:
+            self.ip, port = self.hostname.split(":")
+            self.port = int(port)
+        self.username = node_config.user
+        self.password = node_config.password or ""
+        self.logger = logger
+        self.history = []
+
+        self.logger.info(f"Connecting to {self.username}@{self.hostname}.")
+        self._connect()
+        self.logger.info(f"Connection to {self.username}@{self.hostname} successful.")
+
+    def send_command(self, command: str, timeout: float = SETTINGS.timeout) -> str:
+        self.logger.info(f"Sending: {command}")
+        out = self._send_command(command, timeout)
+        self.logger.debug(f"Received from {command}: {out}")
+        self._history_add(command=command, output=out)
+        return out
+
+    def close(self, force: bool = False) -> None:
+        self.logger.logger_exit()
+        self._close(force)
+
+    def _history_add(self, command: str, output: str) -> None:
+        self.history.append(
+            HistoryRecord(name=self.name, command=command, output=output)
+        )
+
+    @abstractmethod
+    def is_alive(self) -> bool:
+        """
+        Check whether the session is still responding.
+        """
+        pass
+
+    @abstractmethod
+    def _connect(self) -> None:
+        """
+        Create connection to assigned node.
+        """
+        pass
+
+    @abstractmethod
+    def _send_command(self, command: str, timeout: float) -> str:
+        """
+        Send a command and return the output.
+        """
+        pass
+
+    @abstractmethod
+    def _close(self, force: bool = False) -> None:
+        """
+        Close the remote session, freeing all used resources.
+        """
+        pass
diff --git a/dts/framework/settings.py b/dts/framework/settings.py
index c83d957e61..2e0d428996 100644
--- a/dts/framework/settings.py
+++ b/dts/framework/settings.py
@@ -58,6 +58,7 @@ def __call__(
 class _Settings:
     config_file_path: str
     output_dir: str
+    timeout: float
     verbose: bool
 
 
@@ -82,6 +83,16 @@ def _get_parser() -> argparse.ArgumentParser:
         help="[DTS_OUTPUT_DIR] Output directory where dts logs and results are saved.",
     )
 
+    parser.add_argument(
+        "-t",
+        "--timeout",
+        action=_env_arg("DTS_TIMEOUT"),
+        default=15,
+        required=False,
+        help="[DTS_TIMEOUT] The default timeout for all DTS operations except for "
+        "compiling DPDK.",
+    )
+
     parser.add_argument(
         "-v",
         "--verbose",
@@ -100,6 +111,7 @@ def _get_settings() -> _Settings:
     return _Settings(
         config_file_path=parsed_args.config_file,
         output_dir=parsed_args.output_dir,
+        timeout=float(parsed_args.timeout),
         verbose=(parsed_args.verbose == "Y"),
     )
 
-- 
2.30.2


  parent reply	other threads:[~2022-10-13 10:35 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-13 10:35 [PATCH v6 00/10] dts: ssh connection to a node Juraj Linkeš
2022-10-13 10:35 ` [PATCH v6 01/10] dts: add project tools config Juraj Linkeš
2022-10-13 10:35 ` [PATCH v6 02/10] dts: add developer tools Juraj Linkeš
2022-10-13 10:35 ` [PATCH v6 03/10] dts: add config parser module Juraj Linkeš
2022-10-13 10:35 ` [PATCH v6 04/10] dts: add basic logging facility Juraj Linkeš
2022-10-13 10:35 ` Juraj Linkeš [this message]
2022-10-13 10:35 ` [PATCH v6 06/10] dts: add ssh session module Juraj Linkeš
2022-10-13 10:35 ` [PATCH v6 07/10] dts: add node base class Juraj Linkeš
2022-10-13 10:35 ` [PATCH v6 08/10] dts: add dts workflow module Juraj Linkeš
2022-10-13 10:35 ` [PATCH v6 09/10] dts: add dts executable script Juraj Linkeš
2022-10-13 10:35 ` [PATCH v6 10/10] maintainers: add dts maintainers Juraj Linkeš
2022-10-13 10:45 ` [PATCH v6 00/10] dts: ssh connection to a node Bruce Richardson
2022-10-31 19:01 ` Thomas Monjalon
2022-11-02 12:58   ` Owen Hilyard
2022-11-02 13:15     ` Thomas Monjalon
2022-11-03 15:19 ` [PATCH v7 0/9] " Juraj Linkeš
2022-11-03 15:19   ` [PATCH v7 1/9] dts: add project tools config Juraj Linkeš
2022-11-03 15:19   ` [PATCH v7 2/9] dts: add developer tools Juraj Linkeš
2022-11-03 15:19   ` [PATCH v7 3/9] dts: add config parser module Juraj Linkeš
2022-11-03 15:19   ` [PATCH v7 4/9] dts: add basic logging facility Juraj Linkeš
2022-11-03 15:19   ` [PATCH v7 5/9] dts: add remote session abstraction Juraj Linkeš
2022-11-03 15:19   ` [PATCH v7 6/9] dts: add ssh session module Juraj Linkeš
2022-11-03 15:19   ` [PATCH v7 7/9] dts: add node base class Juraj Linkeš
2022-11-03 15:19   ` [PATCH v7 8/9] dts: add dts workflow module Juraj Linkeš
2022-11-03 15:19   ` [PATCH v7 9/9] dts: add dts executable script Juraj Linkeš
2022-11-04 11:05   ` [PATCH v8 0/9] dts: ssh connection to a node Juraj Linkeš
2022-11-04 11:05     ` [PATCH v8 1/9] dts: add project tools config Juraj Linkeš
2022-11-04 11:05     ` [PATCH v8 2/9] dts: add developer tools Juraj Linkeš
2022-11-04 11:05     ` [PATCH v8 3/9] dts: add config parser module Juraj Linkeš
2022-11-04 11:05     ` [PATCH v8 4/9] dts: add basic logging facility Juraj Linkeš
2022-11-04 11:05     ` [PATCH v8 5/9] dts: add remote session abstraction Juraj Linkeš
2022-11-04 11:05     ` [PATCH v8 6/9] dts: add ssh session module Juraj Linkeš
2022-11-04 11:05     ` [PATCH v8 7/9] dts: add node base class Juraj Linkeš
2022-11-04 11:05     ` [PATCH v8 8/9] dts: add dts workflow module Juraj Linkeš
2022-11-04 11:05     ` [PATCH v8 9/9] dts: add dts executable script Juraj Linkeš
2022-11-09 16:11     ` [PATCH v8 0/9] dts: ssh connection to a node Thomas Monjalon
2022-11-09 16:23       ` Honnappa Nagarahalli
2022-11-09 17:05         ` Owen Hilyard

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221013103517.3443997-6-juraj.linkes@pantheon.tech \
    --to=juraj.linkes@pantheon.tech \
    --cc=Honnappa.Nagarahalli@arm.com \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    --cc=kda@semihalf.com \
    --cc=lijuan.tu@intel.com \
    --cc=ohilyard@iol.unh.edu \
    --cc=thomas@monjalon.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).