diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-11-08 18:17:17 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-11-09 12:24:24 +0000 |
commit | 0e198a7311fe341c5bc20a697e90da2928c44262 (patch) | |
tree | 9d864cb840bb6295b28d93159c17384e2d5505e7 | |
parent | 7608f33f0f0c6c1c61c80a77e12270d06b236d84 (diff) | |
download | poky-0e198a7311fe341c5bc20a697e90da2928c44262.tar.gz |
oeqa: Clean up logger handling
The logger handling in oeqa was confused at best. This patch:
a) Passes in a logger through various qemu runner pieces
b) Uses that logger consistently in the code
c) Creates a logger for QemuRunner outside the bitbake namespace
meaning we don't conflict with the tinfoil logging changes
The result of this is more consistency. For runtime tests in testimage,
the logs always contain the debug info, nothing is shwon on the console.
For the oe-selftests, logs are intercepted and only shown if the test
fails.
(From OE-Core rev: 4ff678137a55b93c9ba2cbffda34335ba859f704)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-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): |