python: rename qemu.aqmp to qemu.qmp

Now that we are fully switched over to the new QMP library, move it back
over the old namespace. This is being done primarily so that we may
upload this package simply as "qemu.qmp" without introducing confusion
over whether or not "aqmp" is a new protocol or not.

The trade-off is increased confusion inside the QEMU developer
tree. Sorry!

Note: the 'private' member "_aqmp" in legacy.py also changes to "_qmp";
not out of necessity, but just to remove any traces of the "aqmp"
name.

Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Beraldo Leal <bleal@redhat.com>
Acked-by: Hanna Reitz <hreitz@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@openvz.org>
Message-id: 20220330172812.3427355-8-jsnow@redhat.com
Signed-off-by: John Snow <jsnow@redhat.com>
This commit is contained in:
John Snow 2022-03-30 13:28:10 -04:00
parent 105bbff886
commit 37094b6dd5
30 changed files with 71 additions and 71 deletions

View file

@ -8,11 +8,11 @@ to change at any time.
Usage
-----
The ``qemu.aqmp`` subpackage provides a library for communicating with
The ``qemu.qmp`` subpackage provides a library for communicating with
QMP servers. The ``qemu.machine`` subpackage offers rudimentary
facilities for launching and managing QEMU processes. Refer to each
package's documentation
(``>>> help(qemu.aqmp)``, ``>>> help(qemu.machine)``)
(``>>> help(qemu.qmp)``, ``>>> help(qemu.machine)``)
for more information.
Contributing

View file

@ -3,7 +3,7 @@ QEMU Python Tooling
This directory houses Python tooling used by the QEMU project to build,
configure, and test QEMU. It is organized by namespace (``qemu``), and
then by package (e.g. ``qemu/machine``, ``qemu/aqmp``, etc).
then by package (e.g. ``qemu/machine``, ``qemu/qmp``, etc).
``setup.py`` is used by ``pip`` to install this tooling to the current
environment. ``setup.cfg`` provides the packaging configuration used by
@ -59,7 +59,7 @@ Package installation also normally provides executable console scripts,
so that tools like ``qmp-shell`` are always available via $PATH. To
invoke them without installation, you can invoke e.g.:
``> PYTHONPATH=~/src/qemu/python python3 -m qemu.aqmp.qmp_shell``
``> PYTHONPATH=~/src/qemu/python python3 -m qemu.qmp.qmp_shell``
The mappings between console script name and python module path can be
found in ``setup.cfg``.

View file

