NK-WP-0056-T12 done: pilot operations; synthetic rotation and revert pass
Some checks are pending
CI Smoke / host-smoke (push) Waiting to run
CI Smoke / container-smoke (push) Waiting to run

operations.py: OpenBao KV v2 CAS, LLDAP self-rotation (forward and revert),
ExternalSecret force-sync and status, rollout restart (RolloutFailed is a
definite failure), pilot checks. synthetic_pilot.py on the T08 stack plus
OpenBao 2.5.4 with CCR-2026-0058's policy: rotation completed; a one-off wrong
delivery reverted in declared order with the earlier value restored.

Runner: revert steps run in declared order (BEA-10), definite failures revert,
unknown outcomes stop, receipts carry error types. Found and corrected (in
railiance-platform) CCR-2026-0058's required_parameters refusing reads.
Packaging moved to new T13. 29 executor tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 994874@bnt-lap001
Assistant-Session: 6017c416-d619-47eb-bd1a-f670a02d7d87
This commit is contained in:
tegwick 2026-10-31 16:24:17 +01:00
parent 9b7701a32a
commit db56d8468e
11 changed files with 1088 additions and 33 deletions

View file

@ -299,11 +299,12 @@ class FailureTests(Base):
self.w.fail_check["eso-synced"] = 1
result = self.run_it()
self.assertEqual(result["outcome"], "reverted", result)
self.assertEqual(self.ops(), ["generate", "set-directory", "deliver", "redeliver", "restore-directory", "restore-kv"])
# declared recovery order, only for steps that ran (restart did not run, so no restart-again)
self.assertEqual(self.ops(), ["generate", "set-directory", "deliver", "restore-kv", "restore-directory", "redeliver"])
data = result["receipt"]["data"]
self.assertTrue(data["reverted"])
reverts = [x for x in data["steps"] if x["kind"] == "revert"]
self.assertEqual([x["checks"][0]["id"] for x in reverts], ["eso-synced", "bind-signs-in", "kv-advanced"])
self.assertEqual([x["checks"][0]["id"] for x in reverts], ["kv-advanced", "bind-signs-in", "eso-synced"])
self.assertTrue(all(x["outcome"] == "done" for x in reverts))
self.assertEqual(data["attempts"], 1)
@ -319,10 +320,21 @@ class FailureTests(Base):
def test_revert_whose_check_fails_counts_as_failed(self):
self.doc = synthetic_admission(self.root, lambda s: s["budget"].update(attempts=1))
self.w = World(self.doc, self.clock)
self.w.fail_check["eso-synced"] = 2 # the forward check and the revert's own check
self.w.fail_check["eso-synced"] = 1
self.w.fail_check["kv-advanced"] = 0
original = self.w.check
calls = {"kv": 0}
def check(c, ctx): # kv-advanced passes forward, fails on the revert
if c["id"] == "kv-advanced":
calls["kv"] += 1
if calls["kv"] == 2:
self.w.calls.append("check:kv-advanced")
return False
return original(c, ctx)
self.w.check = check
result = self.run_it()
self.assertEqual(result["outcome"], "revert_failed")
self.assertNotIn("restore-directory", self.ops())
self.assertNotIn("restore-directory", self.ops()) # stop at the failed revert
def test_failed_revert_stops_and_alerts(self):
self.w.fail_check["eso-synced"] = 1
@ -330,7 +342,7 @@ class FailureTests(Base):
result = self.run_it()
self.assertEqual(result["outcome"], "revert_failed")
self.assertIn("revert_failed", self.w.alerts)
self.assertNotIn("restore-kv", self.ops()) # stop at the failed revert, do not continue blindly
self.assertNotIn("redeliver", self.ops()) # stop at the failed revert, do not continue blindly
def test_unknown_outcome_stops_without_revert(self):
self.w.unknown_op = {"eso.force-sync"}
@ -340,6 +352,23 @@ class FailureTests(Base):
self.assertFalse(result["receipt"]["data"]["reverted"])
self.assertIn("unknown", self.w.alerts)
def test_definite_failure_reverts_like_a_failed_check(self):
self.doc = synthetic_admission(self.root, lambda s: s["budget"].update(attempts=1))
self.w = World(self.doc, self.clock)
original = self.w.op
def op(step, ctx):
if step["id"] == "restart":
self.w.calls.append("restart")
raise X.StepFailed("never became ready")
return original(step, ctx)
self.w.op = op
result = self.run_it()
self.assertEqual(result["outcome"], "reverted")
self.assertEqual(self.ops(), ["generate", "set-directory", "deliver", "restart",
"restore-kv", "restore-directory", "redeliver", "restart-again"])
restart = next(s for s in result["receipt"]["data"]["steps"] if s["id"] == "restart")
self.assertEqual((restart["outcome"], restart["error_type"]), ("failed", "StepFailed"))
def test_budget_exhausted_reverts(self):
self.w.slow_op = 700.0 # wall_time_seconds is 1200
result = self.run_it()