Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

improvement(results): allow manual sut selection #572

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
4 changes: 3 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,10 +50,12 @@ 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"
assert updated_metadata.sut_package_name == "new_package"
assert len(updated_metadata.columns_meta) == 1
assert len(updated_metadata.rows_meta) == 2 # should not remove rows from other runs
assert len(updated_metadata.validation_rules["col1"]) == 2 # keep also the old rule
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
Loading