The wait_for function needs to be added into all the images

This affects both fedora and the centos base images.
Wait_for will be intregrated into kolla-common.

Co-authored by: Charles Crouch <charcrou@cisco.com>

Change-Id: Ide2304b787d4c3bf6fb3949f09e2cf1f450c2173
This commit is contained in:
Ryan Hallisey 2015-03-11 09:35:00 -04:00
parent 53d7e3b6fa
commit 4075c851ed
6 changed files with 58 additions and 90 deletions

View File

@ -19,6 +19,41 @@ check_required_vars() {
done
}
wait_for() {
local loops=${1:-""}
local sleeptime=${2:-""}
local fail_match_output=${fail_match_output:-""}
local 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"
fi
local i=0
while [ $i -lt $loops ]; do
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
fi
sleep $sleeptime
done
local seconds=$((loops * sleeptime))
printf 'Timing out after %d seconds:\ncommand=%s\nOUTPUT=%s\n' \
"$seconds" "$command" "$output"
exit 1
}
# Exit unless we receive a successful response from corresponding OpenStack
# service.
check_for_os_service() {

View File

@ -95,3 +95,4 @@ RUN yum install -y \
RUN mkdir -p /opt/kolla
ADD service_hosts.sh /opt/kolla/service_hosts.sh
ADD kolla-common.sh /opt/kolla/kolla-common.sh
ADD wait_for /opt/kolla/wait_for

View File

@ -94,4 +94,3 @@ RUN yum install -y \
RUN mkdir -p /opt/kolla
ADD service_hosts.sh /opt/kolla/service_hosts.sh
ADD kolla-common.sh /opt/kolla/kolla-common.sh

View File

@ -1,85 +0,0 @@
#!/bin/bash
# Based on
# https://raw.githubusercontent.com/openstack/tripleo-incubator/6931c1fc7ed98ce36998c5b82750a880b0365445/scripts/wait_for
#
# Copyright 2013 Red Hat
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
set -e # exit on the first non-zero status
set -u # exit on unset variables
#set -x # setting this actually breaks the scripts function
SCRIPT_NAME=$(basename $0)
function show_options() {
echo "Usage: $SCRIPT_NAME LOOPS_NUMBER SLEEP_TIME ARGS"
echo
echo "ARGS are read and concatenated together into a single command."
echo "Execute the command in a loop until it succeeds or the number"
echo "of attempts exceeds LOOPS_NUMBER value. After each failure"
echo "pause for SLEEP_TIME seconds."
echo
echo "An optional FAIL_MATCH_OUTPUT variable may also be set to control "
echo "if the loop exits early if the commands stdout/stderr matches the "
echo "supplied regex string."
echo
echo "Examples:"
echo " wait_for 30 10 ping -c 1 192.0.2.2"
echo " wait_for 10 1 ls file_we_are_waiting_for"
echo " wait_for 10 3 date \| grep 8"
echo " FAIL_MATCH_OUTPUT=CREATE_FAILED wait_for 30 10 heat stack-show undercloud"
echo " SUCCESSFUL_MATCH_OUTPUT=CREATE_COMPLETE wait_for 30 10 heat stack-show undercloud"
exit 1
}
LOOPS=${1:-""}
SLEEPTIME=${2:-""}
FAIL_MATCH_OUTPUT=${FAIL_MATCH_OUTPUT:-""}
SUCCESSFUL_MATCH_OUTPUT=${SUCCESSFUL_MATCH_OUTPUT:-""}
shift 2 || true
COMMAND="$@"
if [ -z "$LOOPS" -o -z "$SLEEPTIME" -o -z "$COMMAND" ]; then
show_options
fi
i=0
while [ $i -lt $LOOPS ]; do
i=$((i + 1))
STATUS=0
OUTPUT=$(eval $COMMAND 2>&1) || STATUS=$?
if [[ -n "$SUCCESSFUL_MATCH_OUTPUT" ]] \
&& [[ $OUTPUT =~ $SUCCESSFUL_MATCH_OUTPUT ]]; then
exit 0
elif [[ -n "$FAIL_MATCH_OUTPUT" ]] \
&& [[ $OUTPUT =~ $FAIL_MATCH_OUTPUT ]]; then
echo "Command output matched '$FAIL_MATCH_OUTPUT'. Exiting..."
exit 1
elif [[ -z "$SUCCESSFUL_MATCH_OUTPUT" ]] && [[ $STATUS -eq 0 ]]; then
# The command successfully completed and we aren't testing against
# it's output so we have finished waiting.
exit 0
fi
sleep $SLEEPTIME
done
SECONDS=$((LOOPS * SLEEPTIME))
printf 'Timing out after %d seconds:\nCOMMAND=%s\nOUTPUT=%s\n' \
"$SECONDS" "$COMMAND" "$OUTPUT"
exit 1

View File

@ -11,10 +11,10 @@ check_required_vars KEYSTONE_ADMIN_TOKEN KEYSTONE_ADMIN_SERVICE_HOST \
ADMIN_TENANT_NAME GLANCE_API_SERVICE_HOST \
PUBLIC_IP
/opt/kolla/wait_for 30 1 keystone \
--os-auth-url=http://${KEYSTONE_PUBLIC_SERVICE_HOST}:35357/v2.0 \
--os-username=admin --os-tenant-name=${ADMIN_TENANT_NAME} \
--os-password=${KEYSTONE_ADMIN_PASSWORD} endpoint-list
wait_for 30 1 keystone \
--os-auth-url=http://${KEYSTONE_PUBLIC_SERVICE_HOST}:35357/v2.0 \
--os-username=admin --os-tenant-name=${ADMIN_TENANT_NAME} \
--os-password=${KEYSTONE_ADMIN_PASSWORD} endpoint-list
check_for_keystone
export SERVICE_TOKEN="${KEYSTONE_ADMIN_TOKEN}"

18
docs/wait-for.md Normal file
View File

@ -0,0 +1,18 @@
# Wait-for function
The usage of the wait_for function looks like the following
$ SCRIPT_NAME 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).
An optional 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.
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
$ FAIL_MATCH_OUTPUT=CREATE_FAILED wait_for 30 10 heat stack-show undercloud
$ SUCCESSFUL_MATCH_OUTPUT=CREATE_COMPLETE wait_for 30 10 heat stack-show undercloud