All of lore.kernel.org
 help / color / mirror / Atom feed
From: Cleber Rosa <crosa@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Fam Zheng" <fam@euphon.net>,
	"Aleksandar Rikalo" <aleksandar.rikalo@syrmia.com>,
	"Beraldo Leal" <bleal@redhat.com>,
	"Wainer dos Santos Moschetta" <wainersm@redhat.com>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Philippe Mathieu-Daudé" <f4bug@amsat.org>,
	"Max Reitz" <mreitz@redhat.com>, "John Snow" <jsnow@redhat.com>,
	"Eric Auger" <eauger@redhat.com>,
	"Willian Rampazzo" <wrampazz@redhat.com>,
	"Cleber Rosa" <crosa@redhat.com>,
	"Thomas Huth" <thuth@redhat.com>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Philippe Mathieu-Daudé" <philmd@redhat.com>,
	"Aurelien Jarno" <aurelien@aurel32.net>,
	"Eduardo Habkost" <ehabkost@redhat.com>
Subject: [PATCH 10/22] Python: add utility function for retrieving port redirection
Date: Wed,  3 Feb 2021 12:23:45 -0500	[thread overview]
Message-ID: <20210203172357.1422425-11-crosa@redhat.com> (raw)
In-Reply-To: <20210203172357.1422425-1-crosa@redhat.com>

Slightly different versions for the same utility code are currently
present on different locations.  This unifies them all, giving
preference to the version from virtiofs_submounts.py, because of the
last tweaks added to it.

While at it, this adds a "qemu.util" module to host the utility
function and a test.

Signed-off-by: Cleber Rosa <crosa@redhat.com>
---
 python/qemu/utils.py                     | 35 ++++++++++++++++++++++++
 tests/acceptance/info_usernet.py         | 29 ++++++++++++++++++++
 tests/acceptance/linux_ssh_mips_malta.py | 16 +++++------
 tests/acceptance/virtiofs_submounts.py   | 20 +++-----------
 tests/vm/basevm.py                       |  7 ++---
 5 files changed, 77 insertions(+), 30 deletions(-)
 create mode 100644 python/qemu/utils.py
 create mode 100644 tests/acceptance/info_usernet.py

diff --git a/python/qemu/utils.py b/python/qemu/utils.py
new file mode 100644
index 0000000000..89a246ab30
--- /dev/null
+++ b/python/qemu/utils.py
@@ -0,0 +1,35 @@
+"""
+QEMU utility library
+
+This offers miscellaneous utility functions, which may not be easily
+distinguishable or numerous to be in their own module.
+"""
+
+# Copyright (C) 2021 Red Hat Inc.
+#
+# Authors:
+#  Cleber Rosa <crosa@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2.  See
+# the COPYING file in the top-level directory.
+#
+
+import re
+from typing import Optional
+
+
+def get_info_usernet_hostfwd_port(info_usernet_output: str) -> Optional[int]:
+    """
+    Returns the port given to the hostfwd parameter via info usernet
+
+    :param info_usernet_output: output generated by hmp command "info usernet"
+    :param info_usernet_output: str
+    :return: the port number allocated by the hostfwd option
+    :rtype: int
+    """
+    for line in info_usernet_output.split('\r\n'):
+        regex = r'TCP.HOST_FORWARD.*127\.0\.0\.1\s+(\d+)\s+10\.'
+        match = re.search(regex, line)
+        if match is not None:
+            return int(match[1])
+    return None
diff --git a/tests/acceptance/info_usernet.py b/tests/acceptance/info_usernet.py
new file mode 100644
index 0000000000..9c1fd903a0
--- /dev/null
+++ b/tests/acceptance/info_usernet.py
@@ -0,0 +1,29 @@
+# Test for the hmp command "info usernet"
+#
+# Copyright (c) 2021 Red Hat, Inc.
+#
+# Author:
+#  Cleber Rosa <crosa@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or
+# later.  See the COPYING file in the top-level directory.
+
+from avocado_qemu import Test
+
+from qemu.utils import get_info_usernet_hostfwd_port
+
+
+class InfoUsernet(Test):
+
+    def test_hostfwd(self):
+        self.vm.add_args('-netdev', 'user,id=vnet,hostfwd=:127.0.0.1:0-:22')
+        self.vm.launch()
+        res = self.vm.command('human-monitor-command',
+                              command_line='info usernet')
+        port = get_info_usernet_hostfwd_port(res)
+        self.assertIsNotNone(port,
+                             ('"info usernet" output content does not seem to '
+                              'contain the redirected port'))
+        self.assertGreater(port, 0,
+                           ('Found a redirected port that is not greater than'
+                            ' zero'))
diff --git a/tests/acceptance/linux_ssh_mips_malta.py b/tests/acceptance/linux_ssh_mips_malta.py
index 25c5c5f741..275659c785 100644
--- a/tests/acceptance/linux_ssh_mips_malta.py
+++ b/tests/acceptance/linux_ssh_mips_malta.py
@@ -18,6 +18,8 @@ from avocado.utils import process
 from avocado.utils import archive
 from avocado.utils import ssh
 
