Skip to content

Commit 16fecbe

Browse files
authored
fix: Semi aggregated query for hardware details summary endpoint (#1832)
* Bring data grouped by the filter values, ensuring a mid point between bringing all the data to be aggregated and filtered on the app, and needing to query for every filter change. * Build / Test duration is an exception, as they are continuous columns, and any change will trigger a new query. * Include a validation for invalid status values. * Small frontend bugfix on rerender loop when applying trees filter.
1 parent 9bd0e65 commit 16fecbe

11 files changed

Lines changed: 914 additions & 334 deletions

File tree

backend/kernelCI_app/constants/localization.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class ClientStrings:
3434
ISSUE_NOT_FOUND = "Issue not found"
3535
NO_ISSUE_FOUND = "No issues found"
3636
INVALID_JSON_BODY = "Invalid body, request body must be a valid json string"
37+
INVALID_FILTERS = "Invalid filter key or value"
3738
ISSUE_EMPTY_LIST = "Invalid body, the issue list must not be empty"
3839
ISSUE_NO_EXTRA_DETAILS = (
3940
"No extra details found. Issue id has no incident or doesn't exist."

backend/kernelCI_app/helpers/filters.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from kernelCI_app.constants.general import UNCATEGORIZED_STRING
66
from kernelCI_app.helpers.commonDetails import PossibleTabs
77
from kernelCI_app.helpers.logger import log_message
8+
from kernelCI_app.models import StatusChoices
89
from kernelCI_app.typeModels.databases import (
910
StatusValues,
1011
failure_status_list,
@@ -22,6 +23,10 @@
2223
NULL_STRINGS = set(["null", UNKNOWN_STRING, "NULL"])
2324

2425

26+
def is_valid_status(status: str) -> bool:
27+
return status.upper() in {*StatusChoices, "NULL"}
28+
29+
2530
def is_status_failure(
2631
test_status: StatusValues, fail_list: list[StatusValues] = failure_status_list
2732
) -> bool:
@@ -129,6 +134,10 @@ def is_issue_filtered_out(
129134
return not in_filter
130135

131136

137+
def is_filtered_out(value: str, filter_values: set[str]):
138+
return filter_values and value not in filter_values
139+
140+
132141
def should_filter_test_issue(
133142
*,
134143
issue_filters: set,
@@ -361,6 +370,7 @@ def __init__(self, data: Dict, process_body=False) -> None:
361370
"test.status": self._handle_test_status,
362371
"test.duration": self._handle_test_duration,
363372
"build.status": self._handle_build_status,
373+
"duration": self._handle_build_duration, # TODO: same as build.duration (should be standardized)
364374
"build.duration": self._handle_build_duration,
365375
"origin": self._handle_origins,
366376
"config_name": self._handle_config_name,
@@ -391,6 +401,14 @@ def __init__(self, data: Dict, process_body=False) -> None:
391401

392402
self._process_filters()
393403

404+
def __repr__(self) -> str:
405+
parts = ""
406+
for parsed_filter in self.filters:
407+
parts += "\n\t{},".format(
408+
", ".join([f"{key}={val}" for key, val in parsed_filter.items()])
409+
)
410+
return f"FilterParams({parts})"
411+
394412
def _handle_boot_status(self, current_filter: ParsedFilter) -> None:
395413
self.filterBootStatus.add(current_filter["value"])
396414

backend/kernelCI_app/helpers/hardwareDetails.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -509,8 +509,8 @@ def process_issue(
509509
incident_test_id=record["incidents__test_id"],
510510
build_status=record["build__status"],
511511
test_status=record["status"],
512-
issue_comment=record["incidents__issue__comment"],
513-
issue_report_url=record["incidents__issue__report_url"],
512+
issue_comment=record.get("incidents__issue__comment"),
513+
issue_report_url=record.get("incidents__issue__report_url"),
514514
is_failed_task=is_failed_task,
515515
issue_from=issue_from,
516516
task=task_issues_dict,

backend/kernelCI_app/helpers/issueExtras.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from collections import defaultdict
2-
from typing import List, Tuple
2+
from typing import List, Tuple, Optional
33

4+
from kernelCI_app.constants.general import UNCATEGORIZED_STRING
45
from kernelCI_app.helpers.logger import log_message
56
from kernelCI_app.queries.issues import get_issue_first_seen_data, get_issue_trees_data
67
from kernelCI_app.typeModels.issues import (
@@ -20,6 +21,14 @@ class TagUrls:
2021
)
2122

2223

24+
def parse_issue(issue_str: Optional[str]) -> tuple[str, Optional[int]]:
25+
if issue_str is None:
26+
return (UNCATEGORIZED_STRING, None)
27+
issue_id, _, issue_version = issue_str.partition(",")
28+
issue_version = int(issue_version) if issue_version.upper() != "NULL" else None
29+
return (issue_id, issue_version)
30+
31+
2332
def process_issues_extra_details(
2433
*,
2534
issue_key_list: List[Tuple[str, int]],

0 commit comments

Comments
 (0)