Merge pull request #27 from dokku/lg-revamp-link-unlink

Revamp link/unlink commands
This commit is contained in:
Jose Diaz-Gonzalez
2015-09-30 17:24:24 -04:00
18 changed files with 284 additions and 119 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
tests/dokku tests/dokku
tests/fixtures tests/fixtures
tests/bin/plugn

View File

@@ -22,7 +22,6 @@ dokku plugin:install https://github.com/dokku/dokku-mysql.git mysql
## commands ## commands
``` ```
mysql:alias <name> <alias> Set an alias for the docker link
mysql:clone <name> <new-name> Create container <new-name> then copy data from <name> into <new-name> mysql:clone <name> <new-name> Create container <new-name> then copy data from <name> into <new-name>
mysql:connect <name> Connect via mysql to a mysql service mysql:connect <name> Connect via mysql to a mysql service
mysql:create <name> Create a mysql service mysql:create <name> Create a mysql service
@@ -34,6 +33,7 @@ mysql:info <name> Print the connection information
mysql:link <name> <app> Link the mysql service to the app mysql:link <name> <app> Link the mysql service to the app
mysql:list List all mysql services mysql:list List all mysql services
mysql:logs <name> [-t] Print the most recent log(s) for this service mysql:logs <name> [-t] Print the most recent log(s) for this service
mysql:promote <name> <app> Promote service <name> as DATABASE_URL in <app>
mysql:restart <name> Graceful shutdown and restart of the mysql service container mysql:restart <name> Graceful shutdown and restart of the mysql service container
mysql:start <name> Start a previously stopped mysql service mysql:start <name> Start a previously stopped mysql service
mysql:stop <name> Stop a running mysql service mysql:stop <name> Stop a running mysql service
@@ -57,8 +57,6 @@ dokku mysql:create lolipop
# get connection information as follows # get connection information as follows
dokku mysql:info lolipop dokku mysql:info lolipop
# lets assume the ip of our mysql service is 172.17.0.1
# a mysql service can be linked to a # a mysql service can be linked to a
# container this will use native docker # container this will use native docker
# links via the docker-options plugin # links via the docker-options plugin
@@ -68,24 +66,42 @@ dokku mysql:link lolipop playground
# the above will expose the following environment variables # the above will expose the following environment variables
# #
# DATABASE_URL=mysql://mysql:SOME_PASSWORD@172.17.0.1:3306/lolipop # DOKKU_MYSQL_LOLIPOP_NAME=/lolipop/DATABASE
# DATABASE_NAME=/lolipop/DATABASE # DOKKU_MYSQL_LOLIPOP_PORT=tcp://172.17.0.1:3306
# DATABASE_PORT=tcp://172.17.0.1:3306 # DOKKU_MYSQL_LOLIPOP_PORT_3306_TCP=tcp://172.17.0.1:3306
# DATABASE_PORT_3306_TCP=tcp://172.17.0.1:3306 # DOKKU_MYSQL_LOLIPOP_PORT_3306_TCP_PROTO=tcp
# DATABASE_PORT_3306_TCP_PROTO=tcp # DOKKU_MYSQL_LOLIPOP_PORT_3306_TCP_PORT=3306
# DATABASE_PORT_3306_TCP_PORT=3306 # DOKKU_MYSQL_LOLIPOP_PORT_3306_TCP_ADDR=172.17.0.1
# DATABASE_PORT_3306_TCP_ADDR=172.17.0.1 #
# and the following will be set on the linked application by default
#
# DATABASE_URL=mysql://mysql:SOME_PASSWORD@dokku-mysql-lolipop:3306/lolipop
#
# NOTE: the host exposed here only works internally in docker containers. If
# you want your container to be reachable from outside, you should use `expose`.
# you can examine the environment variables # another service can be linked to your app
# using our 'playground' app's env command dokku mysql:link other_service playground
dokku run playground env
# you can customize the environment # since DATABASE_URL is already in use, another environment variable will be
# variables through a custom docker link alias # generated automatically
dokku mysql:alias lolipop MYSQL_DATABASE #
# DOKKU_MYSQL_BLUE_URL=mysql://mysql:ANOTHER_PASSWORD@dokku-mysql-other-service:3306/other_service
# you can then promote the new service to be the primary one
# NOTE: this will restart your app
dokku mysql:promote other_service playground
# this will replace DATABASE_URL with the url from other_service and generate
# another environment variable to hold the previous value if necessary.
# you could end up with the following for example:
#
# DATABASE_URL=mysql://mysql:ANOTHER_PASSWORD@dokku-mysql-other_service:3306/other_service
# DOKKU_MYSQL_BLUE_URL=mysql://mysql:ANOTHER_PASSWORD@dokku-mysql-other-service:3306/other_service
# DOKKU_MYSQL_SILVER_URL=mysql://mysql:SOME_PASSWORD@dokku-mysql-lolipop:3306/lolipop
# you can also unlink a mysql service # you can also unlink a mysql service
# NOTE: this will restart your app # NOTE: this will restart your app and unset related environment variables
dokku mysql:unlink lolipop playground dokku mysql:unlink lolipop playground
# you can tail logs for a particular service # you can tail logs for a particular service

