[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 05/15] python/qemu: Add set_qmp_monitor() to QEMUMachine
From: |
Cleber Rosa |
Subject: |
[PULL 05/15] python/qemu: Add set_qmp_monitor() to QEMUMachine |
Date: |
Tue, 17 Dec 2019 00:15:11 -0500 |
From: Wainer dos Santos Moschetta <address@hidden>
The QEMUMachine VM has a monitor setup on which an QMP
connection is always attempted on _post_launch() (executed
by launch()). In case the QEMU process immediatly exits
then the qmp.accept() (used to establish the connection) stalls
until it reaches timeout and consequently an exception raises.
That behavior is undesirable when, for instance, it needs to
gather information from the QEMU binary ($ qemu -cpu list) or a
test which launches the VM expecting its failure.
This patch adds the set_qmp_monitor() method to QEMUMachine that
allows turn off the creation of the monitor machinery on VM launch.
Signed-off-by: Wainer dos Santos Moschetta <address@hidden>
Reviewed-by: Cleber Rosa <address@hidden>
Message-Id: <address@hidden>
[Cleber: trivial indentation fix]
Signed-off-by: Cleber Rosa <address@hidden>
---
python/qemu/machine.py | 70 +++++++++++++++++++++++++++---------------
1 file changed, 45 insertions(+), 25 deletions(-)
diff --git a/python/qemu/machine.py b/python/qemu/machine.py
index a4631d6934..734efd8536 100644
--- a/python/qemu/machine.py
+++ b/python/qemu/machine.py
@@ -104,6 +104,7 @@ class QEMUMachine(object):
self._events = []
self._iolog = None
self._socket_scm_helper = socket_scm_helper
+ self._qmp_set = True # Enable QMP monitor by default.
self._qmp = None
self._qemu_full_args = None
self._test_dir = test_dir
@@ -228,15 +229,16 @@ class QEMUMachine(object):
self._iolog = iolog.read()
def _base_args(self):
- if isinstance(self._monitor_address, tuple):
- moncdev = "socket,id=mon,host=%s,port=%s" % (
- self._monitor_address[0],
- self._monitor_address[1])
- else:
- moncdev = 'socket,id=mon,path=%s' % self._vm_monitor
- args = ['-chardev', moncdev,
- '-mon', 'chardev=mon,mode=control',
- '-display', 'none', '-vga', 'none']
+ args = ['-display', 'none', '-vga', 'none']
+ if self._qmp_set:
+ if isinstance(self._monitor_address, tuple):
+ moncdev = "socket,id=mon,host=%s,port=%s" % (
+ self._monitor_address[0],
+ self._monitor_address[1])
+ else:
+ moncdev = 'socket,id=mon,path=%s' % self._vm_monitor
+ args.extend(['-chardev', moncdev, '-mon',
+ 'chardev=mon,mode=control'])
if self._machine is not None:
args.extend(['-machine', self._machine])
if self._console_set:
@@ -255,20 +257,21 @@ class QEMUMachine(object):
def _pre_launch(self):
self._temp_dir = tempfile.mkdtemp(dir=self._test_dir)
- if self._monitor_address is not None:
- self._vm_monitor = self._monitor_address
- else:
- self._vm_monitor = os.path.join(self._sock_dir,
- self._name + "-monitor.sock")
- self._remove_files.append(self._vm_monitor)
self._qemu_log_path = os.path.join(self._temp_dir, self._name + ".log")
self._qemu_log_file = open(self._qemu_log_path, 'wb')
- self._qmp = qmp.QEMUMonitorProtocol(self._vm_monitor,
- server=True)
+ if self._qmp_set:
+ if self._monitor_address is not None:
+ self._vm_monitor = self._monitor_address
+ else:
+ self._vm_monitor = os.path.join(self._sock_dir,
+ self._name + "-monitor.sock")
+ self._remove_files.append(self._vm_monitor)
+ self._qmp = qmp.QEMUMonitorProtocol(self._vm_monitor, server=True)
def _post_launch(self):
- self._qmp.accept()
+ if self._qmp:
+ self._qmp.accept()
def _post_shutdown(self):
if self._qemu_log_file is not None:
@@ -330,7 +333,8 @@ class QEMUMachine(object):
Wait for the VM to power off
"""
self._popen.wait()
- self._qmp.close()
+ if self._qmp:
+ self._qmp.close()
self._load_io_log()
self._post_shutdown()
@@ -346,12 +350,13 @@ class QEMUMachine(object):
self._console_socket = None
if self.is_running():
- try:
- if not has_quit:
- self._qmp.cmd('quit')
- self._qmp.close()
- except:
- self._popen.kill()
+ if self._qmp:
+ try:
+ if not has_quit:
+ self._qmp.cmd('quit')
+ self._qmp.close()
+ except:
+ self._popen.kill()
self._popen.wait()
self._load_io_log()
@@ -368,6 +373,21 @@ class QEMUMachine(object):
self._launched = False
+ def set_qmp_monitor(self, enabled=True):
+ """
+ Set the QMP monitor.
+
+ @param enabled: if False, qmp monitor options will be removed from
+ the base arguments of the resulting QEMU command
+ line. Default is True.
+ @note: call this function before launch().
+ """
+ if enabled:
+ self._qmp_set = True
+ else:
+ self._qmp_set = False
+ self._qmp = None
+
def qmp(self, cmd, conv_keys=True, **args):
"""
Invoke a QMP command and return the response dict
--
2.21.0
- [PULL 00/15] Python queue 2019-12-17, Cleber Rosa, 2019/12/17
- [PULL 01/15] tests/boot_linux_console: Fetch assets from Debian snapshot archives, Cleber Rosa, 2019/12/17
- [PULL 02/15] Revert "Acceptance test: cancel test if m68k kernel packages goes missing", Cleber Rosa, 2019/12/17
- [PULL 03/15] analyze-migration.py: fix find() type error, Cleber Rosa, 2019/12/17
- [PULL 04/15] analyze-migration.py: replace numpy with python 3.2, Cleber Rosa, 2019/12/17
- [PULL 05/15] python/qemu: Add set_qmp_monitor() to QEMUMachine,
Cleber Rosa <=
- [PULL 06/15] tests/acceptance: Makes linux_initrd and empty_cpu_model use QEMUMachine, Cleber Rosa, 2019/12/17
- [PULL 07/15] Acceptance test x86_cpu_model_versions: use default vm, Cleber Rosa, 2019/12/17
- [PULL 08/15] Acceptance tests: introduce utility method for tags unique vals, Cleber Rosa, 2019/12/17
- [PULL 09/15] Acceptance tests: use avocado tags for machine type, Cleber Rosa, 2019/12/17
- [PULL 10/15] Acceptance tests: use relative location for tests, Cleber Rosa, 2019/12/17
- [PULL 11/15] python/qemu: Move kvm_available() to its own module, Cleber Rosa, 2019/12/17
- [PULL 12/15] python/qemu: accel: Add list_accel() method, Cleber Rosa, 2019/12/17
- [PULL 13/15] python/qemu: accel: Strengthen kvm_available() checks, Cleber Rosa, 2019/12/17
- [PULL 14/15] python/qemu: accel: Add tcg_available() method, Cleber Rosa, 2019/12/17
- [PULL 15/15] python/qemu: Remove unneeded imports in __init__, Cleber Rosa, 2019/12/17