From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51539) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bmJ28-0005oh-VI for qemu-devel@nongnu.org; Tue, 20 Sep 2016 07:16:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bmJ24-0007co-J6 for qemu-devel@nongnu.org; Tue, 20 Sep 2016 07:16:15 -0400 Received: from mx1.redhat.com ([209.132.183.28]:46514) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bmJ24-0007c8-Ah for qemu-devel@nongnu.org; Tue, 20 Sep 2016 07:16:12 -0400 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BDD534ACC5 for ; Tue, 20 Sep 2016 11:16:11 +0000 (UTC) Date: Tue, 20 Sep 2016 19:16:09 +0800 From: Fam Zheng Message-ID: <20160920111609.GA22222@lemon> References: <1474369559-16903-1-git-send-email-ehabkost@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1474369559-16903-1-git-send-email-ehabkost@redhat.com> Subject: Re: [Qemu-devel] [PATCH] docker: Handle exceptions when looking for docker command List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Eduardo Habkost Cc: qemu-devel@nongnu.org On Tue, 09/20 08:05, Eduardo Habkost wrote: > When trying to run docker tests on a host without the docker > command, we get the following Python backtrace: > > $ make docker-test-quick@centos6 V=1 > .../qemu/tests/docker/docker.py build qemu:centos6 .../qemu/tests/docker/dockerfiles/centos6.docker > Traceback (most recent call last): > File ".../qemu/tests/docker/docker.py", line 339, in > sys.exit(main()) > File ".../qemu/tests/docker/docker.py", line 336, in main > return args.cmdobj.run(args, argv) > File ".../qemu/tests/docker/docker.py", line 231, in run > dkr = Docker() > File ".../qemu/tests/docker/docker.py", line 98, in __init__ > self._command = _guess_docker_command() > File ".../qemu/tests/docker/docker.py", line 41, in _guess_docker_command > stdout=DEVNULL, stderr=DEVNULL) == 0: > File "/usr/lib64/python2.7/subprocess.py", line 523, in call > return Popen(*popenargs, **kwargs).wait() > File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__ > errread, errwrite) > File "/usr/lib64/python2.7/subprocess.py", line 1343, in _execute_child > raise child_exception > OSError: [Errno 2] No such file or directory > .../qemu/tests/docker/Makefile.include:47: recipe for target 'docker-image-centos6' failed > make: *** [docker-image-centos6] Error 1 > > Change _guess_docker_command() to handle OSError exceptions > raised by subprocess.call(), so we will keep looking for other > commands and print a better error message. > > New output will be: > > $ make docker-test-quick@centos6 V=1 > .../qemu/tests/docker/docker.py build qemu:centos6 .../qemu/tests/docker/dockerfiles/centos6.docker > Traceback (most recent call last): > File ".../qemu/tests/docker/docker.py", line 343, in > sys.exit(main()) > File ".../qemu/tests/docker/docker.py", line 340, in main > return args.cmdobj.run(args, argv) > File ".../qemu/tests/docker/docker.py", line 235, in run > dkr = Docker() > File ".../qemu/tests/docker/docker.py", line 102, in __init__ > self._command = _guess_docker_command() > File ".../qemu/tests/docker/docker.py", line 49, in _guess_docker_command > commands_txt) > Exception: Cannot find working docker command. Tried: > docker > sudo -n docker > .../qemu/tests/docker/Makefile.include:47: recipe for target 'docker-image-centos6' failed > make: *** [docker-image-centos6] Error 1 > > Signed-off-by: Eduardo Habkost > --- > tests/docker/docker.py | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/tests/docker/docker.py b/tests/docker/docker.py > index b85c165..daff340 100755 > --- a/tests/docker/docker.py > +++ b/tests/docker/docker.py > @@ -13,6 +13,7 @@ > > import os > import sys > +import exceptions > import subprocess > import json > import hashlib > @@ -37,9 +38,12 @@ def _guess_docker_command(): > """ Guess a working docker command or raise exception if not found""" > commands = [["docker"], ["sudo", "-n", "docker"]] > for cmd in commands: > - if subprocess.call(cmd + ["images"], > - stdout=DEVNULL, stderr=DEVNULL) == 0: > - return cmd > + try: > + if subprocess.call(cmd + ["images"], > + stdout=DEVNULL, stderr=DEVNULL) == 0: > + return cmd > + except exceptions.OSError: > + pass > commands_txt = "\n".join([" " + " ".join(x) for x in commands]) > raise Exception("Cannot find working docker command. Tried:\n%s" % \ > commands_txt) > -- > 2.7.4 > Looks good, except that like exceptions.Exception, OSError is also magically addressable as "OSError", saving us one import. _copy_with_mkdir below already does that. Fixing that for consistency and queued for next PULL, thanks! Fam