1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
#
# 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
"""
Bitbake logger redifines debug() in order to
set a level within debug, this breaks compatibility
with vainilla logging, so we neeed to redifine debug()
method again also add info() method with INFO + 1 level.
"""
def _bitbake_log_debug(*args, **kwargs):
lvl = logging.DEBUG
if isinstance(args[0], int):
lvl = args[0]
msg = args[1]
args = args[2:]
else:
msg = args[0]
args = args[1:]
logger.log(lvl, msg, *args, **kwargs)
def _bitbake_log_info(msg, *args, **kwargs):
logger.log(logging.INFO + 1, msg, *args, **kwargs)
logger.debug = _bitbake_log_debug
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
|