View File

@@ -16,13 +16,6 @@ if [[ $1 == $PLUGIN_COMMAND_PREFIX:* ]]; then
fi fi
case "$1" in case "$1" in
$PLUGIN_COMMAND_PREFIX:alias)
[[ -z $2 ]] && dokku_log_fail "Please specify a name for the service"
[[ -z $3 ]] && dokku_log_fail "Please specify an alias for the service"
verify_service_name "$2"
service_set_alias "$2" "$3"
;;
$PLUGIN_COMMAND_PREFIX:create) $PLUGIN_COMMAND_PREFIX:create)
[[ -z $2 ]] && dokku_log_fail "Please specify a name for the service" [[ -z $2 ]] && dokku_log_fail "Please specify a name for the service"
[[ ! -d "$PLUGIN_DATA_ROOT/$2" ]] || dokku_log_fail "$PLUGIN_SERVICE service $2 already exists" [[ ! -d "$PLUGIN_DATA_ROOT/$2" ]] || dokku_log_fail "$PLUGIN_SERVICE service $2 already exists"
@@ -209,9 +202,16 @@ case "$1" in
service_port_unexpose "$2" service_port_unexpose "$2"
;; ;;
$PLUGIN_COMMAND_PREFIX:promote)
[[ -z $2 ]] && dokku_log_fail "Please specify a name for the service"
[[ -z $3 ]] && dokku_log_fail "Please specify an app to run the command on"
verify_service_name "$2"
verify_app_name "$3"
promote "$2" "$3"
;;
help | $PLUGIN_COMMAND_PREFIX:help) help | $PLUGIN_COMMAND_PREFIX:help)
HELP=$(cat<<EOF HELP=$(cat<<EOF
$PLUGIN_COMMAND_PREFIX:alias <name> <alias>, Set an alias for the docker link
$PLUGIN_COMMAND_PREFIX:create <name>, Create a $PLUGIN_SERVICE service $PLUGIN_COMMAND_PREFIX:create <name>, Create a $PLUGIN_SERVICE service
$PLUGIN_COMMAND_PREFIX:destroy <name>, Delete the $PLUGIN_SERVICE service and stop its container if there are no links left $PLUGIN_COMMAND_PREFIX:destroy <name>, Delete the $PLUGIN_SERVICE service and stop its container if there are no links left
$PLUGIN_COMMAND_PREFIX:link <name> <app>, Link the $PLUGIN_SERVICE service to the app $PLUGIN_COMMAND_PREFIX:link <name> <app>, Link the $PLUGIN_SERVICE service to the app
@@ -228,6 +228,7 @@ case "$1" in
$PLUGIN_COMMAND_PREFIX:unexpose <name>, Unexpose a previously exposed $PLUGIN_SERVICE service $PLUGIN_COMMAND_PREFIX:unexpose <name>, Unexpose a previously exposed $PLUGIN_SERVICE service
$PLUGIN_COMMAND_PREFIX:start <name>, Start a previously stopped $PLUGIN_SERVICE service $PLUGIN_COMMAND_PREFIX:start <name>, Start a previously stopped $PLUGIN_SERVICE service
$PLUGIN_COMMAND_PREFIX:stop <name>, Stop a running $PLUGIN_SERVICE service $PLUGIN_COMMAND_PREFIX:stop <name>, Stop a running $PLUGIN_SERVICE service
$PLUGIN_COMMAND_PREFIX:promote <name> <app>, Promote service <name> as ${PLUGIN_DEFAULT_ALIAS}_URL in <app>
EOF EOF
) )
if [[ -n $DOKKU_API_VERSION ]]; then if [[ -n $DOKKU_API_VERSION ]]; then

