diff --git a/README.md b/README.md index ec472cd..b75a765 100644 --- a/README.md +++ b/README.md @@ -143,3 +143,30 @@ dokku mongo:clone lolipop new_database # finally, you can destroy the container dokku mongo:destroy lolipop ``` + +## Changing database adapter + +It's possible to change the protocol for MONGO_URL by setting +the environment variable MONGO_DATABASE_SCHEME on the app: + +``` +dokku config:set playground MONGO_DATABASE_SCHEME=mongo2 +dokku mongo:link lolipop playground +``` + +Will cause MONGO_URL to be set as +mongo2://lolipop:SOME_PASSWORD@dokku-mongo-lolipop:27017/lolipop + +CAUTION: Changing MONGO_DATABASE_SCHEME after linking will cause dokku to +believe the mongo is not linked when attempting to use `dokku mongo:unlink` +or `dokku mongo:promote`. +You should be able to fix this by + +- Changing MONGO_URL manually to the new value. + +OR + +- Set MONGO_DATABASE_SCHEME back to its original setting +- Unlink the service +- Change MONGO_DATABASE_SCHEME to the desired setting +- Relink the service diff --git a/functions b/functions index 4fccc14..b12a40f 100755 --- a/functions +++ b/functions @@ -1,6 +1,7 @@ #!/usr/bin/env bash set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x source "$(dirname "$0")/config" +source "$PLUGIN_AVAILABLE_PATH/config/functions" get_random_ports() { local iterations="${1:-1}" @@ -70,6 +71,7 @@ service_exposed_ports() { service_link() { 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 SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" @@ -253,6 +255,7 @@ service_stop() { 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=$(dokku config "$APP") @@ -308,6 +311,7 @@ promote() { local APP="$2" local PLUGIN_DEFAULT_CONFIG_VAR="${PLUGIN_DEFAULT_ALIAS}_URL" local EXISTING_CONFIG=$(dokku config "$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") @@ -349,3 +353,9 @@ service_linked_apps() { tr '\n' ' ' < "$LINKS_FILE" } + +update_plugin_scheme_for_app() { + local APP=$1 + local MONGO_DATABASE_SCHEME=$(config_get $APP MONGO_DATABASE_SCHEME) + PLUGIN_SCHEME=${MONGO_DATABASE_SCHEME:-$PLUGIN_SCHEME} +} diff --git a/tests/service_link.bats b/tests/service_link.bats index fd18fcf..b604ad1 100755 --- a/tests/service_link.bats +++ b/tests/service_link.bats @@ -59,3 +59,12 @@ teardown() { assert_contains "${lines[*]}" "--link dokku.mongo.l:dokku-mongo-l" dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app } + +@test "($PLUGIN_COMMAND_PREFIX:link) uses apps MONGO_DATABASE_SCHEME variable" { + dokku config:set my_app MONGO_DATABASE_SCHEME=mongodb2 + dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app + url=$(dokku config:get my_app MONGO_URL) + password="$(cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + assert_contains "$url" "mongodb2://l:$password@dokku-mongo-l:27017/l" + dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app +} diff --git a/tests/service_promote.bats b/tests/service_promote.bats index c708233..9aa5a1b 100755 --- a/tests/service_promote.bats +++ b/tests/service_promote.bats @@ -53,3 +53,10 @@ teardown() { run dokku config my_app assert_contains "${lines[*]}" "DOKKU_MONGO_" } +@test "($PLUGIN_COMMAND_PREFIX:promote) uses MONGO_DATABASE_SCHEME variable" { + password="$(cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + dokku config:set my_app "MONGO_DATABASE_SCHEME=mongodb2" "MONGO_URL=mongodb://u:p@host:27017/db" "DOKKU_MONGO_BLUE_URL=mongodb2://l:$password@dokku-mongo-l:27017/l" + dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app + url=$(dokku config:get my_app MONGO_URL) + assert_contains "$url" "mongodb2://l:$password@dokku-mongo-l:27017/l" +}