From 59c92077977fefb2a421e76fbb5b065c84c9730d Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 2 Jul 2016 17:17:17 -0400 Subject: [PATCH] Implement restart-policy handling. Closes #1734 Applications without a restart-policy will have their policies set to `on-failure:10`. Users can completely unset the restart-policy using the `docker-options` plugin, though this will be equivalent to setting it explicitly to `no`. Restart policies must be explicitly set, and the following are all valid: - no - unless-stopped - always - on-failure - on-failure:NUMBER --- plugins/ps/commands | 2 ++ plugins/ps/functions | 12 +++++++++ plugins/ps/install | 21 +++++++++++++++ plugins/ps/post-create | 14 ++++++++++ plugins/ps/subcommands/restart-policy | 18 +++++++++++++ plugins/ps/subcommands/set-restart-policy | 31 +++++++++++++++++++++++ 6 files changed, 98 insertions(+) create mode 100755 plugins/ps/install create mode 100755 plugins/ps/post-create create mode 100755 plugins/ps/subcommands/restart-policy create mode 100755 plugins/ps/subcommands/set-restart-policy diff --git a/plugins/ps/commands b/plugins/ps/commands index 1d46d500f..696ef63d4 100755 --- a/plugins/ps/commands +++ b/plugins/ps/commands @@ -16,6 +16,8 @@ case "$1" in ps:restart , Restart app container(s) ps:restartall, Restart all deployed app containers ps:restore, Start previously running apps e.g. after reboot + ps:restart-policy , Shows the restart-policy for an app + ps:set-restart-policy , Sets app restart-policy help_content } diff --git a/plugins/ps/functions b/plugins/ps/functions index 5a9949431..9b4fb5b11 100755 --- a/plugins/ps/functions +++ b/plugins/ps/functions @@ -165,3 +165,15 @@ ps_scale() { release_and_deploy "$APP" "$IMAGE_TAG" fi } + +get_restart_policies() { + declare desc="strips docker options and prints restart policies" + local -r phase_file_path=$1 + [[ -r "$phase_file_path" ]] && sed -e '/^--restart=/!d' -e 's/^--restart=/ /' < "$phase_file_path" +} + +get_raw_restart_policies() { + declare desc="strips docker options and prints raw restart policies" + local -r phase_file_path=$1 + [[ -r "$phase_file_path" ]] && sed -e '/^--restart=/!d' < "$phase_file_path" +} diff --git a/plugins/ps/install b/plugins/ps/install new file mode 100755 index 000000000..51195449d --- /dev/null +++ b/plugins/ps/install @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" +source "$PLUGIN_AVAILABLE_PATH/docker-options/functions" +source "$PLUGIN_AVAILABLE_PATH/ps/functions" + +set_default_restart_policies() { + declare desc="set the default restart policy for all applications if there is not one already set" + local APPS="$(dokku_apps)" + local APP + + for APP in $APPS; do + local RESTART_POLICIES=$(get_restart_policies "$(get_phase_file_path "deploy")") + if [[ -z "$RESTART_POLICIES" ]]; then + local passed_phases=(deploy) + add_passed_docker_option passed_phases[@] "--restart=on-failure:10" + fi + done +} + +set_default_restart_policies "$@" diff --git a/plugins/ps/post-create b/plugins/ps/post-create new file mode 100755 index 000000000..948ecf919 --- /dev/null +++ b/plugins/ps/post-create @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" +source "$PLUGIN_AVAILABLE_PATH/docker-options/functions" +source "$PLUGIN_AVAILABLE_PATH/ps/functions" + +ps_post_create() { + declare desc="ps post-stop plugin trigger" + local trigger="ps_post_stop" + local APP="$1" + + local passed_phases=(deploy) + add_passed_docker_option passed_phases[@] "--restart=on-failure:10" +} diff --git a/plugins/ps/subcommands/restart-policy b/plugins/ps/subcommands/restart-policy new file mode 100755 index 000000000..9ee8c434b --- /dev/null +++ b/plugins/ps/subcommands/restart-policy @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" +source "$PLUGIN_AVAILABLE_PATH/docker-options/functions" +source "$PLUGIN_AVAILABLE_PATH/ps/functions" + +ps_restart_policy_cmd() { + declare desc="shows the restart-policy for an app" + local cmd="ps:restart-policy" + local passed_phases="deploy" + [[ -z $2 ]] && dokku_log_fail "Please specify an app to run the command on" + verify_app_name "$2" && local APP="$2" + + echo "$APP restart-policy:" + get_restart_policies "$(get_phase_file_path "$passed_phases")" +} + +ps_restart_policy_cmd "$@" diff --git a/plugins/ps/subcommands/set-restart-policy b/plugins/ps/subcommands/set-restart-policy new file mode 100755 index 000000000..ab836edea --- /dev/null +++ b/plugins/ps/subcommands/set-restart-policy @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" +source "$PLUGIN_AVAILABLE_PATH/docker-options/functions" +source "$PLUGIN_AVAILABLE_PATH/ps/functions" + +ps_set_restart_policy_cmd() { + declare desc="sets app restart-policy" + local cmd="ps:set-restart-policy" + [[ -z $2 ]] && dokku_log_fail "Please specify an app to run the command on" + verify_app_name "$2" && local APP="$2" + local RESTART_POLICY="$3" + local RE_RESTART_POLICY="^(no|unless-stopped|always|on-failure(:[1-9][0-9]*)?)$" + + if [[ ! "$RESTART_POLICY" =~ $RE_RESTART_POLICY ]]; then + dokku_log_fail "Please specify an valid restart policy matching the following regex: ${RE_RESTART_POLICY}" + fi + + local RESTART_POLICIES=$(get_raw_restart_policies "$(get_phase_file_path "deploy")") + local passed_phases=(deploy) + + for policy in $RESTART_POLICIES; do + remove_passed_docker_option passed_phases[@] "$policy" + done + + dokku_log_info1_quiet "Setting restart policy: ${RESTART_POLICY}" + local passed_phases=(deploy) + add_passed_docker_option passed_phases[@] "--restart=${RESTART_POLICY}" +} + +ps_set_restart_policy_cmd "$@"