summaryrefslogtreecommitdiff
path: root/meta/lib/oeqa/utils
diff options
context:
space:
mode:
Diffstat (limited to 'meta/lib/oeqa/utils')
-rw-r--r--meta/lib/oeqa/utils/dump.py28
-rw-r--r--meta/lib/oeqa/utils/qemurunner.py15
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