diff --git a/README.md b/README.md index 3096b76..ff35cda 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 DATABASE_ADAPTER on the app: + +``` +dokku config:set lolipop DATABASE_ADAPTER=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 DATABASE_ADAPTER 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 DATABASE_ADAPTER back to its original setting +- Unlink the service +- Change DATABASE_ADAPTER to the desired setting +- Relink the service diff --git a/functions b/functions index b588a42..7f50209 100755 --- a/functions +++ b/functions @@ -70,6 +70,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 +254,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 +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") @@ -350,3 +353,9 @@ service_linked_apps() { tr '\n' ' ' < "$LINKS_FILE" } + +update_plugin_scheme_for_app() { + local APP=$1 + local DATABASE_ADAPTER=$(dokku config:get $APP DATABASE_ADAPTER) + PLUGIN_SCHEME=${DATABASE_ADAPTER:-$PLUGIN_SCHEME} +} diff --git a/tests/service_link.bats b/tests/service_link.bats index 1f11f41..22bdc74 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 DATABASE_ADAPTER variable" { + dokku config:set my_app DATABASE_ADAPTER=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..6673f39 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 DATABASE_ADAPTER variable" { + password="$(cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + dokku config:set my_app "DATABASE_ADAPTER=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" +}