All of lore.kernel.org
 help / color / mirror / Atom feed
From: Cleber Rosa <crosa@redhat.com>
To: Willian Rampazzo <wrampazz@redhat.com>
Cc: "Fam Zheng" <fam@euphon.net>,
	"Aleksandar Rikalo" <aleksandar.rikalo@syrmia.com>,
	"Eduardo Habkost" <ehabkost@redhat.com>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Philippe Mathieu-Daudé" <f4bug@amsat.org>,
	"Wainer dos Santos Moschetta" <wainersm@redhat.com>,
	qemu-devel <qemu-devel@nongnu.org>,
	"Willian Rampazzo" <willianr@redhat.com>,
	"Eric Auger" <eauger@redhat.com>, "John Snow" <jsnow@redhat.com>,
	"Thomas Huth" <thuth@redhat.com>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Max Reitz" <mreitz@redhat.com>,
	"Philippe Mathieu-Daudé" <philmd@redhat.com>,
	"Aurelien Jarno" <aurelien@aurel32.net>,
	"Beraldo Leal" <bleal@redhat.com>
Subject: Re: [PATCH v2 03/10] Python: add utility function for retrieving port redirection
Date: Wed, 24 Mar 2021 17:58:31 -0400	[thread overview]
Message-ID: <20210324215831.GA3592254@amachine.somewhere> (raw)
In-Reply-To: <CAKJDGDahSxsr7UwCtS=D97de5jDK813qXZ=UUKQyHSEQsCs_FQ@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 9535 bytes --]

On Wed, Mar 24, 2021 at 05:35:07PM -0300, Willian Rampazzo wrote:
> On Tue, Mar 23, 2021 at 7:16 PM Cleber Rosa <crosa@redhat.com> wrote:
> >
> > 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.utils" module to host the utility
> > function and a test.
> >
> > Signed-off-by: Cleber Rosa <crosa@redhat.com>
> > Reviewed-by: Wainer dos Santos Moschetta <wainersm@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   | 21 ++++----------
> >  tests/vm/basevm.py                       |  7 ++---
> >  5 files changed, 78 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')
> 
> This pattern is repeated every time a test needs to call
> get_info_usernet_hostfwd_port. Do you see any downside on moving this
> line inside the function and passing self.vm as an argument? This
> would abstract the need to run info usernet before calling the
> function.
> 

My original plan was to follow this up with a utility in QEMUMachine
itself (because that is the vm).  It can still be done, but:

 * I don't expect *tests* to be calling this often, rather a base
   class for tests;

 * I'm avoiding changing QEMUMachine too much, given it's a more
   generic class and used by other tests (iotests, vm, etc).

Hopefully when we have a better laid out structure for adding tests to
QEMUMachine itself, it'll be confortable to change it more
drastically.

