Hi

On Mon, Aug 17, 2026 at 11:31 AM Thomas Huth <[email protected]> wrote:
>
> On 16/08/2026 21.12, Marc-André Lureau wrote:
> > Replace human-monitor-command "info usernet" calls with the structured
> > x-query-usernet QMP command in get_usernet_hostfwd_port() and the VM
> > test runner boot path.
> >
> > Since x-query-usernet returns a list of UsernetInfo entries, callers
> > now iterate over the result and extract the port from each entry's
> > "info" field. Also switch get_info_usernet_hostfwd_port() from
> > split('\r\n') to splitlines(), since QMP strings use \n rather than
> > the HMP monitor's \r\n line endings.
> >
> > Reviewed-by: Daniel P. Berrangé <[email protected]>
> > Signed-off-by: Marc-Andre Lureau <[email protected]>
> > ---
> >   python/qemu/utils/__init__.py       |  5 +++--
> >   tests/functional/qemu_test/utils.py |  8 ++++++--
> >   tests/vm/basevm.py                  | 13 ++++++++-----
> >   3 files changed, 17 insertions(+), 9 deletions(-)
> >
> > diff --git a/python/qemu/utils/__init__.py b/python/qemu/utils/__init__.py
> > index be5daa836340..e32911d4c6df 100644
> > --- a/python/qemu/utils/__init__.py
> > +++ b/python/qemu/utils/__init__.py
> > @@ -46,10 +46,11 @@ 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: output generated by "info usernet" or
> > +        the "info" field from x-query-usernet
> >       :return: the port number allocated by the hostfwd option
> >       """
> > -    for line in info_usernet_output.split('\r\n'):
> > +    for line in info_usernet_output.splitlines():
> >           regex = r'TCP.HOST_FORWARD.*127\.0\.0\.1\s+(\d+)\s+10\.'
> >           match = re.search(regex, line)
> >           if match is not None:
> > diff --git a/tests/functional/qemu_test/utils.py 
> > b/tests/functional/qemu_test/utils.py
> > index 826c267785bd..0992db49ab28 100644
> > --- a/tests/functional/qemu_test/utils.py
> > +++ b/tests/functional/qemu_test/utils.py
> > @@ -14,8 +14,12 @@
> >
> >
> >   def get_usernet_hostfwd_port(vm):
> > -    res = vm.cmd('human-monitor-command', command_line='info usernet')
> > -    return get_info_usernet_hostfwd_port(res)
> > +    res = vm.cmd('x-query-usernet')
> > +    for entry in res:
> > +        port = get_info_usernet_hostfwd_port(entry['info'])
> > +        if port is not None:
> > +            return port
> > +    return None
> >
> >   def pow2ceil(x):
> >       """
> > diff --git a/tests/vm/basevm.py b/tests/vm/basevm.py
> > index 9e879e966a36..198b04e8c375 100644
> > --- a/tests/vm/basevm.py
> > +++ b/tests/vm/basevm.py
> > @@ -312,12 +312,15 @@ def boot(self, img, extra_args=[]):
> >           self._guest = guest
> >           # Init console so we can start consuming the chars.
> >           self.console_init()
> > -        usernet_info = guest.cmd("human-monitor-command",
> > -                                 command_line="info usernet")
> > -        self.ssh_port = get_info_usernet_hostfwd_port(usernet_info)
> > +        res = guest.cmd("x-query-usernet")
> > +        for entry in res:
> > +            port = get_info_usernet_hostfwd_port(entry['info'])
> > +            if port is not None:
> > +                self.ssh_port = port
> > +                break
> >           if not self.ssh_port:
> > -            raise Exception("Cannot find ssh port from 'info 
> > usernet':\n%s" % \
> > -                            usernet_info)
> > +            raise Exception("Cannot find ssh port from"
> > +                            " 'x-query-usernet': %s" % res)
> >
> >       def console_init(self, timeout = None):
> >           if timeout == None:
> While you're at it, may I suggest to move the cmd('x-query-usernet') into
> the get_info_usernet_hostfwd_port() function in
> python/qemu/utils/__init__.py, too, so that the callers don't have to take
> care about this anymore? Also just return the port number from there, so
> that the callers don't have to take care about the parsing. WDYT?

Good idea, but not so simple. qemu/utils doesn't depend on any VM/QMP
types.. we could use duck typing or other solution. I would rather
defer this for now

thanks

Reply via email to