101 lines
2.9 KiB
Bash
Executable File
101 lines
2.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Read-only AwoooP RLS preflight runner.
|
|
#
|
|
# Default path runs inside the production API pod through the 120 control-plane
|
|
# host, so DATABASE_URL stays inside Kubernetes and is never printed locally.
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PY_SCRIPT="${SCRIPT_DIR}/awooop_rls_preflight.py"
|
|
|
|
NAMESPACE="${AWOOOP_RLS_NAMESPACE:-awoooi-prod}"
|
|
DEPLOYMENT="${AWOOOP_RLS_DEPLOYMENT:-deployment/awoooi-api}"
|
|
CONTAINER="${AWOOOP_RLS_CONTAINER:-api}"
|
|
SSH_TARGET="${AWOOOP_RLS_SSH_TARGET:-wooo@192.168.0.120}"
|
|
REMOTE_KUBECTL="${AWOOOP_RLS_REMOTE_KUBECTL:-sudo kubectl}"
|
|
KUBECTL="${AWOOOP_RLS_KUBECTL:-kubectl}"
|
|
USE_SSH=1
|
|
PY_ARGS=()
|
|
SSH_OPTS=(-o BatchMode=yes -o ConnectTimeout=8)
|
|
|
|
usage() {
|
|
cat <<'USAGE'
|
|
Usage: bash scripts/ops/awooop-rls-preflight.sh [options]
|
|
|
|
Read-only checks for AwoooP PostgreSQL RLS readiness. The script runs the Python
|
|
probe inside the API pod and exits 2 when RLS is not ready to enable.
|
|
|
|
Options:
|
|
--exact-counts Run exact COUNT(*) project_id backfill checks.
|
|
--json Print JSON output from the pod.
|
|
--local Use local kubectl instead of SSH to 120.
|
|
--ssh USER@HOST Override SSH target. Default: wooo@192.168.0.120.
|
|
-h, --help Show this help.
|
|
|
|
Environment:
|
|
AWOOOP_RLS_NAMESPACE Default: awoooi-prod
|
|
AWOOOP_RLS_DEPLOYMENT Default: deployment/awoooi-api
|
|
AWOOOP_RLS_CONTAINER Default: api
|
|
AWOOOP_RLS_REMOTE_KUBECTL Default: sudo kubectl
|
|
AWOOOP_RLS_KUBECTL Default: kubectl
|
|
USAGE
|
|
}
|
|
|
|
while [ "$#" -gt 0 ]; do
|
|
case "$1" in
|
|
--exact-counts)
|
|
PY_ARGS+=(--exact-counts)
|
|
;;
|
|
--json)
|
|
PY_ARGS+=(--json)
|
|
;;
|
|
--local)
|
|
USE_SSH=0
|
|
;;
|
|
--ssh)
|
|
shift
|
|
SSH_TARGET="${1:-}"
|
|
if [ -z "$SSH_TARGET" ]; then
|
|
echo "--ssh requires USER@HOST" >&2
|
|
exit 64
|
|
fi
|
|
USE_SSH=1
|
|
;;
|
|
-h|--help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Unknown argument: $1" >&2
|
|
usage >&2
|
|
exit 64
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [ ! -f "$PY_SCRIPT" ]; then
|
|
echo "Missing Python probe: $PY_SCRIPT" >&2
|
|
exit 66
|
|
fi
|
|
|
|
if [ "$USE_SSH" -eq 1 ]; then
|
|
printf -v namespace_q "%q" "$NAMESPACE"
|
|
printf -v deployment_q "%q" "$DEPLOYMENT"
|
|
printf -v container_q "%q" "$CONTAINER"
|
|
remote_cmd="${REMOTE_KUBECTL} -n ${namespace_q} exec -i ${deployment_q} -c ${container_q} -- python -"
|
|
if [ "${#PY_ARGS[@]}" -gt 0 ]; then
|
|
for arg in "${PY_ARGS[@]}"; do
|
|
printf -v arg_q "%q" "$arg"
|
|
remote_cmd="${remote_cmd} ${arg_q}"
|
|
done
|
|
fi
|
|
ssh "${SSH_OPTS[@]}" "$SSH_TARGET" "$remote_cmd" < "$PY_SCRIPT"
|
|
else
|
|
if [ "${#PY_ARGS[@]}" -gt 0 ]; then
|
|
"$KUBECTL" -n "$NAMESPACE" exec -i "$DEPLOYMENT" -c "$CONTAINER" -- python - "${PY_ARGS[@]}" < "$PY_SCRIPT"
|
|
else
|
|
"$KUBECTL" -n "$NAMESPACE" exec -i "$DEPLOYMENT" -c "$CONTAINER" -- python - < "$PY_SCRIPT"
|
|
fi
|
|
fi
|