testimage: Run commands in target and host when test fails

This patch modify three files altought two of them
are minimal modifications. This version includes
the changes proposed by Paul.

testimage.bbclass:
    Create new vars for easy modification of the dump
directory and commands to be run on host and target
when a test fails
    TESTIMAGE_DUMP_DIR: Directory to save the dumps
    testimage_dump_target: Commands to run on target
    testimage_dump_host: Commands to run on host

oetest.py:
    - Allow to use the vars defined in testimage class
    - Now able to run commands in the host and dump the
      results
    - Fix an issue with the condition where to run the
      dump commands (Before it run the commands every
      test after a failure, now it runs the commands only
      in tests that failed)
    - Fix the output to stdout

[YOCTO #8118]

(From OE-Core rev: 26fe645457633f90bb5ddbb12f5f7b9ca4a06cc5)

(From OE-Core rev: 7b4fbbf979ed22434b8e3f83ae145139bb0d9fc7)

Signed-off-by: Mariano Lopez <mariano.lopez@linux.intel.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Mariano Lopez 2015-08-18 14:52:38 +00:00 committed by Richard Purdie
parent f9f1643ead
commit 48373be830
3 changed files with 59 additions and 14 deletions

View File

@ -56,6 +56,30 @@ TESTIMAGEDEPENDS_qemuall = "qemu-native:do_populate_sysroot qemu-helper-native:d
TESTIMAGELOCK = "${TMPDIR}/testimage.lock"
TESTIMAGELOCK_qemuall = ""
TESTIMAGE_DUMP_DIR ?= "/tmp/oe-saved-tests/"
testimage_dump_target () {
top -bn1
ps
free
df
_ping
dmesg
netstat -an
ip address
_logs
}
testimage_dump_host () {
top -bn1
ps -ef
free
df
memstat
dmesg
netstat -an
}
python do_testimage() {
testimage_main(d)
}

View File

@ -12,8 +12,10 @@ import unittest
import inspect
import subprocess
import datetime
import commands
import bb
from oeqa.utils.decorators import LogResults
from sys import exc_info, exc_clear
def loadTests(tc, type="runtime"):
if type == "runtime":
@ -120,35 +122,51 @@ class oeRuntimeTest(oeTest):
def tearDown(self):
# If a test fails or there is an exception
if (self._resultForDoCleanups.failures or
self._resultForDoCleanups.errors):
self.dump_target_logs()
if not exc_info() == (None, None, None):
exc_clear()
dump_dir = self.create_dump_dir()
print ("%s dump data from host and target "
"stored in %s" % (self._testMethodName, dump_dir))
self.dump_host_logs(dump_dir)
self.dump_target_logs(dump_dir)
def dump_target_logs(self):
commands = ["top -bn1", "ps", "free", "df", "_ping", "dmesg", "netstat -a", "ifconfig -a", "_logs"]
dump_dir = "/tmp/oe-saved-tests"
def create_dump_dir(self):
dump_sub_dir = ("%s_%s" % (
datetime.datetime.now().strftime('%Y%m%d%H%M'),
self._testMethodName))
dump_dir = os.path.join(dump_dir, dump_sub_dir)
dump_dir = os.path.join(self.target.dump_dir, dump_sub_dir)
os.makedirs(dump_dir)
bb.warn("%s failed: getting data from target and "
"saving into %s" % (self._testMethodName, dump_dir))
for command in commands:
return dump_dir
def dump_host_logs(self, dump_dir):
for cmd in self.target.dump_host.split('\n'):
cmd = cmd.lstrip()
if not cmd:
continue
output = commands.getoutput(cmd)
filename = "host_%s" % cmd.split()[0]
with open(os.path.join(dump_dir, filename), 'w') as f:
f.write(output)
def dump_target_logs(self, dump_dir):
for cmd in self.target.dump_target.split('\n'):
cmd = cmd.lstrip()
if not cmd:
continue
# This will ping the host from target
if command == "_ping":
if cmd == "_ping":
comm = "ping -c3 %s" % self.target.server_ip
# This will get all the logs from /var/log/
elif command == "_logs":
elif cmd == "_logs":
comm = 'find /var/log/ -type f 2>/dev/null '
comm = '%s-exec echo "%s" \\; ' % (comm, '='*20)
comm = '%s-exec echo {} \\; ' % comm
comm = '%s-exec echo "%s" \\; ' % (comm, '='*20)
comm = '%s-exec cat {} \\; -exec echo "" \\;' % comm
else:
comm = command
comm = cmd
(status, output) = self.target.run_serial(comm)
filename = command.split()[0]
filename = "target_%s" % cmd.split()[0]
with open(os.path.join(dump_dir, filename), 'w') as f:
f.write(output)

View File

@ -123,6 +123,9 @@ class QemuTarget(BaseTarget):
self.origrootfs = os.path.join(d.getVar("DEPLOY_DIR_IMAGE", True), d.getVar("IMAGE_LINK_NAME", True) + '.' + self.image_fstype)
self.rootfs = os.path.join(self.testdir, d.getVar("IMAGE_LINK_NAME", True) + '-testimage.' + self.image_fstype)
self.kernel = os.path.join(d.getVar("DEPLOY_DIR_IMAGE", True), d.getVar("KERNEL_IMAGETYPE", False) + '-' + d.getVar('MACHINE', False) + '.bin')
self.dump_target = d.getVar("testimage_dump_target", True)
self.dump_host = d.getVar("testimage_dump_host", True)
self.dump_dir = d.getVar("TESTIMAGE_DUMP_DIR", True)
# Log QemuRunner log output to a file
import oe.path