[RFC,v1,09/18] dts: merge DTS framework/ssh_connection.py to DPDK

Message ID 20220406150440.2914464-10-juraj.linkes@pantheon.tech (mailing list archive)
State RFC, archived
Delegated to: Thomas Monjalon
Headers
Series merge DTS component files to DPDK |

Checks

Context Check Description
ci/checkpatch warning coding style issues

Commit Message

Juraj Linkeš April 6, 2022, 3:04 p.m. UTC
  ---
 dts/framework/ssh_connection.py | 117 ++++++++++++++++++++++++++++++++
 1 file changed, 117 insertions(+)
 create mode 100644 dts/framework/ssh_connection.py
  

Patch

diff --git a/dts/framework/ssh_connection.py b/dts/framework/ssh_connection.py
new file mode 100644
index 0000000000..bfe6e6840b
--- /dev/null
+++ b/dts/framework/ssh_connection.py
@@ -0,0 +1,117 @@ 
+# BSD LICENSE
+#
+# Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#   * Neither the name of Intel Corporation nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+from .settings import TIMEOUT, USERNAME
+from .ssh_pexpect import SSHPexpect
+
+"""
+Global structure for saving connections
+"""
+CONNECTIONS = []
+
+
+class SSHConnection(object):
+
+    """
+    Module for create session to host.
+    Implement send_expect/copy function upper SSHPexpect module.
+    """
+
+    def __init__(self, host, session_name, username, password="", dut_id=0):
+        self.session = SSHPexpect(host, username, password, dut_id)
+        self.name = session_name
+        connection = {}
+        connection[self.name] = self.session
+        CONNECTIONS.append(connection)
+        self.history = None
+
+    def init_log(self, logger):
+        self.logger = logger
+        self.session.init_log(logger, self.name)
+
+    def set_history(self, history):
+        self.history = history
+
+    def send_expect(self, cmds, expected, timeout=15, verify=False):
+        self.logger.info(cmds)
+        out = self.session.send_expect(cmds, expected, timeout, verify)
+        if isinstance(out, str):
+            self.logger.debug(out.replace(cmds, ""))
+        if type(self.history) is list:
+            self.history.append({"command": cmds, "name": self.name, "output": out})
+        return out
+
+    def send_command(self, cmds, timeout=1):
+        self.logger.info(cmds)
+        out = self.session.send_command(cmds, timeout)
+        self.logger.debug(out.replace(cmds, ""))
+        if type(self.history) is list:
+            self.history.append({"command": cmds, "name": self.name, "output": out})
+        return out
+
+    def get_session_before(self, timeout=15):
+        out = self.session.get_session_before(timeout)
+        self.logger.debug(out)
+        return out
+
+    def close(self, force=False):
+        if getattr(self, "logger", None):
+            self.logger.logger_exit()
+
+        self.session.close(force)
+        connection = {}
+        connection[self.name] = self.session
+        try:
+            CONNECTIONS.remove(connection)
+        except:
+            pass
+
+    def isalive(self):
+        return self.session.isalive()
+
+    def check_available(self):
+        MAGIC_STR = "DTS_CHECK_SESSION"
+        out = self.session.send_command("echo %s" % MAGIC_STR, timeout=0.1)
+        # if not available, try to send ^C and check again
+        if MAGIC_STR not in out:
+            self.logger.info("Try to recover session...")
+            self.session.send_command("^C", timeout=TIMEOUT)
+            out = self.session.send_command("echo %s" % MAGIC_STR, timeout=0.1)
+            if MAGIC_STR not in out:
+                return False
+
+        return True
+
+    def copy_file_from(self, src, dst=".", password="", crb_session=None):
+        self.session.copy_file_from(src, dst, password, crb_session)
+
+    def copy_file_to(self, src, dst="~/", password="", crb_session=None):
+        self.session.copy_file_to(src, dst, password, crb_session)