@ -40,8 +40,8 @@
TypeVar,
)
from qemu.aqmp import SocketAddrT
from qemu.aqmp.legacy import (
from qemu.qmp import SocketAddrT
from qemu.qmp.legacy import (
QEMUMonitorProtocol,
QMPMessage,
QMPReturnValue,

View file

@ -26,7 +26,7 @@
TextIO,
)
from qemu.aqmp import SocketAddrT
from qemu.qmp import SocketAddrT
from .machine import QEMUMachine

View file

@ -6,8 +6,8 @@
QEMU Guest Agent, and the QEMU Storage Daemon.
`QMPClient` provides the main functionality of this package. All errors
raised by this library derive from `QMPError`, see `aqmp.error` for
additional detail. See `aqmp.events` for an in-depth tutorial on
raised by this library derive from `QMPError`, see `qmp.error` for
additional detail. See `qmp.events` for an in-depth tutorial on
managing QMP events.
"""
@ -36,7 +36,7 @@
# Suppress logging unless an application engages it.
logging.getLogger('qemu.aqmp').addHandler(logging.NullHandler())
logging.getLogger('qemu.qmp').addHandler(logging.NullHandler())
# The order of these fields impact the Sphinx documentation order.

View file

@ -1,5 +1,5 @@
"""
AQMP Events and EventListeners
QMP Events and EventListeners
Asynchronous QMP uses `EventListener` objects to listen for events. An
`EventListener` is a FIFO event queue that can be pre-filtered to listen

View file

@ -78,13 +78,13 @@ def __init__(self, address: SocketAddrT,
server: bool = False,
nickname: Optional[str] = None):
self._aqmp = QMPClient(nickname)
self._qmp = QMPClient(nickname)
self._aloop = asyncio.get_event_loop()
self._address = address
self._timeout: Optional[float] = None
if server:
self._sync(self._aqmp.start_server(self._address))
self._sync(self._qmp.start_server(self._address))
_T = TypeVar('_T')
@ -96,9 +96,9 @@ def _sync(
)
def _get_greeting(self) -> Optional[QMPMessage]:
if self._aqmp.greeting is not None:
if self._qmp.greeting is not None:
# pylint: disable=protected-access
return self._aqmp.greeting._asdict()
return self._qmp.greeting._asdict()
return None
def __enter__(self: _T) -> _T:
@ -141,11 +141,11 @@ def connect(self, negotiate: bool = True) -> Optional[QMPMessage]:
:return: QMP greeting dict, or None if negotiate is false
:raise ConnectError: on connection errors
"""
self._aqmp.await_greeting = negotiate
self._aqmp.negotiate = negotiate
self._qmp.await_greeting = negotiate
self._qmp.negotiate = negotiate
self._sync(
self._aqmp.connect(self._address)
self._qmp.connect(self._address)
)
return self._get_greeting()
@ -160,10 +160,10 @@ def accept(self, timeout: Optional[float] = 15.0) -> QMPMessage:
:return: QMP greeting dict
:raise ConnectError: on connection errors
"""
self._aqmp.await_greeting = True
self._aqmp.negotiate = True
self._qmp.await_greeting = True
self._qmp.negotiate = True
self._sync(self._aqmp.accept(), timeout)
self._sync(self._qmp.accept(), timeout)
ret = self._get_greeting()
assert ret is not None
@ -183,7 +183,7 @@ def cmd_obj(self, qmp_cmd: QMPMessage) -> QMPMessage:
# _raw() isn't a public API, because turning off
# automatic ID assignment is discouraged. For
# compatibility with iotests *only*, do it anyway.
self._aqmp._raw(qmp_cmd, assign_id=False),
self._qmp._raw(qmp_cmd, assign_id=False),
self._timeout
)
)
@ -210,7 +210,7 @@ def command(self, cmd: str, **kwds: object) -> QMPReturnValue:
Build and send a QMP command to the monitor, report errors if any
"""
return self._sync(
self._aqmp.execute(cmd, kwds),
self._qmp.execute(cmd, kwds),
self._timeout
)
@ -231,7 +231,7 @@ def pull_event(self,
"""
if not wait:
# wait is False/0: "do not wait, do not except."
if self._aqmp.events.empty():
if self._qmp.events.empty():
return None
# If wait is 'True', wait forever. If wait is False/0, the events
@ -243,7 +243,7 @@ def pull_event(self,
return dict(
self._sync(
self._aqmp.events.get(),
self._qmp.events.get(),
timeout
)
)
@ -263,7 +263,7 @@ def get_events(self, wait: Union[bool, float] = False) -> List[QMPMessage]:
:return: A list of QMP events.
"""
events = [dict(x) for x in self._aqmp.events.clear()]
events = [dict(x) for x in self._qmp.events.clear()]
if events:
return events
@ -272,12 +272,12 @@ def get_events(self, wait: Union[bool, float] = False) -> List[QMPMessage]:
def clear_events(self) -> None:
"""Clear current list of pending events."""
self._aqmp.events.clear()
self._qmp.events.clear()
def close(self) -> None:
"""Close the connection."""
self._sync(
self._aqmp.disconnect()
self._qmp.disconnect()
)
def settimeout(self, timeout: Optional[float]) -> None:
@ -298,10 +298,10 @@ def send_fd_scm(self, fd: int) -> None:
"""
Send a file descriptor to the remote via SCM_RIGHTS.
"""
self._aqmp.send_fd_scm(fd)
self._qmp.send_fd_scm(fd)
def __del__(self) -> None:
if self._aqmp.runstate == Runstate.IDLE:
if self._qmp.runstate == Runstate.IDLE:
return
if not self._aloop.is_running():

View file

@ -196,9 +196,9 @@ class AsyncProtocol(Generic[T]):
:param name:
Name used for logging messages, if any. By default, messages
will log to 'qemu.aqmp.protocol', but each individual connection
will log to 'qemu.qmp.protocol', but each individual connection
can be given its own logger by giving it a name; messages will
then log to 'qemu.aqmp.protocol.${name}'.
then log to 'qemu.qmp.protocol.${name}'.
"""
# pylint: disable=too-many-instance-attributes

View file

@ -192,7 +192,7 @@ async def run(self, address='/tmp/qemu.socket'):
await self.qmp.runstate_changed.wait()
await self.disconnect()
See `aqmp.events` for more detail on event handling patterns.
See `qmp.events` for more detail on event handling patterns.
"""
#: Logger object used for debugging messages.
logger = logging.getLogger(__name__)
@ -416,7 +416,7 @@ def _do_send(self, msg: Message) -> None:
@upper_half
def _get_exec_id(self) -> str:
exec_id = f"__aqmp#{self._execute_id:05d}"
exec_id = f"__qmp#{self._execute_id:05d}"
self._execute_id += 1
return exec_id
@ -476,7 +476,7 @@ async def _execute(self, msg: Message, assign_id: bool = True) -> Message:
An execution ID will be assigned if assign_id is `True`. It can be
disabled, but this requires that an ID is manually assigned
instead. For manually assigned IDs, you must not use the string
'__aqmp#' anywhere in the ID.
'__qmp#' anywhere in the ID.
:param msg: The QMP `Message` to execute.
:param assign_id: If True, assign a new execution ID.
@ -490,7 +490,7 @@ async def _execute(self, msg: Message, assign_id: bool = True) -> Message:
msg['id'] = self._get_exec_id()
elif 'id' in msg:
assert isinstance(msg['id'], str)
assert '__aqmp#' not in msg['id']
assert '__qmp#' not in msg['id']
exec_id = await self._issue(msg)
return await self._reply(exec_id)
@ -512,7 +512,7 @@ async def _raw(
Assign an arbitrary execution ID to this message. If
`False`, the existing id must either be absent (and no other
such pending execution may omit an ID) or a string. If it is
a string, it must not start with '__aqmp#' and no other such
a string, it must not start with '__qmp#' and no other such
pending execution may currently be using that ID.
:return: Execution reply from the server.
@ -524,7 +524,7 @@ async def _raw(
When assign_id is `False`, an ID is given, and it is not a string.
:raise ValueError:
When assign_id is `False`, but the ID is not usable;
Either because it starts with '__aqmp#' or it is already in-use.
Either because it starts with '__qmp#' or it is already in-use.
"""
# 1. convert generic Mapping or bytes to a QMP Message
# 2. copy Message objects so that we assign an ID only to the copy.
@ -534,9 +534,9 @@ async def _raw(
if not assign_id and 'id' in msg:
if not isinstance(exec_id, str):
raise TypeError(f"ID ('{exec_id}') must be a string.")
if exec_id.startswith('__aqmp#'):
if exec_id.startswith('__qmp#'):
raise ValueError(
f"ID ('{exec_id}') must not start with '__aqmp#'."
f"ID ('{exec_id}') must not start with '__qmp#'."
)
if not assign_id and exec_id in self._pending:

View file

@ -98,8 +98,8 @@
Sequence,
)
from qemu.aqmp import ConnectError, QMPError, SocketAddrT
from qemu.aqmp.legacy import (
from qemu.qmp import ConnectError, QMPError, SocketAddrT
from qemu.qmp.legacy import (
QEMUMonitorProtocol,
QMPBadPortError,
QMPMessage,

View file

@ -50,8 +50,8 @@
Sequence,
)
from qemu.aqmp import ConnectError, SocketAddrT
from qemu.aqmp.legacy import QEMUMonitorProtocol
from qemu.qmp import ConnectError, SocketAddrT
from qemu.qmp.legacy import QEMUMonitorProtocol
# This script has not seen many patches or careful attention in quite

View file

@ -32,7 +32,7 @@
import argparse
from qemu.aqmp import ExecuteError
from qemu.qmp import ExecuteError
from .qom_common import QOMCommand

View file

@ -27,8 +27,8 @@
TypeVar,
)
from qemu.aqmp import QMPError
from qemu.aqmp.legacy import QEMUMonitorProtocol
from qemu.qmp import QMPError
from qemu.qmp.legacy import QEMUMonitorProtocol
class ObjectPropertyInfo:

View file

@ -48,7 +48,7 @@
import fuse
from fuse import FUSE, FuseOSError, Operations
from qemu.aqmp import ExecuteError
from qemu.qmp import ExecuteError
from .qom_common import QOMCommand

View file

@ -24,7 +24,7 @@ classifiers =
[options]
python_requires = >= 3.6
packages =
qemu.aqmp
qemu.qmp
qemu.machine
qemu.utils
@ -66,9 +66,9 @@ console_scripts =
qom-tree = qemu.utils.qom:QOMTree.entry_point
qom-fuse = qemu.utils.qom_fuse:QOMFuse.entry_point [fuse]
qemu-ga-client = qemu.utils.qemu_ga_client:main
qmp-shell = qemu.aqmp.qmp_shell:main
qmp-shell-wrap = qemu.aqmp.qmp_shell:main_wrap
aqmp-tui = qemu.aqmp.aqmp_tui:main [tui]
qmp-shell = qemu.qmp.qmp_shell:main
qmp-shell-wrap = qemu.qmp.qmp_shell:main_wrap
aqmp-tui = qemu.qmp.aqmp_tui:main [tui]
[flake8]
extend-ignore = E722 # Prefer pylint's bare-except checks to flake8's
@ -84,7 +84,7 @@ namespace_packages = True
# fusepy has no type stubs:
allow_subclassing_any = True
[mypy-qemu.aqmp.aqmp_tui]
[mypy-qemu.qmp.aqmp_tui]
# urwid and urwid_readline have no type stubs:
allow_subclassing_any = True

View file

@ -6,9 +6,9 @@
import avocado
from qemu.aqmp import ConnectError, Runstate
from qemu.aqmp.protocol import AsyncProtocol, StateError
from qemu.aqmp.util import asyncio_run, create_task
from qemu.qmp import ConnectError, Runstate
from qemu.qmp.protocol import AsyncProtocol, StateError
from qemu.qmp.util import asyncio_run, create_task
class NullProtocol(AsyncProtocol[None]):
@ -183,7 +183,7 @@ def testDefaultName(self):
def testLogger(self):
self.assertEqual(
self.proto.logger.name,
'qemu.aqmp.protocol'
'qemu.qmp.protocol'
)
def testName(self):
@ -196,7 +196,7 @@ def testName(self):
self.assertEqual(
self.proto.logger.name,
'qemu.aqmp.protocol.Steve'
'qemu.qmp.protocol.Steve'
)
self.assertEqual(
@ -431,7 +431,7 @@ async def _bad_connection(self, family: str):
await self.proto.start_server_and_accept('/dev/null')
async def _hanging_connection(self):
with TemporaryDirectory(suffix='.aqmp') as tmpdir:
with TemporaryDirectory(suffix='.qmp') as tmpdir:
sock = os.path.join(tmpdir, type(self.proto).__name__ + ".sock")
await self.proto.start_server_and_accept(sock)
@ -587,7 +587,7 @@ async def _asyncTearDown(self):
@TestBase.async_test
async def testSmoke(self):
with TemporaryDirectory(suffix='.aqmp') as tmpdir:
with TemporaryDirectory(suffix='.qmp') as tmpdir:
sock = os.path.join(tmpdir, type(self.proto).__name__ + ".sock")
server_task = create_task(self.server.start_server_and_accept(sock))

View file

@ -6,7 +6,7 @@
# compatibility levels for each CPU model.
#
from qemu.aqmp.legacy import QEMUMonitorProtocol
from qemu.qmp.legacy import QEMUMonitorProtocol
import sys
if len(sys.argv) != 2:

View file

@ -36,7 +36,7 @@ from itertools import chain
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'python'))
from qemu.machine import QEMUMachine
from qemu.aqmp import ConnectError
from qemu.qmp import ConnectError
logger = logging.getLogger('device-crash-test')
dbg = logger.debug
@ -517,7 +517,7 @@ def main():
# Async QMP, when in use, is chatty about connection failures.
# This script knowingly generates a ton of connection errors.
# Silence this logger.
logging.getLogger('qemu.aqmp.qmp_client').setLevel(logging.CRITICAL)
logging.getLogger('qemu.qmp.qmp_client').setLevel(logging.CRITICAL)
fatal_failures = []
wl_stats = {}