1
config
View File

@@ -7,6 +7,7 @@ export PLUGIN_COMMAND_PREFIX="mysql"
export PLUGIN_DATA_ROOT=$MYSQL_ROOT export PLUGIN_DATA_ROOT=$MYSQL_ROOT
export PLUGIN_DATASTORE_PORTS=(3306) export PLUGIN_DATASTORE_PORTS=(3306)
export PLUGIN_DEFAULT_ALIAS="DATABASE" export PLUGIN_DEFAULT_ALIAS="DATABASE"
export PLUGIN_ALT_ALIAS="DOKKU_MYSQL"
export PLUGIN_IMAGE=$MYSQL_IMAGE export PLUGIN_IMAGE=$MYSQL_IMAGE
export PLUGIN_IMAGE_VERSION=$MYSQL_IMAGE_VERSION export PLUGIN_IMAGE_VERSION=$MYSQL_IMAGE_VERSION
export PLUGIN_SCHEME="mysql" export PLUGIN_SCHEME="mysql"

View File

@@ -1 +0,0 @@
docker-args-deploy

View File

@@ -1,31 +0,0 @@
#!/usr/bin/env bash
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
PLUGIN_BASE_PATH="$PLUGIN_PATH"
if [[ -n $DOKKU_API_VERSION ]]; then
PLUGIN_BASE_PATH="$PLUGIN_ENABLED_PATH"
fi
source "$PLUGIN_BASE_PATH/common/functions"
source "$(dirname "$0")/functions"
source "$(dirname "$0")/config"
STDIN=$(cat)
APP="$1"
output=""
for i in $PLUGIN_DATA_ROOT/*; do
[[ -d $i ]] || continue
SERVICE=$(echo "$i" | cut -d'/' -f 7)
LINKS_FILE="$PLUGIN_DATA_ROOT/$SERVICE/LINKS"
ALIAS="$(service_alias "$SERVICE")"
SERVICE_URL="$(service_url "$SERVICE")"
if [[ -f "$LINKS_FILE" ]]; then
while read line; do
if [[ "$line" == "$APP" ]]; then
output="$output --link dokku.mysql.$SERVICE:$ALIAS --env ${ALIAS}_URL=$SERVICE_URL"
break
fi
done < "$LINKS_FILE"
fi
done
echo "$STDIN$output"

View File

@@ -1 +0,0 @@
docker-args-deploy

107
functions
View File

@@ -32,14 +32,8 @@ verify_service_name() {
service_alias() { service_alias() {
local SERVICE="$1" local SERVICE="$1"
local ALIAS_FILE="$PLUGIN_DATA_ROOT/$SERVICE/ALIAS" local SERVICE_NAME=$(get_service_name "$SERVICE")
echo "$SERVICE_NAME" | tr ._ -
verify_service_name "$1"
if [[ -f "$ALIAS_FILE" ]]; then
cat "$ALIAS_FILE"
else
echo "$PLUGIN_DEFAULT_ALIAS"
fi
} }
service_info() { service_info() {
@@ -77,16 +71,44 @@ service_exposed_ports() {
service_link() { service_link() {
local APP="$2" local APP="$2"
local SERVICE="$1" local SERVICE="$1"
local SERVICE_URL=$(service_url "$SERVICE")
local SERVICE_NAME=$(get_service_name "$SERVICE")
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$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" 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" mkdir -p "$SERVICE_ROOT" || dokku_log_fail "Unable to create service directory"
touch "$LINKS_FILE" touch "$LINKS_FILE"
echo "$APP" >> "$LINKS_FILE" echo "$APP" >> "$LINKS_FILE"
sort "$LINKS_FILE" -u -o "$LINKS_FILE" sort "$LINKS_FILE" -u -o "$LINKS_FILE"
dokku_log_info1 "Restarting app $APP" local ALIAS="$PLUGIN_DEFAULT_ALIAS"
dokku ps:restart "$APP" 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() { service_logs() {
@@ -232,26 +254,26 @@ service_stop() {
service_unlink() { service_unlink() {
local APP="$2" local APP="$2"
local SERVICE="$1" local SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_URL=$(service_url "$SERVICE")
local LINKS_FILE="$SERVICE_ROOT/LINKS" 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" [[ -z ${LINK[*]} ]] && dokku_log_fail "Not linked to app $APP"
touch "$LINKS_FILE" remove_from_links_file "$SERVICE" "$APP"
sed -i "/^$APP\$/d" "$LINKS_FILE"
sort "$LINKS_FILE" -u -o "$LINKS_FILE"
dokku_log_info1 "Restarting app $APP" dokku docker-options:remove "$APP" build,deploy,run "--link $SERVICE_NAME:$SERVICE_ALIAS"
dokku ps:restart "$APP" dokku config:unset "$APP" "${LINK[*]}"
} }
service_url() { service_url() {
local SERVICE="$1" local SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local ID="$(cat "$SERVICE_ROOT/ID")"
local IP="$(get_container_ip "$ID")"
local PASSWORD="$(cat "$SERVICE_ROOT/PASSWORD")" local PASSWORD="$(cat "$SERVICE_ROOT/PASSWORD")"
echo "$PLUGIN_SCHEME://mysql:$PASSWORD@$IP:${PLUGIN_DATASTORE_PORTS[0]}/$SERVICE" local SERVICE_ALIAS="$(service_alias "$SERVICE")"
echo "$PLUGIN_SCHEME://mysql:$PASSWORD@$SERVICE_ALIAS:${PLUGIN_DATASTORE_PORTS[0]}/$SERVICE"
} }
is_container_status () { is_container_status () {
@@ -276,3 +298,46 @@ service_version() {
local SERVICE_NAME="$(get_service_name "$SERVICE")" local SERVICE_NAME="$(get_service_name "$SERVICE")"
docker inspect -f '{{.Config.Image}}' "$SERVICE_NAME" 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"
}

16
pre-delete Executable file
View File

@@ -0,0 +1,16 @@
#!/usr/bin/env bash
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
PLUGIN_BASE_PATH="$PLUGIN_PATH"
if [[ -n $DOKKU_API_VERSION ]]; then
PLUGIN_BASE_PATH="$PLUGIN_ENABLED_PATH"
fi
source "$PLUGIN_BASE_PATH/common/functions"
source "$(dirname "$0")/functions"
source "$(dirname "$0")/config"
APP="$1"
for SERVICE in "$PLUGIN_DATA_ROOT"/*; do
remove_from_links_file "$(basename "$SERVICE")" "$APP"
done
exit 0

2
tests/bin/sudo Executable file
View File

@@ -0,0 +1,2 @@
#!/usr/bin/env bash
exit 0

20
tests/hook_pre_delete.bats Executable file
View File

@@ -0,0 +1,20 @@
#!/usr/bin/env bats
load test_helper
setup() {
dokku apps:create my_app >&2
dokku "$PLUGIN_COMMAND_PREFIX:create" l >&2
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app >&2
}
teardown() {
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app >&2
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l >&2
rm "$DOKKU_ROOT/my_app" -rf
}
@test "($PLUGIN_COMMAND_PREFIX:hook:pre-delete) removes app from links file when destroying app" {
[[ -n $(< "$PLUGIN_DATA_ROOT/l/LINKS") ]]
dokku --force apps:destroy my_app
[[ -z $(< "$PLUGIN_DATA_ROOT/l/LINKS") ]]
}

View File

@@ -1,32 +0,0 @@
#!/usr/bin/env bats
load test_helper
setup() {
dokku "$PLUGIN_COMMAND_PREFIX:create" l >&2
}
teardown() {
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l >&2
}
@test "($PLUGIN_COMMAND_PREFIX:alias) error when there are no arguments" {
run dokku "$PLUGIN_COMMAND_PREFIX:alias"
assert_contains "${lines[*]}" "Please specify a name for the service"
}
@test "($PLUGIN_COMMAND_PREFIX:alias) error when alias is missing" {
run dokku "$PLUGIN_COMMAND_PREFIX:alias" l
assert_contains "${lines[*]}" "Please specify an alias for the service"
}
@test "($PLUGIN_COMMAND_PREFIX:alias) error when service does not exist" {
run dokku "$PLUGIN_COMMAND_PREFIX:alias" not_existing_service MY_ALIAS
assert_contains "${lines[*]}" "service not_existing_service does not exist"
}
@test "($PLUGIN_COMMAND_PREFIX:alias) success" {
run dokku "$PLUGIN_COMMAND_PREFIX:alias" l MY_ALIAS
new_alias=$(cat "$PLUGIN_DATA_ROOT/l/ALIAS")
[[ $new_alias == "MY_ALIAS" ]]
}

View File

@@ -22,5 +22,13 @@ teardown() {
@test "($PLUGIN_COMMAND_PREFIX:info) success" { @test "($PLUGIN_COMMAND_PREFIX:info) success" {
run dokku "$PLUGIN_COMMAND_PREFIX:info" l run dokku "$PLUGIN_COMMAND_PREFIX:info" l
password="$(cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" password="$(cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
assert_contains "${lines[*]}" "DSN: mysql://mysql:$password@172.17.0.34:3306/l" assert_contains "${lines[*]}" "DSN: mysql://mysql:$password@dokku-mysql-l:3306/l"
}
@test "($PLUGIN_COMMAND_PREFIX:info) replaces underscores by dash in hostname" {
dokku "$PLUGIN_COMMAND_PREFIX:create" test_with_underscores
run dokku "$PLUGIN_COMMAND_PREFIX:info" test_with_underscores
password="$(cat "$PLUGIN_DATA_ROOT/test_with_underscores/PASSWORD")"
assert_contains "${lines[*]}" "DSN: mysql://mysql:$password@dokku-mysql-test-with-underscores:3306/test_with_underscores"
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" test_with_underscores
} }

View File

@@ -31,8 +31,31 @@ teardown() {
assert_contains "${lines[*]}" "service not_existing_service does not exist" assert_contains "${lines[*]}" "service not_existing_service does not exist"
} }
@test "($PLUGIN_COMMAND_PREFIX:link) success" { @test "($PLUGIN_COMMAND_PREFIX:link) error when the service is already linked to app" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app
run dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app run dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app
links=$(cat "$PLUGIN_DATA_ROOT/l/LINKS") assert_contains "${lines[*]}" "Already linked as DATABASE_URL"
assert_equal "$links" "my_app" }
@test "($PLUGIN_COMMAND_PREFIX:link) exports DATABASE_URL to app" {
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" "mysql://mysql:$password@dokku-mysql-l:3306/l"
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app
}
@test "($PLUGIN_COMMAND_PREFIX:link) generates an alternate config url when DATABASE_URL already in use" {
dokku config:set my_app DATABASE_URL=mysql://user:pass@host:3306/db
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app
run dokku config my_app
assert_contains "${lines[*]}" "DOKKU_MYSQL_"
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app
}
@test "($PLUGIN_COMMAND_PREFIX:link) links to app with docker-options" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app
run dokku docker-options my_app
assert_contains "${lines[*]}" "--link dokku.mysql.l:dokku-mysql-l"
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app
} }

55
tests/service_promote.bats Executable file
View File

@@ -0,0 +1,55 @@
#!/usr/bin/env bats
load test_helper
setup() {
dokku "$PLUGIN_COMMAND_PREFIX:create" l >&2
dokku apps:create my_app >&2
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app
}
teardown() {
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l >&2
rm "$DOKKU_ROOT/my_app" -rf
}
@test "($PLUGIN_COMMAND_PREFIX:promote) error when there are no arguments" {
run dokku "$PLUGIN_COMMAND_PREFIX:promote"
assert_contains "${lines[*]}" "Please specify a name for the service"
}
@test "($PLUGIN_COMMAND_PREFIX:promote) error when the app argument is missing" {
run dokku "$PLUGIN_COMMAND_PREFIX:promote" l
assert_contains "${lines[*]}" "Please specify an app to run the command on"
}
@test "($PLUGIN_COMMAND_PREFIX:promote) error when the app does not exist" {
run dokku "$PLUGIN_COMMAND_PREFIX:promote" l not_existing_app
assert_contains "${lines[*]}" "App not_existing_app does not exist"
}
@test "($PLUGIN_COMMAND_PREFIX:promote) error when the service does not exist" {
run dokku "$PLUGIN_COMMAND_PREFIX:promote" not_existing_service my_app
assert_contains "${lines[*]}" "service not_existing_service does not exist"
}
@test "($PLUGIN_COMMAND_PREFIX:promote) error when the service is already promoted" {
run dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app
assert_contains "${lines[*]}" "already promoted as DATABASE_URL"
}
@test "($PLUGIN_COMMAND_PREFIX:promote) changes DATABASE_URL" {
password="$(cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
dokku config:set my_app "DATABASE_URL=mysql://u:p@host:3306/db" "DOKKU_MYSQL_BLUE_URL=mysql://mysql:$password@dokku-mysql-l:3306/l"
dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app
url=$(dokku config:get my_app DATABASE_URL)
assert_equal "$url" "mysql://mysql:$password@dokku-mysql-l:3306/l"
}
@test "($PLUGIN_COMMAND_PREFIX:promote) creates new config url when needed" {
password="$(cat "$PLUGIN_DATA_ROOT/l/PASSWORD")"
dokku config:set my_app "DATABASE_URL=mysql://u:p@host:3306/db" "DOKKU_MYSQL_BLUE_URL=mysql://mysql:$password@dokku-mysql-l:3306/l"
dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app
run dokku config my_app
assert_contains "${lines[*]}" "DOKKU_MYSQL_"
}

View File

@@ -31,9 +31,21 @@ teardown() {
assert_contains "${lines[*]}" "service not_existing_service does not exist" assert_contains "${lines[*]}" "service not_existing_service does not exist"
} }
@test "($PLUGIN_COMMAND_PREFIX:unlink) success" { @test "($PLUGIN_COMMAND_PREFIX:unlink) error when service not linked to app" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app >&2
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app run dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app
links=$(cat "$PLUGIN_DATA_ROOT/l/LINKS") assert_contains "${lines[*]}" "Not linked to app my_app"
assert_equal "$links" "" }
@test "($PLUGIN_COMMAND_PREFIX:unlink) removes link from docker-options" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app >&2
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app
options=$(dokku docker-options my_app)
assert_equal "$options" ""
}
@test "($PLUGIN_COMMAND_PREFIX:unlink) unsets config url from app" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app >&2
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app
config=$(dokku config:get my_app DATABASE_URL)
assert_equal "$config" ""
} }

View File

@@ -1,6 +1,8 @@
#!/usr/bin/env bash #!/usr/bin/env bash
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/test_helper.bash" source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/test_helper.bash"
BIN_STUBS="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/bin"
if [[ ! -d $DOKKU_ROOT ]]; then if [[ ! -d $DOKKU_ROOT ]]; then
git clone https://github.com/progrium/dokku.git $DOKKU_ROOT > /dev/null git clone https://github.com/progrium/dokku.git $DOKKU_ROOT > /dev/null
fi fi
@@ -13,3 +15,10 @@ cd -
rm -rf $DOKKU_ROOT/plugins/service rm -rf $DOKKU_ROOT/plugins/service
mkdir -p $DOKKU_ROOT/plugins/service mkdir -p $DOKKU_ROOT/plugins/service
find ./ -maxdepth 1 -type f -exec cp '{}' $DOKKU_ROOT/plugins/service \; find ./ -maxdepth 1 -type f -exec cp '{}' $DOKKU_ROOT/plugins/service \;
if [[ ! -f $BIN_STUBS/plugn ]]; then
wget -O- "$PLUGN_URL" | tar xzf - -C "$BIN_STUBS"
plugn init
ln -s "$DOKKU_ROOT"/plugins/* "$DOKKU_ROOT"/plugins/available
ln -s "$DOKKU_ROOT"/plugins/* "$DOKKU_ROOT"/plugins/enabled
fi

View File

@@ -10,6 +10,7 @@ export PLUGIN_AVAILABLE_PATH="$PLUGIN_PATH"
export PLUGIN_CORE_AVAILABLE_PATH="$PLUGIN_PATH" export PLUGIN_CORE_AVAILABLE_PATH="$PLUGIN_PATH"
export MYSQL_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/fixtures" export MYSQL_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/fixtures"
export PLUGIN_DATA_ROOT="$MYSQL_ROOT" export PLUGIN_DATA_ROOT="$MYSQL_ROOT"
export PLUGN_URL="https://github.com/progrium/plugn/releases/download/v0.1.0/plugn_0.1.0_linux_x86_64.tgz"
mkdir -p $PLUGIN_DATA_ROOT mkdir -p $PLUGIN_DATA_ROOT
rm -rf "${PLUGIN_DATA_ROOT:?}"/* rm -rf "${PLUGIN_DATA_ROOT:?}"/*