Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ability to skip restarts on link and unlink #144

Merged
merged 11 commits into from
Feb 25, 2023
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@ flags:

- `-a|--alias "BLUE_DATABASE"`: an alternative alias to use for linking to an app via environment variable
- `-q|--querystring "pool=5"`: ampersand delimited querystring arguments to append to the service link
- `-n|--no-restart "false"`: whether or not to restart the app on link (default: true)

A elasticsearch service can be linked to a container. This will use native docker links via the docker-options plugin. Here we link it to our `playground` app.

Expand Down Expand Up @@ -240,6 +241,10 @@ http2://dokku-elasticsearch-lollipop:9200
dokku elasticsearch:unlink <service> <app>
```

flags:

- `-n|--no-restart "false"`: whether or not to restart the app on unlink (default: true)

You can unlink a elasticsearch service:

> NOTE: this will restart your app and unset related environment variables
Expand Down Expand Up @@ -426,7 +431,7 @@ flags:
- `-I|--image-version IMAGE_VERSION`: the image version to start the service with
- `-N|--initial-network INITIAL_NETWORK`: the initial network to attach the service to
- `-P|--post-create-network NETWORKS`: a comman-separated list of networks to attach the service container to after service creation
- `-R|--restart-apps "true"`: whether to force an app restart
- `-R|--restart-apps "true"`: whether or not to force an app restart (default: false)
- `-S|--post-start-network NETWORKS`: a comman-separated list of networks to attach the service container to after service start
- `-s|--shm-size SHM_SIZE`: override shared memory size for elasticsearch docker container

Expand Down
12 changes: 9 additions & 3 deletions common-functions
Original file line number Diff line number Diff line change
Expand Up @@ -631,8 +631,9 @@ service_link() {
fi
[[ -n "$SERVICE_QUERYSTRING" ]] && SERVICE_URL="${SERVICE_URL}?${SERVICE_QUERYSTRING}"
plugn trigger service-action post-link "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "$APP"
if [[ "$DOKKU_GLOBAL_FLAGS" == *"--no-restart"* ]]; then
if [[ "$DOKKU_GLOBAL_FLAGS" == *"--no-restart"* ]] || [[ "$SERVICE_RESTART_APPS" == "false" ]]; then
config_set --no-restart "$APP" "${ALIAS}_URL=$SERVICE_URL"
dokku_log_verbose "Skipping restart of linked app"
else
config_set "$APP" "${ALIAS}_URL=$SERVICE_URL"
fi
Expand Down Expand Up @@ -714,6 +715,7 @@ service_parse_args() {
"--initial-network") set -- "$@" "-N" ;;
"--image") set -- "$@" "-i" ;;
"--memory") set -- "$@" "-m" ;;
"--no-restart") set -- "$@" "-n" ;;
"--password") set -- "$@" "-p" ;;
"--post-create-network") set -- "$@" "-P" ;;
"--post-start-network") set -- "$@" "-S" ;;
Expand All @@ -727,7 +729,7 @@ service_parse_args() {
done

OPTIND=1
while getopts "a:c:C:d:i:I:m:n:N:p:P:q:R:r:s:S:u:" opt; do
while getopts "na:c:C:d:i:I:m:n:N:p:P:q:R:r:s:S:u:" opt; do
case "$opt" in
a)
SERVICE_ALIAS="${OPTARG^^}"
Expand All @@ -751,6 +753,9 @@ service_parse_args() {
m)
export SERVICE_MEMORY=$OPTARG
;;
n)
export SERVICE_RESTART_APPS=false
;;
N)
export SERVICE_INITIAL_NETWORK=$OPTARG
;;
Expand Down Expand Up @@ -971,8 +976,9 @@ service_unlink() {

[[ -z ${LINK[*]} ]] && dokku_log_fail "Not linked to app $APP"
plugn trigger service-action post-unlink "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "$APP"
if [[ "$DOKKU_GLOBAL_FLAGS" == *"--no-restart"* ]]; then
if [[ "$DOKKU_GLOBAL_FLAGS" == *"--no-restart"* ]] || [[ "$SERVICE_RESTART_APPS" == "false" ]]; then
config_unset --no-restart "$APP" "${LINK[@]}"
dokku_log_verbose "Skipping restart of linked app"
else
config_unset "$APP" "${LINK[@]}"
fi
Expand Down
1 change: 1 addition & 0 deletions subcommands/link
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ service-link-cmd() {
#A app, app to run command against
#F -a|--alias "BLUE_DATABASE", an alternative alias to use for linking to an app via environment variable
#F -q|--querystring "pool=5", ampersand delimited querystring arguments to append to the service link
#F -n|--no-restart "false", whether or not to restart the app on link (default: true)
declare desc="link the $PLUGIN_SERVICE service to the app"
local cmd="$PLUGIN_COMMAND_PREFIX:link" argv=("$@")
[[ ${argv[0]} == "$cmd" ]] && shift 1
Expand Down
1 change: 1 addition & 0 deletions subcommands/unlink
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ service-unlink-cmd() {
#E dokku $PLUGIN_COMMAND_PREFIX:unlink lollipop playground
#A service, service to run command against
#A app, app to run command against
#F -n|--no-restart "false", whether or not to restart the app on unlink (default: true)
declare desc="unlink the $PLUGIN_SERVICE service from the app"
local cmd="$PLUGIN_COMMAND_PREFIX:unlink" argv=("$@")
[[ ${argv[0]} == "$cmd" ]] && shift 1
Expand Down
2 changes: 1 addition & 1 deletion subcommands/upgrade
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ service-upgrade-cmd() {
#F -I|--image-version IMAGE_VERSION, the image version to start the service with
#F -N|--initial-network INITIAL_NETWORK, the initial network to attach the service to
#F -P|--post-create-network NETWORKS, a comman-separated list of networks to attach the service container to after service creation
#F -R|--restart-apps "true", whether to force an app restart
#F -R|--restart-apps "true", whether or not to force an app restart (default: false)
#F -S|--post-start-network NETWORKS, a comman-separated list of networks to attach the service container to after service start
#F -s|--shm-size SHM_SIZE, override shared memory size for $PLUGIN_COMMAND_PREFIX docker container
declare desc="upgrade service <service> to the specified versions"
Expand Down
78 changes: 51 additions & 27 deletions tests/service_link.bats
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
load test_helper

setup() {
dokku "$PLUGIN_COMMAND_PREFIX:create" l
dokku "$PLUGIN_COMMAND_PREFIX:create" m
dokku "$PLUGIN_COMMAND_PREFIX:create" ls
dokku "$PLUGIN_COMMAND_PREFIX:create" ms
dokku apps:create my-app
}

teardown() {
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" m
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" ms
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" ls
dokku --force apps:destroy my-app
}

Expand All @@ -22,15 +22,15 @@ teardown() {
}

@test "($PLUGIN_COMMAND_PREFIX:link) error when the app argument is missing" {
run dokku "$PLUGIN_COMMAND_PREFIX:link" l
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls
echo "output: $output"
echo "status: $status"
assert_contains "${lines[*]}" "Please specify an app to run the command on"
assert_failure
}

@test "($PLUGIN_COMMAND_PREFIX:link) error when the app does not exist" {
run dokku "$PLUGIN_COMMAND_PREFIX:link" l not_existing_app
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls not_existing_app
echo "output: $output"
echo "status: $status"
assert_contains "${lines[*]}" "App not_existing_app does not exist"
Expand All @@ -46,70 +46,94 @@ teardown() {
}

@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
dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
echo "output: $output"
echo "status: $status"
assert_contains "${lines[*]}" "Already linked as ELASTICSEARCH_URL"
assert_failure

dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
}

@test "($PLUGIN_COMMAND_PREFIX:link) exports ELASTICSEARCH_URL to app" {
run dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
echo "output: $output"
echo "status: $status"
url=$(dokku config:get my-app ELASTICSEARCH_URL)
assert_contains "$url" "http://dokku-elasticsearch-l:9200"
assert_contains "$url" "http://dokku-elasticsearch-ls:9200"
assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
}

@test "($PLUGIN_COMMAND_PREFIX:link) generates an alternate config url when ELASTICSEARCH_URL already in use" {
dokku config:set my-app ELASTICSEARCH_URL=http://host:9200
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
run dokku config my-app
assert_contains "${lines[*]}" "DOKKU_ELASTICSEARCH_AQUA_URL"
assert_success

dokku "$PLUGIN_COMMAND_PREFIX:link" m my-app
dokku "$PLUGIN_COMMAND_PREFIX:link" ms my-app
run dokku config my-app
assert_contains "${lines[*]}" "DOKKU_ELASTICSEARCH_BLACK_URL"
assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" m my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ms my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
}

@test "($PLUGIN_COMMAND_PREFIX:link) links to app with docker-options" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
run dokku docker-options:report my-app
assert_contains "${lines[*]}" "--link dokku.elasticsearch.l:dokku-elasticsearch-l"
assert_contains "${lines[*]}" "--link dokku.elasticsearch.ls:dokku-elasticsearch-ls"
assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
}

@test "($PLUGIN_COMMAND_PREFIX:link) uses apps ELASTICSEARCH_DATABASE_SCHEME variable" {
dokku config:set my-app ELASTICSEARCH_DATABASE_SCHEME=elasticsearch2
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
url=$(dokku config:get my-app ELASTICSEARCH_URL)
assert_contains "$url" "elasticsearch2://dokku-elasticsearch-l:9200"
assert_contains "$url" "elasticsearch2://dokku-elasticsearch-ls:9200"
assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
}

@test "($PLUGIN_COMMAND_PREFIX:link) adds a querystring" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app --querystring "pool=5"
dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app --querystring "pool=5"
url=$(dokku config:get my-app ELASTICSEARCH_URL)
assert_contains "$url" "?pool=5"
assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
}

@test "($PLUGIN_COMMAND_PREFIX:link) uses a specified config url when alias is specified" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app --alias "ALIAS"
dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app --alias "ALIAS"
url=$(dokku config:get my-app ALIAS_URL)
assert_contains "$url" "http://dokku-elasticsearch-l:9200"
assert_contains "$url" "http://dokku-elasticsearch-ls:9200"
assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
}

@test "($PLUGIN_COMMAND_PREFIX:link) respects --no-restart" {
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
echo "output: $output"
echo "status: $status"
assert_output_contains "Skipping restart of linked app" 0
assert_success

run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
echo "output: $output"
echo "status: $status"
assert_success

run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app --no-restart
echo "output: $output"
echo "status: $status"
assert_output_contains "Skipping restart of linked app"
assert_success

run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
echo "output: $output"
echo "status: $status"
assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
}
42 changes: 33 additions & 9 deletions tests/service_unlink.bats
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ load test_helper

setup() {
dokku apps:create my-app
dokku "$PLUGIN_COMMAND_PREFIX:create" l
dokku "$PLUGIN_COMMAND_PREFIX:create" ls
}

teardown() {
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" ls
dokku --force apps:destroy my-app
}

Expand All @@ -17,12 +17,12 @@ teardown() {
}

@test "($PLUGIN_COMMAND_PREFIX:unlink) error when the app argument is missing" {
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" l
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls
assert_contains "${lines[*]}" "Please specify an app to run the command on"
}

@test "($PLUGIN_COMMAND_PREFIX:unlink) error when the app does not exist" {
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" l not_existing_app
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls not_existing_app
assert_contains "${lines[*]}" "App not_existing_app does not exist"
}

Expand All @@ -32,22 +32,46 @@ teardown() {
}

@test "($PLUGIN_COMMAND_PREFIX:unlink) error when service not linked to app" {
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
assert_contains "${lines[*]}" "Not linked to app my-app"
}

@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
dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app >&2
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app

check_value="Docker options build: Docker options deploy: --restart=on-failure:10 Docker options run:"
options=$(dokku --quiet docker-options:report my-app | xargs)
assert_equal "$options" "$check_value"
}

@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
dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app >&2
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
config=$(dokku config:get my-app ELASTICSEARCH_URL || true)
assert_equal "$config" ""
}

@test "($PLUGIN_COMMAND_PREFIX:unlink) respects --no-restart" {
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
echo "output: $output"
echo "status: $status"
assert_success

run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
echo "output: $output"
echo "status: $status"
assert_output_contains "Skipping restart of linked app" 0
assert_success

run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
echo "output: $output"
echo "status: $status"
assert_success

run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app --no-restart
echo "output: $output"
echo "status: $status"
assert_output_contains "Skipping restart of linked app"
assert_success
}