diff --git a/plugins/common/functions b/plugins/common/functions index 85ca7e5ae..2c89b5ab1 100755 --- a/plugins/common/functions +++ b/plugins/common/functions @@ -408,14 +408,17 @@ is_deployed() { is_container_running() { declare desc="return 0 if given docker container id is in running state" declare deprecated=true - local CID=$1 - local CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "$CID" || true) + declare CID="$1" + local CONTAINER_STATUS + + dokku_log_warn "Deprecated: common#is_container_status" + CONTAINER_STATUS=$(docker inspect -f '{{.State.Running}}' "$CID" || true) if [[ "$CONTAINER_STATUS" == "true" ]]; then return 0 - else - return 1 fi + + return 1 } is_container_status() { @@ -426,14 +429,17 @@ is_container_status() { if [[ "$CONTAINER_STATUS" == "true" ]]; then return 0 - else - return 1 fi + + return 1 } is_app_running() { declare desc="return 0 if given app has a running container" + declare deprecated=true local APP="$1" + + dokku_log_warn "Deprecated: ps#fn-is-app-running" verify_app_name "$APP" local APP_RUNNING_CONTAINER_IDS=$(get_app_running_container_ids "$APP") diff --git a/plugins/ps/functions b/plugins/ps/functions index 39401bc20..60604924f 100755 --- a/plugins/ps/functions +++ b/plugins/ps/functions @@ -91,17 +91,24 @@ ps_start() { declare desc="starts app" local APP="$1"; verify_app_name "$APP" local IMAGE_TAG=$(get_running_image_tag "$APP"); + local RUNNING if (is_deployed "$APP"); then plugn trigger pre-start "$APP" - if ! (is_app_running "$APP"); then + RUNNING="$(fn-ps-is-app-running "$APP")" + + if [[ "$RUNNING" == "mixed" ]]; then + dokku_log_warn "App is running in mixed mode, releasing" + fi + + if [[ "$RUNNING" != "true" ]]; then release_and_deploy "$APP" "$IMAGE_TAG" else - echo "App $APP already running" + dokku_log_warn "App $APP already running" fi plugn trigger proxy-build-config "$APP" else - echo "App $APP has not been deployed" + dokku_log_warn "App $APP has not been deployed" fi } @@ -109,9 +116,9 @@ ps_stop() { declare desc="stops app" local APP="$1"; verify_app_name "$APP" - ! (is_deployed "$APP") && echo "App $APP has not been deployed" && exit 0 + ! (is_deployed "$APP") && dokku_log_warn "App $APP has not been deployed" && exit 0 - echo "Stopping $APP ..." + dokku_log_quiet "Stopping $APP ..." local DOKKU_SCHEDULER=$(config_get "$APP" DOKKU_SCHEDULER || echo "docker-local") plugn trigger scheduler-stop "$DOKKU_SCHEDULER" "$APP" plugn trigger post-stop "$APP" @@ -132,7 +139,7 @@ ps_restart() { if (is_deployed "$APP"); then release_and_deploy "$APP" "$IMAGE_TAG" else - echo "App $APP has not been deployed" + dokku_log_warn "App $APP has not been deployed" fi } @@ -171,3 +178,34 @@ get_restart_policies() { local -r phase_file_path=$1 get_raw_restart_policies "$phase_file_path" | sed -e 's/^--restart=//g' } + +fn-ps-app-status() { + declare APP="$1" + local PROCS=0 RUNNING="" + local APP_CIDS=$(get_app_container_ids "$APP"); + + for CID in $APP_CIDS; do + if (is_container_status "$CID" "Running"); then + RUNNING+="0" + else + RUNNING+="1" + fi + PROCS=$((PROCS + 1)) + done + + if [[ "${#RUNNING}" -eq 0 ]] || [[ "${#RUNNING}" -ne 0 ]] && [[ "$RUNNING" != *"0"* ]]; then + RUNNING="false" + elif [[ "$RUNNING" != *"1"* ]] && [[ "${#RUNNING}" -ne 0 ]]; then + RUNNING="true" + else + RUNNING="mixed" + fi + + echo "$PROCS $RUNNING" +} + +fn-ps-is-app-running() { + declare APP="$1" + APP_STATUS=$(fn-ps-app-status "$APP") + echo "$APP_STATUS" | cut -d ' ' -f 2 +} \ No newline at end of file diff --git a/plugins/ps/internal-functions b/plugins/ps/internal-functions index 763e2f1b2..dfa8639a0 100755 --- a/plugins/ps/internal-functions +++ b/plugins/ps/internal-functions @@ -33,27 +33,12 @@ cmd-ps-report-single() { local APP_DIR="$DOKKU_ROOT/$APP" [[ "$INFO_FLAG" == "true" ]] && INFO_FLAG="" - local passed_phases="deploy" - local APP_CIDS=$(get_app_container_ids "$APP"); local PROCS=0; local RUNNING="" - - for CID in $APP_CIDS; do - if (is_container_status "$CID" "Running"); then - RUNNING+="0" - else - RUNNING+="1" - fi - PROCS=$((PROCS + 1)) - done - - if [[ "${#RUNNING}" -eq 0 ]] || [[ "${#RUNNING}" -ne 0 ]] && [[ "$RUNNING" != *"0"* ]]; then - RUNNING="false" - elif [[ "$RUNNING" != *"1"* ]] && [[ "${#RUNNING}" -ne 0 ]]; then - RUNNING="true"; - else - RUNNING="mixed" - fi + local APP_RUNNING="$(fn-ps-app-status "$APP")" + local PROCS=$(echo "$APP_RUNNING" | cut -d ' ' -f 1) + local RUNNING=$(echo "$APP_RUNNING" | cut -d ' ' -f 2) if (is_deployed "$APP"); then DEPLOYED="true"; else DEPLOYED="false"; fi + local passed_phases="deploy" RESTARTPOLICY=$(get_restart_policies "$(get_phase_file_path "$passed_phases")" || true) local CONTAINER_FILES="$(find "$DOKKU_ROOT/$APP" -maxdepth 1 -name "CONTAINER.*" -printf "%f\n" 2>/dev/null | sort -t . -k 2 -n | xargs)" diff --git a/plugins/ps/subcommands/default b/plugins/ps/subcommands/default index 07f044d57..cc2ecfbe2 100755 --- a/plugins/ps/subcommands/default +++ b/plugins/ps/subcommands/default @@ -10,7 +10,7 @@ ps_main_cmd() { [[ -z $2 ]] && dokku_log_fail "Please specify an app to run the command on" local APP="$2"; verify_app_name "$APP" - ! (is_deployed "$APP") && echo "App $APP has not been deployed" && exit 0 + ! (is_deployed "$APP") && dokku_log_warn "App $APP has not been deployed" && exit 0 local DOKKU_APP_RUNNING_CONTAINER_IDS=$(get_app_running_container_ids "$APP")