Add confirmed admin override for provisioning player checks

This commit is contained in:
2026-10-05 18:16:02 -04:00
parent 4b0f341d64
commit 8abe71b915
20 changed files with 362 additions and 26 deletions
+58
View File
@@ -830,6 +830,64 @@ class AgentTests(unittest.TestCase):
self.assertEqual(self.agent.execute(self.operation("instance.stop"))["state"], "accepted")
self.assertFalse(any(call[:2] == ("container", "stop") for call in self.docker.calls))
def assert_override_disruption(self, kind):
spec = self.create()
payload = {"safetyOverride": True}
if kind == "instance.rebuild":
payload.update({**spec, "nextGeneration": 2})
operation = self.operation(kind, payload)
with patch.object(self.agent, "rcon", side_effect=AssertionError("Override queried player status")):
result = self.agent.execute(operation)
self.assertEqual(result["state"], "completed", result)
calls = list(self.docker.calls)
self.assertEqual(self.agent.execute(operation)["state"], "completed")
self.assertEqual(self.docker.calls, calls)
self.assertTrue((self.library / "content/game.ff").exists())
def test_admin_override_restarts_without_player_status(self):
self.assert_override_disruption("instance.restart")
def test_admin_override_stops_without_player_status(self):
self.assert_override_disruption("instance.stop")
def test_admin_override_removes_without_player_status(self):
self.assert_override_disruption("instance.remove")
def test_admin_override_rebuilds_without_player_status(self):
self.assert_override_disruption("instance.rebuild")
def test_admin_override_requires_boolean_true(self):
self.create()
self.assertIn("instance.safety-override", self.agent.inventory()["capabilities"])
for index, value in enumerate((False, None, "true", 1, {})):
with self.subTest(value=value):
self.agent.rcon = lambda *_: {"ok": True, "players": 2}
result = self.agent.execute(self.operation("instance.restart", {"safetyOverride": value}, f"attempt-{index}"))
self.assertEqual(result["state"], "accepted", result)
self.assertFalse(any(call[:2] == ("container", "restart") for call in self.docker.calls))
def test_admin_override_preserves_ownership_and_generation_checks(self):
self.create()
self.docker.containers[self.agent.container_name(INSTANCE, 1)]["Config"]["Labels"] = {}
self.assertEqual(self.agent.execute(self.operation("instance.remove", {"safetyOverride": True}))["state"], "failed")
self.assertFalse(any(call[:2] == ("container", "stop") for call in self.docker.calls))
self.assertEqual(self.agent.execute(self.operation("instance.stop", {"safetyOverride": True}, "stale", generation=0))["state"], "failed")
def test_admin_override_activation_keeps_file_validation(self):
self.create()
target = self.agent.instance_dir(INSTANCE, 1) / "app/configs/server.cfg"
staged = {"stageId": "campaign", "files": [{"id": 9, "path": "configs/server.cfg", "contentBase64": base64.b64encode(b"new").decode(), "checkBefore": True, "expectedBeforeSha": module.digest(b"original")}]}
self.agent.execute(self.operation("files.stage", staged, "stage"))
self.agent.rcon = lambda *_: {"ok": True, "players": 3}
target.write_bytes(b"changed")
failed = self.agent.execute(self.operation("instance.restart", {"stageId": "campaign", "safetyOverride": True}, "changed"))
self.assertEqual(failed["state"], "failed", failed)
self.assertFalse(any(call[:2] == ("container", "restart") for call in self.docker.calls))
target.write_bytes(b"original")
result = self.agent.execute(self.operation("instance.restart", {"stageId": "campaign", "safetyOverride": True}, "confirmed"))
self.assertEqual(result["state"], "completed", result)
self.assertEqual(target.read_bytes(), b"new")
def test_files_stage_is_nondisruptive_activation_snapshots_and_rollback(self):
self.create()
target = self.agent.instance_dir(INSTANCE, 1) / "app/configs/server.cfg"