diff options
Diffstat (limited to 'meta/lib/oeqa/utils')
-rw-r--r-- | meta/lib/oeqa/utils/dump.py | 28 | ||||
-rw-r--r-- | meta/lib/oeqa/utils/qemurunner.py | 15 |
2 files changed, 23 insertions, 20 deletions
diff --git a/meta/lib/oeqa/utils/dump.py b/meta/lib/oeqa/utils/dump.py index e71e1cd341..6067438e35 100644 --- a/meta/lib/oeqa/utils/dump.py +++ b/meta/lib/oeqa/utils/dump.py @@ -6,30 +6,22 @@ import itertools from commands import runCmd def get_host_dumper(d): - return HostDumper(d) + cmds = d.getVar("testimage_dump_host", True) + parent_dir = d.getVar("TESTIMAGE_DUMP_DIR", True) + return HostDumper(cmds, parent_dir) class BaseDumper(object): - def __init__(self, d, cmds): + def __init__(self, cmds, parent_dir): self.cmds = [] - self.parent_dir = d.getVar("TESTIMAGE_DUMP_DIR", True) + self.parent_dir = parent_dir if not cmds: return for cmd in cmds.split('\n'): cmd = cmd.lstrip() if not cmd or cmd[0] == '#': continue - # Replae variables from the datastore - while True: - index_start = cmd.find("${") - if index_start == -1: - break - index_start += 2 - index_end = cmd.find("}", index_start) - var = cmd[index_start:index_end] - value = d.getVar(var, True) - cmd = cmd.replace("${%s}" % var, value) self.cmds.append(cmd) def create_dir(self, dir_suffix): @@ -62,9 +54,8 @@ class BaseDumper(object): class HostDumper(BaseDumper): - def __init__(self, d): - host_cmds = d.getVar("testimage_dump_host", True) - super(HostDumper, self).__init__(d, host_cmds) + def __init__(self, cmds, parent_dir): + super(HostDumper, self).__init__(cmds, parent_dir) def dump_host(self, dump_dir=""): if dump_dir: @@ -76,9 +67,8 @@ class HostDumper(BaseDumper): class TargetDumper(BaseDumper): - def __init__(self, d, qemurunner): - target_cmds = d.getVar("testimage_dump_target", True) - super(TargetDumper, self).__init__(d, target_cmds) + def __init__(self, cmds, parent_dir, qemurunner): + super(TargetDumper, self).__init__(cmds, parent_dir) self.runner = qemurunner def dump_target(self, dump_dir=""): diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py index bcdb69b38c..4ce5d9c685 100644 --- a/meta/lib/oeqa/utils/qemurunner.py +++ b/meta/lib/oeqa/utils/qemurunner.py @@ -14,13 +14,14 @@ import socket import select import errno import threading +from oeqa.utils.dump import HostDumper import logging logger = logging.getLogger("BitBake.QemuRunner") class QemuRunner: - def __init__(self, machine, rootfs, display, tmpdir, deploy_dir_image, logfile, boottime): + def __init__(self, machine, rootfs, display, tmpdir, deploy_dir_image, logfile, boottime, dump_dir, dump_host_cmds): # Popen object for runqemu self.runqemu = None @@ -42,6 +43,7 @@ class QemuRunner: self.thread = None self.runqemutime = 60 + self.host_dumper = HostDumper(dump_host_cmds, dump_dir) def create_socket(self): try: @@ -118,6 +120,7 @@ class QemuRunner: if self.runqemu.returncode: # No point waiting any longer logger.info('runqemu exited with code %d' % self.runqemu.returncode) + self._dump_host() self.stop() logger.info("Output from runqemu:\n%s" % getOutput(output)) return False @@ -137,6 +140,7 @@ class QemuRunner: self.server_ip = ips[1] except IndexError, ValueError: logger.info("Couldn't get ip from qemu process arguments! Here is the qemu command line used:\n%s\nand output from runqemu:\n%s" % (cmdline, getOutput(output))) + self._dump_host() self.stop() return False logger.info("qemu cmdline used:\n{}".format(cmdline)) @@ -189,6 +193,7 @@ class QemuRunner: lines = "\n".join(bootlog.splitlines()[-25:]) logger.info("Last 25 lines of text:\n%s" % lines) logger.info("Check full boot log: %s" % self.logfile) + self._dump_host() self.stop() return False @@ -202,6 +207,7 @@ class QemuRunner: else: logger.info("Qemu pid didn't appeared in %s seconds" % self.runqemutime) + self._dump_host() self.stop() logger.info("Output from runqemu:\n%s" % getOutput(output)) return False @@ -334,6 +340,13 @@ class QemuRunner: status = 1 return (status, str(data)) + + def _dump_host(self): + self.host_dumper.create_dir("qemu") + logger.error("Qemu ended unexpectedly, dump data from host" + " is in %s" % self.host_dumper.dump_dir) + self.host_dumper.dump_host() + # This class is for reading data from a socket and passing it to logfunc # to be processed. It's completely event driven and has a straightforward # event loop. The mechanism for stopping the thread is a simple pipe which |