Skip to content

Commit 08b0418

Browse files
committed
src/regression_tracker: refine node search and regression generation
Restrict the search of past results to those with the same platform, defconfig, compiler, platform, etc than the original failed test. Update the regression generation to the latest model definitions. Signed-off-by: Ricardo Cañuelo <[email protected]>
1 parent b4981f5 commit 08b0418

File tree

1 file changed

+39
-24
lines changed

1 file changed

+39
-24
lines changed

src/regression_tracker.py

+39-24
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import sys
99

10+
import json
11+
1012
import kernelci
1113
import kernelci.config
1214
import kernelci.db
@@ -19,7 +21,6 @@ class RegressionTracker(Service):
1921

2022
def __init__(self, configs, args):
2123
super().__init__(configs, args, 'regression_tracker')
22-
self._regression_fields = ['group', 'name', 'path']
2324

2425
def _setup(self, args):
2526
return self._api_helper.subscribe_filters({
@@ -33,41 +34,55 @@ def _stop(self, sub_id):
3334
def _create_regression(self, failed_node, last_successful_node):
3435
"""Method to create a regression"""
3536
regression = {}
36-
for field in self._regression_fields:
37-
regression[field] = failed_node[field]
38-
3937
regression['kind'] = 'regression'
38+
regression['name'] = failed_node['name']
39+
regression['path'] = failed_node['path']
40+
regression['group'] = failed_node['group']
41+
regression['state'] = 'done'
4042
regression['data'] = {
4143
'fail_node': failed_node['id'],
4244
'pass_node': last_successful_node['id'],
45+
'arch': failed_node['data'].get('arch'),
46+
'defconfig': failed_node['data'].get('defconfig'),
47+
'compiler': failed_node['data'].get('compiler'),
48+
'platform': failed_node['data'].get('platform'),
49+
'failed_kernel_version': failed_node['data'].get('kernel_revision'), # noqa
4350
}
44-
reg = self._api_helper.submit_regression(regression)
51+
resp = self._api_helper.submit_regression(regression)
52+
reg = json.loads(resp.text)
53+
self.log.info(f"Regression submitted: {reg['id']}")
4554

46-
def _detect_regression(self, node):
55+
def _detect_regression(self, fail_node):
4756
"""Method to check and detect regression"""
4857
previous_nodes = self._api.node.find({
49-
'name': node['name'],
50-
'group': node['group'],
51-
'path': node['path'],
58+
'name': fail_node['name'],
59+
'group': fail_node['group'],
60+
'path': fail_node['path'],
5261
'data.kernel_revision.tree':
53-
node['data']['kernel_revision']['tree'],
62+
fail_node['data']['kernel_revision']['tree'],
5463
'data.kernel_revision.branch':
55-
node['data']['kernel_revision']['branch'],
56-
'data.kernel_revision.url': node['data']['kernel_revision']['url'],
57-
'created__lt': node['created'],
64+
fail_node['data']['kernel_revision']['branch'],
65+
'data.kernel_revision.url':
66+
fail_node['data']['kernel_revision']['url'],
67+
'data.arch': fail_node['data']['arch'],
68+
'data.defconfig': fail_node['data']['defconfig'],
69+
'data.compiler': fail_node['data']['compiler'],
70+
'data.platform': fail_node['data']['platform'],
71+
'created__lt': fail_node['created'],
72+
'state': 'done'
5873
})
5974

60-
if previous_nodes:
61-
previous_nodes = sorted(
62-
previous_nodes,
63-
key=lambda node: node['created'],
64-
reverse=True
65-
)
66-
67-
if previous_nodes[0]['result'] == 'pass':
68-
self.log.info(f"Detected regression for node id: \
69-
{node['id']}")
70-
self._create_regression(node, previous_nodes[0])
75+
if not previous_nodes:
76+
return
77+
previous_node = sorted(
78+
previous_nodes,
79+
key=lambda node: node['created'],
80+
reverse=True
81+
)[0]
82+
if previous_node['result'] == 'pass':
83+
self.log.info("Detected regression for node id: "
84+
f"{fail_node['id']}")
85+
self._create_regression(fail_node, previous_node)
7186

7287
def _get_all_failed_child_nodes(self, failures, root_node):
7388
"""Method to get all failed nodes recursively from top-level node"""

0 commit comments

Comments
 (0)