"""lasuite-docs — UPGRADE overlay (Phase 1d, DG4): data-continuity, extends the generic upgrade. The orchestrator deployed the previous published version ONCE; this overlay writes a marker row into postgres (a dedicated `ci_marker` table the app's own Django migrations don't touch, read back via `psql` in the `db` service), 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 postgres 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 def _psql(domain, sql): cmd = f'PGPASSWORD=$(cat /run/secrets/postgres_p) psql -U docs -d docs -tAc "{sql}"' return lifecycle.exec_in_app(domain, ["sh", "-c", cmd], service="db").strip() def test_upgrade_preserves_data(live_app, meta): domain = live_app _psql( domain, "CREATE TABLE IF NOT EXISTS ci_marker(v text); DELETE FROM ci_marker; " "INSERT INTO ci_marker VALUES('upgrade-survives');", ) assert _psql(domain, "SELECT v FROM ci_marker;") == "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) assert lifecycle.http_get(domain, "/") in (200, 301, 302) assert ( _psql(domain, "SELECT v FROM ci_marker;") == "upgrade-survives" ), "postgres data did not survive the upgrade"