summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2014-04-30 13:32:04 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2014-04-30 21:52:33 +0100
commit3a4bb1aa604189618cc16c702efb9647fbe86108 (patch)
tree2f8976d41de48e19ff06d77ac71b4ada6d3bc2cf
parent9e7b0ca3832ce7ea9826e5d90ec9f10a7772099e (diff)
downloadpoky-3a4bb1aa604189618cc16c702efb9647fbe86108.tar.gz
oeqa: add proper handling for command errors where needed
For use outside of tests themselves, we want a better error than AssertionError, so create one and allow us to request it when calling runCmd(). This enables us to avoid tracebacks during master image operations if the power control command fails. (From OE-Core rev: 89868383685091b0d3723fb8f29590f3f6610078) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/lib/oeqa/controllers/masterimage.py6
-rw-r--r--meta/lib/oeqa/utils/__init__.py12
-rw-r--r--meta/lib/oeqa/utils/commands.py10
3 files changed, 24 insertions, 4 deletions
diff --git a/meta/lib/oeqa/controllers/masterimage.py b/meta/lib/oeqa/controllers/masterimage.py
index d151e24bd7..f2585d4860 100644
--- a/meta/lib/oeqa/controllers/masterimage.py
+++ b/meta/lib/oeqa/controllers/masterimage.py
@@ -20,6 +20,7 @@ import subprocess
20import oeqa.targetcontrol 20import oeqa.targetcontrol
21import oeqa.utils.sshcontrol as sshcontrol 21import oeqa.utils.sshcontrol as sshcontrol
22import oeqa.utils.commands as commands 22import oeqa.utils.commands as commands
23from oeqa.utils import CommandError
23 24
24from abc import ABCMeta, abstractmethod 25from abc import ABCMeta, abstractmethod
25 26
@@ -94,7 +95,10 @@ class MasterImageHardwareTarget(oeqa.targetcontrol.BaseTarget):
94 def power_ctl(self, msg): 95 def power_ctl(self, msg):
95 if self.powercontrol_cmd: 96 if self.powercontrol_cmd:
96 cmd = "%s %s" % (self.powercontrol_cmd, msg) 97 cmd = "%s %s" % (self.powercontrol_cmd, msg)
97 commands.runCmd(cmd, preexec_fn=os.setsid, env=self.origenv) 98 try:
99 commands.runCmd(cmd, assert_error=False, preexec_fn=os.setsid, env=self.origenv)
100 except CommandError as e:
101 bb.fatal(str(e))
98 102
99 def power_cycle(self, conn): 103 def power_cycle(self, conn):
100 if self.powercontrol_cmd: 104 if self.powercontrol_cmd:
diff --git a/meta/lib/oeqa/utils/__init__.py b/meta/lib/oeqa/utils/__init__.py
index 8eda92763c..2260046026 100644
--- a/meta/lib/oeqa/utils/__init__.py
+++ b/meta/lib/oeqa/utils/__init__.py
@@ -1,3 +1,15 @@
1# Enable other layers to have modules in the same named directory 1# Enable other layers to have modules in the same named directory
2from pkgutil import extend_path 2from pkgutil import extend_path
3__path__ = extend_path(__path__, __name__) 3__path__ = extend_path(__path__, __name__)
4
5
6# Borrowed from CalledProcessError
7
8class CommandError(Exception):
9 def __init__(self, retcode, cmd, output = None):
10 self.retcode = retcode
11 self.cmd = cmd
12 self.output = output
13 def __str__(self):
14 return "Command '%s' returned non-zero exit status %d with output: %s" % (self.cmd, self.retcode, self.output)
15
diff --git a/meta/lib/oeqa/utils/commands.py b/meta/lib/oeqa/utils/commands.py
index 9b42620610..7637b9def8 100644
--- a/meta/lib/oeqa/utils/commands.py
+++ b/meta/lib/oeqa/utils/commands.py
@@ -1,4 +1,4 @@
1# Copyright (c) 2013 Intel Corporation 1# Copyright (c) 2013-2014 Intel Corporation
2# 2#
3# Released under the MIT license (see COPYING.MIT) 3# Released under the MIT license (see COPYING.MIT)
4 4
@@ -14,6 +14,7 @@ import signal
14import subprocess 14import subprocess
15import threading 15import threading
16import logging 16import logging
17from oeqa.utils import CommandError
17 18
18class Command(object): 19class Command(object):
19 def __init__(self, command, bg=False, timeout=None, data=None, **options): 20 def __init__(self, command, bg=False, timeout=None, data=None, **options):
@@ -84,8 +85,8 @@ class Command(object):
84class Result(object): 85class Result(object):
85 pass 86 pass
86 87
87def runCmd(command, ignore_status=False, timeout=None, **options):
88 88
89def runCmd(command, ignore_status=False, timeout=None, assert_error=True, **options):
89 result = Result() 90 result = Result()
90 91
91 cmd = Command(command, timeout=timeout, **options) 92 cmd = Command(command, timeout=timeout, **options)
@@ -97,7 +98,10 @@ def runCmd(command, ignore_status=False, timeout=None, **options):
97 result.pid = cmd.process.pid 98 result.pid = cmd.process.pid
98 99
99 if result.status and not ignore_status: 100 if result.status and not ignore_status:
100 raise AssertionError("Command '%s' returned non-zero exit status %d:\n%s" % (command, result.status, result.output)) 101 if assert_error:
102 raise AssertionError("Command '%s' returned non-zero exit status %d:\n%s" % (command, result.status, result.output))
103 else:
104 raise CommandError(result.status, command, result.output)
101 105
102 return result 106 return result
103 107