#!/usr/bin/env bash set -euo pipefail ACTION="" NAMESPACE="" DRY_RUN=false usage() { cat </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 "========================================"