When using timeout option of RunCmd, there is a case that we want to know if command was failed by timeout or by other problem. This commit extends RunResult to hold additional variable "failed_by_timeout" which is set to True if command was killed by timeout.
Signed-off-by: Yuto KAWAMURA(kawamuray) <[email protected]> --- lib/utils/process.py | 6 +++++- test/py/ganeti.utils.process_unittest.py | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/utils/process.py b/lib/utils/process.py index 2521c58..8a9785e 100644 --- a/lib/utils/process.py +++ b/lib/utils/process.py @@ -78,11 +78,14 @@ class RunResult(object): @type failed: boolean @ivar failed: True in case the program was terminated by a signal or exited with a non-zero exit code + @type failed_by_timeout: boolean + @ivar failed_by_timeout: True in case the program was + terminated by timeout @ivar fail_reason: a string detailing the termination reason """ __slots__ = ["exit_code", "signal", "stdout", "stderr", - "failed", "fail_reason", "cmd"] + "failed", "failed_by_timeout", "fail_reason", "cmd"] def __init__(self, exit_code, signal_, stdout, stderr, cmd, timeout_action, timeout): @@ -92,6 +95,7 @@ class RunResult(object): self.stdout = stdout self.stderr = stderr self.failed = (signal_ is not None or exit_code != 0) + self.failed_by_timeout = timeout_action != _TIMEOUT_NONE fail_msgs = [] if self.signal is not None: diff --git a/test/py/ganeti.utils.process_unittest.py b/test/py/ganeti.utils.process_unittest.py index 2e36cfa..3cdad20 100755 --- a/test/py/ganeti.utils.process_unittest.py +++ b/test/py/ganeti.utils.process_unittest.py @@ -259,6 +259,16 @@ class TestRunCmd(testutils.GanetiTestCase): self.assertEqual(result.signal, 15) self.assertEqual(result.output, "") + def testTimeoutFlagTrue(self): + result = utils.RunCmd(["sleep", "2"], timeout=0.1) + self.assertTrue(result.failed) + self.assertTrue(result.failed_by_timeout) + + def testTimeoutFlagFalse(self): + result = utils.RunCmd(["false"], timeout=5) + self.assertTrue(result.failed) + self.assertFalse(result.failed_by_timeout) + def testTimeoutClean(self): cmd = ("trap 'exit 0' TERM; echo >&%d; read < %s" % (self.proc_ready_helper.write_fd, self.fifo_file)) -- 1.8.5.5
