01f9005feb
- Backport aqmp patches from upstream which can fix iotest issues * Patches added: python-aqmp-add-__del__-method-to-legacy.patch python-aqmp-add-_session_guard.patch python-aqmp-add-SocketAddrT-to-package-r.patch python-aqmp-add-socket-bind-step-to-lega.patch python-aqmp-add-start_server-and-accept-.patch python-aqmp-copy-type-definitions-from-q.patch python-aqmp-drop-_bind_hack.patch python-aqmp-fix-docstring-typo.patch python-aqmp-Fix-negotiation-with-pre-oob.patch python-aqmp-fix-race-condition-in-legacy.patch Python-aqmp-fix-type-definitions-for-myp.patch python-aqmp-handle-asyncio.TimeoutError-.patch python-aqmp-refactor-_do_accept-into-two.patch python-aqmp-remove-_new_session-and-_est.patch python-aqmp-rename-accept-to-start_serve.patch python-aqmp-rename-AQMPError-to-QMPError.patch python-aqmp-split-_client_connected_cb-o.patch python-aqmp-squelch-pylint-warning-for-t.patch python-aqmp-stop-the-server-during-disco.patch python-introduce-qmp-shell-wrap-convenie.patch python-machine-raise-VMLaunchFailure-exc.patch python-move-qmp-shell-under-the-AQMP-pac.patch python-move-qmp-utilities-to-python-qemu.patch python-qmp-switch-qmp-shell-to-AQMP.patch python-support-recording-QMP-session-to-.patch python-upgrade-mypy-to-0.780.patch - Drop the patches which are workaround to fix iotest issues * Patches dropped: Revert-python-iotests-replace-qmp-with-a.patch Revert-python-machine-add-instance-disam.patch Revert-python-machine-add-sock_dir-prope.patch Revert-python-machine-handle-fast-QEMU-t.patch Revert-python-machine-move-more-variable.patch Revert-python-machine-remove-_remove_mon.patch OBS-URL: https://build.opensuse.org/request/show/966963 OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=708
164 lines
6.7 KiB
Diff
164 lines
6.7 KiB
Diff
From: John Snow <jsnow@redhat.com>
|
|
Date: Fri, 25 Feb 2022 15:59:40 -0500
|
|
Subject: python/aqmp: rename 'accept()' to 'start_server_and_accept()'
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Git-commit: 0ba4e76b23fed77d09be7f56da783ab3f0b2d497
|
|
|
|
Previously, I had a method named "accept()" that under-the-hood calls
|
|
bind(2), listen(2) *and* accept(2). I meant this as a simplification and
|
|
counterpart to the one-shot "connect()" method.
|
|
|
|
This is confusing to readers who expect accept() to mean *just*
|
|
accept(2). Since I need to split apart the "accept()" method into
|
|
multiple methods anyway (one of which strongly resembling accept(2)), it
|
|
feels pertinent to rename this method *now*.
|
|
|
|
Rename this all-in-one method "start_server_and_accept()" instead.
|
|
|
|
Signed-off-by: John Snow <jsnow@redhat.com>
|
|
Acked-by: Kevin Wolf <kwolf@redhat.com>
|
|
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
|
Message-id: 20220225205948.3693480-3-jsnow@redhat.com
|
|
Signed-off-by: John Snow <jsnow@redhat.com>
|
|
Signed-off-by: Li Zhang <lizhang@suse.de>
|
|
---
|
|
python/qemu/aqmp/legacy.py | 2 +-
|
|
python/qemu/aqmp/protocol.py | 6 ++++--
|
|
python/tests/protocol.py | 24 ++++++++++++------------
|
|
3 files changed, 17 insertions(+), 15 deletions(-)
|
|
|
|
diff --git a/python/qemu/aqmp/legacy.py b/python/qemu/aqmp/legacy.py
|
|
index 6baa5f3409a6b459c67097d3c2a0..dca1e76ed4994959caf542031363 100644
|
|
--- a/python/qemu/aqmp/legacy.py
|
|
+++ b/python/qemu/aqmp/legacy.py
|
|
@@ -91,7 +91,7 @@ class QEMUMonitorProtocol(qemu.qmp.QEMUMonitorProtocol):
|
|
self._aqmp.negotiate = True
|
|
|
|
self._sync(
|
|
- self._aqmp.accept(self._address),
|
|
+ self._aqmp.start_server_and_accept(self._address),
|
|
timeout
|
|
)
|
|
|
|
diff --git a/python/qemu/aqmp/protocol.py b/python/qemu/aqmp/protocol.py
|
|
index 009883f64d011e44dd003e9dcde3..73719257e058b7e9e4d8a281bcd9 100644
|
|
--- a/python/qemu/aqmp/protocol.py
|
|
+++ b/python/qemu/aqmp/protocol.py
|
|
@@ -265,8 +265,10 @@ class AsyncProtocol(Generic[T]):
|
|
|
|
@upper_half
|
|
@require(Runstate.IDLE)
|
|
- async def accept(self, address: SocketAddrT,
|
|
- ssl: Optional[SSLContext] = None) -> None:
|
|
+ async def start_server_and_accept(
|
|
+ self, address: SocketAddrT,
|
|
+ ssl: Optional[SSLContext] = None
|
|
+ ) -> None:
|
|
"""
|
|
Accept a connection and begin processing message queues.
|
|
|
|
diff --git a/python/tests/protocol.py b/python/tests/protocol.py
|
|
index 5cd7938be35ec61a1d412728f64e..354d6559b9d1e3dc3ad29598af3c 100644
|
|
--- a/python/tests/protocol.py
|
|
+++ b/python/tests/protocol.py
|
|
@@ -413,14 +413,14 @@ class Accept(Connect):
|
|
assert family in ('INET', 'UNIX')
|
|
|
|
if family == 'INET':
|
|
- await self.proto.accept(('example.com', 1))
|
|
+ await self.proto.start_server_and_accept(('example.com', 1))
|
|
elif family == 'UNIX':
|
|
- await self.proto.accept('/dev/null')
|
|
+ await self.proto.start_server_and_accept('/dev/null')
|
|
|
|
async def _hanging_connection(self):
|
|
with TemporaryDirectory(suffix='.aqmp') as tmpdir:
|
|
sock = os.path.join(tmpdir, type(self.proto).__name__ + ".sock")
|
|
- await self.proto.accept(sock)
|
|
+ await self.proto.start_server_and_accept(sock)
|
|
|
|
|
|
class FakeSession(TestBase):
|
|
@@ -449,13 +449,13 @@ class FakeSession(TestBase):
|
|
@TestBase.async_test
|
|
async def testFakeAccept(self):
|
|
"""Test the full state lifecycle (via accept) with a no-op session."""
|
|
- await self.proto.accept('/not/a/real/path')
|
|
+ await self.proto.start_server_and_accept('/not/a/real/path')
|
|
self.assertEqual(self.proto.runstate, Runstate.RUNNING)
|
|
|
|
@TestBase.async_test
|
|
async def testFakeRecv(self):
|
|
"""Test receiving a fake/null message."""
|
|
- await self.proto.accept('/not/a/real/path')
|
|
+ await self.proto.start_server_and_accept('/not/a/real/path')
|
|
|
|
logname = self.proto.logger.name
|
|
with self.assertLogs(logname, level='DEBUG') as context:
|
|
@@ -471,7 +471,7 @@ class FakeSession(TestBase):
|
|
@TestBase.async_test
|
|
async def testFakeSend(self):
|
|
"""Test sending a fake/null message."""
|
|
- await self.proto.accept('/not/a/real/path')
|
|
+ await self.proto.start_server_and_accept('/not/a/real/path')
|
|
|
|
logname = self.proto.logger.name
|
|
with self.assertLogs(logname, level='DEBUG') as context:
|
|
@@ -493,7 +493,7 @@ class FakeSession(TestBase):
|
|
):
|
|
with self.assertRaises(StateError) as context:
|
|
if accept:
|
|
- await self.proto.accept('/not/a/real/path')
|
|
+ await self.proto.start_server_and_accept('/not/a/real/path')
|
|
else:
|
|
await self.proto.connect('/not/a/real/path')
|
|
|
|
@@ -504,7 +504,7 @@ class FakeSession(TestBase):
|
|
@TestBase.async_test
|
|
async def testAcceptRequireRunning(self):
|
|
"""Test that accept() cannot be called when Runstate=RUNNING"""
|
|
- await self.proto.accept('/not/a/real/path')
|
|
+ await self.proto.start_server_and_accept('/not/a/real/path')
|
|
|
|
await self._prod_session_api(
|
|
Runstate.RUNNING,
|
|
@@ -515,7 +515,7 @@ class FakeSession(TestBase):
|
|
@TestBase.async_test
|
|
async def testConnectRequireRunning(self):
|
|
"""Test that connect() cannot be called when Runstate=RUNNING"""
|
|
- await self.proto.accept('/not/a/real/path')
|
|
+ await self.proto.start_server_and_accept('/not/a/real/path')
|
|
|
|
await self._prod_session_api(
|
|
Runstate.RUNNING,
|
|
@@ -526,7 +526,7 @@ class FakeSession(TestBase):
|
|
@TestBase.async_test
|
|
async def testAcceptRequireDisconnecting(self):
|
|
"""Test that accept() cannot be called when Runstate=DISCONNECTING"""
|
|
- await self.proto.accept('/not/a/real/path')
|
|
+ await self.proto.start_server_and_accept('/not/a/real/path')
|
|
|
|
# Cheat: force a disconnect.
|
|
await self.proto.simulate_disconnect()
|
|
@@ -541,7 +541,7 @@ class FakeSession(TestBase):
|
|
@TestBase.async_test
|
|
async def testConnectRequireDisconnecting(self):
|
|
"""Test that connect() cannot be called when Runstate=DISCONNECTING"""
|
|
- await self.proto.accept('/not/a/real/path')
|
|
+ await self.proto.start_server_and_accept('/not/a/real/path')
|
|
|
|
# Cheat: force a disconnect.
|
|
await self.proto.simulate_disconnect()
|
|
@@ -576,7 +576,7 @@ class SimpleSession(TestBase):
|
|
async def testSmoke(self):
|
|
with TemporaryDirectory(suffix='.aqmp') as tmpdir:
|
|
sock = os.path.join(tmpdir, type(self.proto).__name__ + ".sock")
|
|
- server_task = create_task(self.server.accept(sock))
|
|
+ server_task = create_task(self.server.start_server_and_accept(sock))
|
|
|
|
# give the server a chance to start listening [...]
|
|
await asyncio.sleep(0)
|