diff options
Diffstat (limited to 'meta')
| -rw-r--r-- | meta/lib/oeqa/core/target/qemu.py | 2 | ||||
| -rw-r--r-- | meta/lib/oeqa/selftest/runqemu.py | 5 | ||||
| -rw-r--r-- | meta/lib/oeqa/targetcontrol.py | 25 | ||||
| -rw-r--r-- | meta/lib/oeqa/utils/commands.py | 25 | ||||
| -rw-r--r-- | meta/lib/oeqa/utils/qemurunner.py | 7 | ||||
| -rw-r--r-- | meta/lib/oeqa/utils/qemutinyrunner.py | 3 |
6 files changed, 26 insertions, 41 deletions
diff --git a/meta/lib/oeqa/core/target/qemu.py b/meta/lib/oeqa/core/target/qemu.py index 2dc521c216..d359bf9fe3 100644 --- a/meta/lib/oeqa/core/target/qemu.py +++ b/meta/lib/oeqa/core/target/qemu.py | |||
| @@ -31,7 +31,7 @@ class OEQemuTarget(OESSHTarget): | |||
| 31 | deploy_dir_image=dir_image, display=display, | 31 | deploy_dir_image=dir_image, display=display, |
| 32 | logfile=bootlog, boottime=boottime, | 32 | logfile=bootlog, boottime=boottime, |
| 33 | use_kvm=kvm, dump_dir=dump_dir, | 33 | use_kvm=kvm, dump_dir=dump_dir, |
| 34 | dump_host_cmds=dump_host_cmds) | 34 | dump_host_cmds=dump_host_cmds, logger=logger) |
| 35 | 35 | ||
| 36 | def start(self, params=None, extra_bootparams=None): | 36 | def start(self, params=None, extra_bootparams=None): |
| 37 | if self.runner.start(params, extra_bootparams=extra_bootparams): | 37 | if self.runner.start(params, extra_bootparams=extra_bootparams): |
diff --git a/meta/lib/oeqa/selftest/runqemu.py b/meta/lib/oeqa/selftest/runqemu.py index 58c6f96f98..89ee780115 100644 --- a/meta/lib/oeqa/selftest/runqemu.py +++ b/meta/lib/oeqa/selftest/runqemu.py | |||
| @@ -3,7 +3,6 @@ | |||
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | import re | 5 | import re |
| 6 | import logging | ||
| 7 | 6 | ||
| 8 | from oeqa.selftest.base import oeSelfTest | 7 | from oeqa.selftest.base import oeSelfTest |
| 9 | from oeqa.utils.commands import bitbake, runqemu, get_bb_var | 8 | from oeqa.utils.commands import bitbake, runqemu, get_bb_var |
| @@ -21,10 +20,6 @@ class RunqemuTests(oeSelfTest): | |||
| 21 | self.fstypes = "ext4 iso hddimg vmdk qcow2 vdi" | 20 | self.fstypes = "ext4 iso hddimg vmdk qcow2 vdi" |
| 22 | self.cmd_common = "runqemu nographic" | 21 | self.cmd_common = "runqemu nographic" |
| 23 | 22 | ||
| 24 | # Avoid emit the same record multiple times. | ||
| 25 | mainlogger = logging.getLogger("BitBake.Main") | ||
| 26 | mainlogger.propagate = False | ||
| 27 | |||
| 28 | self.write_config( | 23 | self.write_config( |
| 29 | """ | 24 | """ |
| 30 | MACHINE = "%s" | 25 | MACHINE = "%s" |
diff --git a/meta/lib/oeqa/targetcontrol.py b/meta/lib/oeqa/targetcontrol.py index e17c89552f..f63936c3ec 100644 --- a/meta/lib/oeqa/targetcontrol.py +++ b/meta/lib/oeqa/targetcontrol.py | |||
| @@ -18,19 +18,18 @@ from oeqa.utils.dump import TargetDumper | |||
| 18 | from oeqa.controllers.testtargetloader import TestTargetLoader | 18 | from oeqa.controllers.testtargetloader import TestTargetLoader |
| 19 | from abc import ABCMeta, abstractmethod | 19 | from abc import ABCMeta, abstractmethod |
| 20 | 20 | ||
| 21 | logger = logging.getLogger('BitBake.QemuRunner') | ||
| 22 | |||
| 23 | class BaseTarget(object, metaclass=ABCMeta): | 21 | class BaseTarget(object, metaclass=ABCMeta): |
| 24 | 22 | ||
| 25 | supported_image_fstypes = [] | 23 | supported_image_fstypes = [] |
| 26 | 24 | ||
| 27 | def __init__(self, d): | 25 | def __init__(self, d, logger): |
| 28 | self.connection = None | 26 | self.connection = None |
| 29 | self.ip = None | 27 | self.ip = None |
| 30 | self.server_ip = None | 28 | self.server_ip = None |
| 31 | self.datetime = d.getVar('DATETIME') | 29 | self.datetime = d.getVar('DATETIME') |
| 32 | self.testdir = d.getVar("TEST_LOG_DIR") | 30 | self.testdir = d.getVar("TEST_LOG_DIR") |
| 33 | self.pn = d.getVar("PN") | 31 | self.pn = d.getVar("PN") |
| 32 | self.logger = logger | ||
| 34 | 33 | ||
| 35 | @abstractmethod | 34 | @abstractmethod |
| 36 | def deploy(self): | 35 | def deploy(self): |
| @@ -40,7 +39,7 @@ class BaseTarget(object, metaclass=ABCMeta): | |||
| 40 | if os.path.islink(sshloglink): | 39 | if os.path.islink(sshloglink): |
| 41 | os.unlink(sshloglink) | 40 | os.unlink(sshloglink) |
| 42 | os.symlink(self.sshlog, sshloglink) | 41 | os.symlink(self.sshlog, sshloglink) |
| 43 | logger.info("SSH log file: %s" % self.sshlog) | 42 | self.logger.info("SSH log file: %s" % self.sshlog) |
| 44 | 43 | ||
| 45 | @abstractmethod | 44 | @abstractmethod |
| 46 | def start(self, params=None, ssh=True, extra_bootparams=None): | 45 | def start(self, params=None, ssh=True, extra_bootparams=None): |
| @@ -90,7 +89,7 @@ class QemuTarget(BaseTarget): | |||
| 90 | 89 | ||
| 91 | supported_image_fstypes = ['ext3', 'ext4', 'cpio.gz', 'wic'] | 90 | supported_image_fstypes = ['ext3', 'ext4', 'cpio.gz', 'wic'] |
| 92 | 91 | ||
| 93 | def __init__(self, d, image_fstype=None, logger=None): | 92 | def __init__(self, d, logger, image_fstype=None): |
| 94 | 93 | ||
| 95 | super(QemuTarget, self).__init__(d, logger) | 94 | super(QemuTarget, self).__init__(d, logger) |
| 96 | 95 | ||
| @@ -120,7 +119,7 @@ class QemuTarget(BaseTarget): | |||
| 120 | self.qemurunnerlog = os.path.join(self.testdir, 'qemurunner_log.%s' % self.datetime) | 119 | self.qemurunnerlog = os.path.join(self.testdir, 'qemurunner_log.%s' % self.datetime) |
| 121 | loggerhandler = logging.FileHandler(self.qemurunnerlog) | 120 | loggerhandler = logging.FileHandler(self.qemurunnerlog) |
| 122 | loggerhandler.setFormatter(logging.Formatter("%(levelname)s: %(message)s")) | 121 | loggerhandler.setFormatter(logging.Formatter("%(levelname)s: %(message)s")) |
| 123 | logger.addHandler(loggerhandler) | 122 | self.logger.addHandler(loggerhandler) |
| 124 | oe.path.symlink(os.path.basename(self.qemurunnerlog), os.path.join(self.testdir, 'qemurunner_log'), force=True) | 123 | oe.path.symlink(os.path.basename(self.qemurunnerlog), os.path.join(self.testdir, 'qemurunner_log'), force=True) |
| 125 | 124 | ||
| 126 | if d.getVar("DISTRO") == "poky-tiny": | 125 | if d.getVar("DISTRO") == "poky-tiny": |
| @@ -131,7 +130,8 @@ class QemuTarget(BaseTarget): | |||
| 131 | display = d.getVar("BB_ORIGENV", False).getVar("DISPLAY"), | 130 | display = d.getVar("BB_ORIGENV", False).getVar("DISPLAY"), |
| 132 | logfile = self.qemulog, | 131 | logfile = self.qemulog, |
| 133 | kernel = self.kernel, | 132 | kernel = self.kernel, |
| 134 | boottime = int(d.getVar("TEST_QEMUBOOT_TIMEOUT"))) | 133 | boottime = int(d.getVar("TEST_QEMUBOOT_TIMEOUT")), |
| 134 | logger = logger) | ||
| 135 | else: | 135 | else: |
| 136 | self.runner = QemuRunner(machine=d.getVar("MACHINE"), | 136 | self.runner = QemuRunner(machine=d.getVar("MACHINE"), |
| 137 | rootfs=self.rootfs, | 137 | rootfs=self.rootfs, |
| @@ -142,7 +142,8 @@ class QemuTarget(BaseTarget): | |||
| 142 | boottime = int(d.getVar("TEST_QEMUBOOT_TIMEOUT")), | 142 | boottime = int(d.getVar("TEST_QEMUBOOT_TIMEOUT")), |
| 143 | use_kvm = use_kvm, | 143 | use_kvm = use_kvm, |
| 144 | dump_dir = dump_dir, | 144 | dump_dir = dump_dir, |
| 145 | dump_host_cmds = d.getVar("testimage_dump_host")) | 145 | dump_host_cmds = d.getVar("testimage_dump_host"), |
| 146 | logger = logger) | ||
| 146 | 147 | ||
| 147 | self.target_dumper = TargetDumper(dump_target_cmds, dump_dir, self.runner) | 148 | self.target_dumper = TargetDumper(dump_target_cmds, dump_dir, self.runner) |
| 148 | 149 | ||
| @@ -154,8 +155,8 @@ class QemuTarget(BaseTarget): | |||
| 154 | os.unlink(qemuloglink) | 155 | os.unlink(qemuloglink) |
| 155 | os.symlink(self.qemulog, qemuloglink) | 156 | os.symlink(self.qemulog, qemuloglink) |
| 156 | 157 | ||
| 157 | logger.info("rootfs file: %s" % self.rootfs) | 158 | self.logger.info("rootfs file: %s" % self.rootfs) |
| 158 | logger.info("Qemu log file: %s" % self.qemulog) | 159 | self.logger.info("Qemu log file: %s" % self.qemulog) |
| 159 | super(QemuTarget, self).deploy() | 160 | super(QemuTarget, self).deploy() |
| 160 | 161 | ||
| 161 | def start(self, params=None, ssh=True, extra_bootparams='', runqemuparams='', launch_cmd='', discard_writes=True): | 162 | def start(self, params=None, ssh=True, extra_bootparams='', runqemuparams='', launch_cmd='', discard_writes=True): |
| @@ -207,14 +208,14 @@ class SimpleRemoteTarget(BaseTarget): | |||
| 207 | self.port = addr.split(":")[1] | 208 | self.port = addr.split(":")[1] |
| 208 | except IndexError: | 209 | except IndexError: |
| 209 | self.port = None | 210 | self.port = None |
| 210 | logger.info("Target IP: %s" % self.ip) | 211 | self.logger.info("Target IP: %s" % self.ip) |
| 211 | self.server_ip = d.getVar("TEST_SERVER_IP") | 212 | self.server_ip = d.getVar("TEST_SERVER_IP") |
| 212 | if not self.server_ip: | 213 | if not self.server_ip: |
| 213 | try: | 214 | try: |
| 214 | self.server_ip = subprocess.check_output(['ip', 'route', 'get', self.ip ]).split("\n")[0].split()[-1] | 215 | self.server_ip = subprocess.check_output(['ip', 'route', 'get', self.ip ]).split("\n")[0].split()[-1] |
| 215 | except Exception as e: | 216 | except Exception as e: |
| 216 | bb.fatal("Failed to determine the host IP address (alternatively you can set TEST_SERVER_IP with the IP address of this machine): %s" % e) | 217 | bb.fatal("Failed to determine the host IP address (alternatively you can set TEST_SERVER_IP with the IP address of this machine): %s" % e) |
| 217 | logger.info("Server IP: %s" % self.server_ip) | 218 | self.logger.info("Server IP: %s" % self.server_ip) |
| 218 | 219 | ||
| 219 | def deploy(self): | 220 | def deploy(self): |
| 220 | super(SimpleRemoteTarget, self).deploy() | 221 | super(SimpleRemoteTarget, self).deploy() |
diff --git a/meta/lib/oeqa/utils/commands.py b/meta/lib/oeqa/utils/commands.py index 57286fcb10..ed925a4d92 100644 --- a/meta/lib/oeqa/utils/commands.py +++ b/meta/lib/oeqa/utils/commands.py | |||
| @@ -233,6 +233,12 @@ def runqemu(pn, ssh=True, runqemuparams='', image_fstype=None, launch_cmd=None, | |||
| 233 | import bb.tinfoil | 233 | import bb.tinfoil |
| 234 | import bb.build | 234 | import bb.build |
| 235 | 235 | ||
| 236 | # Need a non-'BitBake' logger to capture the runner output | ||
| 237 | targetlogger = logging.getLogger('TargetRunner') | ||
| 238 | targetlogger.setLevel(logging.DEBUG) | ||
| 239 | handler = logging.StreamHandler(sys.stdout) | ||
| 240 | targetlogger.addHandler(handler) | ||
| 241 | |||
| 236 | tinfoil = bb.tinfoil.Tinfoil() | 242 | tinfoil = bb.tinfoil.Tinfoil() |
| 237 | tinfoil.prepare(config_only=False, quiet=True) | 243 | tinfoil.prepare(config_only=False, quiet=True) |
| 238 | try: | 244 | try: |
| @@ -250,31 +256,15 @@ def runqemu(pn, ssh=True, runqemuparams='', image_fstype=None, launch_cmd=None, | |||
| 250 | for key, value in overrides.items(): | 256 | for key, value in overrides.items(): |
| 251 | recipedata.setVar(key, value) | 257 | recipedata.setVar(key, value) |
| 252 | 258 | ||
| 253 | # The QemuRunner log is saved out, but we need to ensure it is at the right | ||
| 254 | # log level (and then ensure that since it's a child of the BitBake logger, | ||
| 255 | # we disable propagation so we don't then see the log events on the console) | ||
| 256 | logger = logging.getLogger('BitBake.QemuRunner') | ||
| 257 | logger.setLevel(logging.DEBUG) | ||
| 258 | logger.propagate = False | ||
| 259 | logdir = recipedata.getVar("TEST_LOG_DIR") | 259 | logdir = recipedata.getVar("TEST_LOG_DIR") |
| 260 | 260 | ||
| 261 | qemu = oeqa.targetcontrol.QemuTarget(recipedata, image_fstype) | 261 | qemu = oeqa.targetcontrol.QemuTarget(recipedata, targetlogger, image_fstype) |
| 262 | finally: | 262 | finally: |
| 263 | # We need to shut down tinfoil early here in case we actually want | 263 | # We need to shut down tinfoil early here in case we actually want |
| 264 | # to run tinfoil-using utilities with the running QEMU instance. | 264 | # to run tinfoil-using utilities with the running QEMU instance. |
| 265 | # Luckily QemuTarget doesn't need it after the constructor. | 265 | # Luckily QemuTarget doesn't need it after the constructor. |
| 266 | tinfoil.shutdown() | 266 | tinfoil.shutdown() |
| 267 | 267 | ||
| 268 | # Setup bitbake logger as console handler is removed by tinfoil.shutdown | ||
| 269 | bblogger = logging.getLogger('BitBake') | ||
| 270 | bblogger.setLevel(logging.INFO) | ||
| 271 | console = logging.StreamHandler(sys.stdout) | ||
| 272 | bbformat = bb.msg.BBLogFormatter("%(levelname)s: %(message)s") | ||
| 273 | if sys.stdout.isatty(): | ||
| 274 | bbformat.enable_color() | ||
| 275 | console.setFormatter(bbformat) | ||
| 276 | bblogger.addHandler(console) | ||
| 277 | |||
| 278 | try: | 268 | try: |
| 279 | qemu.deploy() | 269 | qemu.deploy() |
| 280 | try: | 270 | try: |
| @@ -289,6 +279,7 @@ def runqemu(pn, ssh=True, runqemuparams='', image_fstype=None, launch_cmd=None, | |||
| 289 | qemu.stop() | 279 | qemu.stop() |
| 290 | except: | 280 | except: |
| 291 | pass | 281 | pass |
| 282 | targetlogger.removeHandler(handler) | ||
| 292 | 283 | ||
| 293 | def updateEnv(env_file): | 284 | def updateEnv(env_file): |
| 294 | """ | 285 | """ |
diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py index 12653931f4..7ca9f1c736 100644 --- a/meta/lib/oeqa/utils/qemurunner.py +++ b/meta/lib/oeqa/utils/qemurunner.py | |||
| @@ -28,7 +28,7 @@ re_control_char = re.compile('[%s]' % re.escape("".join(control_chars))) | |||
| 28 | 28 | ||
| 29 | class QemuRunner: | 29 | class QemuRunner: |
| 30 | 30 | ||
| 31 | def __init__(self, machine, rootfs, display, tmpdir, deploy_dir_image, logfile, boottime, dump_dir, dump_host_cmds, use_kvm): | 31 | def __init__(self, machine, rootfs, display, tmpdir, deploy_dir_image, logfile, boottime, dump_dir, dump_host_cmds, use_kvm, logger): |
| 32 | 32 | ||
| 33 | # Popen object for runqemu | 33 | # Popen object for runqemu |
| 34 | self.runqemu = None | 34 | self.runqemu = None |
| @@ -57,9 +57,7 @@ class QemuRunner: | |||
| 57 | self.qemu_pidfile = 'pidfile_'+str(os.getpid()) | 57 | self.qemu_pidfile = 'pidfile_'+str(os.getpid()) |
| 58 | self.host_dumper = HostDumper(dump_host_cmds, dump_dir) | 58 | self.host_dumper = HostDumper(dump_host_cmds, dump_dir) |
| 59 | 59 | ||
| 60 | self.logger = logging.getLogger("BitBake.QemuRunner") | 60 | self.logger = logger |
| 61 | self.handler = logging.StreamHandler(sys.stdout) | ||
| 62 | self.logger.addHandler(self.handler) | ||
| 63 | 61 | ||
| 64 | def create_socket(self): | 62 | def create_socket(self): |
| 65 | try: | 63 | try: |
| @@ -370,7 +368,6 @@ class QemuRunner: | |||
| 370 | self.ip = None | 368 | self.ip = None |
| 371 | if os.path.exists(self.qemu_pidfile): | 369 | if os.path.exists(self.qemu_pidfile): |
| 372 | os.remove(self.qemu_pidfile) | 370 | os.remove(self.qemu_pidfile) |
| 373 | self.logger.removeHandler(self.handler) | ||
| 374 | 371 | ||
| 375 | def stop_qemu_system(self): | 372 | def stop_qemu_system(self): |
| 376 | if self.qemupid: | 373 | if self.qemupid: |
diff --git a/meta/lib/oeqa/utils/qemutinyrunner.py b/meta/lib/oeqa/utils/qemutinyrunner.py index 1bf59007ff..63b5d1648b 100644 --- a/meta/lib/oeqa/utils/qemutinyrunner.py +++ b/meta/lib/oeqa/utils/qemutinyrunner.py | |||
| @@ -17,7 +17,7 @@ from .qemurunner import QemuRunner | |||
| 17 | 17 | ||
| 18 | class QemuTinyRunner(QemuRunner): | 18 | class QemuTinyRunner(QemuRunner): |
| 19 | 19 | ||
| 20 | def __init__(self, machine, rootfs, display, tmpdir, deploy_dir_image, logfile, kernel, boottime): | 20 | def __init__(self, machine, rootfs, display, tmpdir, deploy_dir_image, logfile, kernel, boottime, logger): |
| 21 | 21 | ||
| 22 | # Popen object for runqemu | 22 | # Popen object for runqemu |
| 23 | self.runqemu = None | 23 | self.runqemu = None |
| @@ -40,6 +40,7 @@ class QemuTinyRunner(QemuRunner): | |||
| 40 | self.socketfile = "console.sock" | 40 | self.socketfile = "console.sock" |
| 41 | self.server_socket = None | 41 | self.server_socket = None |
| 42 | self.kernel = kernel | 42 | self.kernel = kernel |
| 43 | self.logger = logger | ||
| 43 | 44 | ||
| 44 | 45 | ||
| 45 | def create_socket(self): | 46 | def create_socket(self): |
