prole/tests/installer/test_cluster_nodes_policy.py

82 lines
2.9 KiB
Python

from __future__ import annotations
from types import SimpleNamespace
from knoe.core import storage_probe as storage_probe_mod
from knoe.ui.screens.cluster_nodes import ClusterNodesScreenMixin
class _DummyClusterNodesScreen(ClusterNodesScreenMixin):
def __init__(self, knoe_cfg_data: dict | None = None):
self.knoe_cfg_data = knoe_cfg_data or {}
self._save_calls = 0
def _save_knoe_cfg(self):
self._save_calls += 1
def test_advanced_assignment_grid_disabled_by_default():
app = _DummyClusterNodesScreen(knoe_cfg_data={"Cluster Nodes": {}})
assert app._cluster_nodes_advanced_enabled() is False
def test_set_advanced_assignment_grid_flag_persists_setting():
app = _DummyClusterNodesScreen(knoe_cfg_data={"Cluster Nodes": {}})
app._cluster_nodes_set_advanced_enabled(True)
assert app.knoe_cfg_data["Cluster Nodes"]["ADVANCED_ASSIGNMENT_GRID"] == "true"
assert app._save_calls == 1
def test_default_policy_uses_round_robin_cnpg_and_prefers_d004_for_monitoring():
app = _DummyClusterNodesScreen(knoe_cfg_data={})
policy = app._cluster_nodes_default_policy(["node-a", "node-d004", "node-c"])
assert policy["defaults"]["cnpg_allocation"] == "round-robin"
assert policy["defaults"]["monitoring_storage_root"] == "/synology/d004"
assert policy["defaults"]["monitoring_host"] == "node-d004"
assert policy["services"]["cloudnativepg"]["primary_host"] == ""
assert policy["services"]["cloudnativepg"]["enabled_hosts"] == [
"node-a",
"node-d004",
"node-c",
]
def test_load_policy_falls_back_to_default_when_policy_json_missing():
app = _DummyClusterNodesScreen(knoe_cfg_data={"Cluster Nodes": {}})
policy = app._cluster_nodes_load_policy(["node-a", "node-b"])
assert policy["defaults"]["cnpg_allocation"] == "round-robin"
assert policy["defaults"]["monitoring_storage_root"] == "/synology/d004"
assert policy["defaults"]["monitoring_host"] == "node-b"
assert policy["services"]["cloudnativepg"]["primary_host"] == ""
def test_storage_summary_prefers_probe_results_when_present():
app = _DummyClusterNodesScreen(knoe_cfg_data={})
storage_item = storage_probe_mod.StorageProbeResult(
target_id="t-1",
node_name="node-a",
label="Synology d004",
mountpoint="/synology/d004",
source_type="synology_mount",
storage_class="synology",
succeeded=True,
skipped=False,
error=None,
metrics=storage_probe_mod.StorageProbeMetrics(randread_iops=620.0, randwrite_iops=240.0),
io_class="io_slow_durable",
timing_multiplier=3.0,
observed_at="2026-03-26T00:00:00+00:00",
)
node = SimpleNamespace(storage_items=(storage_item,), filesystems=())
summary = app._cluster_nodes_storage_summary(node)
assert "Synology d004" in summary
assert "io_slow_durable" in summary
assert "R:620" in summary
assert "W:240" in summary