From 97773eaea6407eb12a0f1a2b8dbac24a71f3b7c6 Mon Sep 17 00:00:00 2001 From: Rodolfo Alonso Hernandez Date: Thu, 30 Jan 2020 16:58:12 +0000 Subject: [PATCH] Increase log information when a RootHelperProcess fails If a RootHelperProcess does not start, add more information to the exception raised: the command return code, the stdout and the stderr. Change-Id: I229e926341c5e6c8b06f59950e3ae09864d0f1f6 Closes-Bug: #1861221 --- neutron/tests/common/net_helpers.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/neutron/tests/common/net_helpers.py b/neutron/tests/common/net_helpers.py index b436bdd0dd2..4944d33ad44 100644 --- a/neutron/tests/common/net_helpers.py +++ b/neutron/tests/common/net_helpers.py @@ -327,11 +327,25 @@ class RootHelperProcess(subprocess.Popen): if utils.pid_invoked_with_cmdline(child_pid, self.cmd): return True - common_utils.wait_until_true( - child_is_running, - timeout, - exception=RuntimeError("Process %s hasn't been spawned " - "in %d seconds" % (self.cmd, timeout))) + try: + common_utils.wait_until_true(child_is_running, timeout) + except common_utils.WaitTimeout: + # If there is an error, the stderr and stdout pipes usually have + # information returned by the command executed. If not, timeout + # the pipe communication quickly. + stdout = stderr = '' + try: + stdout, stderr = self.communicate(timeout=0.5) + except subprocess.TimeoutExpired: + pass + msg = ("Process %(cmd)s hasn't been spawned in %(seconds)d " + "seconds. Return code: %(ret_code)s, stdout: %(stdout)s, " + "sdterr: %(stderr)s" % + {'cmd': self.cmd, 'seconds': timeout, + 'ret_code': self.returncode, 'stdout': stdout, + 'stderr': stderr}) + raise RuntimeError(msg) + self.child_pid = utils.get_root_helper_child_pid( self.pid, self.cmd, run_as_root=True)