Join scheduler-effective cluster requests with owner/service/tenant. Host and cluster CPUs counted once. Residual millicores are not admission. T02–T05 remain waiting on Vergabe measurements.
39 lines
1.7 KiB
Python
39 lines
1.7 KiB
Python
from __future__ import annotations
|
|
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
import yaml
|
|
|
|
import reconcile_railiance_allocation as rec
|
|
|
|
OWNERS = yaml.safe_load((Path(__file__).resolve().parents[1] / "docs" / "evidence" / "namespace-ownership.yaml").read_text())
|
|
|
|
|
|
class ReconcileTests(unittest.TestCase):
|
|
def test_unknown_and_pending_are_explicit(self) -> None:
|
|
observation = {
|
|
"schema_version": "railiance.cluster-resource-observation.v1",
|
|
"captured_at": "2026-09-14T00:00:00Z",
|
|
"capacity": {"totals": {"cpu_millicores": 4000}},
|
|
"utilization": {"workloads": [
|
|
{"namespace": "state-hub", "workload": "state-hub", "pods": 2, "requests": {"cpu_millicores": 110, "memory_bytes": 1}},
|
|
{"namespace": "brand-new", "workload": "x", "pods": 1, "requests": {"cpu_millicores": 0, "memory_bytes": 0}},
|
|
]},
|
|
"allocation": {
|
|
"denominators": {"cpu_requested_millicores": 110},
|
|
"residual_capacity": {"cpu_millicores": 3890},
|
|
"pending_unscheduled": {"cpu_millicores": 25, "pods": [{"namespace": "other", "name": "p"}]},
|
|
},
|
|
"measurement_gaps": ["pod metrics unavailable"],
|
|
}
|
|
report = rec.join(observation, OWNERS)
|
|
self.assertEqual(["brand-new"], report["unknown_namespaces"])
|
|
self.assertIn("brand-new/x", report["zero_request_workloads"])
|
|
self.assertEqual(25, report["pending_unscheduled_cpu_m"])
|
|
self.assertEqual("state-hub", report["workloads"][0]["owner"])
|
|
self.assertTrue(report["count_host_and_cluster_cpus_once"])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|