Skip to content

Commit

Permalink
nixos/lib/test-driver: add wait_for_qmp_event
Browse files Browse the repository at this point in the history
Adds a function to wait for a new QMP event with a model filter
so that you can expect specific type of events with specific payloads.

e.g. a guest-reset-induced shutdown event.
  • Loading branch information
RaitoBezarius committed Jan 25, 2024
1 parent 5545bc8 commit 1196ae6
Showing 1 changed file with 24 additions and 0 deletions.
24 changes: 24 additions & 0 deletions nixos/lib/test-driver/test_driver/machine.py
Original file line number Diff line number Diff line change
Expand Up @@ -740,6 +740,30 @@ def wait_for_shutdown(self) -> None:
self.booted = False
self.connected = False

def wait_for_qmp_event(self, event_filter: Callable[[dict[str, Any]], bool], timeout: int = 60 * 10) -> dict[str, Any]:
"""
Wait for a QMP event which you can filter with the `event_filter` function.
The function takes as an input a dictionary of the event and if it returns True, we return that event,
if it does not, we wait for the next event and retry.
It will skip all events received in the meantime, if you want to keep them,
you have to do the bookkeeping yourself and store them somewhere.
By default, it will wait up to 10 minutes, `timeout` is in seconds.
"""
if self.qmp_client is None:
raise RuntimeError('QMP API is not ready yet, is the VM ready?')

start = time.time()
while True:
evt = self.qmp_client.wait_for_event(timeout=timeout)
if event_filter(evt):
return evt

elapsed = time.time() - start
if elapsed >= timeout:
raise TimeoutError

def get_tty_text(self, tty: str) -> str:
status, output = self.execute(
f"fold -w$(stty -F /dev/tty{tty} size | "
Expand Down

0 comments on commit 1196ae6

Please sign in to comment.