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, prole_cfg_data: dict | None = None): self.prole_cfg_data = prole_cfg_data or {} self._save_calls = 0 def _save_prole_cfg(self): self._save_calls += 1 def test_advanced_assignment_grid_disabled_by_default(): app = _DummyClusterNodesScreen(prole_cfg_data={"Cluster Nodes": {}}) assert app._cluster_nodes_advanced_enabled() is False def test_set_advanced_assignment_grid_flag_persists_setting(): app = _DummyClusterNodesScreen(prole_cfg_data={"Cluster Nodes": {}}) app._cluster_nodes_set_advanced_enabled(True) assert app.prole_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(prole_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(prole_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(prole_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