mirror of
https://github.com/dredx/prole.git
synced 2026-09-24 19:34:31 +00:00
- add reusable storage probing subsystem with discovery, bounded probe execution, IO classification, caching, and topology integration - render per-node storage inventory in Cluster Nodes UI and extend installer test coverage for topology/storage behavior - introduce core service operation modules and align actions, milestones, services, and supporting configs/scripts for repair/update workflows - update CNPG/Supabase/database artifacts, placement and port mapping configs, plus related integration tests Co-authored-by: Junie <junie@jetbrains.com>
82 lines
2.9 KiB
Python
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, 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 |