Alphabetize functions to improve organization

This commit is contained in:
Jose Diaz-Gonzalez
2016-05-16 02:28:32 -04:00
parent badbbec7ae
commit 68fe59e7fd

384
functions
View File

@@ -4,6 +4,13 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_AVAILABLE_PATH/config/functions" source "$PLUGIN_AVAILABLE_PATH/config/functions"
source "$PLUGIN_AVAILABLE_PATH/docker-options/functions" source "$PLUGIN_AVAILABLE_PATH/docker-options/functions"
docker_ports_options() {
local PORTS=("$@")
for (( i=0; i < ${#PLUGIN_DATASTORE_PORTS[@]}; i++ )); do
echo -n "-p ${PORTS[i]}:${PLUGIN_DATASTORE_PORTS[i]} "
done
}
get_random_ports() { get_random_ports() {
local iterations="${1:-1}" local iterations="${1:-1}"
for (( i=0; i < iterations; i++ )); do for (( i=0; i < iterations; i++ )); do
@@ -25,6 +32,69 @@ get_container_ip() {
docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$1" docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$1"
} }
get_service_name() {
local SERVICE="$1"
echo "dokku.${PLUGIN_COMMAND_PREFIX}.$SERVICE"
}
get_url_from_config() {
local EXISTING_CONFIG="$1"
local CONFIG_VAR="$2"
echo "$EXISTING_CONFIG" | grep "$CONFIG_VAR" | sed "s/$CONFIG_VAR:\s*//" | xargs
}
is_container_status() {
local CID="$1"
local TEMPLATE="{{.State.$2}}"
local CONTAINER_STATUS=$(docker inspect -f "$TEMPLATE" "$CID" || true)
if [[ "$CONTAINER_STATUS" == "true" ]]; then
return 0
else
return 1
fi
}
promote() {
local SERVICE="$1"
local APP="$2"
local PLUGIN_DEFAULT_CONFIG_VAR="${PLUGIN_DEFAULT_ALIAS}_URL"
local EXISTING_CONFIG=$(config_all "$APP")
update_plugin_scheme_for_app "$APP"
local SERVICE_URL=$(service_url "$SERVICE")
local CONFIG_VARS=($(echo "$EXISTING_CONFIG" | grep "$SERVICE_URL" | cut -d: -f1)) || true
local PREVIOUS_DEFAULT_URL=$(get_url_from_config "$EXISTING_CONFIG" "$PLUGIN_DEFAULT_CONFIG_VAR")
[[ -z ${CONFIG_VARS[*]} ]] && dokku_log_fail "Not linked to app $APP"
[[ ${CONFIG_VARS[*]} =~ $PLUGIN_DEFAULT_CONFIG_VAR ]] && dokku_log_fail "Service $1 already promoted as $PLUGIN_DEFAULT_CONFIG_VAR"
local NEW_CONFIG_VARS=""
if [[ -n $PREVIOUS_DEFAULT_URL ]]; then
local PREVIOUS_ALIAS=$(echo "$EXISTING_CONFIG" | grep "$PREVIOUS_DEFAULT_URL" | grep -v "$PLUGIN_DEFAULT_CONFIG_VAR") || true
if [[ -z $PREVIOUS_ALIAS ]]; then
local ALIAS=$(service_alternative_alias "$EXISTING_CONFIG")
NEW_CONFIG_VARS+="${ALIAS}_URL=$PREVIOUS_DEFAULT_URL "
fi
fi
local PROMOTE_URL=$(get_url_from_config "$EXISTING_CONFIG" "${CONFIG_VARS[0]}")
NEW_CONFIG_VARS+="$PLUGIN_DEFAULT_CONFIG_VAR=$PROMOTE_URL"
# shellcheck disable=SC2086
config_set "$APP" $NEW_CONFIG_VARS
}
remove_from_links_file() {
local SERVICE="$1"
local APP="$2"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local LINKS_FILE="$SERVICE_ROOT/LINKS"
mkdir -p "$SERVICE_ROOT" || dokku_log_fail "Unable to create service directory"
touch "$LINKS_FILE"
sed -i.bak "/^$APP\$/d" "$LINKS_FILE" && rm "$LINKS_FILE.bak"
sort "$LINKS_FILE" -u -o "$LINKS_FILE"
}
verify_service_name() { verify_service_name() {
local SERVICE="$1" local SERVICE="$1"
[[ ! -n "$SERVICE" ]] && dokku_log_fail "(verify_service_name) SERVICE must not be null" [[ ! -n "$SERVICE" ]] && dokku_log_fail "(verify_service_name) SERVICE must not be null"
@@ -38,51 +108,21 @@ service_alias() {
echo "$SERVICE_NAME" | tr ._ - echo "$SERVICE_NAME" | tr ._ -
} }
service_export() { service_alternative_alias() {
local SERVICE="$1" local EXISTING_CONFIG="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local COLORS=(AQUA BLACK BLUE FUCHSIA GRAY GREEN LIME MAROON NAVY OLIVE PURPLE RED SILVER TEAL WHITE YELLOW)
local SERVICE_NAME="$(get_service_name "$SERVICE")" local ALIAS;
local DATABASE_NAME="$(get_database_name "$SERVICE")"
local PASSWORD=$(cat "$SERVICE_ROOT/PASSWORD")
[[ -n $SSH_TTY ]] && stty -opost while [[ -z $ALIAS ]]; do
docker exec "$SERVICE_NAME" env PGPASSWORD="$PASSWORD" pg_dump -Fc --no-acl --no-owner -h localhost -U postgres -w "$DATABASE_NAME" local IDX=$((RANDOM % ${#COLORS[*]}))
status=$? local COLOR=${COLORS[IDX]}
[[ -n $SSH_TTY ]] && stty opost ALIAS="${PLUGIN_ALT_ALIAS}_${COLOR}"
exit $status local IN_USE=$(echo "$EXISTING_CONFIG" | grep "${ALIAS}_URL")
} if [[ -n $IN_USE ]]; then
unset ALIAS
service_info() {
local SERVICE="$1"
local SERVICE_URL=$(service_url "$SERVICE")
echo " DSN: $SERVICE_URL"
}
service_import() {
local SERVICE="$1"
SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
SERVICE_NAME="$(get_service_name "$SERVICE")"
DATABASE_NAME="$(get_database_name "$SERVICE")"
PASSWORD=$(cat "$SERVICE_ROOT/PASSWORD")
if [[ -t 0 ]]; then
dokku_log_fail "No data provided on stdin."
fi fi
docker exec -i "$SERVICE_NAME" env PGPASSWORD="$PASSWORD" pg_restore -h localhost -cO -d "$DATABASE_NAME" -U postgres -w
}
service_list() {
local SERVICES=$(ls "$PLUGIN_DATA_ROOT" 2> /dev/null)
if [[ -z $SERVICES ]]; then
dokku_log_warn "There are no $PLUGIN_SERVICE services"
else
LIST="NAME,VERSION,STATUS,EXPOSED PORTS,LINKS\n"
for SERVICE in $SERVICES; do
LIST+="$SERVICE,$(service_version "$SERVICE"),$(service_status "$SERVICE"),$(service_exposed_ports "$SERVICE"),$(service_linked_apps "$SERVICE")\n"
done done
printf "%b" "$LIST" | column -t -s, echo "$ALIAS"
fi
} }
service_exposed_ports() { service_exposed_ports() {
@@ -96,6 +136,13 @@ service_exposed_ports() {
done done
} }
service_info() {
local SERVICE="$1"
local SERVICE_URL=$(service_url "$SERVICE")
echo " DSN: $SERVICE_URL"
}
service_link() { service_link() {
local APP="$2" local APP="$2"
local SERVICE="$1" local SERVICE="$1"
@@ -126,21 +173,27 @@ service_link() {
config_set "$APP" "${ALIAS}_URL=$SERVICE_URL" config_set "$APP" "${ALIAS}_URL=$SERVICE_URL"
} }
service_alternative_alias() { service_linked_apps() {
local EXISTING_CONFIG="$1" local SERVICE="$1"
local COLORS=(AQUA BLACK BLUE FUCHSIA GRAY GREEN LIME MAROON NAVY OLIVE PURPLE RED SILVER TEAL WHITE YELLOW) local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local ALIAS; local LINKS_FILE="$SERVICE_ROOT/LINKS"
while [[ -z $ALIAS ]]; do [[ -z $(< "$LINKS_FILE") ]] && echo '-' && return 0
local IDX=$((RANDOM % ${#COLORS[*]}))
local COLOR=${COLORS[IDX]} tr '\n' ' ' < "$LINKS_FILE"
ALIAS="${PLUGIN_ALT_ALIAS}_${COLOR}" }
local IN_USE=$(echo "$EXISTING_CONFIG" | grep "${ALIAS}_URL")
if [[ -n $IN_USE ]]; then service_list() {
unset ALIAS local SERVICES=$(ls "$PLUGIN_DATA_ROOT" 2> /dev/null)
fi if [[ -z $SERVICES ]]; then
dokku_log_warn "There are no $PLUGIN_SERVICE services"
else
LIST="NAME,VERSION,STATUS,EXPOSED PORTS,LINKS\n"
for SERVICE in $SERVICES; do
LIST+="$SERVICE,$(service_version "$SERVICE"),$(service_status "$SERVICE"),$(service_exposed_ports "$SERVICE"),$(service_linked_apps "$SERVICE")\n"
done done
echo "$ALIAS" printf "%b" "$LIST" | column -t -s,
fi
} }
service_logs() { service_logs() {
@@ -245,40 +298,56 @@ service_port_unpause() {
fi fi
} }
docker_ports_options() { service_stop() {
local PORTS=("$@")
for (( i=0; i < ${#PLUGIN_DATASTORE_PORTS[@]}; i++ )); do
echo -n "-p ${PORTS[i]}:${PLUGIN_DATASTORE_PORTS[i]} "
done
}
service_start() {
local SERVICE="$1" local SERVICE="$1"
local QUIET="$2" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE";
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local SERVICE_NAME="$(get_service_name "$SERVICE")" local SERVICE_NAME="$(get_service_name "$SERVICE")"
local ID=$(docker ps -f status=running | grep -e "$SERVICE_NAME$" | awk '{print $1}') || true local ID=$(docker ps -f status=running | grep -e "$SERVICE_NAME$" | awk '{print $1}') || true
[[ -z $ID ]] && dokku_log_warn "Service is already stopped" && return 0
if [[ -n $ID ]]; then if [[ -n $ID ]]; then
[[ -z $QUIET ]] && dokku_log_warn "Service is already started" dokku_log_info1_quiet "Stopping container"
return 0 docker stop "$SERVICE_NAME" > /dev/null
fi service_port_pause "$SERVICE"
dokku_log_info2 "Container stopped"
dokku_log_info1_quiet "Starting container"
local PREVIOUS_ID=$(docker ps -f status=exited | grep -e "$SERVICE_NAME$" | awk '{print $1}') || true
local IMAGE_EXISTS=$(docker images | grep -e "^$PLUGIN_IMAGE " | grep -q " $PLUGIN_IMAGE_VERSION " && true)
local PASSWORD=$(cat "$SERVICE_ROOT/PASSWORD")
if [[ -n $PREVIOUS_ID ]]; then
docker start "$PREVIOUS_ID" > /dev/null
service_port_unpause "$SERVICE"
dokku_log_info2 "Container started"
elif $IMAGE_EXISTS && [[ -n "$PASSWORD" ]]; then
service_create_container "$SERVICE"
else else
dokku_log_verbose_quiet "Neither container nor valid configuration exists for $SERVICE" dokku_log_verbose_quiet "No container exists for $SERVICE"
fi fi
} }
service_unlink() {
local APP="$2"
local SERVICE="$1"
update_plugin_scheme_for_app "$APP"
local SERVICE_URL=$(service_url "$SERVICE")
local SERVICE_NAME="$(get_service_name "$SERVICE")"
local EXISTING_CONFIG=$(config_all "$APP")
local SERVICE_ALIAS=$(service_alias "$SERVICE")
local LINK=($(echo "$EXISTING_CONFIG" | grep "$SERVICE_URL" | cut -d: -f1)) || true
[[ -z ${LINK[*]} ]] && dokku_log_fail "Not linked to app $APP"
remove_from_links_file "$SERVICE" "$APP"
# shellcheck disable=SC2034
local passed_phases=(build deploy run)
remove_passed_docker_option passed_phases[@] "--link $SERVICE_NAME:$SERVICE_ALIAS"
config_unset "$APP" "${LINK[*]}"
}
service_version() {
local SERVICE="$1"
local SERVICE_NAME="$(get_service_name "$SERVICE")"
docker inspect -f '{{.Config.Image}}' "$SERVICE_NAME"
}
# non-generic functions
get_database_name() {
# postgres does not like special characters in database names
# so we need to normalize them out
echo "$1" | tr .- _
}
service_create() { service_create() {
local SERVICE="$1" local SERVICE="$1"
[[ -z "$SERVICE" ]] && dokku_log_fail "Please specify a name for the service" [[ -z "$SERVICE" ]] && dokku_log_fail "Please specify a name for the service"
@@ -332,40 +401,58 @@ service_create_container() {
service_info "$SERVICE" service_info "$SERVICE"
} }
service_stop() { service_export() {
local SERVICE="$1" local SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"; local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local SERVICE_NAME="$(get_service_name "$SERVICE")" local SERVICE_NAME="$(get_service_name "$SERVICE")"
local ID=$(docker ps -f status=running | grep -e "$SERVICE_NAME$" | awk '{print $1}') || true local DATABASE_NAME="$(get_database_name "$SERVICE")"
[[ -z $ID ]] && dokku_log_warn "Service is already stopped" && return 0 local PASSWORD=$(cat "$SERVICE_ROOT/PASSWORD")
if [[ -n $ID ]]; then [[ -n $SSH_TTY ]] && stty -opost
dokku_log_info1_quiet "Stopping container" docker exec "$SERVICE_NAME" env PGPASSWORD="$PASSWORD" pg_dump -Fc --no-acl --no-owner -h localhost -U postgres -w "$DATABASE_NAME"
docker stop "$SERVICE_NAME" > /dev/null status=$?
service_port_pause "$SERVICE" [[ -n $SSH_TTY ]] && stty opost
dokku_log_info2 "Container stopped" exit $status
else
dokku_log_verbose_quiet "No container exists for $SERVICE"
fi
} }
service_unlink() { service_import() {
local APP="$2"
local SERVICE="$1" local SERVICE="$1"
update_plugin_scheme_for_app "$APP" SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local SERVICE_URL=$(service_url "$SERVICE") SERVICE_NAME="$(get_service_name "$SERVICE")"
DATABASE_NAME="$(get_database_name "$SERVICE")"
PASSWORD=$(cat "$SERVICE_ROOT/PASSWORD")
if [[ -t 0 ]]; then
dokku_log_fail "No data provided on stdin."
fi
docker exec -i "$SERVICE_NAME" env PGPASSWORD="$PASSWORD" pg_restore -h localhost -cO -d "$DATABASE_NAME" -U postgres -w
}
service_start() {
local SERVICE="$1"
local QUIET="$2"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local SERVICE_NAME="$(get_service_name "$SERVICE")" local SERVICE_NAME="$(get_service_name "$SERVICE")"
local EXISTING_CONFIG=$(config_all "$APP") local ID=$(docker ps -f status=running | grep -e "$SERVICE_NAME$" | awk '{print $1}') || true
local SERVICE_ALIAS=$(service_alias "$SERVICE") if [[ -n $ID ]]; then
local LINK=($(echo "$EXISTING_CONFIG" | grep "$SERVICE_URL" | cut -d: -f1)) || true [[ -z $QUIET ]] && dokku_log_warn "Service is already started"
return 0
fi
[[ -z ${LINK[*]} ]] && dokku_log_fail "Not linked to app $APP" dokku_log_info1_quiet "Starting container"
remove_from_links_file "$SERVICE" "$APP" local PREVIOUS_ID=$(docker ps -f status=exited | grep -e "$SERVICE_NAME$" | awk '{print $1}') || true
local IMAGE_EXISTS=$(docker images | grep -e "^$PLUGIN_IMAGE " | grep -q " $PLUGIN_IMAGE_VERSION " && true)
local PASSWORD=$(cat "$SERVICE_ROOT/PASSWORD")
# shellcheck disable=SC2034 if [[ -n $PREVIOUS_ID ]]; then
local passed_phases=(build deploy run) docker start "$PREVIOUS_ID" > /dev/null
remove_passed_docker_option passed_phases[@] "--link $SERVICE_NAME:$SERVICE_ALIAS" service_port_unpause "$SERVICE"
config_unset "$APP" "${LINK[*]}" dokku_log_info2 "Container started"
elif $IMAGE_EXISTS && [[ -n "$PASSWORD" ]]; then
service_create_container "$SERVICE"
else
dokku_log_verbose_quiet "Neither container nor valid configuration exists for $SERVICE"
fi
} }
service_url() { service_url() {
@@ -378,91 +465,6 @@ service_url() {
echo "$PLUGIN_SCHEME://postgres:$PASSWORD@$SERVICE_ALIAS:${PLUGIN_DATASTORE_PORTS[0]}/$DATABASE_NAME" echo "$PLUGIN_SCHEME://postgres:$PASSWORD@$SERVICE_ALIAS:${PLUGIN_DATASTORE_PORTS[0]}/$DATABASE_NAME"
} }
is_container_status() {
local CID="$1"
local TEMPLATE="{{.State.$2}}"
local CONTAINER_STATUS=$(docker inspect -f "$TEMPLATE" "$CID" || true)
if [[ "$CONTAINER_STATUS" == "true" ]]; then
return 0
else
return 1
fi
}
get_service_name() {
local SERVICE="$1"
echo "dokku.${PLUGIN_COMMAND_PREFIX}.$SERVICE"
}
get_database_name() {
# postgres does not like special characters in database names
# so we need to normalize them out
echo "$1" | tr .- _
}
service_version() {
local SERVICE="$1"
local SERVICE_NAME="$(get_service_name "$SERVICE")"
docker inspect -f '{{.Config.Image}}' "$SERVICE_NAME"
}
get_url_from_config() {
local EXISTING_CONFIG="$1"
local CONFIG_VAR="$2"
echo "$EXISTING_CONFIG" | grep "$CONFIG_VAR" | sed "s/$CONFIG_VAR:\s*//" | xargs
}
promote() {
local SERVICE="$1"
local APP="$2"
local PLUGIN_DEFAULT_CONFIG_VAR="${PLUGIN_DEFAULT_ALIAS}_URL"
local EXISTING_CONFIG=$(config_all "$APP")
update_plugin_scheme_for_app "$APP"
local SERVICE_URL=$(service_url "$SERVICE")
local CONFIG_VARS=($(echo "$EXISTING_CONFIG" | grep "$SERVICE_URL" | cut -d: -f1)) || true
local PREVIOUS_DEFAULT_URL=$(get_url_from_config "$EXISTING_CONFIG" "$PLUGIN_DEFAULT_CONFIG_VAR")
[[ -z ${CONFIG_VARS[*]} ]] && dokku_log_fail "Not linked to app $APP"
[[ ${CONFIG_VARS[*]} =~ $PLUGIN_DEFAULT_CONFIG_VAR ]] && dokku_log_fail "Service $1 already promoted as $PLUGIN_DEFAULT_CONFIG_VAR"
local NEW_CONFIG_VARS=""
if [[ -n $PREVIOUS_DEFAULT_URL ]]; then
local PREVIOUS_ALIAS=$(echo "$EXISTING_CONFIG" | grep "$PREVIOUS_DEFAULT_URL" | grep -v "$PLUGIN_DEFAULT_CONFIG_VAR") || true
if [[ -z $PREVIOUS_ALIAS ]]; then
local ALIAS=$(service_alternative_alias "$EXISTING_CONFIG")
NEW_CONFIG_VARS+="${ALIAS}_URL=$PREVIOUS_DEFAULT_URL "
fi
fi
local PROMOTE_URL=$(get_url_from_config "$EXISTING_CONFIG" "${CONFIG_VARS[0]}")
NEW_CONFIG_VARS+="$PLUGIN_DEFAULT_CONFIG_VAR=$PROMOTE_URL"
# shellcheck disable=SC2086
config_set "$APP" $NEW_CONFIG_VARS
}
remove_from_links_file() {
local SERVICE="$1"
local APP="$2"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local LINKS_FILE="$SERVICE_ROOT/LINKS"
mkdir -p "$SERVICE_ROOT" || dokku_log_fail "Unable to create service directory"
touch "$LINKS_FILE"
sed -i.bak "/^$APP\$/d" "$LINKS_FILE" && rm "$LINKS_FILE.bak"
sort "$LINKS_FILE" -u -o "$LINKS_FILE"
}
service_linked_apps() {
local SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local LINKS_FILE="$SERVICE_ROOT/LINKS"
[[ -z $(< "$LINKS_FILE") ]] && echo '-' && return 0
tr '\n' ' ' < "$LINKS_FILE"
}
update_plugin_scheme_for_app() { update_plugin_scheme_for_app() {
local APP="$1" local APP="$1"
local POSTGRES_DATABASE_SCHEME=$(config_get "$APP" POSTGRES_DATABASE_SCHEME) local POSTGRES_DATABASE_SCHEME=$(config_get "$APP" POSTGRES_DATABASE_SCHEME)