Files
italiadatacenter/pipeline/cnpg-maintenance.sh
T
2026-08-26 10:45:35 +02:00

218 lines
4.8 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
ACTION=""
NAMESPACE=""
DRY_RUN=false
usage() {
cat <<EOF
Uso:
$0 hibernate [--namespace NAMESPACE] [--dry-run]
$0 resume [--namespace NAMESPACE] [--dry-run]
Esempi:
# Mostra cosa verrebbe ibernato in tutti i namespace
$0 hibernate --dry-run
# Iberna tutti i cluster CNPG
$0 hibernate
# Iberna solo i cluster di un namespace
$0 hibernate --namespace produzione
# Mostra cosa verrebbe riattivato
$0 resume --dry-run
# Riattiva tutti i cluster CNPG
$0 resume
EOF
}
#
# Parsing argomenti
#
if [[ $# -lt 1 ]]; then
usage
exit 1
fi
ACTION="$1"
shift
case "$ACTION" in
hibernate|resume)
;;
*)
echo "Errore: azione non valida: $ACTION"
usage
exit 1
;;
esac
while [[ $# -gt 0 ]]; do
case "$1" in
--namespace|-n)
NAMESPACE="$2"
shift 2
;;
--dry-run)
DRY_RUN=true
shift
;;
--help|-h)
usage
exit 0
;;
*)
echo "Errore: parametro sconosciuto: $1"
usage
exit 1
;;
esac
done
#
# Controlli prerequisiti
#
command -v kubectl >/dev/null 2>&1 || {
echo "Errore: kubectl non trovato"
exit 1
}
kubectl cnpg version >/dev/null 2>&1 || {
echo "Errore: plugin kubectl-cnpg non disponibile o non funzionante"
exit 1
}
#
# Recupero cluster CNPG
#
# label applicata dallo script per tracciare le ibernazioni proprie
SCRIPT_LABEL="cnpg-maintenance-hibernated"
JSONPATH='{range .items[*]}{.metadata.namespace}{";"}{.metadata.name}{";"}{.status.readyInstances}{";"}{.metadata.annotations.cnpg\.io/hibernation}{";"}{.metadata.labels.cnpg-maintenance-hibernated}{"\n"}{end}'
if [[ -n "$NAMESPACE" ]]; then
CLUSTERS=$(kubectl get cluster.postgresql.cnpg.io \
-n "$NAMESPACE" \
-o jsonpath="$JSONPATH")
else
CLUSTERS=$(kubectl get cluster.postgresql.cnpg.io \
-A \
-o jsonpath="$JSONPATH")
fi
if [[ -z "$CLUSTERS" ]]; then
echo "Nessun cluster CNPG trovato."
exit 0
fi
echo
echo "========================================"
echo " CNPG BULK OPERATION"
echo "========================================"
echo "Azione: $ACTION"
if [[ -n "$NAMESPACE" ]]; then
echo "Namespace: $NAMESPACE"
else
echo "Namespace: TUTTI"
fi
echo "Dry-run: $DRY_RUN"
echo "========================================"
echo
#
# Elaborazione cluster
#
while IFS=";" read -r NS CLUSTER READY_INSTANCES HIBERNATION_ANNOTATION SCRIPT_HIBERNATED; do
[[ -z "$CLUSTER" ]] && continue
if [[ "$ACTION" == "hibernate" ]]; then
# skip clusters con no ready instances (già ibernati o non attivi)
if [[ -z "$READY_INSTANCES" || "$READY_INSTANCES" -lt 1 ]]; then
echo "Cluster: $NS/$CLUSTER — SALTATO (readyInstances=${READY_INSTANCES:-0}, già ibernato o non attivo)"
echo
continue
fi
else
# resume: solo cluster ibernati da questo script (label presente) e con annotazione CNPG attiva
if [[ "$SCRIPT_HIBERNATED" != "true" || "$HIBERNATION_ANNOTATION" != "on" ]]; then
echo "Cluster: $NS/$CLUSTER — SALTATO (non ibernato da questo script)"
echo
continue
fi
fi
echo "Cluster: $NS/$CLUSTER (readyInstances=${READY_INSTANCES:-0}, hibernation=${HIBERNATION_ANNOTATION:-none}, script-label=${SCRIPT_HIBERNATED:-none})"
if [[ "$ACTION" == "hibernate" ]]; then
CMD=(
kubectl
cnpg
hibernate
on
"$CLUSTER"
-n
"$NS"
)
else
CMD=(
kubectl
cnpg
hibernate
off
"$CLUSTER"
-n
"$NS"
)
fi
if [[ "$DRY_RUN" == true ]]; then
echo "[DRY-RUN] ${CMD[*]}"
if [[ "$ACTION" == "hibernate" ]]; then
echo "[DRY-RUN] kubectl label cluster.postgresql.cnpg.io $CLUSTER -n $NS ${SCRIPT_LABEL}=true"
else
echo "[DRY-RUN] kubectl label cluster.postgresql.cnpg.io $CLUSTER -n $NS ${SCRIPT_LABEL}-"
fi
else
echo "Esecuzione: ${CMD[*]}"
if "${CMD[@]}"; then
echo "OK: $NS/$CLUSTER"
if [[ "$ACTION" == "hibernate" ]]; then
kubectl label cluster.postgresql.cnpg.io "$CLUSTER" -n "$NS" "${SCRIPT_LABEL}=true" --overwrite
else
kubectl label cluster.postgresql.cnpg.io "$CLUSTER" -n "$NS" "${SCRIPT_LABEL}-"
fi
else
echo "ERRORE: $NS/$CLUSTER"
fi
fi
echo
done <<< "$CLUSTERS"
echo "========================================"
echo "Operazione completata"
echo "========================================"