Skip to content

Commit

Permalink
improvement(results): allow manual sut selection
Browse files Browse the repository at this point in the history
In some cases it will be hard to automatically select proper SUT -
test that runs for the first time, or not supported package name by
automatic sut selection.

Allowed client (tests) to specify 'sut_package_name' - bypassing
automatic selection.

fixes: scylladb#550
  • Loading branch information
soyacz committed Jan 17, 2025
1 parent 65f07fe commit 31a3f9a
Show file tree
Hide file tree
Showing 5 changed files with 13 additions and 7 deletions.
1 change: 1 addition & 0 deletions argus/backend/models/result.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class ArgusGenericResultMetadata(Model):
columns_meta = columns.List(value_type=columns.UserDefinedType(ColumnMetadata))
validation_rules = columns.Map(key_type=columns.Ascii(), value_type=columns.List(columns.UserDefinedType(ValidationRules)))
rows_meta = columns.List(value_type=columns.Ascii())
sut_package_name = columns.Ascii()

def __init__(self, **kwargs):
kwargs["columns_meta"] = [ColumnMetadata(**col) for col in kwargs.pop('columns_meta', [])]
Expand Down
8 changes: 5 additions & 3 deletions argus/backend/service/results_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ def calculate_graph_ticks(graphs: List[Dict]) -> dict[str, str]:
def _identify_most_changed_package(packages_list: list[PackageVersion]) -> str:
version_date_changes: dict[str, set[tuple[str, str]]] = defaultdict(set)

# filtering as workaround for issue https://github.com/scylladb/argus/issues/550
# avoid counting unrelevant packages when detecting automatically
packages_list = [pkg for pkg in packages_list if pkg.name in ('scylla-server', 'scylla-manager-server')]
for package_version in packages_list:
version_date_changes[package_version.name].add((package_version.version, package_version.date))
Expand Down Expand Up @@ -398,7 +398,7 @@ def _get_runs_details(self, test_id: UUID) -> RunsDetails:
return RunsDetails(ignored=ignored_runs, packages=packages)

def _get_tables_metadata(self, test_id: UUID) -> list[ArgusGenericResultMetadata]:
query_fields = ["name", "description", "columns_meta", "rows_meta", "validation_rules"]
query_fields = ["name", "description", "columns_meta", "rows_meta", "validation_rules", "sut_package_name"]
raw_query = (f"SELECT {','.join(query_fields)}"
f" FROM generic_result_metadata_v1 WHERE test_id = ?")
query = self.cluster.prepare(raw_query)
Expand Down Expand Up @@ -515,7 +515,9 @@ def get_test_graphs(self, test_id: UUID, start_date: datetime | None = None, end
if not data:
continue
best_results = self.get_best_results(test_id=test_id, name=table.name)
main_package = _identify_most_changed_package([pkg for sublist in runs_details.packages.values() for pkg in sublist])
main_package = tables_meta[0].sut_package_name
if not main_package:
main_package = _identify_most_changed_package([pkg for sublist in runs_details.packages.values() for pkg in sublist])
releases_map = _split_results_by_release(runs_details.packages, main_package=main_package)
graphs.extend(
create_chartjs(table, data, best_results, releases_map=releases_map, runs_details=runs_details, main_package=main_package))
Expand Down
2 changes: 2 additions & 0 deletions argus/backend/tests/client_service/test_submit_results.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class SampleTable(GenericResultTable):
class Meta:
name = "Test Table"
description = "Test Table Description"
sut_package_name = "test_package"
Columns = [
ColumnMetadata(name="metric1", unit="ms", type=ResultType.FLOAT, higher_is_better=False),
ColumnMetadata(name="metric2", unit="ms", type=ResultType.INTEGER, higher_is_better=False),
Expand All @@ -42,6 +43,7 @@ def test_submit_results_responds_ok_if_all_cells_pass(fake_test, client_service)
results.add_result(column=cell.column, row=cell.row, value=cell.value, status=cell.status)
client_service.submit_run(run_type, asdict(run))
response = client_service.submit_results(run_type, run.run_id, results.as_dict())
assert results.as_dict()["meta"]["sut_package_name"] == "test_package"
assert response["status"] == "ok"
assert response["message"] == "Results submitted"

Expand Down
3 changes: 2 additions & 1 deletion argus/backend/tests/results_service/test_result_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ def test_update_if_changed():
"name": "Updated Metadata",
"columns_meta": [{"name": "col1", "unit": "ms", "type": "float", "higher_is_better": True}],
"validation_rules": {"col1": {"best_pct": 95.0, "best_abs": 105.0, "fixed_limit": 50.0}},
"rows_meta": ["row1"]
"rows_meta": ["row1"],
"sut_package_name": "new_package",
}
updated_metadata = metadata.update_if_changed(new_data)
assert updated_metadata.name == "Updated Metadata"
Expand Down
6 changes: 3 additions & 3 deletions argus/client/generic_result.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ def __new__(cls, name, bases, dct):
cls_instance.description = meta.description
cls_instance.columns = meta.Columns
cls_instance.column_types = {column.name: column.type for column in cls_instance.columns}
cls_instance.sut_package_name = getattr(meta, 'sut_package_name', '')
cls_instance.rows = []
validation_rules = getattr(meta, 'ValidationRules', {})
for col_name, rule in validation_rules.items():
Expand Down Expand Up @@ -98,7 +99,6 @@ class GenericResultTable(metaclass=ResultTableMeta):
Base class for all Generic Result Tables in Argus. Use it as a base class for your result table.
"""
sut_timestamp: int = 0 # automatic timestamp based on SUT version. Works only with SCT and refers to Scylla version.
sut_details: str = ""
results: list[Cell] = field(default_factory=list)

def as_dict(self) -> dict:
Expand All @@ -112,12 +112,12 @@ def as_dict(self) -> dict:
"description": self.description,
"columns_meta": [column.as_dict() for column in self.columns],
"rows_meta": rows,
"validation_rules": {k: v.as_dict() for k, v in self.validation_rules.items()}
"validation_rules": {k: v.as_dict() for k, v in self.validation_rules.items()},
"sut_package_name": self.sut_package_name,
}
return {
"meta": meta_info,
"sut_timestamp": self.sut_timestamp,
"sut_details": self.sut_details,
"results": [result.as_dict() for result in self.results]
}

Expand Down

0 comments on commit 31a3f9a

Please sign in to comment.