titan-iac/services/comms/oneoffs/mas-db-ensure-job.yaml

90 lines
3.8 KiB
YAML
Raw Normal View History

2026-01-28 01:48:32 -03:00
# services/comms/oneoffs/mas-db-ensure-job.yaml
# One-off job for comms/mas-db-ensure-22.
# Purpose: mas db ensure 22 (see container args/env in this file).
# Run by setting spec.suspend to false, reconcile, then set it back to true.
# Safe to delete the finished Job/pod; it should not run continuously.
2026-01-08 02:45:00 -03:00
apiVersion: batch/v1
kind: Job
metadata:
2026-01-17 20:23:32 -03:00
name: mas-db-ensure-22
2026-01-08 02:45:00 -03:00
namespace: comms
spec:
2026-01-28 01:48:32 -03:00
suspend: true
2026-01-08 03:09:27 -03:00
backoffLimit: 1
2026-01-08 03:00:19 -03:00
ttlSecondsAfterFinished: 600
2026-01-08 02:45:00 -03:00
template:
spec:
serviceAccountName: mas-db-ensure
2026-01-08 03:09:27 -03:00
restartPolicy: Never
2026-01-17 01:47:53 -03:00
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/worker
operator: Exists
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: kubernetes.io/arch
operator: In
values: ["arm64"]
2026-01-08 03:04:33 -03:00
containers:
- name: ensure
image: registry.bstein.dev/bstein/kubectl:1.35.0
2026-01-08 02:45:00 -03:00
command: ["/bin/sh", "-c"]
args:
- |
2026-01-08 03:00:19 -03:00
set -eu
2026-01-08 03:09:27 -03:00
trap 'echo "mas-db-ensure failed"; sleep 300' ERR
2026-01-08 02:45:00 -03:00
umask 077
2026-01-08 03:23:09 -03:00
safe_pass() {
head -c 32 /dev/urandom | base64 | tr -d '\n' | tr '+/' '-_' | tr -d '='
}
vault_addr="${VAULT_ADDR:-http://vault.vault.svc.cluster.local:8200}"
vault_role="${VAULT_ROLE:-comms-secrets}"
jwt="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
login_payload="$(jq -nc --arg jwt "${jwt}" --arg role "${vault_role}" '{jwt:$jwt, role:$role}')"
vault_token="$(curl -sS --request POST --data "${login_payload}" \
"${vault_addr}/v1/auth/kubernetes/login" | jq -r '.auth.client_token')"
if [ -z "${vault_token}" ] || [ "${vault_token}" = "null" ]; then
echo "vault login failed" >&2
exit 1
fi
vault_read() {
curl -sS -H "X-Vault-Token: ${vault_token}" \
"${vault_addr}/v1/kv/data/atlas/comms/mas-db" | jq -r '.data.data.password // empty'
}
vault_write() {
value="$1"
payload="$(jq -nc --arg value "${value}" '{data:{password:$value}}')"
curl -sS -X POST -H "X-Vault-Token: ${vault_token}" \
-d "${payload}" "${vault_addr}/v1/kv/data/atlas/comms/mas-db" >/dev/null
}
MAS_PASS="$(vault_read)"
if [ -z "${MAS_PASS}" ] || printf '%s' "${MAS_PASS}" | grep -Eq '[^A-Za-z0-9_-]'; then
2026-01-08 03:23:09 -03:00
MAS_PASS="$(safe_pass)"
vault_write "${MAS_PASS}"
2026-01-08 02:45:00 -03:00
fi
2026-01-08 03:04:33 -03:00
2026-01-08 03:06:34 -03:00
POD_NAME="$(kubectl -n postgres get pods -l app=postgres -o jsonpath='{.items[0].metadata.name}')"
if [ -z "${POD_NAME}" ]; then
echo "postgres pod not found" >&2
2026-01-08 03:04:33 -03:00
exit 1
fi
2026-01-08 03:20:28 -03:00
MAS_PASS_SQL="$(printf '%s' "${MAS_PASS}" | sed "s/'/''/g")"
kubectl -n postgres exec -i "${POD_NAME}" -- psql -U postgres -d postgres \
-c "CREATE ROLE mas LOGIN PASSWORD '${MAS_PASS_SQL}';" || true
kubectl -n postgres exec -i "${POD_NAME}" -- psql -U postgres -d postgres \
-c "ALTER ROLE mas WITH PASSWORD '${MAS_PASS_SQL}';"
2026-01-08 03:18:03 -03:00
kubectl -n postgres exec -i "${POD_NAME}" -- psql -U postgres -d postgres \
-c "CREATE DATABASE mas OWNER mas;" || true
2026-01-08 03:26:14 -03:00
kubectl -n postgres exec -i "${POD_NAME}" -- /bin/sh -c \
"PGPASSWORD='${MAS_PASS_SQL}' psql -U mas -d mas -c 'select 1;'"