feat(kpi): add autonomous worker auto-spawn engine and watchdog reconciliation
This commit is contained in:
@@ -12,8 +12,10 @@ sys.path.insert(0, str(REPO_ROOT / "bin"))
|
||||
|
||||
import kpi
|
||||
from kpi import (
|
||||
auto_spawn_workers,
|
||||
calculate_efficiency,
|
||||
check_node_routes,
|
||||
find_pending_work_for_node,
|
||||
generate_preservation_advisory,
|
||||
get_agent_dm_metrics,
|
||||
get_agent_kpi,
|
||||
@@ -159,6 +161,45 @@ class TestKPIMetrics(unittest.TestCase):
|
||||
self.assertEqual(call_kwargs["parent"], "dev")
|
||||
self.assertIn("dev-audit-sub", call_kwargs["session_id"])
|
||||
|
||||
def test_find_pending_work_for_node(self):
|
||||
work = find_pending_work_for_node("dev")
|
||||
self.assertIsNotNone(work)
|
||||
self.assertIn(work["type"], ("job", "swarm"))
|
||||
if work["type"] == "job":
|
||||
self.assertIn("dev", work["name"])
|
||||
self.assertIn("job-dispatch.py", work["cmd"])
|
||||
|
||||
@patch("kpi.get_agent_tmux_workers")
|
||||
def test_auto_spawn_workers_skip_active(self, mock_tmux):
|
||||
mock_tmux.return_value = ["active-worker-1"]
|
||||
res = auto_spawn_workers(nodes=["dev"], dry_run=True)
|
||||
self.assertEqual(len(res), 1)
|
||||
self.assertEqual(res[0]["action"], "skip")
|
||||
self.assertIn("Active tmux worker already running", res[0]["reason"])
|
||||
|
||||
@patch("kpi.get_agent_tmux_workers")
|
||||
def test_auto_spawn_workers_dry_run(self, mock_tmux):
|
||||
mock_tmux.return_value = []
|
||||
res = auto_spawn_workers(nodes=["dev"], dry_run=True)
|
||||
self.assertEqual(len(res), 1)
|
||||
self.assertEqual(res[0]["action"], "would_spawn")
|
||||
self.assertIn("session", res[0])
|
||||
self.assertIn("command", res[0])
|
||||
|
||||
@patch("kpi.spawn_tmux_worker")
|
||||
@patch("invite_handler.send_loopback_notice")
|
||||
@patch("kpi.get_agent_tmux_workers")
|
||||
def test_auto_spawn_workers_live(self, mock_tmux, mock_notice, mock_spawn):
|
||||
mock_tmux.return_value = []
|
||||
mock_spawn.return_value = {"ok": True, "session": "worker-1", "node": "dev"}
|
||||
mock_notice.return_value = True
|
||||
|
||||
res = auto_spawn_workers(nodes=["dev"], dry_run=False)
|
||||
self.assertEqual(len(res), 1)
|
||||
self.assertEqual(res[0]["action"], "spawned")
|
||||
mock_spawn.assert_called_once()
|
||||
mock_notice.assert_called_once()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user