"""cryptpad — UPGRADE overlay (Phase 1d, DG4): data-continuity, extends the generic upgrade. The orchestrator deployed the previous published version ONCE; this overlay writes a marker into the persistent cryptpad_data volume (cryptpad data isn't HTTP-served as a static file — it's an encrypted datastore — so the marker is read back via `exec_in_app`, not HTTP), performs the in-place upgrade via the shared op helper (`generic.do_upgrade`, which also asserts reconverge + serving + that the deployment moved), then asserts the data SURVIVED. Assertion-only on the shared deployment.""" import os import sys sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "runner")) from harness import generic, lifecycle # noqa: E402 MARKER = "/cryptpad/data/ci-marker.txt" def test_upgrade_preserves_data(live_app, meta): domain = live_app # write a data marker into the persistent cryptpad_data volume lifecycle.exec_in_app(domain, ["sh", "-c", f"echo upgrade-survives > {MARKER}"]) assert lifecycle.exec_in_app(domain, ["cat", MARKER]).strip() == "upgrade-survives" # in-place upgrade previous -> target (reuses the generic op: upgrade + assert reconverge/serving) generic.do_upgrade(domain, os.environ.get("VERSION") or None, meta) # app healthy and the data written before the upgrade is still there assert lifecycle.http_get(domain, "/") in (200, 301, 302) assert ( lifecycle.exec_in_app(domain, ["cat", MARKER]).strip() == "upgrade-survives" ), "data did not survive the upgrade"