diff options
| author | Martin André <martin.andre@kvhasia.com> | 2015-03-19 14:42:45 +0900 |
|---|---|---|
| committer | Martin André <martin.andre@kvhasia.com> | 2015-03-20 12:55:53 +0900 |
| commit | 1cb551435365c7e06cb605ff11417f0a43881f37 (patch) | |
| tree | 4fc2bae0ccef64c3a59ae97b389301f2ad628511 /docker/base | |
| parent | 65683e5ed7df8fecd12a553bb628b982de24a326 (diff) | |
| download | kolla-1cb551435365c7e06cb605ff11417f0a43881f37.tar.gz kolla-1cb551435365c7e06cb605ff11417f0a43881f37.zip | |
Fix `wait_for` function in kolla-common.sh
Add `wait_for_output` and `wait_for_output_unless` helper functions that
only succeed when the command output contains the expected string, with
a possibility to exit early with a failure for `wait_for_output_unless`.
Change-Id: Ie20e7c72fb84f626f1a3fe9c4d2f22c9d6863dbe
Diffstat (limited to 'docker/base')
| -rw-r--r-- | docker/base/kolla-common.sh | 73 |
1 files changed, 61 insertions, 12 deletions
diff --git a/docker/base/kolla-common.sh b/docker/base/kolla-common.sh index 75058e521..bc932a31d 100644 --- a/docker/base/kolla-common.sh +++ b/docker/base/kolla-common.sh @@ -19,16 +19,37 @@ check_required_vars() { done } +# The usage of the wait_for function looks like the following +# wait_for LOOPS_NUMBER SLEEP_TIME ARGS +# +# The ARGS are read and concatenated together into a single command and the +# command is executed in a loop until it succeeds or reaches the max number of +# attempts (LOOPS_NUMBER). +# +# Optional variables SUCCESSFUL_MATCH_OUTPUT and FAIL_MATCH_OUTPUT variable may +# also be set to control if the loop exits early if the commands stdout/stderr +# matches the supplied regex string. Consider using the `wait_for_output` and +# `wait_for_output_unless` functions in case there is a need to check for the +# command output. +# +# The script exits on failure, either when output contains string identified as +# failure, or when it reaches a timeout. +# +# Examples: +# wait_for 30 10 ping -c 1 192.0.2.2 +# wait_for 10 1 ls file_we_are_waiting_for +# wait_for 10 3 date \| grep 8 wait_for() { local loops=${1:-""} local sleeptime=${2:-""} - local fail_match_output=${fail_match_output:-""} - local successful_match_output=${successful_match_output:-""} + FAIL_MATCH_OUTPUT=${FAIL_MATCH_OUTPUT:-""} + SUCCESSFUL_MATCH_OUTPUT=${SUCCESSFUL_MATCH_OUTPUT:-""} shift 2 || true local command="$@" if [ -z "$loops" -o -z "$sleeptime" -o -z "$command" ]; then - echo "Incorrect call of wait_for. Refer to docs/wait-for.md for help" + echo "wait_for is missing a required parameter" + return 1 fi local i=0 @@ -36,15 +57,15 @@ wait_for() { i=$((i + 1)) local status=0 local output=$(eval $command 2>&1) || status=$? - if [[ -n "$successful_match_output" ]] \ - && [[ $output =~ $successful_match_output ]]; then - break - elif [[ -n "$fail_match_output" ]] \ - && [[ $output =~ $fail_match_output ]]; then - echo "Command output matched '$fail_match_output'." - continue - elif [[ -z "$successful_match_output" ]] && [[ $status -eq 0 ]]; then - break + if [[ -n "$SUCCESSFUL_MATCH_OUTPUT" ]] \ + && [[ $output =~ $SUCCESSFUL_MATCH_OUTPUT ]]; then + return 0 + elif [[ -n "$FAIL_MATCH_OUTPUT" ]] \ + && [[ $output =~ $FAIL_MATCH_OUTPUT ]]; then + echo "Command output matched '$FAIL_MATCH_OUTPUT'." + exit 1 + elif [[ -z "$SUCCESSFUL_MATCH_OUTPUT" ]] && [[ $status -eq 0 ]]; then + return 0 fi sleep $sleeptime done @@ -54,6 +75,34 @@ wait_for() { exit 1 } +# Helper function to `wait_for` that only succeeds when the given regex is +# matching the command's output. Exit early with a failure when the second +# supplied regexp is matching the output. +# +# Example: +# wait_for_output_unless CREATE_COMPLETE CREATE_FAIL 30 10 heat stack-show undercloud +wait_for_output_unless() { + SUCCESSFUL_MATCH_OUTPUT=$1 + FAIL_MATCH_OUTPUT=$2 + shift 2 + wait_for $@ + local status=$? + unset SUCCESSFUL_MATCH_OUTPUT + unset FAIL_MATCH_OUTPUT + return $status +} + +# Helper function to `wait_for` that only succeeds when the given regex is +# matching the command's output. +# +# Example: +# wait_for_output CREATE_COMPLETE 30 10 heat stack-show undercloud +wait_for_output() { + local expected_output=$1 + shift + wait_for_output_unless $expected_output '' $@ +} + # Exit unless we receive a successful response from corresponding OpenStack # service. check_for_os_service() { |
