diff mbox series

[1/3] oeqa/runtime/parselogs: load ignores from disk

Message ID 20231204182419.2455488-2-ross.burton@arm.com
State Accepted, archived
Commit 7a04063f7cff243fe2bee09664ad7979612110cb
Headers show
Series Move parselog ignores from code to data | expand

Commit Message

Ross Burton Dec. 4, 2023, 6:24 p.m. UTC
From: Ross Burton <ross.burton@arm.com>

Instead of hardcoding the list of ignored errors/warnings in the test
itself, read them plain text files on disk.

This uses importlib to try to open a file called
oeqa.runtime.cases.parselogs-ignores-[candidate].txt, where the
candidate will be:

- "common"
- The TARGET_ARCH
- Each of the MACHINEOVERRDES

This allows the common and tune-specific ignores to be retained in
oe-core, and machine-specific ignores added to the layer where the
machine is defined.

[ YOCTO #14604 ]

Signed-off-by: Ross Burton <ross.burton@arm.com>
---
 meta/lib/oeqa/runtime/cases/parselogs.py | 40 +++++++++++++++++++++---
 1 file changed, 35 insertions(+), 5 deletions(-)
diff mbox series

Patch

diff --git a/meta/lib/oeqa/runtime/cases/parselogs.py b/meta/lib/oeqa/runtime/cases/parselogs.py
index cddb846bdfc..5527ebd271c 100644
--- a/meta/lib/oeqa/runtime/cases/parselogs.py
+++ b/meta/lib/oeqa/runtime/cases/parselogs.py
@@ -6,6 +6,7 @@ 
 
 import collections
 import os
+import sys
 
 from shutil import rmtree
 from oeqa.runtime.case import OERuntimeTestCase
@@ -190,6 +191,23 @@  ignore_errors = {
         ] + common_errors,
 }
 
+
+# importlib.resources.open_text in Python <3.10 doesn't search all directories
+# when a package is split across multiple directories. Until we can rely on
+# 3.10+, reimplement the searching logic.
+if sys.version_info < (3, 10):
+    def _open_text(package, resource):
+        import importlib, pathlib
+        module = importlib.import_module(package)
+        for path in module.__path__:
+            candidate = pathlib.Path(path) / resource
+            if candidate.exists():
+                return candidate.open(encoding='utf-8')
+        raise FileNotFoundError
+else:
+    from importlib.resources import open_text as _open_text
+
+
 class ParseLogsTest(OERuntimeTestCase):
 
     # Which log files should be collected
@@ -198,6 +216,9 @@  class ParseLogsTest(OERuntimeTestCase):
     # The keywords that identify error messages in the log files
     errors = ["error", "cannot", "can't", "failed"]
 
+    # A list of error messages that should be ignored
+    ignore_errors = []
+
     @classmethod
     def setUpClass(cls):
         # When systemd is enabled we need to notice errors on
@@ -212,11 +233,20 @@  class ParseLogsTest(OERuntimeTestCase):
 
         cls.errors = [s.casefold() for s in cls.errors]
 
-        try:
-            cls.ignore_errors = [s.casefold() for s in ignore_errors[cls.td.get('MACHINE')]]
-        except KeyError:
-            cls.logger.info('No ignore list found for this machine, using default')
-            cls.ignore_errors = [s.casefold() for s in ignore_errors['default']]
+        cls.load_machine_ignores()
+
+    @classmethod
+    def load_machine_ignores(cls):
+        # Add TARGET_ARCH explicitly as not every machine has that in MACHINEOVERRDES (eg qemux86-64)
+        for candidate in ["common", cls.td.get("TARGET_ARCH")] + cls.td.get("MACHINEOVERRIDES").split(":"):
+            try:
+                name = f"parselogs-ignores-{candidate}.txt"
+                for line in _open_text("oeqa.runtime.cases", name):
+                    line = line.strip()
+                    if line and not line.startswith("#"):
+                        cls.ignore_errors.append(line.casefold())
+            except FileNotFoundError:
+                pass
 
     # Go through the log locations provided and if it's a folder
     # create a list with all the .log files in it, if it's a file