Revamp link/unlink commands
Previously we were exporting `REDIS_URL` via the docker-args* hooks. This seems to confuse our users (since the env var is not displayed when calling `dokku config`) and in some cases it also seems that the env var is not correctly set. Another problem is if several services are linked to the same app and if they are exporting `REDIS_URL` as well. Then we don’t know what will be set. To resolve theses issues, this patch changes the way we manage the env vars. We use standard dokku commands (`config` and `docker-options`) so config is set on the linked application and can be reviewed by the user easily. We also handle the case where `REDIS_URL` is already set on the linked application. When it’s the case, we automatically generate another env var based on the following pattern: DOKKU_<service name>_<random unused color>_URL. For example, this can give: DOKKU_REDIS_BLACK_URL. Since naming is now handled automatically, the `alias` command has been removed. If the user wants to set a different env var on her app, it’s just a matter of using `dokku config:set` and pasting the wanted value. IP in DSN has been removed in favor of host name exported by docker in the container. This is more robust and simpler since the IP can change but the name will remain the same if the service container restarts for instance. With all those changes, a new command has been introduced: `promote`. The goal of this command is to easily set a service as the primary one when several are linked to an app. (see README for an example)
This commit is contained in:
109
functions
109
functions
@@ -32,14 +32,8 @@ verify_service_name() {
|
||||
|
||||
service_alias() {
|
||||
local SERVICE="$1"
|
||||
local ALIAS_FILE="$PLUGIN_DATA_ROOT/$SERVICE/ALIAS"
|
||||
|
||||
verify_service_name "$1"
|
||||
if [[ -f "$ALIAS_FILE" ]]; then
|
||||
cat "$ALIAS_FILE"
|
||||
else
|
||||
echo "$PLUGIN_DEFAULT_ALIAS"
|
||||
fi
|
||||
local SERVICE_NAME=$(get_service_name "$SERVICE")
|
||||
echo "$SERVICE_NAME" | tr ._ -
|
||||
}
|
||||
|
||||
service_info() {
|
||||
@@ -77,16 +71,44 @@ service_exposed_ports() {
|
||||
service_link() {
|
||||
local APP="$2"
|
||||
local SERVICE="$1"
|
||||
local SERVICE_URL=$(service_url "$SERVICE")
|
||||
local SERVICE_NAME=$(get_service_name "$SERVICE")
|
||||
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
|
||||
local EXISTING_CONFIG=$(dokku config "$APP")
|
||||
local LINK=$(echo "$EXISTING_CONFIG" | grep "$SERVICE_URL" | cut -d: -f1) || true
|
||||
local DEFAULT_ALIAS=$(echo "$EXISTING_CONFIG" | grep "${PLUGIN_DEFAULT_ALIAS}_URL") || true
|
||||
local SERVICE_ALIAS=$(service_alias "$SERVICE")
|
||||
local LINKS_FILE="$SERVICE_ROOT/LINKS"
|
||||
|
||||
[[ -n $LINK ]] && dokku_log_fail "Already linked as $LINK"
|
||||
mkdir -p "$SERVICE_ROOT" || dokku_log_fail "Unable to create service directory"
|
||||
touch "$LINKS_FILE"
|
||||
echo "$APP" >> "$LINKS_FILE"
|
||||
sort "$LINKS_FILE" -u -o "$LINKS_FILE"
|
||||
|
||||
dokku_log_info1 "Restarting app $APP"
|
||||
dokku ps:restart "$APP"
|
||||
local ALIAS="$PLUGIN_DEFAULT_ALIAS"
|
||||
if [[ -n $DEFAULT_ALIAS ]]; then
|
||||
ALIAS=$(service_alternative_alias "$EXISTING_CONFIG")
|
||||
fi
|
||||
dokku docker-options:add "$APP" build,deploy,run "--link $SERVICE_NAME:$SERVICE_ALIAS"
|
||||
dokku config:set "$APP" "${ALIAS}_URL=$SERVICE_URL"
|
||||
}
|
||||
|
||||
service_alternative_alias() {
|
||||
local EXISTING_CONFIG="$1"
|
||||
local COLORS=(AQUA BLACK BLUE FUCHSIA GRAY GREEN LIME MAROON NAVY OLIVE PURPLE RED SILVER TEAL WHITE YELLOW)
|
||||
local ALIAS;
|
||||
|
||||
while [[ -z $ALIAS ]]; do
|
||||
local IDX=$((RANDOM % ${#COLORS[*]}))
|
||||
local COLOR=${COLORS[IDX]}
|
||||
ALIAS="${PLUGIN_ALT_ALIAS}_${COLOR}"
|
||||
local IN_USE=$(echo "$EXISTING_CONFIG" | grep "${ALIAS}_URL")
|
||||
if [[ -n $IN_USE ]]; then
|
||||
unset ALIAS
|
||||
fi
|
||||
done
|
||||
echo "$ALIAS"
|
||||
}
|
||||
|
||||
service_logs() {
|
||||
@@ -236,25 +258,23 @@ service_stop() {
|
||||
service_unlink() {
|
||||
local APP="$2"
|
||||
local SERVICE="$1"
|
||||
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
|
||||
local LINKS_FILE="$SERVICE_ROOT/LINKS"
|
||||
local SERVICE_URL=$(service_url "$SERVICE")
|
||||
local SERVICE_NAME=$(get_service_name "$SERVICE")
|
||||
local EXISTING_CONFIG=$(dokku config "$APP")
|
||||
local SERVICE_ALIAS=$(service_alias "$SERVICE")
|
||||
local LINK=($(echo "$EXISTING_CONFIG" | grep "$SERVICE_URL" | cut -d: -f1)) || true
|
||||
|
||||
mkdir -p "$SERVICE_ROOT" || dokku_log_fail "Unable to create service directory"
|
||||
touch "$LINKS_FILE"
|
||||
sed -i "/^$APP\$/d" "$LINKS_FILE"
|
||||
sort "$LINKS_FILE" -u -o "$LINKS_FILE"
|
||||
[[ -z ${LINK[*]} ]] && dokku_log_fail "Not linked to app $APP"
|
||||
remove_from_links_file "$SERVICE" "$APP"
|
||||
|
||||
dokku_log_info1 "Restarting app $APP"
|
||||
dokku ps:restart "$APP"
|
||||
dokku docker-options:remove "$APP" build,deploy,run "--link $SERVICE_NAME:$SERVICE_ALIAS"
|
||||
dokku config:unset "$APP" "${LINK[*]}"
|
||||
}
|
||||
|
||||
service_url() {
|
||||
local SERVICE="$1"
|
||||
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
|
||||
|
||||
local ID="$(cat "$SERVICE_ROOT/ID")"
|
||||
local IP="$(get_container_ip "$ID")"
|
||||
echo "$PLUGIN_SCHEME://$IP:${PLUGIN_DATASTORE_PORTS[0]}/0"
|
||||
local SERVICE_ALIAS="$(service_alias "$SERVICE")"
|
||||
echo "$PLUGIN_SCHEME://$SERVICE_ALIAS:${PLUGIN_DATASTORE_PORTS[0]}/0"
|
||||
}
|
||||
|
||||
is_container_status () {
|
||||
@@ -279,3 +299,46 @@ service_version() {
|
||||
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*//"
|
||||
}
|
||||
|
||||
promote() {
|
||||
local SERVICE="$1"
|
||||
local APP="$2"
|
||||
local PLUGIN_DEFAULT_CONFIG_VAR="${PLUGIN_DEFAULT_ALIAS}_URL"
|
||||
local EXISTING_CONFIG=$(dokku config "$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"
|
||||
dokku 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 "/^$APP\$/d" "$LINKS_FILE"
|
||||
sort "$LINKS_FILE" -u -o "$LINKS_FILE"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user