Publish curated Unraid-AppOps-Gateway source from 5f1a0fc2fdd07082637995b2c8b4514a1ecbbbb8
This commit is contained in:
1 parent
9787d16330
commit
75269a32eb
8 files changed
+920
-8
No files matched your search
@@ -228,6 +228,124 @@ def test_positive_preserves_resources_and_windows_then_idempotent(module, proven
|
||||
module.quiesce(revision="e" * 40, projects={}, driver=driver)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def smart_database(proven):
|
||||
# Synthetic dependency graph over two existing running identities; this
|
||||
# models retained sessions, not a claim that mock-ats uses this production DB.
|
||||
driver, receipt = proven
|
||||
project = "workmesh-runtime-19421"
|
||||
pg = next(row for row in driver.state["rows"]
|
||||
if row["composeLabels"]["com.docker.compose.project"] == project
|
||||
and row["composeLabels"]["com.docker.compose.service"] == "postgres")
|
||||
clients = [row for row in driver.state["rows"]
|
||||
if row["composeLabels"]["com.docker.compose.project"] == project
|
||||
and row["composeLabels"]["com.docker.compose.service"] in {"api", "mock-ats"}]
|
||||
assert len(clients) == 2 and all(row["state"]["Running"] for row in clients)
|
||||
driver.state["rows"] = [pg] + [row for row in driver.state["rows"] if row is not pg]
|
||||
original_term = driver.term
|
||||
pending = False
|
||||
waits = []
|
||||
|
||||
def term(cid):
|
||||
nonlocal pending
|
||||
if cid == pg["id"] and pg["state"]["Running"]:
|
||||
pending = True
|
||||
driver.effects.append(("TERM", cid))
|
||||
else:
|
||||
original_term(cid)
|
||||
if pending and all(not row["state"]["Running"] for row in clients):
|
||||
pg["state"].update(Running=False, Status="exited", Pid=0,
|
||||
FinishedAt="2026-10-10T00:00:00Z")
|
||||
|
||||
def wait(cid):
|
||||
waits.append(sum(effect[0] == "TERM" for effect in driver.effects))
|
||||
return not next(row for row in driver.state["rows"] if row["id"] == cid)["state"]["Running"]
|
||||
|
||||
driver.term, driver.wait_exited = term, wait
|
||||
return driver, receipt, pg, clients, waits
|
||||
|
||||
|
||||
def test_two_clients_receive_term_before_waiting_for_smart_database_shutdown(module, smart_database):
|
||||
driver, receipt, pg, clients, waits = smart_database
|
||||
result = module.quiesce(revision="d" * 40, projects={}, driver=driver)
|
||||
assert result["status"] == "quiesced"
|
||||
assert all(not row["state"]["Running"] for row in [pg, *clients])
|
||||
assert waits and all(count == 12 for count in waits)
|
||||
assert receipt["value"]["phase"] == "complete"
|
||||
assert sum(effect[0] == "TERM" for effect in driver.effects) == 12
|
||||
|
||||
|
||||
def test_old_partial_receipt_resumes_two_passes_without_rewriting_origin(module, smart_database, monkeypatch):
|
||||
from types import SimpleNamespace
|
||||
|
||||
driver, holder, pg, clients, _ = smart_database
|
||||
baseline = copy.deepcopy(driver.state)
|
||||
original = {
|
||||
"schema": module.SCHEMA, "revision": module.REVIEWED_RECEIPT_PREDECESSOR,
|
||||
"manifestDigest": module._digest(module.OBSERVATION), "phase": "quiescing",
|
||||
"baseline": baseline, "registrations": copy.deepcopy(driver.runners[:2]),
|
||||
"registrationProgress": {"9": "disabled", "22": "disabled"},
|
||||
"progress": {pg["id"]: "term_intent"}, "guards": driver.capture_guards(),
|
||||
"guardProgress": {"runner": "installed", "host": "installed"},
|
||||
}
|
||||
driver.disable_restart(pg["id"])
|
||||
driver.term(pg["id"])
|
||||
assert pg["state"]["Running"] and all(row["state"]["Running"] for row in clients)
|
||||
for runner in driver.runners[:2]:
|
||||
runner["disabled"] = True
|
||||
holder["value"] = original
|
||||
frozen = (original["revision"], original["manifestDigest"], module._digest(baseline))
|
||||
release = {"controllerVersion": "2.1.21", "sourceRepository": module.fleet.SOURCE_REPOSITORY,
|
||||
"sourceRevision": "e" * 40, "sourceTree": "f" * 40}
|
||||
monkeypatch.setitem(sys.modules, "status_server", SimpleNamespace(_require_controller_release=lambda: release))
|
||||
driver.accepts_reviewed_receipt_predecessor = module.ControllerDriver({}).accepts_reviewed_receipt_predecessor
|
||||
assert module.preflight(revision="e" * 40, projects={}, driver=driver)["status"] == "partial"
|
||||
assert module.quiesce(revision="e" * 40, projects={}, driver=driver)["status"] == "quiesced"
|
||||
final = holder["value"]
|
||||
assert (final["revision"], final["manifestDigest"], module._digest(final["baseline"])) == frozen
|
||||
assert all(not row["state"]["Running"] for row in [pg, *clients])
|
||||
assert module.quiesce(revision="e" * 40, projects={}, driver=driver)["status"] == "already_quiesced"
|
||||
|
||||
|
||||
@pytest.mark.parametrize("change", ["origin", "manifest", "revision", "tree", "repository", "version", "missing-reader"])
|
||||
def test_predecessor_resume_rejects_foreign_receipt_or_current_source(module, proven, monkeypatch, change):
|
||||
from types import SimpleNamespace
|
||||
|
||||
driver, holder = proven
|
||||
driver.timeout = True
|
||||
module.quiesce(revision=module.REVIEWED_RECEIPT_PREDECESSOR, projects={}, driver=driver)
|
||||
release = {"controllerVersion": "2.1.21", "sourceRepository": module.fleet.SOURCE_REPOSITORY,
|
||||
"sourceRevision": "e" * 40, "sourceTree": "f" * 40}
|
||||
monkeypatch.setitem(sys.modules, "status_server", SimpleNamespace(_require_controller_release=lambda: release))
|
||||
if change == "origin":
|
||||
holder["value"]["revision"] = "a" * 40
|
||||
elif change == "manifest":
|
||||
holder["value"]["manifestDigest"] = "a" * 64
|
||||
elif change == "revision":
|
||||
release["sourceRevision"] = "a" * 40
|
||||
elif change == "tree":
|
||||
release["sourceTree"] = "invalid"
|
||||
elif change == "repository":
|
||||
release["sourceRepository"] = "jens/foreign"
|
||||
elif change == "version":
|
||||
release["controllerVersion"] = "2.1.22"
|
||||
if change != "missing-reader":
|
||||
driver.accepts_reviewed_receipt_predecessor = module.ControllerDriver({}).accepts_reviewed_receipt_predecessor
|
||||
before = len(driver.effects)
|
||||
with pytest.raises(module.QuiescenceError, match="maintenance_owner_changed"):
|
||||
module.quiesce(revision="e" * 40, projects={}, driver=driver)
|
||||
assert len(driver.effects) == before
|
||||
|
||||
|
||||
def test_predecessor_failure_projection_preserves_effect_uncertainty(module, proven):
|
||||
driver, _ = proven
|
||||
driver.timeout = True
|
||||
module.quiesce(revision=module.REVIEWED_RECEIPT_PREDECESSOR, projects={}, driver=driver)
|
||||
result = module.failure_projection("e" * 40)
|
||||
assert result["status"] == "partial" and result["guardHeld"] is True
|
||||
assert result["effectsPerformed"] is True
|
||||
|
||||
|
||||
def test_mount_order_is_canonical_for_fixed_current_and_resume_baseline(module, proven):
|
||||
driver, _ = proven
|
||||
baseline = copy.deepcopy(driver.state)
|
||||
|
||||
Reference in new issue
Block a user