From: Wainer dos Santos Moschetta <wainersm@redhat.com>
To: qemu-devel@nongnu.org
Cc: philmd@redhat.com, ehabkost@redhat.com, crosa@redhat.com
Subject: [PATCH v2 1/2] python/qemu: Add set_qmp_monitor() to QEMUMachine
Date: Wed, 11 Dec 2019 13:55:35 -0500 [thread overview]
Message-ID: <20191211185536.16962-2-wainersm@redhat.com> (raw)
In-Reply-To: <20191211185536.16962-1-wainersm@redhat.com>
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 <wainersm@redhat.com>
Reviewed-by: Cleber Rosa <crosa@redhat.com>
---
python/qemu/machine.py | 66 +++++++++++++++++++++++++++---------------
1 file changed, 43 insertions(+), 23 deletions(-)
diff --git a/python/qemu/machine.py b/python/qemu/machine.py
index a4631d6934..7d4d621a42 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" % (
+ 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 = ['-chardev', moncdev,
- '-mon', 'chardev=mon,mode=control',
- '-display', 'none', '-vga', 'none']
+ 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
next prev parent reply other threads:[~2019-12-11 18:59 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-11 18:55 [PATCH v2 0/2] tests/acceptance: Use QEMUMachine on tests that expect failure Wainer dos Santos Moschetta
2019-12-11 18:55 ` Wainer dos Santos Moschetta [this message]
2019-12-12 14:13 ` [PATCH v2 1/2] python/qemu: Add set_qmp_monitor() to QEMUMachine Cleber Rosa
2019-12-13 12:46 ` Wainer dos Santos Moschetta
2019-12-15 19:51 ` Cleber Rosa
2019-12-11 18:55 ` [PATCH v2 2/2] tests/acceptance: Makes linux_initrd and empty_cpu_model use QEMUMachine Wainer dos Santos Moschetta
2019-12-15 19:51 ` Cleber Rosa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191211185536.16962-2-wainersm@redhat.com \
--to=wainersm@redhat.com \
--cc=crosa@redhat.com \
--cc=ehabkost@redhat.com \
--cc=philmd@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).