[PATCH v2 00/17] Switch iotests to using Async QMP

John Snow posted 17 patches 2 years, 7 months ago
Test checkpatch passed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20210923004938.3999963-1-jsnow@redhat.com
Maintainers: Cleber Rosa <crosa@redhat.com>, Kevin Wolf <kwolf@redhat.com>, Eduardo Habkost <ehabkost@redhat.com>, Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>, John Snow <jsnow@redhat.com>, Hanna Reitz <hreitz@redhat.com>
There is a newer version of this series
tests/qemu-iotests/socket_scm_helper.c    | 136 ----------------------
python/qemu/aqmp/__init__.py              |  14 +--
python/qemu/aqmp/events.py                |  15 ++-
python/qemu/aqmp/legacy.py                | 135 +++++++++++++++++++++
python/qemu/aqmp/models.py                |  13 +++
python/qemu/aqmp/protocol.py              |   7 +-
python/qemu/aqmp/qmp_client.py            |  27 +++++
python/qemu/machine/machine.py            | 133 +++++++++++----------
python/qemu/machine/qtest.py              |   2 -
python/qemu/qmp/__init__.py               |  27 +++--
python/qemu/qmp/qmp_shell.py              |   1 -
scripts/simplebench/bench_block_job.py    |   3 +-
tests/Makefile.include                    |   1 -
tests/meson.build                         |   4 -
tests/qemu-iotests/040                    |   7 +-
tests/qemu-iotests/218                    |   2 +-
tests/qemu-iotests/255                    |   2 +-
tests/qemu-iotests/iotests.py             |  23 +++-
tests/qemu-iotests/meson.build            |   5 -
tests/qemu-iotests/testenv.py             |   8 +-
tests/qemu-iotests/tests/mirror-top-perms |  12 +-
21 files changed, 315 insertions(+), 262 deletions(-)
delete mode 100644 tests/qemu-iotests/socket_scm_helper.c
create mode 100644 python/qemu/aqmp/legacy.py
delete mode 100644 tests/qemu-iotests/meson.build
[PATCH v2 00/17] Switch iotests to using Async QMP
Posted by John Snow 2 years, 7 months ago
Based-on: <20210915162955.333025-1-jsnow@redhat.com>
          [PATCH v4 00/27] python: introduce Asynchronous QMP package
GitLab: https://gitlab.com/jsnow/qemu/-/commits/python-aqmp-iotest-wrapper
CI: https://gitlab.com/jsnow/qemu/-/pipelines/375637927

Hiya,

