"""Release-unit names on the weekly allocation recommendation.""" import importlib.util from pathlib import Path import unittest ROOT = Path(__file__).resolve().parents[1] spec = importlib.util.spec_from_file_location("weekly", ROOT / "scripts/weekly_allocation_report.py") weekly = importlib.util.module_from_spec(spec) spec.loader.exec_module(weekly) END = "2026-10-19T06:00:00+00:00" RESOURCE = "resource:railiance:reef-railiance:k3s" INDEX = { "schema": "release-registry.index.v1", "units": [ { "unit_id": "flex-auth-secrets-engine", "declaration": { "unit_id": "flex-auth-secrets-engine", "owner": "access-engine", "workloads": [ {"kind": "Deployment", "namespace": "flex-auth", "name": "flex-auth-secrets-engine"} ], }, } ], } def _workload(namespace, name, labels=None): item = { "namespace": namespace, "workload": name, "pods": 1, "requests": {"cpu_millicores": 60, "memory_bytes": 256}, "limits": {"cpu_millicores": 1000, "memory_bytes": 1024}, } if labels: item["labels"] = labels return item class WeeklyReleaseOwnerTests(unittest.TestCase): def report(self): cluster = { "schema_version": "railiance.cluster-resource-observation.v1", "resource_id": RESOURCE, "captured_at": END, "utilization": {"workloads": [ _workload("flex-auth", "flex-auth-secrets-engine"), _workload("flex-auth", "flex-auth-tenant-engine"), _workload("forgejo", "forge", {"railiance.io/release-unit": "flex-auth-secrets-engine"}), ]}, } allocation = { "schema": "custodian.allocation-reconcile.v1", "captured_at": END, "host": {"cluster_resource_id": RESOURCE}, "count_host_and_cluster_cpus_once": True, "workloads": [ {"namespace": "flex-auth", "workload": "flex-auth-secrets-engine", "owner": "namespace-map"}, {"namespace": "flex-auth", "workload": "flex-auth-tenant-engine", "owner": "namespace-map"}, {"namespace": "forgejo", "workload": "forge", "owner": "namespace-map"}, ], } return weekly.build_report( cluster, allocation, {"captured_at": END, "window": "7d", "step": "5m", "queries": {}}, {"id": RESOURCE}, {"source_observation": END, "revisions": {"collector": "a" * 40}}, as_of=END, release_index=INDEX, ) def by_name(self, report): return {item["workload"]: item for item in report["recommendations"]} def test_claim_label_and_gap_name_unit_and_owner(self): first = self.by_name(self.report()) second = self.by_name(self.report()) claimed = first["flex-auth-secrets-engine"] self.assertEqual(claimed["release_unit"], "flex-auth-secrets-engine") self.assertEqual(claimed["owner"], "access-engine") self.assertEqual(claimed["release_owner"], "access-engine") self.assertEqual(second["flex-auth-secrets-engine"]["release_unit"], claimed["release_unit"]) self.assertEqual(second["flex-auth-secrets-engine"]["owner"], claimed["owner"]) unclaimed = first["flex-auth-tenant-engine"] self.assertIsNone(unclaimed["release_unit"]) self.assertIsNone(unclaimed["release_owner"]) labeled = first["forge"] self.assertIsNone(labeled["release_unit"]) self.assertIsNone(labeled["release_owner"]) self.assertNotEqual(labeled["owner"], "flex-auth-secrets-engine") if __name__ == "__main__": unittest.main()