Add confirmed admin override for provisioning player checks
This commit is contained in:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user