"""n8n — UPGRADE overlay (Phase 1d, DG4): data-continuity, extends the generic upgrade. The orchestrator deployed the previous published version ONCE; this overlay writes a marker file into the persistent /home/node/.n8n volume (n8n state = sqlite + config; the marker is read back via `exec_in_app`, not HTTP-served), 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 = "/home/node/.n8n/ci-marker.txt" def test_upgrade_preserves_data(live_app, meta): domain = live_app 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) assert lifecycle.http_get(domain, meta["HEALTH_PATH"]) == 200 assert ( lifecycle.exec_in_app(domain, ["cat", MARKER]).strip() == "upgrade-survives" ), "data did not survive the upgrade"