From b7b25c91a02f72f6b81d100733aacb88b728f517 Mon Sep 17 00:00:00 2001 From: Peter West Date: Mon, 18 Jan 2016 15:58:16 +0000 Subject: [PATCH 1/5] Read DATABASE_ADAPTER variable from app when setting DATABASE_URL --- README.md | 27 +++++++++++++++++++++++++++ functions | 9 +++++++++ tests/service_link.bats | 9 +++++++++ tests/service_promote.bats | 8 ++++++++ 4 files changed, 53 insertions(+) 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" +} From 9b33bf1c53081fd1bf6d18faf2e39e9a8a2edde6 Mon Sep 17 00:00:00 2001 From: Peter West Date: Mon, 18 Jan 2016 16:55:13 +0000 Subject: [PATCH 2/5] Update README to show setting var on the app correctly --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ff35cda..f325d8c 100644 --- a/README.md +++ b/README.md @@ -136,7 +136,7 @@ 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 config:set playground DATABASE_ADAPTER=mysql2 dokku mysql:link lolipop playground ``` From ab7cc8c1a1a8f697f76e5ecf289ac4cb7177b409 Mon Sep 17 00:00:00 2001 From: Peter West Date: Mon, 18 Jan 2016 17:12:44 +0000 Subject: [PATCH 3/5] Use config_get from config functions --- functions | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/functions b/functions index 7f50209..0cbd2f9 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}" @@ -356,6 +357,6 @@ service_linked_apps() { update_plugin_scheme_for_app() { local APP=$1 - local DATABASE_ADAPTER=$(dokku config:get $APP DATABASE_ADAPTER) + local DATABASE_ADAPTER=$(config_get $APP DATABASE_ADAPTER) PLUGIN_SCHEME=${DATABASE_ADAPTER:-$PLUGIN_SCHEME} } From 90791f536a0ab0176b717b14af7ff6a43117cc64 Mon Sep 17 00:00:00 2001 From: Peter West Date: Tue, 8 Mar 2016 09:03:20 +0000 Subject: [PATCH 4/5] Change DATABASE_ADAPTER to DATABASE_SCHEME --- README.md | 10 +++++----- functions | 4 ++-- tests/service_link.bats | 4 ++-- tests/service_promote.bats | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index f325d8c..44e80d8 100644 --- a/README.md +++ b/README.md @@ -133,17 +133,17 @@ 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: +the environment variable DATABASE_SCHEME on the app: ``` -dokku config:set playground DATABASE_ADAPTER=mysql2 +dokku config:set playground 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 DATABASE_ADAPTER after linking will cause dokku to believe +CAUTION: Changing 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 @@ -152,7 +152,7 @@ You should be able to fix this by OR -- Set DATABASE_ADAPTER back to its original setting +- Set DATABASE_SCHEME back to its original setting - Unlink the service -- Change DATABASE_ADAPTER to the desired setting +- Change DATABASE_SCHEME to the desired setting - Relink the service diff --git a/functions b/functions index 0cbd2f9..ce1d6fa 100755 --- a/functions +++ b/functions @@ -357,6 +357,6 @@ service_linked_apps() { update_plugin_scheme_for_app() { local APP=$1 - local DATABASE_ADAPTER=$(config_get $APP DATABASE_ADAPTER) - PLUGIN_SCHEME=${DATABASE_ADAPTER:-$PLUGIN_SCHEME} + local DATABASE_SCHEME=$(config_get $APP DATABASE_SCHEME) + PLUGIN_SCHEME=${DATABASE_SCHEME:-$PLUGIN_SCHEME} } diff --git a/tests/service_link.bats b/tests/service_link.bats index 22bdc74..de1fc00 100755 --- a/tests/service_link.bats +++ b/tests/service_link.bats @@ -60,8 +60,8 @@ teardown() { 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 +@test "($PLUGIN_COMMAND_PREFIX:link) uses apps DATABASE_SCHEME variable" { + dokku config:set my_app 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")" diff --git a/tests/service_promote.bats b/tests/service_promote.bats index 6673f39..94a3f13 100755 --- a/tests/service_promote.bats +++ b/tests/service_promote.bats @@ -54,9 +54,9 @@ teardown() { assert_contains "${lines[*]}" "DOKKU_MYSQL_" } -@test "($PLUGIN_COMMAND_PREFIX:promote) uses DATABASE_ADAPTER variable" { +@test "($PLUGIN_COMMAND_PREFIX:promote) uses DATABASE_SCHEME 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 config:set my_app "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" From d1a1450b48b5255fca80832d8b41a15c3bb61084 Mon Sep 17 00:00:00 2001 From: Peter West Date: Sat, 19 Mar 2016 10:17:48 +0000 Subject: [PATCH 5/5] Rename DATABASE_SCHEME to MYSQL_DATABASE_SCHEME --- README.md | 14 +++++++------- functions | 4 ++-- tests/service_link.bats | 4 ++-- tests/service_promote.bats | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 44e80d8..ad40802 100644 --- a/README.md +++ b/README.md @@ -133,26 +133,26 @@ dokku mysql:destroy lolipop ## Changing database adapter It's possible to change the protocol for DATABASE_URL by setting -the environment variable DATABASE_SCHEME on the app: +the environment variable MYSQL_DATABASE_SCHEME on the app: ``` -dokku config:set playground DATABASE_SCHEME=mysql2 +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 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`. +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 DATABASE_SCHEME back to its original setting +- Set MYSQL_DATABASE_SCHEME back to its original setting - Unlink the service -- Change DATABASE_SCHEME to the desired setting +- Change MYSQL_DATABASE_SCHEME to the desired setting - Relink the service diff --git a/functions b/functions index ce1d6fa..5e003df 100755 --- a/functions +++ b/functions @@ -357,6 +357,6 @@ service_linked_apps() { update_plugin_scheme_for_app() { local APP=$1 - local DATABASE_SCHEME=$(config_get $APP DATABASE_SCHEME) - PLUGIN_SCHEME=${DATABASE_SCHEME:-$PLUGIN_SCHEME} + 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 de1fc00..978fab3 100755 --- a/tests/service_link.bats +++ b/tests/service_link.bats @@ -60,8 +60,8 @@ teardown() { dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app } -@test "($PLUGIN_COMMAND_PREFIX:link) uses apps DATABASE_SCHEME variable" { - dokku config:set my_app DATABASE_SCHEME=mysql2 +@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")" diff --git a/tests/service_promote.bats b/tests/service_promote.bats index 94a3f13..9bd3f52 100755 --- a/tests/service_promote.bats +++ b/tests/service_promote.bats @@ -54,9 +54,9 @@ teardown() { assert_contains "${lines[*]}" "DOKKU_MYSQL_" } -@test "($PLUGIN_COMMAND_PREFIX:promote) uses DATABASE_SCHEME variable" { +@test "($PLUGIN_COMMAND_PREFIX:promote) uses MYSQL_DATABASE_SCHEME variable" { password="$(cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" - dokku config:set my_app "DATABASE_SCHEME=mysql2" "DATABASE_URL=mysql://u:p@host:3306/db" "DOKKU_MYSQL_BLUE_URL=mysql2://mysql:$password@dokku-mysql-l:3306/l" + 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"