Files
poky/meta/lib/oeqa/utils/__init__.py
Richard Purdie fdcaf1cce9 oeqa/postactions: Separate artefact collection from test result collection
Combining the test result collection and artefact collection hasn't worked out
well as the data has different life cycles, the artefacts can be large and
we need to be able to clean them up on a different timescale.

Separate them out to be controlled by a separate variable, OEQA_ARTEFACT_DIR.
Also rework the code to inject a directory with a date/time and random component
to allow builds to run in parallel. Pass function arguments to avoid re-reading
variables.

(From OE-Core rev: e1cf7e94c3fcbe7dbc29e4286f0e1014b95964a9)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2024-07-18 17:21:39 +01:00

106 lines
3.3 KiB
Python

#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
# Enable other layers to have modules in the same named directory
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
# Borrowed from CalledProcessError
class CommandError(Exception):
def __init__(self, retcode, cmd, output = None):
self.retcode = retcode
self.cmd = cmd
self.output = output
def __str__(self):
return "Command '%s' returned non-zero exit status %d with output: %s" % (self.cmd, self.retcode, self.output)
def avoid_paths_in_environ(paths):
"""
Searches for every path in os.environ['PATH']
if found remove it.
Returns new PATH without avoided PATHs.
"""
import os
new_path = ''
for p in os.environ['PATH'].split(':'):
avoid = False
for pa in paths:
if pa in p:
avoid = True
break
if avoid:
continue
new_path = new_path + p + ':'
new_path = new_path[:-1]
return new_path
def make_logger_bitbake_compatible(logger):
import logging
"""
We need to raise the log level of the info output so unittest
messages are visible on the console.
"""
def _bitbake_log_info(msg, *args, **kwargs):
logger.log(logging.INFO + 1, msg, *args, **kwargs)
logger.info = _bitbake_log_info
return logger
def load_test_components(logger, executor):
import sys
import os
import importlib
from oeqa.core.context import OETestContextExecutor
components = {}
for path in sys.path:
base_dir = os.path.join(path, 'oeqa')
if os.path.exists(base_dir) and os.path.isdir(base_dir):
for file in os.listdir(base_dir):
comp_name = file
comp_context = os.path.join(base_dir, file, 'context.py')
if os.path.exists(comp_context):
comp_plugin = importlib.import_module('oeqa.%s.%s' % \
(comp_name, 'context'))
try:
if not issubclass(comp_plugin._executor_class,
OETestContextExecutor):
raise TypeError("Component %s in %s, _executor_class "\
"isn't derived from OETestContextExecutor."\
% (comp_name, comp_context))
if comp_plugin._executor_class._script_executor \
!= executor:
continue
components[comp_name] = comp_plugin._executor_class()
except AttributeError:
raise AttributeError("Component %s in %s don't have "\
"_executor_class defined." % (comp_name, comp_context))
return components
def get_json_result_dir(d):
json_result_dir = os.path.join(d.getVar("LOG_DIR"), 'oeqa')
custom_json_result_dir = d.getVar("OEQA_JSON_RESULT_DIR")
if custom_json_result_dir:
json_result_dir = custom_json_result_dir
return json_result_dir
def get_artefact_dir(d):
custom_json_result_dir = d.getVar("OEQA_ARTEFACT_DIR")
if custom_json_result_dir:
return custom_json_result_dir
return os.path.join(d.getVar("LOG_DIR"), 'oeqa-artefacts')