#!/usr/bin/env bash set -euo pipefail NAMESPACE="pcp-dev" POSTGRES_POD="pcp-postgres-0" validate_db_name() { local db_name="$1" if [[ ! "$db_name" =~ ^[a-z][a-z0-9_]*$ ]]; then echo "ERROR: invalid database name: $db_name" >&2 echo "Allowed: lowercase letters, digits, underscore; must start with a letter." >&2 exit 1 fi } secret_name_for_db() { local db_name="$1" echo "${db_name//_/-}-db" } user_name_for_db() { local db_name="$1" echo "${db_name}_user" } get_or_create_password() { local secret_name="$1" if kubectl -n "$NAMESPACE" get secret "$secret_name" >/dev/null 2>&1; then kubectl -n "$NAMESPACE" get secret "$secret_name" \ -o jsonpath='{.data.SPRING_DATASOURCE_PASSWORD}' | base64 -d else openssl rand -base64 32 | tr -d '/+=' | head -c 32 fi } create_db_user_and_secret() { local db_name="$1" validate_db_name "$db_name" local db_user local secret_name local db_password db_user="$(user_name_for_db "$db_name")" secret_name="$(secret_name_for_db "$db_name")" db_password="$(get_or_create_password "$secret_name")" echo echo "============================================================" echo "Creating database package" echo " database: $db_name" echo " user: $db_user" echo " secret: $secret_name" echo "============================================================" echo "1/4 Create or update PostgreSQL user and database" kubectl -n "$NAMESPACE" exec -i "$POSTGRES_POD" -- psql \ -U postgres \ -d postgres < [db_name...]" exit 1 fi for db_name in "$@"; do create_db_user_and_secret "$db_name" done echo echo "All requested databases processed."