diff --git a/README.md b/README.md index 3096b76..ad40802 100644 --- a/README.md +++ b/README.md @@ -129,3 +129,30 @@ dokku mysql:clone lolipop new_database # finally, you can destroy the container dokku mysql:destroy lolipop ``` + +## Changing database adapter + +It's possible to change the protocol for DATABASE_URL by setting +the environment variable MYSQL_DATABASE_SCHEME on the app: + +``` +dokku config:set playground MYSQL_DATABASE_SCHEME=mysql2 +dokku mysql:link lolipop playground +``` + +Will cause DATABASE_URL to be set as +mysql2://mysql:SOME_PASSWORD@dokku-mysql-lolipop:3306/lolipop + +CAUTION: Changing MYSQL_DATABASE_SCHEME after linking will cause dokku to +believe the service is not linked when attempting to use `dokku mysql:unlink` +or `dokku mysql:promote`. +You should be able to fix this by + +- Changing DATABASE_URL manually to the new value. + +OR + +- Set MYSQL_DATABASE_SCHEME back to its original setting +- Unlink the service +- Change MYSQL_DATABASE_SCHEME to the desired setting +- Relink the service diff --git a/functions b/functions index b588a42..5e003df 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") @@ -309,6 +312,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") @@ -350,3 +354,9 @@ service_linked_apps() { tr '\n' ' ' < "$LINKS_FILE" } + +update_plugin_scheme_for_app() { + local APP=$1 + local MYSQL_DATABASE_SCHEME=$(config_get $APP MYSQL_DATABASE_SCHEME) + PLUGIN_SCHEME=${MYSQL_DATABASE_SCHEME:-$PLUGIN_SCHEME} +} diff --git a/tests/service_link.bats b/tests/service_link.bats index 1f11f41..978fab3 100755 --- a/tests/service_link.bats +++ b/tests/service_link.bats @@ -59,3 +59,12 @@ teardown() { assert_contains "${lines[*]}" "--link dokku.mysql.l:dokku-mysql-l" dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app } + +@test "($PLUGIN_COMMAND_PREFIX:link) uses apps MYSQL_DATABASE_SCHEME variable" { + dokku config:set my_app MYSQL_DATABASE_SCHEME=mysql2 + dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app + url=$(dokku config:get my_app DATABASE_URL) + password="$(cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + assert_contains "$url" "mysql2://mysql:$password@dokku-mysql-l:3306/l" + dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app +} diff --git a/tests/service_promote.bats b/tests/service_promote.bats index e227c3d..9bd3f52 100755 --- a/tests/service_promote.bats +++ b/tests/service_promote.bats @@ -53,3 +53,11 @@ teardown() { run dokku config my_app assert_contains "${lines[*]}" "DOKKU_MYSQL_" } + +@test "($PLUGIN_COMMAND_PREFIX:promote) uses MYSQL_DATABASE_SCHEME variable" { + password="$(cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + dokku config:set my_app "MYSQL_DATABASE_SCHEME=mysql2" "DATABASE_URL=mysql://u:p@host:3306/db" "DOKKU_MYSQL_BLUE_URL=mysql2://mysql:$password@dokku-mysql-l:3306/l" + dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app + url=$(dokku config:get my_app DATABASE_URL) + assert_contains "$url" "mysql2://mysql:$password@dokku-mysql-l:3306/l" +}