View file

@ -4,7 +4,7 @@ import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
from qemu.aqmp import qmp_shell
from qemu.qmp import qmp_shell
if __name__ == '__main__':

View file

@ -4,7 +4,7 @@ import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
from qemu.aqmp import qmp_shell
from qemu.qmp import qmp_shell
if __name__ == '__main__':

View file

@ -25,8 +25,8 @@
from graphviz import Digraph
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'python'))
from qemu.aqmp import QMPError
from qemu.aqmp.legacy import QEMUMonitorProtocol
from qemu.qmp import QMPError
from qemu.qmp.legacy import QEMUMonitorProtocol
def perm(arr):

View file

@ -27,7 +27,7 @@
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
from qemu.machine import QEMUMachine
from qemu.aqmp import ConnectError
from qemu.qmp import ConnectError
def bench_block_job(cmd, cmd_args, qemu_args):

View file

@ -37,8 +37,8 @@
from contextlib import contextmanager
from qemu.aqmp.legacy import QMPMessage, QEMUMonitorProtocol
from qemu.machine import qtest
from qemu.qmp.legacy import QMPMessage, QEMUMonitorProtocol
from qemu.utils import VerboseProcessError
# Use this logger for logging messages directly from the iotests module

View file

@ -97,8 +97,8 @@ class TestMirrorTopPerms(iotests.QMPTestCase):
self.vm_b.add_blockdev(f'file,node-name=drive0,filename={source}')
self.vm_b.add_device('virtio-blk,drive=drive0,share-rw=on')
try:
# Silence AQMP logging errors temporarily.
with change_log_level('qemu.aqmp'):
# Silence QMP logging errors temporarily.
with change_log_level('qemu.qmp'):
self.vm_b.launch()
print('ERROR: VM B launched successfully, '
'this should not have happened')