diff options
| -rw-r--r-- | meta/lib/oeqa/core/target/qemu.py | 2 | ||||
| -rw-r--r-- | meta/lib/oeqa/selftest/cases/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/cases/runqemu.py b/meta/lib/oeqa/selftest/cases/runqemu.py index 1a8d12178d..47d41f5218 100644 --- a/meta/lib/oeqa/selftest/cases/runqemu.py +++ b/meta/lib/oeqa/selftest/cases/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.case import OESelftestTestCase | 7 | from oeqa.selftest.case import OESelftestTestCase |
| 9 | from oeqa.utils.commands import bitbake, runqemu, get_bb_var | 8 | from oeqa.utils.commands import bitbake, runqemu, get_bb_var |
| @@ -24,10 +23,6 @@ class RunqemuTests(OESelftestTestCase): | |||
| 24 | self.fstypes = "ext4 iso hddimg wic.vmdk wic.qcow2 wic.vdi" | 23 | self.fstypes = "ext4 iso hddimg wic.vmdk wic.qcow2 wic.vdi" |
| 25 | self.cmd_common = "runqemu nographic" | 24 | self.cmd_common = "runqemu nographic" |
| 26 | 25 | ||
| 27 | # Avoid emit the same record multiple times. | ||
| 28 | mainlogger = logging.getLogger("BitBake.Main") | ||
| 29 | mainlogger.propagate = False | ||
| 30 | |||
| 31 | self.write_config( | 26 | self.write_config( |
| 32 | """ | 27 | """ |
| 33 | MACHINE = "%s" | 28 | 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 5e5345434d..0bb90028dc 100644 --- a/meta/lib/oeqa/utils/commands.py +++ b/meta/lib/oeqa/utils/commands.py | |||
| @@ -296,6 +296,12 @@ def runqemu(pn, ssh=True, runqemuparams='', image_fstype=None, launch_cmd=None, | |||
| 296 | import bb.tinfoil | 296 | import bb.tinfoil |
| 297 | import bb.build | 297 | import bb.build |
| 298 | 298 | ||
| 299 | # Need a non-'BitBake' logger to capture the runner output | ||
| 300 | targetlogger = logging.getLogger('TargetRunner') | ||
| 301 | targetlogger.setLevel(logging.DEBUG) | ||
| 302 | handler = logging.StreamHandler(sys.stdout) | ||
| 303 | targetlogger.addHandler(handler) | ||
| 304 | |||
| 299 | tinfoil = bb.tinfoil.Tinfoil() | 305 | tinfoil = bb.tinfoil.Tinfoil() |
| 300 | tinfoil.prepare(config_only=False, quiet=True) | 306 | tinfoil.prepare(config_only=False, quiet=True) |
| 301 | try: | 307 | try: |
| @@ -313,31 +319,15 @@ def runqemu(pn, ssh=True, runqemuparams='', image_fstype=None, launch_cmd=None, | |||
| 313 | for key, value in overrides.items(): | 319 | for key, value in overrides.items(): |
| 314 | recipedata.setVar(key, value) | 320 | recipedata.setVar(key, value) |
| 315 | 321 | ||
| 316 | # The QemuRunner log is saved out, but we need to ensure it is at the right | ||
| 317 | # log level (and then ensure that since it's a child of the BitBake logger, | ||
| 318 | # we disable propagation so we don't then see the log events on the console) | ||
| 319 | logger = logging.getLogger('BitBake.QemuRunner') | ||
| 320 | logger.setLevel(logging.DEBUG) | ||
| 321 | logger.propagate = False | ||
| 322 | logdir = recipedata.getVar("TEST_LOG_DIR") | 322 | logdir = recipedata.getVar("TEST_LOG_DIR") |
| 323 | 323 | ||
| 324 | qemu = oeqa.targetcontrol.QemuTarget(recipedata, image_fstype) | 324 | qemu = oeqa.targetcontrol.QemuTarget(recipedata, targetlogger, image_fstype) |
| 325 | finally: | 325 | finally: |
| 326 | # We need to shut down tinfoil early here in case we actually want | 326 | # We need to shut down tinfoil early here in case we actually want |
| 327 | # to run tinfoil-using utilities with the running QEMU instance. | 327 | # to run tinfoil-using utilities with the running QEMU instance. |
| 328 | # Luckily QemuTarget doesn't need it after the constructor. | 328 | # Luckily QemuTarget doesn't need it after the constructor. |
| 329 | tinfoil.shutdown() | 329 | tinfoil.shutdown() |
| 330 | 330 | ||
| 331 | # Setup bitbake logger as console handler is removed by tinfoil.shutdown | ||
| 332 | bblogger = logging.getLogger('BitBake') | ||
| 333 | bblogger.setLevel(logging.INFO) | ||
| 334 | console = logging.StreamHandler(sys.stdout) | ||
| 335 | bbformat = bb.msg.BBLogFormatter("%(levelname)s: %(message)s") | ||
| 336 | if sys.stdout.isatty(): | ||
| 337 | bbformat.enable_color() | ||
| 338 | console.setFormatter(bbformat) | ||
| 339 | bblogger.addHandler(console) | ||
| 340 | |||
| 341 | try: | 331 | try: |
| 342 | qemu.deploy() | 332 | qemu.deploy() |
| 343 | try: | 333 | try: |
| @@ -352,6 +342,7 @@ def runqemu(pn, ssh=True, runqemuparams='', image_fstype=None, launch_cmd=None, | |||
| 352 | qemu.stop() | 342 | qemu.stop() |
| 353 | except: | 343 | except: |
| 354 | pass | 344 | pass |
| 345 | targetlogger.removeHandler(handler) | ||
| 355 | 346 | ||
| 356 | def updateEnv(env_file): | 347 | def updateEnv(env_file): |
| 357 | """ | 348 | """ |
diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py index 32148871ff..82335d8456 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: |
| @@ -371,7 +369,6 @@ class QemuRunner: | |||
| 371 | self.ip = None | 369 | self.ip = None |
| 372 | if os.path.exists(self.qemu_pidfile): | 370 | if os.path.exists(self.qemu_pidfile): |
| 373 | os.remove(self.qemu_pidfile) | 371 | os.remove(self.qemu_pidfile) |
| 374 | self.logger.removeHandler(self.handler) | ||
| 375 | 372 | ||
| 376 | def stop_qemu_system(self): | 373 | def stop_qemu_system(self): |
| 377 | if self.qemupid: | 374 | 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): |