This series continues where the first AQMP series left off and adds a
synchronous 'legacy' wrapper around the new AQMP interface, then drops
it straight into iotests to prove that AQMP is functional and totally
cool and fine. The disruption and churn to iotests is extremely minimal.
(There's actually a net negative SLOC in tests/qemu-iotests.)

In the event that a regression happens and I am not physically proximate
to inflict damage upon, one may set the QEMU_PYTHON_LEGACY_QMP variable
to any non-empty string as it pleases you to engage the QMP machinery
you are used to.

I'd like to try and get this committed early in the 6.2 development
cycle to give ample time to smooth over any possible regressions. I've
tested it locally and via gitlab CI, across Python versions 3.6 through
3.10, and "worksforme". If something bad happens, we can revert the
actual switch-flip very trivially.

Layout:

Patches 1-7: ./python/qemu/aqmp changes that serve as pre-requisites.
Patches 8-12: other ./python changes that ease the transition.
Patches 13-14: iotest changes to support the new QMP backend.
Patches 15-17: Make the switch.

V2:

001/17:[----] [--] 'python/aqmp: add greeting property to QMPClient'
002/17:[----] [--] 'python/aqmp: add .empty() method to EventListener'
003/17:[----] [--] 'python/aqmp: Return cleared events from EventListener.clear()'
004/17:[0007] [FC] 'python/aqmp: add send_fd_scm'
005/17:[down] 'python/aqmp: Add dict conversion method to Greeting object'
006/17:[down] 'python/aqmp: Reduce severity of EOFError-caused loop terminations'
007/17:[down] 'python/aqmp: Disable logging messages by default'

008/17:[0002] [FC] 'python/qmp: clear events on get_events() call'
009/17:[----] [--] 'python/qmp: add send_fd_scm directly to QEMUMonitorProtocol'
010/17:[----] [--] 'python, iotests: remove socket_scm_helper'
011/17:[0013] [FC] 'python/machine: remove has_quit argument'
012/17:[down] 'python/machine: Handle QMP errors on close more meticulously'

013/17:[0009] [FC] 'iotests: Accommodate async QMP Exception classes'
014/17:[down] 'iotests: Conditionally silence certain AQMP errors'

015/17:[0016] [FC] 'python/aqmp: Create sync QMP wrapper for iotests'
016/17:[0002] [FC] 'python/aqmp: Remove scary message'
017/17:[----] [--] 'python, iotests: replace qmp with aqmp'

- Rebased on jsnow/python, which was recently rebased on origin/master.
- Make aqmp's send_fd_scm method bark if the socket isn't AF_UNIX (Hanna)
- Uh... modify send_fd_scm so it doesn't break when Python 3.11 comes out ...
  See the commit message for more detail.
- Drop the "python/aqmp: Create MessageModel and StandaloneModel class"
  patch and replace with a far simpler method that just adds an
  _asdict() method.
- Add patches 06 and 07 to change how the AQMP library handles logging.
- Adjust docstring in patch 08 (Hanna)
- Rename "_has_quit" attribute to "_quid_issued" (Hanna)
- Renamed patch 12, simplified the logic in _soft_shutdown a tiny bit.
- Fixed bad exception handling logic in 13 (Hanna)
- Introduce a helper in patch 14 to silence log output when it's unwanted.
- Small addition of _get_greeting() helper in patch 15, coinciding with the
  new patch 05 here.
- Contextual changes in 16.

John Snow (17):
  python/aqmp: add greeting property to QMPClient
  python/aqmp: add .empty() method to EventListener
  python/aqmp: Return cleared events from EventListener.clear()
  python/aqmp: add send_fd_scm
  python/aqmp: Add dict conversion method to Greeting object
  python/aqmp: Reduce severity of EOFError-caused loop terminations
  python/aqmp: Disable logging messages by default
  python/qmp: clear events on get_events() call
  python/qmp: add send_fd_scm directly to QEMUMonitorProtocol
  python, iotests: remove socket_scm_helper
  python/machine: remove has_quit argument
  python/machine: Handle QMP errors on close more meticulously
  iotests: Accommodate async QMP Exception classes
  iotests: Conditionally silence certain AQMP errors
  python/aqmp: Create sync QMP wrapper for iotests
  python/aqmp: Remove scary message
  python, iotests: replace qmp with aqmp

 tests/qemu-iotests/socket_scm_helper.c    | 136 ----------------------
 python/qemu/aqmp/__init__.py              |  14 +--
 python/qemu/aqmp/events.py                |  15 ++-
 python/qemu/aqmp/legacy.py                | 135 +++++++++++++++++++++
 python/qemu/aqmp/models.py                |  13 +++
 python/qemu/aqmp/protocol.py              |   7 +-
 python/qemu/aqmp/qmp_client.py            |  27 +++++
 python/qemu/machine/machine.py            | 133 +++++++++++----------
 python/qemu/machine/qtest.py              |   2 -
 python/qemu/qmp/__init__.py               |  27 +++--
 python/qemu/qmp/qmp_shell.py              |   1 -
 scripts/simplebench/bench_block_job.py    |   3 +-
 tests/Makefile.include                    |   1 -
 tests/meson.build                         |   4 -
 tests/qemu-iotests/040                    |   7 +-
 tests/qemu-iotests/218                    |   2 +-
 tests/qemu-iotests/255                    |   2 +-
 tests/qemu-iotests/iotests.py             |  23 +++-
 tests/qemu-iotests/meson.build            |   5 -
 tests/qemu-iotests/testenv.py             |   8 +-
 tests/qemu-iotests/tests/mirror-top-perms |  12 +-
 21 files changed, 315 insertions(+), 262 deletions(-)
 delete mode 100644 tests/qemu-iotests/socket_scm_helper.c
 create mode 100644 python/qemu/aqmp/legacy.py
 delete mode 100644 tests/qemu-iotests/meson.build

-- 
2.31.1



Re: [PATCH v2 00/17] Switch iotests to using Async QMP
Posted by Paolo Bonzini 2 years, 7 months ago
On 23/09/21 02:49, John Snow wrote:
> Based-on: <20210915162955.333025-1-jsnow@redhat.com>
>            [PATCH v4 00/27] python: introduce Asynchronous QMP package
> GitLab: https://gitlab.com/jsnow/qemu/-/commits/python-aqmp-iotest-wrapper
> CI: https://gitlab.com/jsnow/qemu/-/pipelines/375637927
> 
> Hiya,
> 
> This series continues where the first AQMP series left off and adds a
> synchronous 'legacy' wrapper around the new AQMP interface, then drops
> it straight into iotests to prove that AQMP is functional and totally
> cool and fine. The disruption and churn to iotests is extremely minimal.
> (There's actually a net negative SLOC in tests/qemu-iotests.)
> 
> In the event that a regression happens and I am not physically proximate
> to inflict damage upon, one may set the QEMU_PYTHON_LEGACY_QMP variable
> to any non-empty string as it pleases you to engage the QMP machinery
> you are used to.
> 
> I'd like to try and get this committed early in the 6.2 development
> cycle to give ample time to smooth over any possible regressions. I've
> tested it locally and via gitlab CI, across Python versions 3.6 through
> 3.10, and "worksforme". If something bad happens, we can revert the
> actual switch-flip very trivially.
> 
> Layout:
> 
> Patches 1-7: ./python/qemu/aqmp changes that serve as pre-requisites.
> Patches 8-12: other ./python changes that ease the transition.
> Patches 13-14: iotest changes to support the new QMP backend.
> Patches 15-17: Make the switch.
> 
> V2:
> 
> 001/17:[----] [--] 'python/aqmp: add greeting property to QMPClient'
> 002/17:[----] [--] 'python/aqmp: add .empty() method to EventListener'
> 003/17:[----] [--] 'python/aqmp: Return cleared events from EventListener.clear()'
> 004/17:[0007] [FC] 'python/aqmp: add send_fd_scm'
> 005/17:[down] 'python/aqmp: Add dict conversion method to Greeting object'
> 006/17:[down] 'python/aqmp: Reduce severity of EOFError-caused loop terminations'
> 007/17:[down] 'python/aqmp: Disable logging messages by default'
> 
> 008/17:[0002] [FC] 'python/qmp: clear events on get_events() call'
> 009/17:[----] [--] 'python/qmp: add send_fd_scm directly to QEMUMonitorProtocol'
> 010/17:[----] [--] 'python, iotests: remove socket_scm_helper'
> 011/17:[0013] [FC] 'python/machine: remove has_quit argument'
> 012/17:[down] 'python/machine: Handle QMP errors on close more meticulously'
> 
> 013/17:[0009] [FC] 'iotests: Accommodate async QMP Exception classes'
> 014/17:[down] 'iotests: Conditionally silence certain AQMP errors'
> 
> 015/17:[0016] [FC] 'python/aqmp: Create sync QMP wrapper for iotests'
> 016/17:[0002] [FC] 'python/aqmp: Remove scary message'
> 017/17:[----] [--] 'python, iotests: replace qmp with aqmp'
> 
> - Rebased on jsnow/python, which was recently rebased on origin/master.
> - Make aqmp's send_fd_scm method bark if the socket isn't AF_UNIX (Hanna)
> - Uh... modify send_fd_scm so it doesn't break when Python 3.11 comes out ...
>    See the commit message for more detail.
> - Drop the "python/aqmp: Create MessageModel and StandaloneModel class"
>    patch and replace with a far simpler method that just adds an
>    _asdict() method.
> - Add patches 06 and 07 to change how the AQMP library handles logging.
> - Adjust docstring in patch 08 (Hanna)
> - Rename "_has_quit" attribute to "_quid_issued" (Hanna)
> - Renamed patch 12, simplified the logic in _soft_shutdown a tiny bit.
> - Fixed bad exception handling logic in 13 (Hanna)
> - Introduce a helper in patch 14 to silence log output when it's unwanted.
> - Small addition of _get_greeting() helper in patch 15, coinciding with the
>    new patch 05 here.
> - Contextual changes in 16.
> 
> John Snow (17):
>    python/aqmp: add greeting property to QMPClient
>    python/aqmp: add .empty() method to EventListener
>    python/aqmp: Return cleared events from EventListener.clear()
>    python/aqmp: add send_fd_scm
>    python/aqmp: Add dict conversion method to Greeting object
>    python/aqmp: Reduce severity of EOFError-caused loop terminations
>    python/aqmp: Disable logging messages by default
>    python/qmp: clear events on get_events() call
>    python/qmp: add send_fd_scm directly to QEMUMonitorProtocol
>    python, iotests: remove socket_scm_helper
>    python/machine: remove has_quit argument
>    python/machine: Handle QMP errors on close more meticulously
>    iotests: Accommodate async QMP Exception classes
>    iotests: Conditionally silence certain AQMP errors
>    python/aqmp: Create sync QMP wrapper for iotests
>    python/aqmp: Remove scary message
>    python, iotests: replace qmp with aqmp
> 
>   tests/qemu-iotests/socket_scm_helper.c    | 136 ----------------------
>   python/qemu/aqmp/__init__.py              |  14 +--
>   python/qemu/aqmp/events.py                |  15 ++-
>   python/qemu/aqmp/legacy.py                | 135 +++++++++++++++++++++
>   python/qemu/aqmp/models.py                |  13 +++
>   python/qemu/aqmp/protocol.py              |   7 +-
>   python/qemu/aqmp/qmp_client.py            |  27 +++++
>   python/qemu/machine/machine.py            | 133 +++++++++++----------
>   python/qemu/machine/qtest.py              |   2 -
>   python/qemu/qmp/__init__.py               |  27 +++--
>   python/qemu/qmp/qmp_shell.py              |   1 -
>   scripts/simplebench/bench_block_job.py    |   3 +-
>   tests/Makefile.include                    |   1 -
>   tests/meson.build                         |   4 -
>   tests/qemu-iotests/040                    |   7 +-
>   tests/qemu-iotests/218                    |   2 +-
>   tests/qemu-iotests/255                    |   2 +-
>   tests/qemu-iotests/iotests.py             |  23 +++-
>   tests/qemu-iotests/meson.build            |   5 -
>   tests/qemu-iotests/testenv.py             |   8 +-
>   tests/qemu-iotests/tests/mirror-top-perms |  12 +-
>   21 files changed, 315 insertions(+), 262 deletions(-)
>   delete mode 100644 tests/qemu-iotests/socket_scm_helper.c
>   create mode 100644 python/qemu/aqmp/legacy.py
>   delete mode 100644 tests/qemu-iotests/meson.build
> 

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

apart from the name nit in patch 15.  I would really like this to go in 
and get rid of socket_scm_helper.c!

Paolo


Re: [PATCH v2 00/17] Switch iotests to using Async QMP
Posted by John Snow 2 years, 7 months ago
On Wed, Oct 6, 2021 at 6:14 AM Paolo Bonzini <pbonzini@redhat.com> wrote:

> On 23/09/21 02:49, John Snow wrote:
> > Based-on: <20210915162955.333025-1-jsnow@redhat.com>
> >            [PATCH v4 00/27] python: introduce Asynchronous QMP package
> > GitLab:
> https://gitlab.com/jsnow/qemu/-/commits/python-aqmp-iotest-wrapper
> > CI: https://gitlab.com/jsnow/qemu/-/pipelines/375637927
> >
> > Hiya,
> >
> > This series continues where the first AQMP series left off and adds a
> > synchronous 'legacy' wrapper around the new AQMP interface, then drops
> > it straight into iotests to prove that AQMP is functional and totally
> > cool and fine. The disruption and churn to iotests is extremely minimal.
> > (There's actually a net negative SLOC in tests/qemu-iotests.)
> >
> > In the event that a regression happens and I am not physically proximate
> > to inflict damage upon, one may set the QEMU_PYTHON_LEGACY_QMP variable
> > to any non-empty string as it pleases you to engage the QMP machinery
> > you are used to.
> >
> > I'd like to try and get this committed early in the 6.2 development
> > cycle to give ample time to smooth over any possible regressions. I've
> > tested it locally and via gitlab CI, across Python versions 3.6 through
> > 3.10, and "worksforme". If something bad happens, we can revert the
> > actual switch-flip very trivially.
> >
> > Layout:
> >
> > Patches 1-7: ./python/qemu/aqmp changes that serve as pre-requisites.
> > Patches 8-12: other ./python changes that ease the transition.
> > Patches 13-14: iotest changes to support the new QMP backend.
> > Patches 15-17: Make the switch.
> >
> > V2:
> >
> > 001/17:[----] [--] 'python/aqmp: add greeting property to QMPClient'
> > 002/17:[----] [--] 'python/aqmp: add .empty() method to EventListener'
> > 003/17:[----] [--] 'python/aqmp: Return cleared events from
> EventListener.clear()'
> > 004/17:[0007] [FC] 'python/aqmp: add send_fd_scm'
> > 005/17:[down] 'python/aqmp: Add dict conversion method to Greeting
> object'
> > 006/17:[down] 'python/aqmp: Reduce severity of EOFError-caused loop
> terminations'
> > 007/17:[down] 'python/aqmp: Disable logging messages by default'
> >
> > 008/17:[0002] [FC] 'python/qmp: clear events on get_events() call'
> > 009/17:[----] [--] 'python/qmp: add send_fd_scm directly to
> QEMUMonitorProtocol'
> > 010/17:[----] [--] 'python, iotests: remove socket_scm_helper'
> > 011/17:[0013] [FC] 'python/machine: remove has_quit argument'
> > 012/17:[down] 'python/machine: Handle QMP errors on close more
> meticulously'
> >
> > 013/17:[0009] [FC] 'iotests: Accommodate async QMP Exception classes'
> > 014/17:[down] 'iotests: Conditionally silence certain AQMP errors'
> >
> > 015/17:[0016] [FC] 'python/aqmp: Create sync QMP wrapper for iotests'
> > 016/17:[0002] [FC] 'python/aqmp: Remove scary message'
> > 017/17:[----] [--] 'python, iotests: replace qmp with aqmp'
> >
> > - Rebased on jsnow/python, which was recently rebased on origin/master.
> > - Make aqmp's send_fd_scm method bark if the socket isn't AF_UNIX (Hanna)
> > - Uh... modify send_fd_scm so it doesn't break when Python 3.11 comes
> out ...
> >    See the commit message for more detail.
> > - Drop the "python/aqmp: Create MessageModel and StandaloneModel class"
> >    patch and replace with a far simpler method that just adds an
> >    _asdict() method.
> > - Add patches 06 and 07 to change how the AQMP library handles logging.
> > - Adjust docstring in patch 08 (Hanna)
> > - Rename "_has_quit" attribute to "_quid_issued" (Hanna)
> > - Renamed patch 12, simplified the logic in _soft_shutdown a tiny bit.
> > - Fixed bad exception handling logic in 13 (Hanna)
> > - Introduce a helper in patch 14 to silence log output when it's
> unwanted.
> > - Small addition of _get_greeting() helper in patch 15, coinciding with
> the
> >    new patch 05 here.
> > - Contextual changes in 16.
> >
> > John Snow (17):
> >    python/aqmp: add greeting property to QMPClient
> >    python/aqmp: add .empty() method to EventListener
> >    python/aqmp: Return cleared events from EventListener.clear()
> >    python/aqmp: add send_fd_scm
> >    python/aqmp: Add dict conversion method to Greeting object
> >    python/aqmp: Reduce severity of EOFError-caused loop terminations
> >    python/aqmp: Disable logging messages by default
> >    python/qmp: clear events on get_events() call
> >    python/qmp: add send_fd_scm directly to QEMUMonitorProtocol
> >    python, iotests: remove socket_scm_helper
> >    python/machine: remove has_quit argument
> >    python/machine: Handle QMP errors on close more meticulously
> >    iotests: Accommodate async QMP Exception classes
> >    iotests: Conditionally silence certain AQMP errors
> >    python/aqmp: Create sync QMP wrapper for iotests
> >    python/aqmp: Remove scary message
> >    python, iotests: replace qmp with aqmp
> >
> >   tests/qemu-iotests/socket_scm_helper.c    | 136 ----------------------
> >   python/qemu/aqmp/__init__.py              |  14 +--
> >   python/qemu/aqmp/events.py                |  15 ++-
> >   python/qemu/aqmp/legacy.py                | 135 +++++++++++++++++++++
> >   python/qemu/aqmp/models.py                |  13 +++
> >   python/qemu/aqmp/protocol.py              |   7 +-
> >   python/qemu/aqmp/qmp_client.py            |  27 +++++
> >   python/qemu/machine/machine.py            | 133 +++++++++++----------
> >   python/qemu/machine/qtest.py              |   2 -
> >   python/qemu/qmp/__init__.py               |  27 +++--
> >   python/qemu/qmp/qmp_shell.py              |   1 -
> >   scripts/simplebench/bench_block_job.py    |   3 +-
> >   tests/Makefile.include                    |   1 -
> >   tests/meson.build                         |   4 -
> >   tests/qemu-iotests/040                    |   7 +-
> >   tests/qemu-iotests/218                    |   2 +-
> >   tests/qemu-iotests/255                    |   2 +-
> >   tests/qemu-iotests/iotests.py             |  23 +++-
> >   tests/qemu-iotests/meson.build            |   5 -
> >   tests/qemu-iotests/testenv.py             |   8 +-
> >   tests/qemu-iotests/tests/mirror-top-perms |  12 +-
> >   21 files changed, 315 insertions(+), 262 deletions(-)
> >   delete mode 100644 tests/qemu-iotests/socket_scm_helper.c
> >   create mode 100644 python/qemu/aqmp/legacy.py
> >   delete mode 100644 tests/qemu-iotests/meson.build
> >
>
> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
>
> apart from the name nit in patch 15.  I would really like this to go in
> and get rid of socket_scm_helper.c!
>
> Paolo
>
>
Got a thumbs up from Hanna on IRC to stage patches 1-10 myself. I'll leave
patches 11-17 for further scrutiny.

so, patches 1-10: staged to my Python branch.

https://gitlab.com/jsnow/qemu/-/commits/python

thanks!

--js