From nobody Sat Apr 27 18:33:40 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1501491236208253.36576714933062; Mon, 31 Jul 2017 01:53:56 -0700 (PDT) Received: from localhost ([::1]:58160 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dc6SY-0007Em-TB for importer@patchew.org; Mon, 31 Jul 2017 04:53:54 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53348) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dc6Qq-0006AZ-8r for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dc6Qm-0000RL-Ce for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:08 -0400 Received: from mx1.redhat.com ([209.132.183.28]:51404) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dc6Qm-0000QV-6k for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:04 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9674F372205; Mon, 31 Jul 2017 08:52:01 +0000 (UTC) Received: from t460p.pahim.org.com (ovpn-204-234.brq.redhat.com [10.40.204.234]) by smtp.corp.redhat.com (Postfix) with ESMTP id E13B518225; Mon, 31 Jul 2017 08:51:58 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 9674F372205 Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=apahim@redhat.com From: Amador Pahim To: qemu-devel@nongnu.org Date: Mon, 31 Jul 2017 10:51:04 +0200 Message-Id: <20170731085110.1050-2-apahim@redhat.com> In-Reply-To: <20170731085110.1050-1-apahim@redhat.com> References: <20170731085110.1050-1-apahim@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Mon, 31 Jul 2017 08:52:01 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 1/7] qemu.py: use poll() instead of 'returncode' X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, ldoktor@redhat.com, famz@redhat.com, ehabkost@redhat.com, stefanha@gmail.com, Amador Pahim , armbru@redhat.com, mreitz@redhat.com, crosa@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The 'returncode' Popen attribute is not guaranteed to be updated. It actually depends on a call to either poll(), wait() or communicate(). On the other hand, poll() will: "Check if child process has terminated. Set and return returncode attribute." Let's use the poll() to check whether the process is running and also to get the updated process exit code, when the process is finished. Signed-off-by: Amador Pahim Reviewed-by: Fam Zheng Reviewed-by: Stefan Hajnoczi --- scripts/qemu.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/qemu.py b/scripts/qemu.py index 880e3e8219..2f1984c93c 100644 --- a/scripts/qemu.py +++ b/scripts/qemu.py @@ -86,12 +86,12 @@ class QEMUMachine(object): raise =20 def is_running(self): - return self._popen and (self._popen.returncode is None) + return self._popen and (self._popen.poll() is None) =20 def exitcode(self): if self._popen is None: return None - return self._popen.returncode + return self._popen.poll() =20 def get_pid(self): if not self.is_running(): --=20 2.13.3 From nobody Sat Apr 27 18:33:40 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1501491228254899.3355339423139; Mon, 31 Jul 2017 01:53:48 -0700 (PDT) Received: from localhost ([::1]:58158 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dc6SQ-00077t-EE for importer@patchew.org; Mon, 31 Jul 2017 04:53:46 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53346) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dc6Qq-0006AY-8L for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dc6Qo-0000ST-5r for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:08 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33376) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dc6Qn-0000Rq-Vl for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:06 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DEB5552C67; Mon, 31 Jul 2017 08:52:04 +0000 (UTC) Received: from t460p.pahim.org.com (ovpn-204-234.brq.redhat.com [10.40.204.234]) by smtp.corp.redhat.com (Postfix) with ESMTP id F41F360606; Mon, 31 Jul 2017 08:52:01 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com DEB5552C67 Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=apahim@redhat.com From: Amador Pahim To: qemu-devel@nongnu.org Date: Mon, 31 Jul 2017 10:51:05 +0200 Message-Id: <20170731085110.1050-3-apahim@redhat.com> In-Reply-To: <20170731085110.1050-1-apahim@redhat.com> References: <20170731085110.1050-1-apahim@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 31 Jul 2017 08:52:05 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 2/7] qemu.py: fix is_running() return before first launch() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, ldoktor@redhat.com, famz@redhat.com, ehabkost@redhat.com, stefanha@gmail.com, Amador Pahim , armbru@redhat.com, mreitz@redhat.com, crosa@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" is_running() returns None when called before the first time we call launch(): >>> import qemu >>> vm =3D qemu.QEMUMachine('qemu-system-x86_64') >>> vm.is_running() >>> It should retunt False instead. This patch fixes that. Signed-off-by: Amador Pahim --- scripts/qemu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/qemu.py b/scripts/qemu.py index 2f1984c93c..77565eb092 100644 --- a/scripts/qemu.py +++ b/scripts/qemu.py @@ -86,7 +86,7 @@ class QEMUMachine(object): raise =20 def is_running(self): - return self._popen and (self._popen.poll() is None) + return self._popen is not None and (self._popen.poll() is None) =20 def exitcode(self): if self._popen is None: --=20 2.13.3 From nobody Sat Apr 27 18:33:40 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 15014912339730.7282542740148301; Mon, 31 Jul 2017 01:53:53 -0700 (PDT) Received: from localhost ([::1]:58159 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dc6SW-0007DA-ET for importer@patchew.org; Mon, 31 Jul 2017 04:53:52 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53364) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dc6Qs-0006Af-EV for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dc6Qr-0000U2-JT for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:10 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57388) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dc6Qr-0000To-B0 for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:09 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1B77ED02BC; Mon, 31 Jul 2017 08:52:08 +0000 (UTC) Received: from t460p.pahim.org.com (ovpn-204-234.brq.redhat.com [10.40.204.234]) by smtp.corp.redhat.com (Postfix) with ESMTP id 454D58AD67; Mon, 31 Jul 2017 08:52:05 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 1B77ED02BC Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=apahim@redhat.com From: Amador Pahim To: qemu-devel@nongnu.org Date: Mon, 31 Jul 2017 10:51:06 +0200 Message-Id: <20170731085110.1050-4-apahim@redhat.com> In-Reply-To: <20170731085110.1050-1-apahim@redhat.com> References: <20170731085110.1050-1-apahim@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 31 Jul 2017 08:52:08 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 3/7] qemu.py: use python logging system X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, ldoktor@redhat.com, famz@redhat.com, ehabkost@redhat.com, stefanha@gmail.com, Amador Pahim , armbru@redhat.com, mreitz@redhat.com, crosa@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Let's provide extra control and flexibility by using python logging system instead of print and/or sys.std*.write(). Signed-off-by: Amador Pahim --- scripts/qemu.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/scripts/qemu.py b/scripts/qemu.py index 77565eb092..e3ea534ec4 100644 --- a/scripts/qemu.py +++ b/scripts/qemu.py @@ -13,6 +13,7 @@ # =20 import errno +import logging import string import os import sys @@ -20,11 +21,19 @@ import subprocess import qmp.qmp =20 =20 +logging.basicConfig() +LOG =3D logging.getLogger(__name__) + + class QEMUMachine(object): '''A QEMU VM''' =20 def __init__(self, binary, args=3D[], wrapper=3D[], name=3DNone, test_= dir=3D"/var/tmp", monitor_address=3DNone, socket_scm_helper=3DNone, debug= =3DFalse): + if debug: + LOG.setLevel(logging.DEBUG) + else: + LOG.setLevel(logging.INFO) if name is None: name =3D "qemu-%d" % os.getpid() if monitor_address is None: @@ -62,10 +71,10 @@ class QEMUMachine(object): # In iotest.py, the qmp should always use unix socket. assert self._qmp.is_scm_available() if self._socket_scm_helper is None: - print >>sys.stderr, "No path to socket_scm_helper set" + LOG.error("No path to socket_scm_helper set") return -1 if os.path.exists(self._socket_scm_helper) =3D=3D False: - print >>sys.stderr, "%s does not exist" % self._socket_scm_hel= per + LOG.error("%s does not exist", self._socket_scm_helper) return -1 fd_param =3D ["%s" % self._socket_scm_helper, "%d" % self._qmp.get_sock_fd(), @@ -154,7 +163,8 @@ class QEMUMachine(object): =20 exitcode =3D self._popen.wait() if exitcode < 0: - sys.stderr.write('qemu received signal %i: %s\n' % (-exitc= ode, ' '.join(self._args))) + LOG.error('qemu received signal %i: %s', -exitcode, + ' '.join(self._args)) self._load_io_log() self._post_shutdown() =20 --=20 2.13.3 From nobody Sat Apr 27 18:33:40 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1501491368866529.1193607324583; Mon, 31 Jul 2017 01:56:08 -0700 (PDT) Received: from localhost ([::1]:58176 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dc6Uh-0000z3-Id for importer@patchew.org; Mon, 31 Jul 2017 04:56:07 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53375) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dc6R2-0006Ij-DH for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dc6Qy-0000Xv-I6 for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:20 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57576) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dc6Qy-0000Xn-B9 for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:16 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3F813BAB67; Mon, 31 Jul 2017 08:52:15 +0000 (UTC) Received: from t460p.pahim.org.com (ovpn-204-234.brq.redhat.com [10.40.204.234]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6D4698AD67; Mon, 31 Jul 2017 08:52:08 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 3F813BAB67 Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=apahim@redhat.com From: Amador Pahim To: qemu-devel@nongnu.org Date: Mon, 31 Jul 2017 10:51:07 +0200 Message-Id: <20170731085110.1050-5-apahim@redhat.com> In-Reply-To: <20170731085110.1050-1-apahim@redhat.com> References: <20170731085110.1050-1-apahim@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 31 Jul 2017 08:52:15 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 4/7] qemu.py: improve message on negative exit code X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, ldoktor@redhat.com, famz@redhat.com, ehabkost@redhat.com, stefanha@gmail.com, Amador Pahim , armbru@redhat.com, mreitz@redhat.com, crosa@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The current message shows 'self._args', which contains only part of the options used in the qemu command line. This patch makes the qemu full args list an instance variable and then uses it in the negative exit code message. Signed-off-by: Amador Pahim --- scripts/qemu.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/scripts/qemu.py b/scripts/qemu.py index e3ea534ec4..9434ccc30b 100644 --- a/scripts/qemu.py +++ b/scripts/qemu.py @@ -48,6 +48,7 @@ class QEMUMachine(object): self._iolog =3D None self._socket_scm_helper =3D socket_scm_helper self._debug =3D debug + self._qemu_full_args =3D None =20 # This can be used to add an unused monitor instance. def add_monitor_telnet(self, ip, port): @@ -140,9 +141,14 @@ class QEMUMachine(object): qemulog =3D open(self._qemu_log_path, 'wb') try: self._pre_launch() - args =3D self._wrapper + [self._binary] + self._base_args() + = self._args - self._popen =3D subprocess.Popen(args, stdin=3Ddevnull, stdout= =3Dqemulog, - stderr=3Dsubprocess.STDOUT, she= ll=3DFalse) + self._qemu_full_args =3D None + self._qemu_full_args =3D (self._wrapper + [self._binary] + + self._base_args() + self._args) + self._popen =3D subprocess.Popen(self._qemu_full_args, + stdin=3Ddevnull, + stdout=3Dqemulog, + stderr=3Dsubprocess.STDOUT, + shell=3DFalse) self._post_launch() except: if self.is_running(): @@ -163,8 +169,9 @@ class QEMUMachine(object): =20 exitcode =3D self._popen.wait() if exitcode < 0: - LOG.error('qemu received signal %i: %s', -exitcode, - ' '.join(self._args)) + LOG.error('qemu received signal %i:%s', -exitcode, + ' Command: %r.' % ' '.join(self._qemu_full_args) + if self._qemu_full_args else '') self._load_io_log() self._post_shutdown() =20 --=20 2.13.3 From nobody Sat Apr 27 18:33:40 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1501491362311625.6769726700147; Mon, 31 Jul 2017 01:56:02 -0700 (PDT) Received: from localhost ([::1]:58174 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dc6Ub-0000uZ-2N for importer@patchew.org; Mon, 31 Jul 2017 04:56:01 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53386) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dc6R6-0006ME-Fv for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dc6R5-0000c2-Mp for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:24 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40440) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dc6R5-0000bC-Gk for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:23 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6756717F8C8; Mon, 31 Jul 2017 08:52:22 +0000 (UTC) Received: from t460p.pahim.org.com (ovpn-204-234.brq.redhat.com [10.40.204.234]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3A54E8AD67; Mon, 31 Jul 2017 08:52:15 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 6756717F8C8 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=apahim@redhat.com From: Amador Pahim To: qemu-devel@nongnu.org Date: Mon, 31 Jul 2017 10:51:08 +0200 Message-Id: <20170731085110.1050-6-apahim@redhat.com> In-Reply-To: <20170731085110.1050-1-apahim@redhat.com> References: <20170731085110.1050-1-apahim@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 31 Jul 2017 08:52:22 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 5/7] qemu.py: use os.path.null instead of /dev/null X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, ldoktor@redhat.com, famz@redhat.com, ehabkost@redhat.com, stefanha@gmail.com, Amador Pahim , armbru@redhat.com, mreitz@redhat.com, crosa@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" For increased portability, let's use os.path.devnull. Signed-off-by: Amador Pahim Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Stefan Hajnoczi --- scripts/qemu.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/qemu.py b/scripts/qemu.py index 9434ccc30b..d313c6d4db 100644 --- a/scripts/qemu.py +++ b/scripts/qemu.py @@ -80,7 +80,7 @@ class QEMUMachine(object): fd_param =3D ["%s" % self._socket_scm_helper, "%d" % self._qmp.get_sock_fd(), "%s" % fd_file_path] - devnull =3D open('/dev/null', 'rb') + devnull =3D open(os.path.devnull, 'rb') p =3D subprocess.Popen(fd_param, stdin=3Ddevnull, stdout=3Dsys.std= out, stderr=3Dsys.stderr) return p.wait() @@ -137,7 +137,7 @@ class QEMUMachine(object): =20 def launch(self): '''Launch the VM and establish a QMP connection''' - devnull =3D open('/dev/null', 'rb') + devnull =3D open(os.path.devnull, 'rb') qemulog =3D open(self._qemu_log_path, 'wb') try: self._pre_launch() --=20 2.13.3 From nobody Sat Apr 27 18:33:40 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1501491259390272.8514621402021; Mon, 31 Jul 2017 01:54:19 -0700 (PDT) Received: from localhost ([::1]:58161 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dc6Sw-0007m8-1o for importer@patchew.org; Mon, 31 Jul 2017 04:54:18 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53447) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dc6RC-0006R1-PD for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dc6R8-0000dZ-RK for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:30 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40516) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dc6R8-0000cx-IJ for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:26 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 77ECEAEEFF; Mon, 31 Jul 2017 08:52:25 +0000 (UTC) Received: from t460p.pahim.org.com (ovpn-204-234.brq.redhat.com [10.40.204.234]) by smtp.corp.redhat.com (Postfix) with ESMTP id BF75E8AD67; Mon, 31 Jul 2017 08:52:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 77ECEAEEFF Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=apahim@redhat.com From: Amador Pahim To: qemu-devel@nongnu.org Date: Mon, 31 Jul 2017 10:51:09 +0200 Message-Id: <20170731085110.1050-7-apahim@redhat.com> In-Reply-To: <20170731085110.1050-1-apahim@redhat.com> References: <20170731085110.1050-1-apahim@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 31 Jul 2017 08:52:25 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 6/7] qemu.py: cleanup and improve launch()/shutdown() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, ldoktor@redhat.com, famz@redhat.com, ehabkost@redhat.com, stefanha@gmail.com, Amador Pahim , armbru@redhat.com, mreitz@redhat.com, crosa@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" launch() is currently taking care of a number of flows, each one if its own exception treatment, depending on the VM state and the files creation state. This patch makes launch() more resilient, off-loading the core calls to the new _launch() and calling shutdown() if any exception is raised by _launch(), making sure VM will be terminated and cleaned up. Also, the pre_launch() was changed to make sure the files that will be created are not present in the system before creating them and the post_shutdown() will now only remove files that were created by this instance. Signed-off-by: Amador Pahim --- scripts/qemu.py | 84 ++++++++++++++++++++++++++++++++++++++++-------------= ---- 1 file changed, 59 insertions(+), 25 deletions(-) diff --git a/scripts/qemu.py b/scripts/qemu.py index d313c6d4db..e9a3a96d13 100644 --- a/scripts/qemu.py +++ b/scripts/qemu.py @@ -25,6 +25,10 @@ logging.basicConfig() LOG =3D logging.getLogger(__name__) =20 =20 +class QEMULaunchError(Exception): + pass + + class QEMUMachine(object): '''A QEMU VM''' =20 @@ -40,6 +44,7 @@ class QEMUMachine(object): monitor_address =3D os.path.join(test_dir, name + "-monitor.so= ck") self._monitor_address =3D monitor_address self._qemu_log_path =3D os.path.join(test_dir, name + ".log") + self._qemu_log_fd =3D None self._popen =3D None self._binary =3D binary self._args =3D list(args) # Force copy args in case we modify them @@ -49,6 +54,8 @@ class QEMUMachine(object): self._socket_scm_helper =3D socket_scm_helper self._debug =3D debug self._qemu_full_args =3D None + self._created_files =3D [] + self._pending_shutdown =3D False =20 # This can be used to add an unused monitor instance. def add_monitor_telnet(self, ip, port): @@ -109,8 +116,9 @@ class QEMUMachine(object): return self._popen.pid =20 def _load_io_log(self): - with open(self._qemu_log_path, "r") as fh: - self._iolog =3D fh.read() + if os.path.exists(self._qemu_log_path): + with open(self._qemu_log_path, "r") as fh: + self._iolog =3D fh.read() =20 def _base_args(self): if isinstance(self._monitor_address, tuple): @@ -124,40 +132,62 @@ class QEMUMachine(object): '-display', 'none', '-vga', 'none'] =20 def _pre_launch(self): - self._qmp =3D qmp.qmp.QEMUMonitorProtocol(self._monitor_address, s= erver=3DTrue, + if (not isinstance(self._monitor_address, tuple) and + os.path.exists(self._monitor_address)): + raise QEMULaunchError('File %s exists. Please remove it.' % + self._monitor_address) + + self._qmp =3D qmp.qmp.QEMUMonitorProtocol(self._monitor_address, + server=3DTrue, debug=3Dself._debug) + if not isinstance(self._monitor_address, tuple): + self._created_files.append(self._monitor_address) + + if os.path.exists(self._qemu_log_path): + raise QEMULaunchError('File %s exists. Please remove it.' % + self._qemu_log_path) + + self._qemu_log_fd =3D open(self._qemu_log_path, 'wb') + self._created_files.append(self._qemu_log_path) =20 def _post_launch(self): self._qmp.accept() =20 def _post_shutdown(self): - if not isinstance(self._monitor_address, tuple): - self._remove_if_exists(self._monitor_address) - self._remove_if_exists(self._qemu_log_path) + while self._created_files: + self._remove_if_exists(self._created_files.pop()) =20 def launch(self): '''Launch the VM and establish a QMP connection''' - devnull =3D open(os.path.devnull, 'rb') - qemulog =3D open(self._qemu_log_path, 'wb') + + if self.is_running(): + raise QEMULaunchError('VM already running.') + + if self._pending_shutdown: + raise QEMULaunchError('Shutdown after the previous launch ' + 'is pending. Please call shutdown() ' + 'before launching again.') + try: - self._pre_launch() self._qemu_full_args =3D None self._qemu_full_args =3D (self._wrapper + [self._binary] + self._base_args() + self._args) - self._popen =3D subprocess.Popen(self._qemu_full_args, - stdin=3Ddevnull, - stdout=3Dqemulog, - stderr=3Dsubprocess.STDOUT, - shell=3DFalse) - self._post_launch() + self._launch() + self._pending_shutdown =3D True except: - if self.is_running(): - self._popen.kill() - self._popen.wait() - self._load_io_log() - self._post_shutdown() + self.shutdown() raise =20 + def _launch(self): + self._pre_launch() + devnull =3D open(os.path.devnull, 'rb') + self._popen =3D subprocess.Popen(self._qemu_full_args, + stdin=3Ddevnull, + stdout=3Dself._qemu_log_fd, + stderr=3Dsubprocess.STDOUT, + shell=3DFalse) + self._post_launch() + def shutdown(self): '''Terminate the VM and clean up''' if self.is_running(): @@ -166,14 +196,18 @@ class QEMUMachine(object): self._qmp.close() except: self._popen.kill() + self._popen.wait() =20 - exitcode =3D self._popen.wait() - if exitcode < 0: - LOG.error('qemu received signal %i:%s', -exitcode, + if self._pending_shutdown: + exit_code =3D self.exitcode() + if exit_code is not None and exit_code < 0: + LOG.error('qemu received signal %i: %s', -exit_code, ' Command: %r.' % ' '.join(self._qemu_full_args) if self._qemu_full_args else '') - self._load_io_log() - self._post_shutdown() + + self._load_io_log() + self._post_shutdown() + self._pending_shutdown =3D False =20 underscore_to_dash =3D string.maketrans('_', '-') def qmp(self, cmd, conv_keys=3DTrue, **args): --=20 2.13.3 From nobody Sat Apr 27 18:33:40 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 150149147495899.96290764601554; Mon, 31 Jul 2017 01:57:54 -0700 (PDT) Received: from localhost ([::1]:58185 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dc6WP-0002IC-4Z for importer@patchew.org; Mon, 31 Jul 2017 04:57:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53476) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dc6RF-0006S0-01 for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dc6RD-0000gv-P2 for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:33 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40628) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dc6RD-0000g2-FK for qemu-devel@nongnu.org; Mon, 31 Jul 2017 04:52:31 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 62A86107D94; Mon, 31 Jul 2017 08:52:30 +0000 (UTC) Received: from t460p.pahim.org.com (ovpn-204-234.brq.redhat.com [10.40.204.234]) by smtp.corp.redhat.com (Postfix) with ESMTP id D1C5E8AD67; Mon, 31 Jul 2017 08:52:25 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 62A86107D94 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=apahim@redhat.com From: Amador Pahim To: qemu-devel@nongnu.org Date: Mon, 31 Jul 2017 10:51:10 +0200 Message-Id: <20170731085110.1050-8-apahim@redhat.com> In-Reply-To: <20170731085110.1050-1-apahim@redhat.com> References: <20170731085110.1050-1-apahim@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 31 Jul 2017 08:52:30 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 7/7] qemu.py: include debug information on launch error X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, ldoktor@redhat.com, famz@redhat.com, ehabkost@redhat.com, stefanha@gmail.com, Amador Pahim , armbru@redhat.com, mreitz@redhat.com, crosa@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" When launching a VM, if an exception happens and the VM is not initiated, it is useful to see the qemu command line that was executed and the output of that command. Before this patch: >>> import qemu >>> vm =3D qemu.QEMUMachine('qemu-system-aarch64', debug=3DTrue) >>> vm.launch() Traceback (most recent call last): File "", line 1, in File "qemu.py", line 175, in launch self._launch() File "qemu.py", line 189, in _launch self._post_launch() File "qemu.py", line 154, in _post_launch self._qmp.accept() File "qmp/qmp.py", line 145, in accept self.__sock, _ =3D self.__sock.accept() File "/usr/lib64/python2.7/socket.py", line 206, in accept sock, addr =3D self._sock.accept() socket.timeout: timed out >>> After this patch: >>> import qemu >>> vm =3D qemu.QEMUMachine('qemu-system-aarch64', debug=3DTrue) >>> vm.launch() DEBUG:qemu:Error launching VM. Command: 'qemu-system-aarch64 -chardev socket,id=3Dmon,path=3D/var/tmp/qemu-5298-monitor.sock -mon chardev=3Dmon,mode=3Dcontrol -display none -vga none'. Output: 'qemu-system-aarch64: No machine specified, and there is no default\nUse -machine help to list supported machines\n'. Traceback (most recent call last): File "", line 1, in File "qemu.py", line 175, in launch self._launch() File "qemu.py", line 189, in _launch self._post_launch() File "qemu.py", line 154, in _post_launch self._qmp.accept() File "qmp/qmp.py", line 145, in accept self.__sock, _ =3D self.__sock.accept() File "/usr/lib64/python2.7/socket.py", line 206, in accept sock, addr =3D self._sock.accept() socket.timeout: timed out >>> Signed-off-by: Amador Pahim --- scripts/qemu.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/scripts/qemu.py b/scripts/qemu.py index e9a3a96d13..43fd0b072c 100644 --- a/scripts/qemu.py +++ b/scripts/qemu.py @@ -158,7 +158,10 @@ class QEMUMachine(object): self._remove_if_exists(self._created_files.pop()) =20 def launch(self): - '''Launch the VM and establish a QMP connection''' + ''' + Try to launch the VM and make sure we cleanup and expose the + command line/output in case of exception. + ''' =20 if self.is_running(): raise QEMULaunchError('VM already running.') @@ -169,6 +172,7 @@ class QEMUMachine(object): 'before launching again.') =20 try: + self._iolog =3D None self._qemu_full_args =3D None self._qemu_full_args =3D (self._wrapper + [self._binary] + self._base_args() + self._args) @@ -176,9 +180,15 @@ class QEMUMachine(object): self._pending_shutdown =3D True except: self.shutdown() + LOG.debug('Error launching VM.%s%s', + ' Command: %r.' % ' '.join(self._qemu_full_args) + if self._qemu_full_args else '', + ' Output: %r.' % self._iolog + if self._iolog else '') raise =20 def _launch(self): + '''Launch the VM and establish a QMP connection.''' self._pre_launch() devnull =3D open(os.path.devnull, 'rb') self._popen =3D subprocess.Popen(self._qemu_full_args, --=20 2.13.3