RESULT=STOP_P23B_VM121_DOMAIN_V2_LIVE_ACTIVATION_AND_MODEL_COMPATIBILITY REVISION=R01 STOP_RC=2 STOP_LINE=303 STOP_DETAIL=unknown CORE_CHANGE_COMPLETE=true CORE_CHANGE_REPEATED=false ROLLBACK_STATUS=not_required SOURCE_ROLLBACK_STATUS=not_required RUNTIME_RECOVERY_STATUS=PASS LIVE_DATABASE_TARGET=0003_domain_v2_schema VM121_BASE_COMMIT=f9cc1cdfa0619ba5d6d28f359462061d97b3a558 MIGRATION_SHA256=56c1fe6fd85d4d8a7a048ccf4efc807c8f3b20f2c98b24d6f21e4230153a9d8d STOP_COMMAND=$'ssh -T -o BatchMode=yes -o ConnectTimeout=20 vm121 /bin/bash -s > "$EVIDENCE/post-vm121.txt" 2>&1 <<\'VM121POST\'\nset -euo pipefail\n/usr/local/sbin/router-vm121-git-publish.sh --check\nPG=wgaccess-postgres; BACKEND=wgaccess-backend\nPGUSER="$(docker exec "$PG" sh -lc \'printf %s "$POSTGRES_USER"\')"; PGDB="$(docker exec "$PG" sh -lc \'printf %s "$POSTGRES_DB"\')"\nq(){ docker exec "$PG" psql -v ON_ERROR_STOP=1 -U "$PGUSER" -d "$PGDB" -Atqc "$1"; }\necho "ALEMBIC_VERSION=$(q \'SELECT version_num FROM alembic_version\')"\necho "MIGRATION_SHA256=$(sha256sum /opt/wg-access/backend/alembic/versions/0003_domain_v2_schema.py | awk \'{print $1}\')"\necho "CORE_MODEL_SHA256=$(sha256sum /opt/wg-access/backend/app/models/core.py | awk \'{print $1}\')"\necho "MODELS_INIT_SHA256=$(sha256sum /opt/wg-access/backend/app/models/__init__.py | awk \'{print $1}\')"\necho "DEV_API_SHA256=$(sha256sum /opt/wg-access/backend/app/api/dev.py | awk \'{print $1}\')"\necho "LIVE_DOMAIN_V2_TABLE_COUNT=$(q \\"SELECT count(*) FROM information_schema.tables WHERE table_schema=\'public\' AND table_name IN (\'plans\',\'access_grants\',\'access_grant_protocol_limits\',\'invites\',\'invite_redemptions\',\'magic_link_tokens\',\'auth_sessions\',\'connection_profiles\',\'peer_credentials\',\'audit_events\')\\")"\necho "LEGACY_BUSINESS_ROWS=$(q \\"SELECT (SELECT count(*) FROM users)+(SELECT count(*) FROM invite_codes)+(SELECT count(*) FROM orders)+(SELECT count(*) FROM subscriptions)+(SELECT count(*) FROM peers)+(SELECT count(*) FROM provisioning_jobs)+(SELECT count(*) FROM peer_egress_leases)\\")"\necho "EGRESS_TARGET_COUNT=$(q \'SELECT count(*) FROM egress_targets\')"\necho "EGRESS_ALLOCATOR_COUNT=$(q \'SELECT count(*) FROM egress_allocator_settings\')"\ngrep -Fq \'status_code=410\' /opt/wg-access/backend/app/api/dev.py && echo LEGACY_DEV_WRITER_RETIRED=true || { echo LEGACY_DEV_WRITER_RETIRED=false; exit 1; }\nif docker exec -i "$BACKEND" python - <<\'PY\' >/dev/null 2>&1\nimport urllib.request\nfor u in (\'http://127.0.0.1:8000/health\',\'http://127.0.0.1:8000/health/db\'):\n with urllib.request.urlopen(u,timeout=5) as r: assert r.status==200\nPY\nthen echo BACKEND_HEALTH=PASS; else echo BACKEND_HEALTH=FAIL; exit 1; fi\nVM121POST\n'