mirror of
https://git.yoctoproject.org/poky
synced 2026-02-06 08:48:45 +01:00
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>
106 lines
3.3 KiB
Python
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')
|