Files
application/backing-services/gitea/charts/postgresql-ha/templates/postgresql/scripts-configmap.yaml
2025-11-09 13:22:40 +03:30

160 lines
5.6 KiB
YAML

{{- /*
Copyright Broadcom, Inc. All Rights Reserved.
SPDX-License-Identifier: APACHE-2.0
*/}}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ printf "%s-scripts" (include "postgresql-ha.postgresql" .) }}
namespace: {{ include "common.names.namespace" . | quote }}
labels: {{- include "common.labels.standard" (dict "customLabels" .Values.commonLabels "context" .) | nindent 4 }}
app.kubernetes.io/component: postgresql
{{- if .Values.commonAnnotations }}
annotations: {{- include "common.tplvalues.render" (dict "value" .Values.commonAnnotations "context" .) | nindent 4 }}
{{- end }}
data:
pre-stop.sh: |-
#!/bin/bash
set -o errexit
set -o pipefail
set -o nounset
# Debug section
exec 3>&1
exec 4>&2
# Process input parameters
MIN_DELAY_AFTER_PG_STOP_SECONDS=$1
# Load Libraries
. /opt/bitnami/scripts/libpostgresql.sh
. /opt/bitnami/scripts/librepmgr.sh
# Load PostgreSQL & repmgr environment variables
. /opt/bitnami/scripts/postgresql-env.sh
# Auxiliary functions
is_new_primary_ready() {
local -a current_primary_node
readarray -t current_primary_node < <(repmgr_get_primary_node)
local current_primary_host="${current_primary_node[0]}"
if [[ -n "$current_primary_host" ]] && [[ "$current_primary_host" != "$REPMGR_NODE_NETWORK_NAME" ]]; then
info "New primary detected, leaving the cluster..."
return 0
fi
info "Waiting for a new primary to be available..."
return 1
}
export MODULE="pre-stop-hook"
if ! is_boolean_yes "$BITNAMI_DEBUG"; then
exec 1>/dev/null
exec 2>/dev/null
fi
postgresql_enable_nss_wrapper
# Prepare env vars for managing roles
readarray -t primary_node < <(repmgr_get_upstream_node)
primary_host="${primary_node[0]}"
# Stop postgresql for graceful exit.
PG_STOP_INIT=$EPOCHSECONDS
postgresql_stop
if [[ -z "$primary_host" ]] || [[ "$primary_host" = "$REPMGR_NODE_NETWORK_NAME" ]]; then
info "Primary node need to wait for a new primary node before leaving the cluster"
retry_while is_new_primary_ready 10 5
else
info "Standby node doesn't need to wait for a new primary switchover. Leaving the cluster"
fi
# Make sure pre-stop hook waits at least 25 seconds after stop of PG to make sure Pgpool-II detects node is down.
# default terminationGracePeriodSeconds=30 seconds
PG_STOP_DURATION=$((EPOCHSECONDS - PG_STOP_INIT))
if (( PG_STOP_DURATION < MIN_DELAY_AFTER_PG_STOP_SECONDS )); then
WAIT_TO_PG_POOL_TIME=$((MIN_DELAY_AFTER_PG_STOP_SECONDS - PG_STOP_DURATION))
info "Waiting additional $WAIT_TO_PG_POOL_TIME seconds for Pgpool-II to detect node is down"
sleep $WAIT_TO_PG_POOL_TIME
fi
liveness-probe.sh: |-
#!/bin/bash
set -o errexit
set -o pipefail
set -o nounset
# Load Libraries
. /opt/bitnami/scripts/libpostgresql.sh
. /opt/bitnami/scripts/librepmgr.sh
# Load PostgreSQL & repmgr environment variables
. /opt/bitnami/scripts/postgresql-env.sh
# Check if PG is ready
pg_isready_args=("-U" "postgres" "-p" "$POSTGRESQL_PORT_NUMBER" "-h" "127.0.0.1")
is_boolean_yes "$POSTGRESQL_ENABLE_TLS" && pg_isready_args+=("-d" "sslcert=$POSTGRESQL_TLS_CERT_FILE sslkey=$POSTGRESQL_TLS_KEY_FILE")
debug_execute pg_isready "${pg_isready_args[@]}"
# Check if repmgr has split-brain issues
postgresql_enable_nss_wrapper
repmgr_check_status
readiness-probe.sh: |-
#!/bin/bash
set -o errexit
set -o pipefail
set -o nounset
# Load Libraries
. /opt/bitnami/scripts/libpostgresql.sh
. /opt/bitnami/scripts/librepmgr.sh
# Load PostgreSQL & repmgr environment variables
. /opt/bitnami/scripts/postgresql-env.sh
# We should not proceed if a standby clone is in progress
if ps waux | grep "data standby clone" | grep -qv grep; then
echo "standby clone in progress"
exit 1
fi
# Then, let's check if PG is responding to queries
{{- if .Values.postgresql.headlessWithNotReadyAddresses }}
MIN_DELAY_AFTER_POD_READY_FIRST_TIME={{ add .Values.pgpool.livenessProbe.periodSeconds .Values.pgpool.livenessProbe.timeoutSeconds }}
FIRST_READY_TS_FILE="/tmp/.first-ready.epoch"
DELAY_SEMAPHORE="/tmp/.delay"
{{- end }}
if [[ $(PGPASSWORD="$POSTGRESQL_PASSWORD" psql -w -U "$POSTGRESQL_USERNAME" -d $POSTGRESQL_DATABASE -h 127.0.0.1 -p "$POSTGRESQL_PORT_NUMBER" -tA -c "SELECT 1" 2> /dev/null || true) = 1 ]]; then
{{- if .Values.postgresql.headlessWithNotReadyAddresses }}
# DB up, but initial readiness delay not applied
if [[ ! -f "$DELAY_SEMAPHORE" ]] && [[ -f "$FIRST_READY_TS_FILE" ]]; then
# calculate delay from the first readiness success
FIRST_READY_TS=$(cat $FIRST_READY_TS_FILE)
CURRENT_DELAY_SECONDS=$((EPOCHSECONDS - FIRST_READY_TS))
# Wait for the minimal delay after the first readiness state
if (( CURRENT_DELAY_SECONDS > MIN_DELAY_AFTER_POD_READY_FIRST_TIME )); then
# mark delay as applied
touch "$DELAY_APPLIED_FILE"
else
echo "minimal delay not met"
exit 1
fi
# first ever readiness test success - store timestamp and report failure
elif [[ ! -f "$DELAY_SEMAPHORE" ]]; then
echo $EPOCHSECONDS > $FIRST_READY_TS_FILE
exit 1
fi
{{- end }}
# Finally, check if repmgr has split-brain issues
postgresql_enable_nss_wrapper
repmgr_check_status
else
echo "connection to database failed"
exit 1
fi