diff options
| author | Jenkins <jenkins@review.openstack.org> | 2015-03-21 03:17:15 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2015-03-21 03:17:15 +0000 |
| commit | f84c2b1705bf4568387a0e0e82327b221218fef5 (patch) | |
| tree | ef0377ad90914ba530c783b1b35d9dc978e3f0fa /docker | |
| parent | ad6026e0e11ab015218fa3e19206b42652d16da9 (diff) | |
| parent | 1cb551435365c7e06cb605ff11417f0a43881f37 (diff) | |
| download | kolla-f84c2b1705bf4568387a0e0e82327b221218fef5.tar.gz kolla-f84c2b1705bf4568387a0e0e82327b221218fef5.zip | |
Merge "Fix `wait_for` function in kolla-common.sh"
Diffstat (limited to 'docker')
| -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() { |
