[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 10/20] python/aqmp: add _cb_inbound and _cb_inbound logging hooks
From: |
John Snow |
Subject: |
[PATCH 10/20] python/aqmp: add _cb_inbound and _cb_inbound logging hooks |
Date: |
Thu, 1 Jul 2021 00:13:03 -0400 |
Add hooks designed to log/filter incoming/outgoing messages. The primary
intent for these is to be able to support iotests which may want to log
messages with specific filters for reproducible output.
Another use is for plugging into Urwid frameworks; all messages in/out
can be automatically added to a rendering list for the purposes of a
qmp-shell like tool.
Signed-off-by: John Snow <jsnow@redhat.com>
---
python/qemu/aqmp/protocol.py | 50 +++++++++++++++++++++++++++++++++---
1 file changed, 46 insertions(+), 4 deletions(-)
diff --git a/python/qemu/aqmp/protocol.py b/python/qemu/aqmp/protocol.py
index a32a8cbbf6..72c9e95198 100644
--- a/python/qemu/aqmp/protocol.py
+++ b/python/qemu/aqmp/protocol.py
@@ -176,6 +176,11 @@ class AsyncProtocol(Generic[T]):
can be written after the super() call.
- `_on_message`:
Actions to be performed when a message is received.
+ - `_cb_outbound`:
+ Logging/Filtering hook for all outbound messages.
+ - `_cb_inbound`:
+ Logging/Filtering hook for all inbound messages.
+ This hook runs *before* `_on_message()`.
:param name:
Name used for logging messages, if any. By default, messages
@@ -700,6 +705,43 @@ async def _bh_recv_message(self) -> None:
# Section: Message I/O
# --------------------
+ @upper_half
+ @bottom_half
+ def _cb_outbound(self, msg: T) -> T:
+ """
+ Callback: outbound message hook.
+
+ This is intended for subclasses to be able to add arbitrary
+ hooks to filter or manipulate outgoing messages. The base
+ implementation does nothing but log the message without any
+ manipulation of the message.
+
+ :param msg: raw outbound message
+ :return: final outbound message
+ """
+ self.logger.debug("--> %s", str(msg))
+ return msg
+
+ @upper_half
+ @bottom_half
+ def _cb_inbound(self, msg: T) -> T:
+ """
+ Callback: inbound message hook.
+
+ This is intended for subclasses to be able to add arbitrary
+ hooks to filter or manipulate incoming messages. The base
+ implementation does nothing but log the message without any
+ manipulation of the message.
+
+ This method does not "handle" incoming messages; it is a filter.
+ The actual "endpoint" for incoming messages is `_on_message()`.
+
+ :param msg: raw inbound message
+ :return: processed inbound message
+ """
+ self.logger.debug("<-- %s", str(msg))
+ return msg
+
@upper_half
@bottom_half
async def _do_recv(self) -> T:
@@ -728,8 +770,8 @@ async def _recv(self) -> T:
:return: A single (filtered, processed) protocol message.
"""
- # A forthcoming commit makes this method less trivial.
- return await self._do_recv()
+ message = await self._do_recv()
+ return self._cb_inbound(message)
@upper_half
@bottom_half
@@ -759,7 +801,7 @@ async def _send(self, msg: T) -> None:
:raise OSError: For problems with the underlying stream.
"""
- # A forthcoming commit makes this method less trivial.
+ msg = self._cb_outbound(msg)
self._do_send(msg)
@bottom_half
@@ -774,6 +816,6 @@ async def _on_message(self, msg: T) -> None:
directly cause the loop to halt, so logic may be best-kept
to a minimum if at all possible.
- :param msg: The incoming message
+ :param msg: The incoming message, already logged/filtered.
"""
# Nothing to do in the abstract case.
--
2.31.1
- [PATCH 03/20] python/aqmp: add asynchronous QMP (AQMP) subpackage, (continued)
- [PATCH 03/20] python/aqmp: add asynchronous QMP (AQMP) subpackage, John Snow, 2021/07/01
- [PATCH 01/20] python/pylint: Add exception for TypeVar names ('T'), John Snow, 2021/07/01
- [PATCH 04/20] python/aqmp: add error classes, John Snow, 2021/07/01
- [PATCH 02/20] python/pylint: disable too-many-function-args, John Snow, 2021/07/01
- [PATCH 05/20] python/aqmp: add asyncio compatibility wrappers, John Snow, 2021/07/01
- [PATCH 07/20] python/aqmp: add runstate state machine to AsyncProtocol, John Snow, 2021/07/01
- [PATCH 08/20] python/aqmp: add logging to AsyncProtocol, John Snow, 2021/07/01
- [PATCH 06/20] python/aqmp: add generic async message-based protocol support, John Snow, 2021/07/01
- [PATCH 09/20] python/aqmp: add AsyncProtocol.accept() method, John Snow, 2021/07/01
- [PATCH 11/20] python/aqmp: add AsyncProtocol._readline() method, John Snow, 2021/07/01
- [PATCH 10/20] python/aqmp: add _cb_inbound and _cb_inbound logging hooks,
John Snow <=
- [PATCH 13/20] python/aqmp: add well-known QMP object models, John Snow, 2021/07/01
- [PATCH 12/20] python/aqmp: add QMP Message format, John Snow, 2021/07/01
- [PATCH 16/20] python/aqmp: Add message routing to QMP protocol, John Snow, 2021/07/01
- [PATCH 17/20] python/aqmp: add execute() interfaces, John Snow, 2021/07/01
- [PATCH 15/20] python/aqmp: add QMP protocol support, John Snow, 2021/07/01
- [PATCH 14/20] python/aqmp: add QMP event support, John Snow, 2021/07/01
- [PATCH 18/20] python/aqmp: add _raw() execution interface, John Snow, 2021/07/01
- [PATCH 19/20] python/aqmp: add asyncio_run compatibility wrapper, John Snow, 2021/07/01