summaryrefslogtreecommitdiffstats
path: root/python/qemu/machine
diff options
context:
space:
mode:
authorPeter Maydell2021-09-02 14:00:52 +0200
committerPeter Maydell2021-09-02 14:00:52 +0200
commit9093028dd48c50bc0392791f78aab44afef57ead (patch)
treeac9ab96c78172fff29ac3da160f39e0bc012637e /python/qemu/machine
parentMerge remote-tracking branch 'remotes/stefanberger/tags/pull-tpm-2021-09-01-1... (diff)
parentblock/file-win32: add reopen handlers (diff)
downloadqemu-9093028dd48c50bc0392791f78aab44afef57ead.tar.gz
qemu-9093028dd48c50bc0392791f78aab44afef57ead.tar.xz
qemu-9093028dd48c50bc0392791f78aab44afef57ead.zip
Merge remote-tracking branch 'remotes/hreitz/tags/pull-block-2021-09-01' into staging
Block patches: - Make the backup-top filter driver available for user-created block nodes (i.e. via blockdev-add) - Allow running iotests with gdb or valgrind being attached to qemu instances - Fix the raw format driver's permissions: There is no metadata, so we only need WRITE or RESIZE when the parent needs it - Basic reopen implementation for win32 files (file-win32.c) so that qemu-img commit can work - uclibc/musl build fix for the FUSE export code - Some iotests delinting - block-hmp-cmds.c refactoring # gpg: Signature made Wed 01 Sep 2021 16:01:54 BST # gpg: using RSA key CB62D7A0EE3829E45F004D34A1FA40D098019CDF # gpg: issuer "hreitz@redhat.com" # gpg: Good signature from "Hanna Reitz <hreitz@redhat.com>" [marginal] # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: CB62 D7A0 EE38 29E4 5F00 4D34 A1FA 40D0 9801 9CDF * remotes/hreitz/tags/pull-block-2021-09-01: (56 commits) block/file-win32: add reopen handlers block/export/fuse.c: fix fuse-lseek on uclibc or musl block/block-copy: block_copy_state_new(): drop extra arguments iotests/image-fleecing: add test-case for copy-before-write filter iotests/image-fleecing: prepare for adding new test-case iotests/image-fleecing: rename tgt_node iotests/image-fleecing: proper source device iotests.py: hmp_qemu_io: support qdev iotests: move 222 to tests/image-fleecing iotests/222: constantly use single quotes for strings iotests/222: fix pylint and mypy complains python:QEMUMachine: template typing for self returning methods python/qemu/machine: QEMUMachine: improve qmp() method python/qemu/machine.py: refactor _qemu_args() qapi: publish copy-before-write filter block/copy-before-write: make public block driver block/block-copy: make setting progress optional block/copy-before-write: initialize block-copy bitmap block/copy-before-write: cbw_init(): use options block/copy-before-write: bdrv_cbw_append(): drop unused compress arg ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'python/qemu/machine')
-rw-r--r--python/qemu/machine/machine.py56
-rw-r--r--python/qemu/machine/qtest.py9
2 files changed, 43 insertions, 22 deletions
diff --git a/python/qemu/machine/machine.py b/python/qemu/machine/machine.py
index 971ed7e8c6..a7081b1845 100644
--- a/python/qemu/machine/machine.py
+++ b/python/qemu/machine/machine.py
@@ -36,6 +36,7 @@ from typing import (
Sequence,
Tuple,
Type,
+ TypeVar,
)
from qemu.qmp import ( # pylint: disable=import-error
@@ -73,6 +74,9 @@ class AbnormalShutdown(QEMUMachineError):
"""
+_T = TypeVar('_T', bound='QEMUMachine')
+
+
class QEMUMachine:
"""
A QEMU VM.
@@ -97,7 +101,8 @@ class QEMUMachine:
sock_dir: Optional[str] = None,
drain_console: bool = False,
console_log: Optional[str] = None,
- log_dir: Optional[str] = None):
+ log_dir: Optional[str] = None,
+ qmp_timer: Optional[float] = None):
'''
Initialize a QEMUMachine
@@ -112,6 +117,7 @@ class QEMUMachine:
@param drain_console: (optional) True to drain console socket to buffer
@param console_log: (optional) path to console log file
@param log_dir: where to create and keep log files
+ @param qmp_timer: (optional) default QMP socket timeout
@note: Qemu process is not started until launch() is used.
'''
# pylint: disable=too-many-arguments
@@ -121,6 +127,7 @@ class QEMUMachine:
self._binary = binary
self._args = list(args)
self._wrapper = wrapper
+ self._qmp_timer = qmp_timer
self._name = name or "qemu-%d" % os.getpid()
self._base_temp_dir = base_temp_dir
@@ -166,7 +173,7 @@ class QEMUMachine:
self._remove_files: List[str] = []
self._user_killed = False
- def __enter__(self) -> 'QEMUMachine':
+ def __enter__(self: _T) -> _T:
return self
def __exit__(self,
@@ -182,8 +189,8 @@ class QEMUMachine:
self._args.append('-monitor')
self._args.append('null')
- def add_fd(self, fd: int, fdset: int,
- opaque: str, opts: str = '') -> 'QEMUMachine':
+ def add_fd(self: _T, fd: int, fdset: int,
+ opaque: str, opts: str = '') -> _T:
"""
Pass a file descriptor to the VM
"""
@@ -343,7 +350,12 @@ class QEMUMachine:
def _post_launch(self) -> None:
if self._qmp_connection:
- self._qmp.accept()
+ self._qmp.accept(self._qmp_timer)
+
+ def _close_qemu_log_file(self) -> None:
+ if self._qemu_log_file is not None:
+ self._qemu_log_file.close()
+ self._qemu_log_file = None
def _post_shutdown(self) -> None:
"""
@@ -357,9 +369,7 @@ class QEMUMachine:
self._qmp.close()
self._qmp_connection = None
- if self._qemu_log_file is not None:
- self._qemu_log_file.close()
- self._qemu_log_file = None
+ self._close_qemu_log_file()
self._load_io_log()
@@ -564,22 +574,30 @@ class QEMUMachine:
return self._qmp_connection
@classmethod
- def _qmp_args(cls, _conv_keys: bool = True, **args: Any) -> Dict[str, Any]:
- qmp_args = dict()
- for key, value in args.items():
- if _conv_keys:
- qmp_args[key.replace('_', '-')] = value
- else:
- qmp_args[key] = value
- return qmp_args
+ def _qmp_args(cls, conv_keys: bool,
+ args: Dict[str, Any]) -> Dict[str, object]:
+ if conv_keys:
+ return {k.replace('_', '-'): v for k, v in args.items()}
+
+ return args
def qmp(self, cmd: str,
- conv_keys: bool = True,
+ args_dict: Optional[Dict[str, object]] = None,
+ conv_keys: Optional[bool] = None,
**args: Any) -> QMPMessage:
"""
Invoke a QMP command and return the response dict
"""
- qmp_args = self._qmp_args(conv_keys, **args)
+ if args_dict is not None:
+ assert not args
+ assert conv_keys is None
+ args = args_dict
+ conv_keys = False
+
+ if conv_keys is None:
+ conv_keys = True
+
+ qmp_args = self._qmp_args(conv_keys, args)
return self._qmp.cmd(cmd, args=qmp_args)
def command(self, cmd: str,
@@ -590,7 +608,7 @@ class QEMUMachine:
On success return the response dict.
On failure raise an exception.
"""
- qmp_args = self._qmp_args(conv_keys, **args)
+ qmp_args = self._qmp_args(conv_keys, args)
return self._qmp.command(cmd, **qmp_args)
def get_qmp_event(self, wait: bool = False) -> Optional[QMPMessage]:
diff --git a/python/qemu/machine/qtest.py b/python/qemu/machine/qtest.py
index d6d9c6a34a..395cc8fbfe 100644
--- a/python/qemu/machine/qtest.py
+++ b/python/qemu/machine/qtest.py
@@ -112,19 +112,22 @@ class QEMUQtestMachine(QEMUMachine):
def __init__(self,
binary: str,
args: Sequence[str] = (),
+ wrapper: Sequence[str] = (),
name: Optional[str] = None,
base_temp_dir: str = "/var/tmp",
socket_scm_helper: Optional[str] = None,
- sock_dir: Optional[str] = None):
+ sock_dir: Optional[str] = None,
+ qmp_timer: Optional[float] = None):
# pylint: disable=too-many-arguments
if name is None:
name = "qemu-%d" % os.getpid()
if sock_dir is None:
sock_dir = base_temp_dir
- super().__init__(binary, args, name=name, base_temp_dir=base_temp_dir,
+ super().__init__(binary, args, wrapper=wrapper, name=name,
+ base_temp_dir=base_temp_dir,
socket_scm_helper=socket_scm_helper,
- sock_dir=sock_dir)
+ sock_dir=sock_dir, qmp_timer=qmp_timer)
self._qtest: Optional[QEMUQtestProtocol] = None
self._qtest_path = os.path.join(sock_dir, name + "-qtest.sock")