From 1ec11bf0f438922df8948d9a56608879d96871c0 Mon Sep 17 00:00:00 2001 From: Valentin Lab Date: Thu, 28 Jul 2022 16:12:00 +0200 Subject: [PATCH] new: [postgres] new ``sql`` indirect action Signed-off-by: Valentin Lab --- .../actions/relations/postgres-database/sql | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100755 postgres/actions/relations/postgres-database/sql diff --git a/postgres/actions/relations/postgres-database/sql b/postgres/actions/relations/postgres-database/sql new file mode 100755 index 0000000..fe5da32 --- /dev/null +++ b/postgres/actions/relations/postgres-database/sql @@ -0,0 +1,110 @@ +#!/bin/bash + +## Load action gets a first argument a FILE/DIRECTORY/URL holding the necessary files. +## +## + +if [ -z "$SERVICE_DATASTORE" ]; then + echo "This script is meant to be run through 'compose' to work properly." >&2 + exit 1 +fi + +version=0.1 +usage="$exname [-h|--help] DBNAME" +help=" +USAGE: + +$usage + +DESCRIPTION: + +Read stdin and content to related postgres service in the database +DBNAME. If DBNAME is not provided, it'll take the default database +from the ${DARKCYAN}postgres-database${NORMAL} relation of current +service. + +EXAMPLES: + + $exname < foo.sql + $exname mydb2 < foo.sql + +" + + +dbname= +output= +while [ "$1" ]; do + case "$1" in + "--help"|"-h") + print_help >&2 + exit 0 + ;; + "--force"|"-f") + force=yes + ;; + --*|-*) + err "Unexpected optional argument '$1'" + print_usage >&2 + exit 1 + ;; + *) + [ -z "$dbname" ] && { dbname=$1 ; shift ; continue ; } + err "Unexpected positional argument '$1'" + print_usage >&2 + exit 1 + ;; + esac + shift +done + + +if [ -z "$dbname" ]; then + + ## + ## Fetch default dbname in relation to postgres-database + ## + + ## XXXvlab: can't get real config here + if ! read-0 ts _ _ < <(get_service_relation "$SERVICE_NAME" "postgres-database"); then + err "Couldn't find relation ${DARKCYAN}postgres-database${NORMAL}." + exit 1 + fi + + relation_dir=$(get_relation_data_dir "$SERVICE_NAME" "$ts" "postgres-database") || { + err "Failed to find relation dir" + exit 1 + } + postgres_config=$(cat "$relation_dir"/data) || exit 2 + + dbname="$(e "$postgres_config" | shyaml get-value dbname)" || { + err "Couldn't retrieve information of ${DARKCYAN}postgres-database${NORMAL}'s relation." + exit 1 + } + dbuser="$(e "$postgres_config" | shyaml get-value user)" || { + err "Couldn't retrieve information of ${DARKCYAN}postgres-database${NORMAL}'s relation." + exit 1 + } + password="$(e "$postgres_config" | shyaml get-value password)" || { + err "Couldn't retrieve information of ${DARKCYAN}postgres-database${NORMAL}'s relation." + exit 1 + } + +fi + +set -e + +containers="$(get_running_containers_for_service "$RELATION_TARGET_SERVICE")" + +if [ -z "$containers" ]; then + err "No containers running for service $DARKYELLOW$service$NORMAL." + exit 1 +fi + + + +## XXXvlab: taking first container is probably not a good idea +container_id="$(echo "$containers" | head -n 1)" +docker exec -i -u 0 \ + -e PGUSER="$dbuser" \ + -e PGPASSWORD="$password" \ + "${container_id}" psql -qAt "$dbname"