> > +        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 6dbd02d49d..052008f02d 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 archive
> >  from avocado.utils import ssh
> >
> > +from qemu.utils import get_info_usernet_hostfwd_port
> > +
> >
> >  class LinuxSSH(Test):
> >
> > @@ -70,18 +72,14 @@ def get_kernel_info(self, endianess, wordsize):
> >      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 ca64b76301..57a7047342 100644
> > --- a/tests/acceptance/virtiofs_submounts.py
> > +++ b/tests/acceptance/virtiofs_submounts.py
> > @@ -9,6 +9,8 @@
> >  from avocado_qemu import wait_for_console_pattern
> >  from avocado.utils import ssh
> >
> > +from qemu.utils import get_info_usernet_hostfwd_port
> > +
> >
> >  def run_cmd(args):
> >      subp = subprocess.Popen(args,
> > @@ -73,27 +75,14 @@ class VirtiofsSubmountsTest(LinuxTest):
> >      :avocado: tags=accel:kvm
> >      """
> >
> > -    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 @@
> >  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 @@ def boot(self, img, extra_args=[]):
> >          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
> >
> 
> Other than maybe a small adjustment to the
> get_info_usernet_hostfwd_port function:
> 
> Reviewed-by: Willian Rampazzo <willianr@redhat.com>
> 

Thanks for the review!
- Cleber.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  reply	other threads:[~2021-03-24 23:22 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-23 22:15 [PATCH v2 00/10] Acceptance Test: introduce base class for Linux based tests Cleber Rosa
2021-03-23 22:15 ` [PATCH v2 01/10] tests/acceptance/virtiofs_submounts.py: add missing accel tag Cleber Rosa
2021-03-24  8:45   ` Auger Eric
2021-03-23 22:15 ` [PATCH v2 02/10] tests/acceptance/virtiofs_submounts.py: evaluate string not length Cleber Rosa
2021-03-24  8:45   ` Auger Eric
2021-03-24 19:54   ` Willian Rampazzo
2021-03-23 22:15 ` [PATCH v2 03/10] Python: add utility function for retrieving port redirection Cleber Rosa
2021-03-24  8:58   ` Auger Eric
2021-03-24 20:35   ` Willian Rampazzo
2021-03-24 21:58     ` Cleber Rosa [this message]
2021-03-25 18:10   ` John Snow
2021-04-12  2:09     ` Cleber Rosa
2021-05-13 19:16       ` John Snow
2021-03-23 22:15 ` [PATCH v2 04/10] Acceptance Tests: move useful ssh methods to base class Cleber Rosa
2021-03-24  9:07   ` Auger Eric
2021-03-24 22:23     ` Cleber Rosa
2021-03-25 12:50       ` Auger Eric
2021-03-25 17:43         ` Wainer dos Santos Moschetta
2021-04-12  2:18     ` Cleber Rosa
2021-03-23 22:15 ` [PATCH v2 05/10] Acceptance Tests: add port redirection for ssh by default Cleber Rosa
2021-03-24  8:30   ` Marc-André Lureau
2021-03-24 22:28     ` Cleber Rosa
2021-03-24  9:10   ` Auger Eric
2021-03-24 22:27     ` Cleber Rosa
2021-03-25 17:57     ` Wainer dos Santos Moschetta
2021-04-12  2:47       ` Cleber Rosa
2021-03-24 10:36   ` Auger Eric
2021-03-24 22:40     ` Cleber Rosa
2021-03-24 20:39   ` Willian Rampazzo
2021-03-23 22:15 ` [PATCH v2 06/10] Acceptance Tests: make username/password configurable Cleber Rosa
2021-03-24  8:31   ` Marc-André Lureau
2021-03-24  9:18   ` Auger Eric
2021-03-24 20:43   ` Willian Rampazzo
2021-03-23 22:15 ` [PATCH v2 07/10] Acceptance Tests: set up SSH connection by default after boot for LinuxTest Cleber Rosa
2021-03-24  8:33   ` Marc-André Lureau
2021-03-24  9:22   ` Auger Eric
2021-03-24 22:45     ` Cleber Rosa
2021-03-24 20:45   ` Willian Rampazzo
2021-03-25 14:31   ` Wainer dos Santos Moschetta
2021-03-25 14:53     ` Wainer dos Santos Moschetta
2021-03-23 22:15 ` [PATCH v2 08/10] tests/acceptance/virtiofs_submounts.py: remove launch_vm() Cleber Rosa
2021-03-24  8:34   ` Marc-André Lureau
2021-03-24  9:24   ` Auger Eric
2021-03-24 20:46   ` Willian Rampazzo
2021-03-23 22:15 ` [PATCH v2 09/10] Acceptance Tests: add basic documentation on LinuxTest base class Cleber Rosa
2021-03-24  9:25   ` Auger Eric
2021-03-25 18:14   ` Wainer dos Santos Moschetta
2021-04-12  2:59     ` Cleber Rosa
2021-03-23 22:15 ` [PATCH v2 10/10] Acceptance Tests: introduce CPU hotplug test Cleber Rosa
2021-03-24  9:29   ` Auger Eric
2021-03-25 19:45 ` [PATCH v2 00/10] Acceptance Test: introduce base class for Linux based tests Wainer dos Santos Moschetta
2021-03-26  8:06   ` Auger Eric
2021-04-12  3:22   ` 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=20210324215831.GA3592254@amachine.somewhere \
    --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=willianr@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.