79 lines
2.9 KiB
Bash
Executable File
79 lines
2.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
export HELM_DRIVER=${HELM_DRIVER:-configmap}
|
|
|
|
project_dir=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
|
|
workdir=$(mktemp --directory)
|
|
trap 'rm -rf "${workdir}"' EXIT HUP INT TERM
|
|
namespace=${NAMESPACE:-gramps}
|
|
|
|
for key in app-secret-key user-database-uri search-index-database-uri \
|
|
oidc-client-secret aws-access-key-id aws-secret-access-key; do
|
|
kubectl --namespace "${namespace}" get secret gramps-runtime \
|
|
--output="jsonpath={.data.${key}}" | grep -q . \
|
|
|| { echo "gramps-runtime is missing ${key}" >&2; exit 1; }
|
|
done
|
|
for item in gramps-postgresql:postgres-password gramps-postgresql:password \
|
|
gramps-valkey:valkey-password; do
|
|
secret=${item%%:*}
|
|
key=${item#*:}
|
|
kubectl --namespace "${namespace}" get secret "${secret}" \
|
|
--output="jsonpath={.data.${key}}" | grep -q . \
|
|
|| { echo "${secret} is missing ${key}" >&2; exit 1; }
|
|
done
|
|
|
|
for claim in data-postgresql-0 grampsweb-data; do
|
|
phase=$(kubectl --namespace "${namespace}" get pvc "${claim}" \
|
|
--output=jsonpath='{.status.phase}')
|
|
[[ "${phase}" == Bound ]] || { echo "PVC ${claim} is ${phase}" >&2; exit 1; }
|
|
done
|
|
|
|
dependencies=("${project_dir}"/charts/*.tgz)
|
|
if (( ${#dependencies[@]} < 2 )); then
|
|
helm dependency build --skip-refresh "${project_dir}"
|
|
fi
|
|
helm template gramps "${project_dir}" --namespace "${namespace}" \
|
|
--values "${project_dir}/values-arschrock.yaml" > "${workdir}/rendered.yaml"
|
|
kubectl --namespace "${namespace}" get statefulset postgresql valkey-primary valkey-replicas \
|
|
--output=json > "${workdir}/live.json"
|
|
|
|
python3 - "${workdir}/rendered.yaml" "${workdir}/live.json" <<'PY'
|
|
import json
|
|
import sys
|
|
import yaml
|
|
|
|
rendered = {
|
|
item["metadata"]["name"]: item
|
|
for item in yaml.safe_load_all(open(sys.argv[1], encoding="utf-8"))
|
|
if item and item.get("kind") == "StatefulSet"
|
|
}
|
|
live = {
|
|
item["metadata"]["name"]: item
|
|
for item in json.load(open(sys.argv[2], encoding="utf-8"))["items"]
|
|
}
|
|
for name in ("postgresql", "valkey-primary", "valkey-replicas"):
|
|
expected = rendered[name]["spec"]
|
|
current = live[name]["spec"]
|
|
checks = {
|
|
"selector": (expected["selector"], current["selector"]),
|
|
"serviceName": (expected["serviceName"], current["serviceName"]),
|
|
"volumeClaimTemplates": (
|
|
[item["metadata"]["name"] for item in expected.get("volumeClaimTemplates", [])],
|
|
[item["metadata"]["name"] for item in current.get("volumeClaimTemplates", [])],
|
|
),
|
|
}
|
|
for field, (wanted, found) in checks.items():
|
|
if wanted != found:
|
|
raise SystemExit(f"{name}: immutable {field} differs: wanted={wanted!r} live={found!r}")
|
|
print("Live StatefulSet immutable fields match the parent chart.")
|
|
PY
|
|
|
|
helm upgrade --install gramps "${project_dir}" \
|
|
--namespace "${namespace}" \
|
|
--values "${project_dir}/values-arschrock.yaml" \
|
|
--take-ownership --dry-run=server --hide-secret
|
|
|
|
echo "Migration preflight passed."
|