+from qemu.utils import get_info_usernet_hostfwd_port
+
 
 class LinuxSSH(Test):
 
@@ -70,18 +72,14 @@ class LinuxSSH(Test):
     def setUp(self):
         super(LinuxSSH, self).setUp()
 
-    def get_portfwd(self):
+    def ssh_connect(self, username, password):
+        self.ssh_logger = logging.getLogger('ssh')
         res = self.vm.command('human-monitor-command',
                               command_line='info usernet')
-        line = res.split('\r\n')[2]
-        port = re.split(r'.*TCP.HOST_FORWARD.*127\.0\.0\.1 (\d+)\s+10\..*',
-                        line)[1]
+        port = get_info_usernet_hostfwd_port(res)
+        if not port:
+            self.cancel("Failed to retrieve SSH port")
         self.log.debug("sshd listening on port:" + port)
-        return port
-
-    def ssh_connect(self, username, password):
-        self.ssh_logger = logging.getLogger('ssh')
-        port = self.get_portfwd()
         self.ssh_session = ssh.Session(self.VM_IP, port=int(port),
                                        user=username, password=password)
         for i in range(10):
diff --git a/tests/acceptance/virtiofs_submounts.py b/tests/acceptance/virtiofs_submounts.py
index 0f9d7a5d9c..bf99164fcb 100644
--- a/tests/acceptance/virtiofs_submounts.py
+++ b/tests/acceptance/virtiofs_submounts.py
@@ -10,6 +10,7 @@ from avocado_qemu import wait_for_console_pattern
 from avocado.utils import ssh
 
 from qemu.accel import kvm_available
+from qemu.utils import get_info_usernet_hostfwd_port
 
 from boot_linux import BootLinux
 
