python/qmp: switch qemu-ga-client to AQMP

Async QMP always raises a "ConnectError" on any connection error which
houses the cause in a second exception. We can check if this root cause
was python's ConnectionError to determine a fairly similar condition to
the original error check here.

Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Beraldo Leal <bleal@redhat.com>
This commit is contained in:
John Snow 2022-01-10 18:28:51 -05:00
parent 7017f3853a
commit 26db07516f
1 changed files with 11 additions and 11 deletions

View File

@ -37,8 +37,8 @@ See also: https://wiki.qemu.org/Features/QAPI/GuestAgent
# the COPYING file in the top-level directory. # the COPYING file in the top-level directory.
import argparse import argparse
import asyncio
import base64 import base64
import errno
import os import os
import random import random
import sys import sys
@ -50,8 +50,8 @@ from typing import (
Sequence, Sequence,
) )
from qemu import qmp from qemu.aqmp import ConnectError, SocketAddrT
from qemu.qmp import SocketAddrT from qemu.aqmp.legacy import QEMUMonitorProtocol
# This script has not seen many patches or careful attention in quite # This script has not seen many patches or careful attention in quite
@ -61,7 +61,7 @@ from qemu.qmp import SocketAddrT
# pylint: disable=missing-docstring # pylint: disable=missing-docstring
class QemuGuestAgent(qmp.QEMUMonitorProtocol): class QemuGuestAgent(QEMUMonitorProtocol):
def __getattr__(self, name: str) -> Callable[..., Any]: def __getattr__(self, name: str) -> Callable[..., Any]:
def wrapper(**kwds: object) -> object: def wrapper(**kwds: object) -> object:
return self.command('guest-' + name.replace('_', '-'), **kwds) return self.command('guest-' + name.replace('_', '-'), **kwds)
@ -149,7 +149,7 @@ class QemuGuestAgentClient:
self.qga.settimeout(timeout) self.qga.settimeout(timeout)
try: try:
self.qga.ping() self.qga.ping()
except TimeoutError: except asyncio.TimeoutError:
return False return False
return True return True
@ -172,7 +172,7 @@ class QemuGuestAgentClient:
try: try:
getattr(self.qga, 'suspend' + '_' + mode)() getattr(self.qga, 'suspend' + '_' + mode)()
# On error exception will raise # On error exception will raise
except TimeoutError: except asyncio.TimeoutError:
# On success command will timed out # On success command will timed out
return return
@ -182,7 +182,7 @@ class QemuGuestAgentClient:
try: try:
self.qga.shutdown(mode=mode) self.qga.shutdown(mode=mode)
except TimeoutError: except asyncio.TimeoutError:
pass pass
@ -277,7 +277,7 @@ commands = [m.replace('_cmd_', '') for m in dir() if '_cmd_' in m]
def send_command(address: str, cmd: str, args: Sequence[str]) -> None: def send_command(address: str, cmd: str, args: Sequence[str]) -> None:
if not os.path.exists(address): if not os.path.exists(address):
print('%s not found' % address) print(f"'{address}' not found. (Is QEMU running?)")
sys.exit(1) sys.exit(1)
if cmd not in commands: if cmd not in commands:
@ -287,10 +287,10 @@ def send_command(address: str, cmd: str, args: Sequence[str]) -> None:
try: try:
client = QemuGuestAgentClient(address) client = QemuGuestAgentClient(address)
except OSError as err: except ConnectError as err:
print(err) print(err)
if err.errno == errno.ECONNREFUSED: if isinstance(err.exc, ConnectionError):
print('Hint: qemu is not running?') print('(Is QEMU running?)')
sys.exit(1) sys.exit(1)
if cmd == 'fsfreeze' and args[0] == 'freeze': if cmd == 'fsfreeze' and args[0] == 'freeze':