From faa987dc59550620e33f3d96663178283ccde860 Mon Sep 17 00:00:00 2001 From: schlepptop Date: Thu, 16 Jul 2020 15:23:16 +0200 Subject: [PATCH 01/14] :art: Use the properties system instead of the service root --- common-functions | 110 +++++++++++++++++++---------------------------- functions | 19 ++++---- install | 3 ++ 3 files changed, 56 insertions(+), 76 deletions(-) diff --git a/common-functions b/common-functions index c0b316c7..6f4036c6 100755 --- a/common-functions +++ b/common-functions @@ -3,6 +3,7 @@ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/config" set -eo pipefail [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_AVAILABLE_PATH/config/functions" +source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions" docker_ports_options() { declare desc="Exports a list of exposed ports" @@ -23,11 +24,11 @@ get_database_name() { declare SERVICE="$1" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - if [[ ! -f "$SERVICE_ROOT/DATABASE_NAME" ]]; then - echo "$SERVICE" > "$SERVICE_ROOT/DATABASE_NAME" + if ! fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "DATABASE_NAME"; then + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "DATABASE_NAME" "$SERVICE" fi - cat "$SERVICE_ROOT/DATABASE_NAME" + fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "DATABASE_NAME" } get_random_ports() { @@ -174,16 +175,14 @@ service_backup() { declare SERVICE="$1" BUCKET_NAME="$2" USE_IAM_OPTIONAL_FLAG="$3" local SERVICE_BACKUP_ROOT="$PLUGIN_DATA_ROOT/$SERVICE/backup" local BACKUP_ENCRYPTION_CONFIG_ROOT="$PLUGIN_DATA_ROOT/$SERVICE/backup-encryption" - local AWS_ACCESS_KEY_ID_FILE="$SERVICE_BACKUP_ROOT/AWS_ACCESS_KEY_ID" - local AWS_SECRET_ACCESS_KEY_FILE="$SERVICE_BACKUP_ROOT/AWS_SECRET_ACCESS_KEY" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local ID="$(cat "$SERVICE_ROOT/ID")" + local ID=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID") local BACKUP_PARAMETERS="" if [[ -z "$USE_IAM_OPTIONAL_FLAG" ]]; then [[ ! -f "$AWS_ACCESS_KEY_ID_FILE" ]] && dokku_log_fail "Missing AWS_ACCESS_KEY_ID file" [[ ! -f "$AWS_SECRET_ACCESS_KEY_FILE" ]] && dokku_log_fail "Missing AWS_SECRET_ACCESS_KEY file" - BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e AWS_ACCESS_KEY_ID=$(cat "$AWS_ACCESS_KEY_ID_FILE") -e AWS_SECRET_ACCESS_KEY=$(cat "$AWS_SECRET_ACCESS_KEY_FILE")" + BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e AWS_ACCESS_KEY_ID=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_ACCESS_KEY_ID") -e AWS_SECRET_ACCESS_KEY=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_SECRET_ACCESS_KEY_ID")" elif [[ "$USE_IAM_OPTIONAL_FLAG" != "--use-iam" ]] && [[ "$USE_IAM_OPTIONAL_FLAG" != "-u" ]]; then dokku_log_fail "Provide AWS credentials or use the --use-iam flag" fi @@ -201,20 +200,20 @@ service_backup() { BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e BACKUP_NAME=${PLUGIN_COMMAND_PREFIX}-${SERVICE}" BACKUP_PARAMETERS="$BACKUP_PARAMETERS -v ${TMPDIR}:/backup" - if [[ -f "$SERVICE_BACKUP_ROOT/AWS_DEFAULT_REGION" ]]; then - BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e AWS_DEFAULT_REGION=$(cat "$SERVICE_BACKUP_ROOT/AWS_DEFAULT_REGION")" + if fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_DEFAULT_REGION"; then + BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e AWS_DEFAULT_REGION=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_DEFAULT_REGION")" fi - if [[ -f "$SERVICE_BACKUP_ROOT/AWS_SIGNATURE_VERSION" ]]; then - BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e AWS_SIGNATURE_VERSION=$(cat "$SERVICE_BACKUP_ROOT/AWS_SIGNATURE_VERSION")" + if fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_SIGNATURE_VERSION"; then + BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e AWS_SIGNATURE_VERSION=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_SIGNATURE_VERSION")" fi - if [[ -f "$SERVICE_BACKUP_ROOT/ENDPOINT_URL" ]]; then - BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e ENDPOINT_URL=$(cat "$SERVICE_BACKUP_ROOT/ENDPOINT_URL")" + if fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_ENDPOINT_URL"; then + BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e ENDPOINT_URL=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_ENDPOINT_URL")" fi - if [[ -f "$BACKUP_ENCRYPTION_CONFIG_ROOT/ENCRYPTION_KEY" ]]; then - BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e ENCRYPTION_KEY=$(cat "$BACKUP_ENCRYPTION_CONFIG_ROOT/ENCRYPTION_KEY")" + if fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_ENCRYPTION_KEY"; then + BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e ENCRYPTION_KEY=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_ENCRYPTION_KEY")" fi # shellcheck disable=SC2086 @@ -224,32 +223,31 @@ service_backup() { service_backup_auth() { declare desc="Sets up authentication" declare SERVICE="$1" AWS_ACCESS_KEY_ID="$2" AWS_SECRET_ACCESS_KEY="$3" AWS_DEFAULT_REGION="$4" AWS_SIGNATURE_VERSION="$5" ENDPOINT_URL="$6" - local SERVICE_BACKUP_ROOT="$PLUGIN_DATA_ROOT/$SERVICE/backup" - mkdir "$SERVICE_BACKUP_ROOT" - echo "$AWS_ACCESS_KEY_ID" >"$SERVICE_BACKUP_ROOT/AWS_ACCESS_KEY_ID" - echo "$AWS_SECRET_ACCESS_KEY" >"$SERVICE_BACKUP_ROOT/AWS_SECRET_ACCESS_KEY" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_ACCESS_KEY_ID" "$AWS_ACCESS_KEY_ID" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_SECRET_ACCESS_KEY" "$AWS_SECRET_ACCESS_KEY" if [[ -n "$AWS_DEFAULT_REGION" ]]; then - echo "$AWS_DEFAULT_REGION" >"$SERVICE_BACKUP_ROOT/AWS_DEFAULT_REGION" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_DEFAULT_REGION" "$AWS_DEFAULT_REGION" fi if [[ -n "$AWS_SIGNATURE_VERSION" ]]; then - echo "$AWS_SIGNATURE_VERSION" >"$SERVICE_BACKUP_ROOT/AWS_SIGNATURE_VERSION" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_SIGNATURE_VERSION" "$AWS_SIGNATURE_VERSION" fi if [[ -n "$ENDPOINT_URL" ]]; then - echo "$ENDPOINT_URL" >"$SERVICE_BACKUP_ROOT/ENDPOINT_URL" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_ENDPOINT_URL" "$ENDPOINT_URL" fi } service_backup_deauth() { declare desc="Removes authentication" declare SERVICE="$1" - local SERVICE_ROOT="${PLUGIN_DATA_ROOT}/${SERVICE}" - local SERVICE_BACKUP_ROOT="${SERVICE_ROOT}/backup/" - - rm -rf "$SERVICE_BACKUP_ROOT" + fn-plugin-property-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_ACCESS_KEY_ID" + fn-plugin-property-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_SECRET_ACCESS_KEY" + fn-plugin-property-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_DEFAULT_REGION" + fn-plugin-property-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_SIGNATURE_VERSION" + fn-plugin-property-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_ENDPOINT_URL" } service_backup_schedule() { @@ -284,11 +282,8 @@ service_backup_schedule_cat() { service_backup_set_encryption() { declare desc="Sets up backup encryption" declare SERVICE="$1" ENCRYPTION_KEY="$2" - local SERVICE_ROOT="${PLUGIN_DATA_ROOT}/${SERVICE}" - local SERVICE_BACKUP_ENCRYPTION_ROOT="${SERVICE_ROOT}/backup-encryption/" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_ENCRYPTION_KEY" "$ENCRYPTION_KEY" - mkdir "$SERVICE_BACKUP_ENCRYPTION_ROOT" - echo "$ENCRYPTION_KEY" >"${SERVICE_BACKUP_ENCRYPTION_ROOT}/ENCRYPTION_KEY" } service_backup_unschedule() { @@ -302,10 +297,7 @@ service_backup_unschedule() { service_backup_unset_encryption() { declare desc="Removes backup encryption" declare SERVICE="$1" - local SERVICE_ROOT="${PLUGIN_DATA_ROOT}/${SERVICE}" - local SERVICE_BACKUP_ENCRYPTION_ROOT="${SERVICE_ROOT}/backup-encryption/" - - rm -rf "$SERVICE_BACKUP_ENCRYPTION_ROOT" + fn-plugin-property-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_ENCRYPTION_KEY" } service_container_rm() { @@ -339,7 +331,7 @@ service_enter() { declare desc="enters running app container of specified proc type" declare SERVICE="$1" && shift 1 local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local ID="$(cat "$SERVICE_ROOT/ID")" + local ID=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID") docker inspect "$ID" &>/dev/null || dokku_log_fail "Service container does not exist" is_container_status "$ID" "Running" || dokku_log_fail "Service container is not running" @@ -354,9 +346,8 @@ service_exposed_ports() { declare desc="Lists exposed ports for a service" declare SERVICE="$1" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local PORT_FILE="$SERVICE_ROOT/PORT" [[ ! -f $PORT_FILE ]] && echo '-' && return 0 - local PORTS=($(cat "$PORT_FILE")) + local PORTS=($(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS")) for ((i = 0; i < ${#PLUGIN_DATASTORE_PORTS[@]}; i++)); do echo -n "${PLUGIN_DATASTORE_PORTS[i]}->${PORTS[i]} " done @@ -379,7 +370,7 @@ service_info() { local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_URL=$(service_url "$SERVICE") local PORT_FILE="$SERVICE_ROOT/PORT" - local SERVICE_CONTAINER_ID="$(cat "$SERVICE_ROOT/ID")" + local SERVICE_CONTAINER_ID="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID")" local flag key valid_flags local flag_map=( @@ -489,7 +480,7 @@ service_links() { touch "$LINKS_FILE" [[ -z $(<"$LINKS_FILE") ]] && return 0 - cat "$LINKS_FILE" + fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" } service_list() { @@ -511,7 +502,7 @@ service_logs() { declare desc="Displays logs for a service" declare SERVICE="$1" TAIL_FLAG="$2" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local ID=$(cat "$SERVICE_ROOT/ID") + local ID=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID") local RE_INTEGER='^[0-9]+$' DOKKU_LOGS_ARGS="--tail 100" @@ -599,20 +590,16 @@ service_parse_args() { service_password() { declare desc="Fetch the password for a service" declare SERVICE="$1" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local PASSWORD_FILE="$SERVICE_ROOT/PASSWORD" - if [[ -f "$PASSWORD_FILE" ]]; then - cat "$PASSWORD_FILE" + if fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PASSWORD"; then + fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PASSWORD" fi } service_root_password() { declare desc="Fetch the root password for a service" declare SERVICE="$1" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local PASSWORD_FILE="$SERVICE_ROOT/ROOTPASSWORD" - if [[ -f "$PASSWORD_FILE" ]]; then - cat "$PASSWORD_FILE" + if fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ROOTPASSWORD"; then + fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ROOTPASSWORD" fi } @@ -631,9 +618,9 @@ service_port_pause() { local PORT_FILE="$SERVICE_ROOT/PORT" if [[ "$LOG_FAIL" == "true" ]]; then - [[ ! -f "$PORT_FILE" ]] && dokku_log_fail "Service not exposed" + fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" && dokku_log_fail "Service not exposed" else - [[ ! -f "$PORT_FILE" ]] && return 0 + fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" && return 0 fi local GREP_NAME="^/${EXPOSED_NAME}$" @@ -656,10 +643,8 @@ service_port_pause() { service_port_unexpose() { declare desc="Wrapper for pausing exposed service ports" declare SERVICE="$1" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local PORT_FILE="$SERVICE_ROOT/PORT" service_port_pause "$SERVICE" "true" - rm -rf "$PORT_FILE" + fn-plugin-property-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" } service_port_unpause() { @@ -673,18 +658,18 @@ service_port_unpause() { local PORTS=(${@:3}) # shellcheck disable=SC2068 PORTS=(${PORTS[@]:-$(get_random_ports ${#PLUGIN_DATASTORE_PORTS[@]})}) - local ID=$(cat "$SERVICE_ROOT/ID") + local ID=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID") [[ "${#PORTS[@]}" != "${#PLUGIN_DATASTORE_PORTS[@]}" ]] && dokku_log_fail "${#PLUGIN_DATASTORE_PORTS[@]} ports to be exposed need to be provided in the following order: ${PLUGIN_DATASTORE_PORTS[*]}" if [[ "$LOG_FAIL" == "true" ]]; then - [[ -f "$PORT_FILE" ]] && PORTS=($(cat "$PORT_FILE")) && dokku_log_fail "Service $SERVICE already exposed on port(s) ${PORTS[*]}" + fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" && IFS=" " read -r -a PORTS <<< "$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS")" && dokku_log_fail "Service $SERVICE already exposed on port(s) ${PORTS[*]}" else - [[ ! -f "$PORT_FILE" ]] && return 0 - PORTS=($(cat "$PORT_FILE")) + fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" && return 0 + IFS=" " read -r -a PORTS <<< "$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS")" fi - echo "${PORTS[@]}" >"$PORT_FILE" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" "${PORTS[@]}" # shellcheck disable=SC2046 docker run -d --link "$SERVICE_NAME:$PLUGIN_COMMAND_PREFIX" --name "$EXPOSED_NAME" $(docker_ports_options "${PORTS[@]}") --restart always --label dokku=ambassador --label "dokku.ambassador=$PLUGIN_COMMAND_PREFIX" "$PLUGIN_AMBASSADOR_IMAGE" >/dev/null @@ -724,18 +709,14 @@ service_promote() { service_set_alias() { declare desc="Sets the alias in use for a service" declare SERVICE="$1" ALIAS="$2" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local ALIAS_FILE="$SERVICE_ROOT/ALIAS" - touch "$ALIAS_FILE" - echo "$ALIAS" >"$ALIAS_FILE" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ALIAS" "$ALIAS" } service_status() { declare desc="Displays the status of a service" declare SERVICE="$1" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local ID="$(cat "$SERVICE_ROOT/ID")" + local ID=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID") local CONTAINER_STATUS CONTAINER_STATUS=$(docker inspect -f "{{.State.Status}}" "$ID" 2>/dev/null || true) @@ -746,7 +727,6 @@ service_status() { service_stop() { declare desc="Stops a running service" declare SERVICE="$1" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_NAME="$(get_service_name "$SERVICE")" local ID=$(docker ps -aq --no-trunc --filter "name=^/$SERVICE_NAME$" --format '{{ .ID }}') || true [[ -z $ID ]] && dokku_log_warn "Service is already stopped" && return 0 diff --git a/functions b/functions index aad85dde..ae2ca003 100755 --- a/functions +++ b/functions @@ -5,6 +5,7 @@ set -eo pipefail source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common-functions" source "$PLUGIN_BASE_PATH/common/functions" source "$PLUGIN_AVAILABLE_PATH/config/functions" +source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions" if [[ -f "$PLUGIN_AVAILABLE_PATH/docker-options/functions" ]]; then source "$PLUGIN_AVAILABLE_PATH/docker-options/functions" fi @@ -26,7 +27,6 @@ service_create() { [[ -z "$SERVICE" ]] && dokku_log_fail "Please specify a valid name for the service" [[ ! -d "$PLUGIN_DATA_ROOT/$SERVICE" ]] || dokku_log_fail "$PLUGIN_SERVICE service $SERVICE already exists" SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - LINKS_FILE="$SERVICE_ROOT/LINKS" service_parse_args "${@:2}" @@ -42,21 +42,17 @@ service_create() { mkdir -p "$SERVICE_ROOT" || dokku_log_fail "Unable to create service directory" mkdir -p "$SERVICE_ROOT/data" || dokku_log_fail "Unable to create service data directory" - touch "$LINKS_FILE" PASSWORD=$(openssl rand -hex 16) if [[ -n "$SERVICE_PASSWORD" ]]; then PASSWORD="$SERVICE_PASSWORD" dokku_log_warn "Specified password may not be as secure as the auto-generated password" fi - echo "$PASSWORD" >"$SERVICE_ROOT/PASSWORD" - chmod 640 "$SERVICE_ROOT/PASSWORD" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PASSWORD" "$PASSWORD" [[ -n "$SERVICE_CUSTOM_ENV" ]] && POSTGRES_CUSTOM_ENV="$SERVICE_CUSTOM_ENV" if [[ -n $POSTGRES_CUSTOM_ENV ]]; then - echo "$POSTGRES_CUSTOM_ENV" | tr ';' "\n" >"$SERVICE_ROOT/ENV" - else - echo "" >"$SERVICE_ROOT/ENV" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ENV" "$POSTGRES_CUSTOM_ENV" fi write_database_name "$SERVICE" @@ -72,8 +68,9 @@ service_create_container() { local DATABASE_NAME="$(get_database_name "$SERVICE")" local PREVIOUS_ID - ID=$(docker run --name "$SERVICE_NAME" -v "$SERVICE_HOST_ROOT/data:/var/lib/postgresql/data" -e "POSTGRES_PASSWORD=$PASSWORD" --env-file="$SERVICE_ROOT/ENV" -d --restart always --label dokku=service --label dokku.service=postgres "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION") - echo "$ID" >"$SERVICE_ROOT/ID" + ID=$(docker run --name "$SERVICE_NAME" -v "$SERVICE_HOST_ROOT/data:/var/lib/postgresql/data" -e "POSTGRES_PASSWORD=$PASSWORD" --env-file="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ENV" "")" -d --restart always --label dokku=service --label dokku.service=postgres "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION") + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID" "$ID" + dokku_log_verbose_quiet "Waiting for container to be ready" docker run --rm --link "$SERVICE_NAME:$PLUGIN_COMMAND_PREFIX" "$PLUGIN_WAIT_IMAGE" -p "$PLUGIN_DATASTORE_WAIT_PORT" >/dev/null @@ -129,9 +126,9 @@ service_start() { local ID=$(docker ps -aq --no-trunc --filter "status=running" --filter "name=^/$SERVICE_NAME$" --format '{{ .ID }}') || true if [[ -n $ID ]]; then [[ -z $QUIET ]] && dokku_log_warn "Service is already started" - if [[ ! -f "$SERVICE_ROOT/ID" ]] || [[ "$(cat "$SERVICE_ROOT/ID")" != "$ID" ]]; then + if fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID" || [[ "$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID")" != "$ID" ]]; then [[ -z $QUIET ]] && dokku_log_warn "Updating local container ID" - echo "$ID" >"$SERVICE_ROOT/ID" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID" "$ID" fi return 0 fi diff --git a/install b/install index 6521cc36..d8238d24 100755 --- a/install +++ b/install @@ -1,5 +1,7 @@ #!/usr/bin/env bash source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/config" +source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions" + set -eo pipefail [[ $DOKKU_TRACE ]] && set -x @@ -25,6 +27,7 @@ plugin-install() { mkdir -p "$PLUGIN_DATA_ROOT" || echo "Failed to create $PLUGIN_SERVICE data directory" chown dokku:dokku "$PLUGIN_DATA_ROOT" + fn-plugin-property-setup "$PLUGIN_COMMAND_PREFIX" mkdir -p "$PLUGIN_CONFIG_ROOT" || echo "Failed to create $PLUGIN_SERVICE config directory" chown dokku:dokku "$PLUGIN_CONFIG_ROOT" From 177806af97eab0f45d3b42f1e7d3596599e9892c Mon Sep 17 00:00:00 2001 From: schlepptop Date: Thu, 16 Jul 2020 18:24:53 +0200 Subject: [PATCH 02/14] :art: Use the properties system instead of the service root even more --- common-functions | 48 ++++++++++++++++++++++----------------------- functions | 6 ++++-- subcommands/destroy | 2 ++ 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/common-functions b/common-functions index 6f4036c6..5aaf38eb 100755 --- a/common-functions +++ b/common-functions @@ -106,14 +106,15 @@ remove_from_links_file() { declare desc="Removes an app from the service link file" declare SERVICE="$1" APP="$2" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local LINKS_FILE="$SERVICE_ROOT/LINKS" - - if [[ ! -f "$LINKS_FILE" ]]; then + if ! fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "$APP" "LINKS"; then return fi sed -i.bak "/^$APP\$/d" "$LINKS_FILE" && rm "$LINKS_FILE.bak" sort "$LINKS_FILE" -u -o "$LINKS_FILE" + EXISTING_LINKS="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "")" + echo "$EXISTING_LINKS" > sed "/^$APP\n\$/d" + EXISTING_LINKS="$(echo -e "$EXISTING_LINKS$APP\n" | sort -u)" } retry-docker-command() { @@ -161,8 +162,8 @@ service_app_links() { pushd "$PLUGIN_DATA_ROOT" >/dev/null for SERVICE in *; do - [[ -f "$SERVICE/LINKS" ]] || continue - for LINKED_APP in $(<"$SERVICE/LINKS"); do + ! fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" || continue + for LINKED_APP in $(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS"); do if [[ "$LINKED_APP" == "$APP" ]]; then echo "$SERVICE" fi @@ -346,7 +347,7 @@ service_exposed_ports() { declare desc="Lists exposed ports for a service" declare SERVICE="$1" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - [[ ! -f $PORT_FILE ]] && echo '-' && return 0 + ! fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" && echo '-' && return 0 local PORTS=($(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS")) for ((i = 0; i < ${#PLUGIN_DATASTORE_PORTS[@]}; i++)); do echo -n "${PLUGIN_DATASTORE_PORTS[i]}->${PORTS[i]} " @@ -427,7 +428,6 @@ service_link() { local EXISTING_CONFIG=$(config_all "$APP") local LINK=$(echo "$EXISTING_CONFIG" | grep "$SERVICE_URL" | cut -d: -f1) || true local SERVICE_DNS_HOSTNAME=$(service_dns_hostname "$SERVICE") - local LINKS_FILE="$SERVICE_ROOT/LINKS" local ALIAS="$PLUGIN_DEFAULT_ALIAS" local DEFAULT_ALIAS @@ -444,9 +444,11 @@ service_link() { fi [[ -n $LINK ]] && dokku_log_fail "Already linked as $LINK" - touch "$LINKS_FILE" - echo "$APP" >>"$LINKS_FILE" - sort "$LINKS_FILE" -u -o "$LINKS_FILE" + + EXISTING_LINKS="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "")" + EXISTING_LINKS="$(echo -e "$APP\n$EXISTING_LINKS" | sort -u)" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "$EXISTING_LINKS" + if declare -f -F add_passed_docker_option >/dev/null; then # shellcheck disable=SC2034 @@ -462,25 +464,21 @@ service_link() { service_linked_apps() { declare desc="Lists all apps linked to a service for info output" declare SERVICE="$1" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local LINKS_FILE="$SERVICE_ROOT/LINKS" - touch "$LINKS_FILE" - [[ -z $(<"$LINKS_FILE") ]] && echo '-' && return 0 + EXISTING_LINKS="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "")" + [[ -z $EXISTING_LINKS ]] && echo '-' && return 0 - tr '\n' ' ' <"$LINKS_FILE" + echo "$EXISTING_LINKS" | tr '\n' ' ' } service_links() { declare desc="Lists all apps linked to a service" declare SERVICE="$1" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local LINKS_FILE="$SERVICE_ROOT/LINKS" - touch "$LINKS_FILE" - [[ -z $(<"$LINKS_FILE") ]] && return 0 + EXISTING_LINKS="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "")" + [[ -z $EXISTING_LINKS ]] && echo '-' && return 0 - fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" + echo "$EXISTING_LINKS" } service_list() { @@ -618,9 +616,9 @@ service_port_pause() { local PORT_FILE="$SERVICE_ROOT/PORT" if [[ "$LOG_FAIL" == "true" ]]; then - fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" && dokku_log_fail "Service not exposed" + ! fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" && dokku_log_fail "Service not exposed" else - fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" && return 0 + ! fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" && return 0 fi local GREP_NAME="^/${EXPOSED_NAME}$" @@ -665,7 +663,7 @@ service_port_unpause() { if [[ "$LOG_FAIL" == "true" ]]; then fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" && IFS=" " read -r -a PORTS <<< "$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS")" && dokku_log_fail "Service $SERVICE already exposed on port(s) ${PORTS[*]}" else - fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" && return 0 + ! fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" && return 0 IFS=" " read -r -a PORTS <<< "$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS")" fi @@ -792,9 +790,9 @@ verify_service_name() { write_database_name() { declare desc="Writes a sanitized database name" declare SERVICE="$1" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" # some datastores do not like special characters in database names # so we need to normalize them out - echo "$SERVICE" | tr .- _ > "$SERVICE_ROOT/DATABASE_NAME" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "DATABASE_NAME" "$(echo "$SERVICE" | tr .- _)" + } diff --git a/functions b/functions index ae2ca003..683b4f14 100755 --- a/functions +++ b/functions @@ -52,7 +52,9 @@ service_create() { [[ -n "$SERVICE_CUSTOM_ENV" ]] && POSTGRES_CUSTOM_ENV="$SERVICE_CUSTOM_ENV" if [[ -n $POSTGRES_CUSTOM_ENV ]]; then - fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ENV" "$POSTGRES_CUSTOM_ENV" + echo "$POSTGRES_CUSTOM_ENV" | tr ';' "\n" >"$SERVICE_ROOT/ENV" + else + echo "" >"$SERVICE_ROOT/ENV" fi write_database_name "$SERVICE" @@ -68,7 +70,7 @@ service_create_container() { local DATABASE_NAME="$(get_database_name "$SERVICE")" local PREVIOUS_ID - ID=$(docker run --name "$SERVICE_NAME" -v "$SERVICE_HOST_ROOT/data:/var/lib/postgresql/data" -e "POSTGRES_PASSWORD=$PASSWORD" --env-file="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ENV" "")" -d --restart always --label dokku=service --label dokku.service=postgres "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION") + ID=$(docker run --name "$SERVICE_NAME" -v "$SERVICE_HOST_ROOT/data:/var/lib/postgresql/data" -e "POSTGRES_PASSWORD=$PASSWORD" --env-file="$SERVICE_ROOT/ENV" -d --restart always --label dokku=service --label dokku.service=postgres "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION") fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID" "$ID" diff --git a/subcommands/destroy b/subcommands/destroy index e2f08d58..4ca41162 100755 --- a/subcommands/destroy +++ b/subcommands/destroy @@ -4,6 +4,7 @@ set -eo pipefail [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_BASE_PATH/common/functions" source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions" +source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions" service-destroy-cmd() { #E destroy the service, it's data, and the running container @@ -47,6 +48,7 @@ service-destroy-cmd() { dokku_log_verbose_quiet "Removing data" docker run --rm -v "$SERVICE_HOST_ROOT/data:/data" -v "$SERVICE_HOST_ROOT/$PLUGIN_CONFIG_SUFFIX:/config" "$PLUGIN_BUSYBOX_IMAGE" chmod 777 -R /config /data rm -rf "$SERVICE_ROOT" + fn-plugin-property-destroy "$PLUGIN_COMMAND_PREFIX" "$SERVICE" dokku_log_info2 "$PLUGIN_SERVICE container deleted: $SERVICE" } From ac7a693579620148ea08ea58ba601321744bd310 Mon Sep 17 00:00:00 2001 From: schlepptop Date: Thu, 16 Jul 2020 19:19:31 +0200 Subject: [PATCH 03/14] :worker: Fix tests to look in the right place --- common-functions | 6 ++---- subcommands/clone | 5 +++-- subcommands/destroy | 3 +-- tests/hook_pre_delete.bats | 4 ++-- tests/service_clone.bats | 2 +- tests/service_info.bats | 6 +++--- tests/service_link.bats | 6 +++--- tests/service_promote.bats | 6 +++--- 8 files changed, 18 insertions(+), 20 deletions(-) diff --git a/common-functions b/common-functions index 5aaf38eb..b10a4500 100755 --- a/common-functions +++ b/common-functions @@ -110,11 +110,9 @@ remove_from_links_file() { return fi - sed -i.bak "/^$APP\$/d" "$LINKS_FILE" && rm "$LINKS_FILE.bak" - sort "$LINKS_FILE" -u -o "$LINKS_FILE" EXISTING_LINKS="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "")" - echo "$EXISTING_LINKS" > sed "/^$APP\n\$/d" - EXISTING_LINKS="$(echo -e "$EXISTING_LINKS$APP\n" | sort -u)" + echo "$EXISTING_LINKS" | sed "/^$APP\n\$/d" + EXISTING_LINKS="$(echo -e "$APP\n$EXISTING_LINKS" | sort -u)" } retry-docker-command() { diff --git a/subcommands/clone b/subcommands/clone index 744e28af..3799ee6b 100755 --- a/subcommands/clone +++ b/subcommands/clone @@ -4,6 +4,8 @@ set -eo pipefail [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_BASE_PATH/common/functions" source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions" +source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions" + service-clone-cmd() { #E you can clone an existing service to a new one @@ -25,8 +27,7 @@ service-clone-cmd() { [[ -z "$NEW_SERVICE" ]] && dokku_log_fail "Please specify a name for the new service" verify_service_name "$SERVICE" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local ID="$(cat "$SERVICE_ROOT/ID")" + local ID=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID") is_container_status "$ID" "Running" || dokku_log_fail "Service ${SERVICE} container is not running" PLUGIN_IMAGE=$(service_version "$SERVICE" | grep -o "^.*:" | sed -r "s/://g") diff --git a/subcommands/destroy b/subcommands/destroy index 4ca41162..4690be33 100755 --- a/subcommands/destroy +++ b/subcommands/destroy @@ -19,11 +19,10 @@ service-destroy-cmd() { [[ -z "$SERVICE" ]] && dokku_log_fail "Please specify a valid name for the service" verify_service_name "$SERVICE" SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - LINKS_FILE="$SERVICE_ROOT/LINKS" SERVICE_HOST_ROOT="$PLUGIN_DATA_HOST_ROOT/$SERVICE" SERVICE_NAME="$(get_service_name "$SERVICE")" - [[ -s "$LINKS_FILE" ]] && dokku_log_fail "Cannot delete linked service" + [[ $(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "") == "" ]] && dokku_log_fail "Cannot delete linked service" if [[ "$FORCE_FLAG" == "force" ]] || [[ "$FORCE_FLAG" == "-f" ]] || [[ "$FORCE_FLAG" == "--force" ]]; then DOKKU_APPS_FORCE_DELETE=1 diff --git a/tests/hook_pre_delete.bats b/tests/hook_pre_delete.bats index 21d339dd..a691d931 100755 --- a/tests/hook_pre_delete.bats +++ b/tests/hook_pre_delete.bats @@ -13,7 +13,7 @@ teardown() { } @test "($PLUGIN_COMMAND_PREFIX:hook:pre-delete) removes app from links file when destroying app" { - [[ -n $(< "$PLUGIN_DATA_ROOT/l/LINKS") ]] + [[ -n $(< "$PLUGIN_CONFIG_ROOT/l/LINKS") ]] dokku --force apps:destroy my_app - [[ -z $(< "$PLUGIN_DATA_ROOT/l/LINKS") ]] + [[ -z $(< "$PLUGIN_CONFIG_ROOT/l/LINKS") ]] } diff --git a/tests/service_clone.bats b/tests/service_clone.bats index 5ccd9977..e945af12 100755 --- a/tests/service_clone.bats +++ b/tests/service_clone.bats @@ -38,7 +38,7 @@ teardown() { @test "($PLUGIN_COMMAND_PREFIX:clone) success" { run dokku "$PLUGIN_COMMAND_PREFIX:clone" l new_service - [[ -f $PLUGIN_DATA_ROOT/new_service/ID ]] + [[ -f $PLUGIN_CONFIG_ROOT/new_service/ID ]] assert_contains "${lines[*]}" "Copying data from l to new_service" assert_contains "${lines[*]}" "Done" assert_success diff --git a/tests/service_info.bats b/tests/service_info.bats index 77ffb877..042dd0ad 100755 --- a/tests/service_info.bats +++ b/tests/service_info.bats @@ -21,21 +21,21 @@ teardown() { @test "($PLUGIN_COMMAND_PREFIX:info) success" { run dokku "$PLUGIN_COMMAND_PREFIX:info" l - local password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + local password="$(sudo cat "$PLUGIN_CONFIG_ROOT/l/PASSWORD")" assert_contains "${lines[*]}" "postgres://postgres:$password@dokku-postgres-l:5432/l" } @test "($PLUGIN_COMMAND_PREFIX:info) replaces underscores by dash in hostname" { dokku "$PLUGIN_COMMAND_PREFIX:create" test_with_underscores run dokku "$PLUGIN_COMMAND_PREFIX:info" test_with_underscores - local password="$(sudo cat "$PLUGIN_DATA_ROOT/test_with_underscores/PASSWORD")" + local password="$(sudo cat "$PLUGIN_CONFIG_ROOT/test_with_underscores/PASSWORD")" assert_contains "${lines[*]}" "postgres://postgres:$password@dokku-postgres-test-with-underscores:5432/test_with_underscores" dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" test_with_underscores } @test "($PLUGIN_COMMAND_PREFIX:info) success with flag" { run dokku "$PLUGIN_COMMAND_PREFIX:info" l --dsn - local password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + local password="$(sudo cat "$PLUGIN_CONFIG_ROOT/l/PASSWORD")" assert_output "postgres://postgres:$password@dokku-postgres-l:5432/l" run dokku "$PLUGIN_COMMAND_PREFIX:info" l --config-dir diff --git a/tests/service_link.bats b/tests/service_link.bats index 3635fa18..ae926a7f 100755 --- a/tests/service_link.bats +++ b/tests/service_link.bats @@ -62,7 +62,7 @@ teardown() { echo "output: $output" echo "status: $status" url=$(dokku config:get my_app DATABASE_URL) - password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + password="$(sudo cat "$PLUGIN_CONFIG_ROOT/l/PASSWORD")" assert_contains "$url" "postgres://postgres:$password@dokku-postgres-l:5432/l" assert_success dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app @@ -95,7 +95,7 @@ teardown() { dokku config:set my_app POSTGRES_DATABASE_SCHEME=postgres2 dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app url=$(dokku config:get my_app DATABASE_URL) - password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + password="$(sudo cat "$PLUGIN_CONFIG_ROOT/l/PASSWORD")" assert_contains "$url" "postgres2://postgres:$password@dokku-postgres-l:5432/l" assert_success dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app @@ -112,7 +112,7 @@ teardown() { @test "($PLUGIN_COMMAND_PREFIX:link) uses a specified config url when alias is specified" { dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app --alias "ALIAS" url=$(dokku config:get my_app ALIAS_URL) - password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + password="$(sudo cat "$PLUGIN_CONFIG_ROOT/l/PASSWORD")" assert_contains "$url" "postgres://postgres:$password@dokku-postgres-l:5432/l" assert_success dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app diff --git a/tests/service_promote.bats b/tests/service_promote.bats index 92fe4a3b..43229b10 100755 --- a/tests/service_promote.bats +++ b/tests/service_promote.bats @@ -39,7 +39,7 @@ teardown() { } @test "($PLUGIN_COMMAND_PREFIX:promote) changes DATABASE_URL" { - password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + password="$(sudo cat "$PLUGIN_CONFIG_ROOT/l/PASSWORD")" dokku config:set my_app "DATABASE_URL=postgres://u:p@host:5432/db" "DOKKU_POSTGRES_BLUE_URL=postgres://postgres:$password@dokku-postgres-l:5432/l" dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app url=$(dokku config:get my_app DATABASE_URL) @@ -47,14 +47,14 @@ teardown() { } @test "($PLUGIN_COMMAND_PREFIX:promote) creates new config url when needed" { - password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + password="$(sudo cat "$PLUGIN_CONFIG_ROOT/l/PASSWORD")" dokku config:set my_app "DATABASE_URL=postgres://u:p@host:5432/db" "DOKKU_POSTGRES_BLUE_URL=postgres://postgres:$password@dokku-postgres-l:5432/l" dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app run dokku config my_app assert_contains "${lines[*]}" "DOKKU_POSTGRES_" } @test "($PLUGIN_COMMAND_PREFIX:promote) uses POSTGRES_DATABASE_SCHEME variable" { - password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + password="$(sudo cat "$PLUGIN_CONFIG_ROOT/l/PASSWORD")" dokku config:set my_app "POSTGRES_DATABASE_SCHEME=postgres2" "DATABASE_URL=postgres://u:p@host:5432/db" "DOKKU_POSTGRES_BLUE_URL=postgres2://postgres:$password@dokku-postgres-l:5432/l" dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app url=$(dokku config:get my_app DATABASE_URL) From 7e5c631238ad14779026e9b027c5d4422cbd2726 Mon Sep 17 00:00:00 2001 From: schlepptop Date: Thu, 16 Jul 2020 20:21:51 +0200 Subject: [PATCH 04/14] :bug: --- common-functions | 10 +++++----- subcommands/destroy | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/common-functions b/common-functions index b10a4500..3c933fdd 100755 --- a/common-functions +++ b/common-functions @@ -106,13 +106,13 @@ remove_from_links_file() { declare desc="Removes an app from the service link file" declare SERVICE="$1" APP="$2" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - if ! fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "$APP" "LINKS"; then + if ! fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS"; then return fi EXISTING_LINKS="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "")" - echo "$EXISTING_LINKS" | sed "/^$APP\n\$/d" - EXISTING_LINKS="$(echo -e "$APP\n$EXISTING_LINKS" | sort -u)" + EXISTING_LINKS="$(echo "$EXISTING_LINKS" | sort -u | sed -e "/^$APP\$/d" -e "/^$/d")" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "$EXISTING_LINKS" } retry-docker-command() { @@ -444,7 +444,7 @@ service_link() { [[ -n $LINK ]] && dokku_log_fail "Already linked as $LINK" EXISTING_LINKS="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "")" - EXISTING_LINKS="$(echo -e "$APP\n$EXISTING_LINKS" | sort -u)" + EXISTING_LINKS="$(echo -e "$APP\n$EXISTING_LINKS" | sort -u | sed "/^$/d")" fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "$EXISTING_LINKS" @@ -464,7 +464,7 @@ service_linked_apps() { declare SERVICE="$1" EXISTING_LINKS="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "")" - [[ -z $EXISTING_LINKS ]] && echo '-' && return 0 + [[ -z $EXISTING_LINKS ]] && echo "-" && return 0 echo "$EXISTING_LINKS" | tr '\n' ' ' } diff --git a/subcommands/destroy b/subcommands/destroy index 4690be33..3fe1c38d 100755 --- a/subcommands/destroy +++ b/subcommands/destroy @@ -22,7 +22,7 @@ service-destroy-cmd() { SERVICE_HOST_ROOT="$PLUGIN_DATA_HOST_ROOT/$SERVICE" SERVICE_NAME="$(get_service_name "$SERVICE")" - [[ $(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "") == "" ]] && dokku_log_fail "Cannot delete linked service" + [[ $(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "") != "" ]] && dokku_log_fail "Cannot delete linked service" if [[ "$FORCE_FLAG" == "force" ]] || [[ "$FORCE_FLAG" == "-f" ]] || [[ "$FORCE_FLAG" == "--force" ]]; then DOKKU_APPS_FORCE_DELETE=1 From 44cb49b508ede9d36d6af3e6212a2ea4557f8598 Mon Sep 17 00:00:00 2001 From: schlepptop Date: Thu, 16 Jul 2020 21:53:58 +0200 Subject: [PATCH 05/14] :worker: tracing for failing test --- tests/hook_pre_delete.bats | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/hook_pre_delete.bats b/tests/hook_pre_delete.bats index a691d931..9a59d071 100755 --- a/tests/hook_pre_delete.bats +++ b/tests/hook_pre_delete.bats @@ -13,7 +13,9 @@ teardown() { } @test "($PLUGIN_COMMAND_PREFIX:hook:pre-delete) removes app from links file when destroying app" { + dokku trace:on [[ -n $(< "$PLUGIN_CONFIG_ROOT/l/LINKS") ]] dokku --force apps:destroy my_app [[ -z $(< "$PLUGIN_CONFIG_ROOT/l/LINKS") ]] + dokku trace:off } From 5e784b8ee21766fa4b742f4a5024ee2805a270ca Mon Sep 17 00:00:00 2001 From: schlepptop Date: Fri, 17 Jul 2020 12:23:08 +0200 Subject: [PATCH 06/14] :worker: debugging failing test --- tests/hook_pre_delete.bats | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/hook_pre_delete.bats b/tests/hook_pre_delete.bats index 9a59d071..30bfcb82 100755 --- a/tests/hook_pre_delete.bats +++ b/tests/hook_pre_delete.bats @@ -13,9 +13,10 @@ teardown() { } @test "($PLUGIN_COMMAND_PREFIX:hook:pre-delete) removes app from links file when destroying app" { - dokku trace:on + ls -la "$PLUGIN_CONFIG_ROOT/l/LINKS" + whoami + users [[ -n $(< "$PLUGIN_CONFIG_ROOT/l/LINKS") ]] dokku --force apps:destroy my_app [[ -z $(< "$PLUGIN_CONFIG_ROOT/l/LINKS") ]] - dokku trace:off } From 8c1091fc4d32ef4ab3894f14fa13ec0a205aa238 Mon Sep 17 00:00:00 2001 From: schlepptop Date: Fri, 17 Jul 2020 12:54:18 +0200 Subject: [PATCH 07/14] :worker: debugging failing test --- tests/hook_pre_delete.bats | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/hook_pre_delete.bats b/tests/hook_pre_delete.bats index 30bfcb82..f6d163e8 100755 --- a/tests/hook_pre_delete.bats +++ b/tests/hook_pre_delete.bats @@ -13,10 +13,7 @@ teardown() { } @test "($PLUGIN_COMMAND_PREFIX:hook:pre-delete) removes app from links file when destroying app" { - ls -la "$PLUGIN_CONFIG_ROOT/l/LINKS" - whoami - users - [[ -n $(< "$PLUGIN_CONFIG_ROOT/l/LINKS") ]] + sudo [ -n $(< "$PLUGIN_CONFIG_ROOT/l/LINKS") ] dokku --force apps:destroy my_app - [[ -z $(< "$PLUGIN_CONFIG_ROOT/l/LINKS") ]] + sudo [ -z $(< "$PLUGIN_CONFIG_ROOT/l/LINKS") ] } From f54a6b2692da20b62bb8193d8084b129887b3098 Mon Sep 17 00:00:00 2001 From: schlepptop Date: Fri, 17 Jul 2020 13:40:15 +0200 Subject: [PATCH 08/14] :truck: Added migration code --- install | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/install b/install index d8238d24..8d95cf3c 100755 --- a/install +++ b/install @@ -31,6 +31,23 @@ plugin-install() { mkdir -p "$PLUGIN_CONFIG_ROOT" || echo "Failed to create $PLUGIN_SERVICE config directory" chown dokku:dokku "$PLUGIN_CONFIG_ROOT" + for SERVICE in "$PLUGIN_DATA_ROOT"/*; do + if [ -d "$SERVICE" ]; then + for PROP in "$PLUGIN_DATA_ROOT"/"$SERVICE"/*; do + if [ ! -d "$PROP" ] && [[ "$PROP" != "ENV" ]]; then + mv "$PROP" "$PLUGIN_CONFIG_ROOT"/"$SERVICE" + fi + done + if [ -d "$SERVICE"/backup ]; then + for BACKUPPROP in "$PLUGIN_DATA_ROOT"/"$SERVICE"/*; do + mv "$BACKUPPROP" "$PLUGIN_CONFIG_ROOT/$SERVICE/BACKUP_$BACKUPPROP" + done + fi + chown dokku:dokku "$PLUGIN_CONFIG_ROOT"/"$SERVICE"/* + chmod 600 "$PLUGIN_CONFIG_ROOT"/"$SERVICE"/* + fi + done + rm -f "/etc/sudoers.d/dokku-${PLUGIN_COMMAND_PREFIX}*" _SUDOERS_FILE="/etc/sudoers.d/dokku-${PLUGIN_COMMAND_PREFIX}" From a4e44708e691f72a26ee93de87510b8fb6cdc7c7 Mon Sep 17 00:00:00 2001 From: schlepptop Date: Fri, 17 Jul 2020 14:48:36 +0200 Subject: [PATCH 09/14] :bug: --- install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install b/install index 8d95cf3c..a993b917 100755 --- a/install +++ b/install @@ -39,7 +39,7 @@ plugin-install() { fi done if [ -d "$SERVICE"/backup ]; then - for BACKUPPROP in "$PLUGIN_DATA_ROOT"/"$SERVICE"/*; do + for BACKUPPROP in "$PLUGIN_DATA_ROOT"/"$SERVICE"/backup/*; do mv "$BACKUPPROP" "$PLUGIN_CONFIG_ROOT/$SERVICE/BACKUP_$BACKUPPROP" done fi From f3f1e521626898698e964cdf67774d8b72b6f420 Mon Sep 17 00:00:00 2001 From: schlepptop Date: Fri, 17 Jul 2020 15:18:59 +0200 Subject: [PATCH 10/14] :bug: Fix migration code --- install | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/install b/install index a993b917..6d108bd5 100755 --- a/install +++ b/install @@ -31,22 +31,28 @@ plugin-install() { mkdir -p "$PLUGIN_CONFIG_ROOT" || echo "Failed to create $PLUGIN_SERVICE config directory" chown dokku:dokku "$PLUGIN_CONFIG_ROOT" - for SERVICE in "$PLUGIN_DATA_ROOT"/*; do + pushd "$PLUGIN_DATA_ROOT" + for SERVICE in *; do if [ -d "$SERVICE" ]; then - for PROP in "$PLUGIN_DATA_ROOT"/"$SERVICE"/*; do + mkdir -p "$PLUGIN_CONFIG_ROOT"/"$SERVICE/" + for PROP in "$SERVICE"/*; do if [ ! -d "$PROP" ] && [[ "$PROP" != "ENV" ]]; then - mv "$PROP" "$PLUGIN_CONFIG_ROOT"/"$SERVICE" + mv "$PROP" "$PLUGIN_CONFIG_ROOT"/"$SERVICE/" fi done if [ -d "$SERVICE"/backup ]; then - for BACKUPPROP in "$PLUGIN_DATA_ROOT"/"$SERVICE"/backup/*; do - mv "$BACKUPPROP" "$PLUGIN_CONFIG_ROOT/$SERVICE/BACKUP_$BACKUPPROP" + pushd "$SERVICE"/backup + for BACKUPPROP in *; do + mv "$BACKUPPROP" "BACKUP_$BACKUPPROP" + mv "BACKUP_$BACKUPPROP" "$PLUGIN_CONFIG_ROOT/$SERVICE/" done + popd fi - chown dokku:dokku "$PLUGIN_CONFIG_ROOT"/"$SERVICE"/* + chown -R dokku:dokku "$PLUGIN_CONFIG_ROOT"/"$SERVICE"/* chmod 600 "$PLUGIN_CONFIG_ROOT"/"$SERVICE"/* fi done + popd rm -f "/etc/sudoers.d/dokku-${PLUGIN_COMMAND_PREFIX}*" _SUDOERS_FILE="/etc/sudoers.d/dokku-${PLUGIN_COMMAND_PREFIX}" From 7a4ccdedcbdd8a2a5d403173e0c5768d201574bc Mon Sep 17 00:00:00 2001 From: schlepptop Date: Fri, 17 Jul 2020 15:27:42 +0200 Subject: [PATCH 11/14] :bug: Fix migration code a little more --- install | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/install b/install index 6d108bd5..7eeeaa77 100755 --- a/install +++ b/install @@ -35,11 +35,13 @@ plugin-install() { for SERVICE in *; do if [ -d "$SERVICE" ]; then mkdir -p "$PLUGIN_CONFIG_ROOT"/"$SERVICE/" - for PROP in "$SERVICE"/*; do + pushd "$SERVICE" + for PROP in *; do if [ ! -d "$PROP" ] && [[ "$PROP" != "ENV" ]]; then mv "$PROP" "$PLUGIN_CONFIG_ROOT"/"$SERVICE/" fi done + popd if [ -d "$SERVICE"/backup ]; then pushd "$SERVICE"/backup for BACKUPPROP in *; do From 79148b3fce2edce3d9adb9902235ea3421ec4cfd Mon Sep 17 00:00:00 2001 From: schlepptop Date: Sat, 18 Jul 2020 10:55:54 +0200 Subject: [PATCH 12/14] :bug: Switch cases for service_app_links --- common-functions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common-functions b/common-functions index 3c933fdd..331c2aa4 100755 --- a/common-functions +++ b/common-functions @@ -160,7 +160,7 @@ service_app_links() { pushd "$PLUGIN_DATA_ROOT" >/dev/null for SERVICE in *; do - ! fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" || continue + fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" || continue for LINKED_APP in $(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS"); do if [[ "$LINKED_APP" == "$APP" ]]; then echo "$SERVICE" From 94652d1dada6434c10252202026b1b295b178134 Mon Sep 17 00:00:00 2001 From: schlepptop Date: Sat, 18 Jul 2020 16:54:39 +0200 Subject: [PATCH 13/14] Fix config root permissions after migrating --- install | 1 + 1 file changed, 1 insertion(+) diff --git a/install b/install index 7eeeaa77..be4038b0 100755 --- a/install +++ b/install @@ -50,6 +50,7 @@ plugin-install() { done popd fi + chown dokku:dokku "$PLUGIN_CONFIG_ROOT"/"$SERVICE"/ chown -R dokku:dokku "$PLUGIN_CONFIG_ROOT"/"$SERVICE"/* chmod 600 "$PLUGIN_CONFIG_ROOT"/"$SERVICE"/* fi From 55980e5035c2219ffa50bdb45d3c01079b6c7ef7 Mon Sep 17 00:00:00 2001 From: schlepptop Date: Sun, 19 Jul 2020 15:06:40 +0200 Subject: [PATCH 14/14] Empty commit; trigger retest