@@ -76,27 +77,14 @@ class VirtiofsSubmountsTest(BootLinux):
     :avocado: tags=arch:x86_64
     """
 
-    def get_portfwd(self):
-        port = None
-
+    def ssh_connect(self, username, keyfile):
+        self.ssh_logger = logging.getLogger('ssh')
         res = self.vm.command('human-monitor-command',
                               command_line='info usernet')
-        for line in res.split('\r\n'):
-            match = \
-                re.search(r'TCP.HOST_FORWARD.*127\.0\.0\.1\s+(\d+)\s+10\.',
-                          line)
-            if match is not None:
-                port = int(match[1])
-                break
-
+        port = get_info_usernet_hostfwd_port(res)
         self.assertIsNotNone(port)
         self.assertGreater(port, 0)
         self.log.debug('sshd listening on port: %d', port)
-        return port
-
-    def ssh_connect(self, username, keyfile):
-        self.ssh_logger = logging.getLogger('ssh')
-        port = self.get_portfwd()
         self.ssh_session = ssh.Session('127.0.0.1', port=port,
                                        user=username, key=keyfile)
         for i in range(10):
diff --git a/tests/vm/basevm.py b/tests/vm/basevm.py
index 00f1d5ca8d..75ce07df36 100644
--- a/tests/vm/basevm.py
+++ b/tests/vm/basevm.py
@@ -21,6 +21,7 @@ import datetime
 sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
 from qemu.accel import kvm_available
 from qemu.machine import QEMUMachine
+from qemu.utils import get_info_usernet_hostfwd_port
 import subprocess
 import hashlib
 import argparse
@@ -306,11 +307,7 @@ class BaseVM(object):
         self.console_init()
         usernet_info = guest.qmp("human-monitor-command",
                                  command_line="info usernet")
-        self.ssh_port = None
-        for l in usernet_info["return"].splitlines():
-            fields = l.split()
-            if "TCP[HOST_FORWARD]" in fields and "22" in fields:
-                self.ssh_port = l.split()[3]
+        self.ssh_port = get_info_usernet_hostfwd_port(usernet_info)
         if not self.ssh_port:
             raise Exception("Cannot find ssh port from 'info usernet':\n%s" % \
                             usernet_info)
-- 
2.25.4



  parent reply	other threads:[~2021-02-03 17:47 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-03 17:23 [PATCH 00/22] Acceptance Test: introduce base class for Linux based tests Cleber Rosa
2021-02-03 17:23 ` [PATCH 01/22] tests/acceptance/boot_linux.py: fix typo on cloudinit error message Cleber Rosa
2021-02-03 17:41   ` Philippe Mathieu-Daudé
2021-02-04 10:34   ` Alex Bennée
2021-02-04 10:44   ` Beraldo Leal
2021-02-03 17:23 ` [PATCH 02/22] tests/acceptance/boot_linux.py: rename misleading cloudinit method Cleber Rosa
2021-02-04  6:50   ` Thomas Huth
2021-02-04 10:47   ` Alex Bennée
2021-02-04 10:48   ` Beraldo Leal
2021-02-03 17:23 ` [PATCH 03/22] Acceptance Tests: remove unnecessary tag from documentation example Cleber Rosa
2021-02-03 17:41   ` Philippe Mathieu-Daudé
2021-02-04 10:47   ` Alex Bennée
2021-02-03 17:23 ` [PATCH 04/22] tests/acceptance/virtiofs_submounts.py: use workdir property Cleber Rosa
2021-02-04 10:48   ` Alex Bennée
2021-02-04 10:50   ` Beraldo Leal
2021-02-03 17:23 ` [PATCH 05/22] tests/acceptance/virtiofs_submounts.py: do not ask for ssh key password Cleber Rosa
2021-02-04 10:49   ` Alex Bennée
2021-02-04 11:05   ` Beraldo Leal
2021-02-03 17:23 ` [PATCH 06/22] tests/acceptance/virtiofs_submounts.py: use a virtio-net device instead Cleber Rosa
2021-02-04 13:22   ` Alex Bennée
2021-02-03 17:23 ` [PATCH 07/22] tests/acceptance/virtiofs_submounts.py: evaluate string not length Cleber Rosa
2021-02-04 11:07   ` Beraldo Leal
2021-02-04 13:23   ` Alex Bennée
2021-02-09 10:25     ` Max Reitz
2021-02-09 11:24       ` Alex Bennée
2021-02-09 12:03         ` Max Reitz
2021-02-09 12:52           ` Alex Bennée
2021-02-09 13:35             ` Max Reitz
2021-02-09 16:15               ` Alex Bennée
2021-02-09 17:15             ` Philippe Mathieu-Daudé
2021-02-15 17:56               ` Cleber Rosa
2021-02-03 17:23 ` [PATCH 08/22] tests/acceptance/virtiofs_submounts.py: standardize port as integer Cleber Rosa
2021-02-04 11:14   ` Beraldo Leal
2021-02-03 17:23 ` [PATCH 09/22] tests/acceptance/virtiofs_submounts.py: required space between IP and port Cleber Rosa
2021-02-08 11:21   ` Philippe Mathieu-Daudé
2021-02-03 17:23 ` Cleber Rosa [this message]
2021-02-05  0:25   ` [PATCH 10/22] Python: add utility function for retrieving port redirection John Snow
2021-03-23 21:53     ` Cleber Rosa
2021-02-09 14:50   ` Wainer dos Santos Moschetta
2021-02-15 18:27     ` Cleber Rosa
2021-02-15 19:43       ` John Snow
2021-02-15 20:31       ` Wainer dos Santos Moschetta
2021-02-03 17:23 ` [PATCH 11/22] tests/acceptance/linux_ssh_mips_malta.py: standardize port as integer Cleber Rosa
2021-02-08 11:24   ` Philippe Mathieu-Daudé
2021-02-15 18:58   ` Willian Rampazzo
2021-02-03 17:23 ` [PATCH 12/22] Acceptance tests: clarify ssh connection failure reason Cleber Rosa
2021-02-03 17:42   ` Philippe Mathieu-Daudé
2021-02-03 17:23 ` [PATCH 13/22] tests/acceptance/virtiofs_submounts.py: add missing accel tag Cleber Rosa
2021-02-08 11:28   ` Philippe Mathieu-Daudé
2021-02-15 17:37     ` Cleber Rosa
2021-02-09 14:54   ` Wainer dos Santos Moschetta
2021-02-15 20:05   ` Willian Rampazzo
2021-02-03 17:23 ` [PATCH 14/22] Acceptance Tests: introduce LinuxTest base class Cleber Rosa
2021-02-09 19:27   ` Wainer dos Santos Moschetta
2021-02-15 19:06   ` Willian Rampazzo
2021-02-16  3:21     ` Cleber Rosa
2021-02-03 17:23 ` [PATCH 15/22] Acceptance Tests: move useful ssh methods to " Cleber Rosa
2021-02-09 19:56   ` Wainer dos Santos Moschetta
2021-02-15 19:15   ` Willian Rampazzo
2021-02-03 17:23 ` [PATCH 16/22] Acceptance Tests: introduce method for requiring an accelerator Cleber Rosa
2021-02-04 11:25   ` Beraldo Leal
2021-02-15 19:20   ` Willian Rampazzo
2021-02-03 17:23 ` [PATCH 17/22] Acceptance Tests: fix population of public key in cloudinit image Cleber Rosa
2021-02-11 10:08   ` Marc-André Lureau
2021-02-15 14:48   ` Wainer dos Santos Moschetta
2021-02-15 19:23   ` Willian Rampazzo
2021-02-03 17:23 ` [PATCH 18/22] Acceptance Tests: set up existing ssh keys by default Cleber Rosa
2021-02-11 10:15   ` Marc-André Lureau
2021-02-16  3:28     ` Cleber Rosa
2021-02-15 19:25   ` Willian Rampazzo
2021-02-03 17:23 ` [PATCH 19/22] Acceptance Tests: add port redirection for ssh " Cleber Rosa
2021-02-03 17:46   ` Philippe Mathieu-Daudé
2021-02-03 17:51     ` Philippe Mathieu-Daudé
2021-03-23 17:56       ` Cleber Rosa
2021-02-03 17:23 ` [PATCH 20/22] Acceptance Tests: add basic documentation on LinuxTest base class Cleber Rosa
2021-02-11 10:24   ` Marc-André Lureau
2021-02-12 20:30   ` Willian Rampazzo
2021-02-03 17:23 ` [PATCH 21/22] Acceptance Tests: introduce CPU hotplug test Cleber Rosa
2021-02-11 10:25   ` Marc-André Lureau
2021-02-15 19:57   ` Willian Rampazzo
2021-02-03 17:23 ` [PATCH 22/22] [NOTFORMERGE] Bump Avocado version to latest master Cleber Rosa
2021-02-11 10:45   ` Marc-André Lureau
2021-02-08 11:35 ` [PATCH 00/22] Acceptance Test: introduce base class for Linux based tests Philippe Mathieu-Daudé
2021-02-15 15:49   ` Wainer dos Santos Moschetta
2021-02-15 17:03     ` Philippe Mathieu-Daudé
2021-02-16  3:35       ` Cleber Rosa

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=20210203172357.1422425-11-crosa@redhat.com \
    --to=crosa@redhat.com \
    --cc=aleksandar.rikalo@syrmia.com \
    --cc=alex.bennee@linaro.org \
    --cc=aurelien@aurel32.net \
    --cc=bleal@redhat.com \
    --cc=eauger@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=f4bug@amsat.org \
    --cc=fam@euphon.net \
    --cc=jsnow@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=philmd@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=thuth@redhat.com \
    --cc=wainersm@redhat.com \
    --cc=wrampazz@redhat.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.