diff options
Diffstat (limited to 'docker/centos/binary/base')
| -rw-r--r-- | docker/centos/binary/base/kolla-common.sh | 170 | ||||
| -rwxr-xr-x | docker/centos/binary/base/service_hosts.sh | 45 |
2 files changed, 215 insertions, 0 deletions
diff --git a/docker/centos/binary/base/kolla-common.sh b/docker/centos/binary/base/kolla-common.sh new file mode 100644 index 000000000..8c2ef5ec1 --- /dev/null +++ b/docker/centos/binary/base/kolla-common.sh @@ -0,0 +1,170 @@ +#!/bin/bash + +. /opt/kolla/service_hosts.sh + +# Set some generally useful defaults. +MY_IP=$(ip route get $(ip route | awk '$1 == "default" {print $3}') | + awk '$4 == "src" {print $5}') + +: ${PUBLIC_IP:=${MY_IP}} + +# Iterate over a list of variable names and exit if one is +# undefined. +check_required_vars() { + for var in $*; do + if [ -z "${!var}" ]; then + echo "ERROR: missing $var" >&2 + exit 1 + fi + 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:-""} + 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 "wait_for is missing a required parameter" + exit 1 + 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 + 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 + local seconds=$((loops * sleeptime)) + printf 'Timing out after %d seconds:\ncommand=%s\nOUTPUT=%s\n' \ + "$seconds" "$command" "$output" + 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 '' $@ +} + +# Check if we receive a successful response from corresponding OpenStack +# service endpoint. +check_for_os_service_endpoint() { + local name=$1 + local host_var=$2 + local port_var=$3 + local api_version=$4 + + check_required_vars $host_var $port_var + + local endpoint="http://${!host_var}:${!port_var}/$api_version" + + curl -sf -o /dev/null "$endpoint" || { + echo "ERROR: $name is not available @ $endpoint" >&2 + return 1 + } + + echo "$name is active @ $endpoint" +} + +check_for_os_service_running() { + local service=$1 + local args= + case $service in + ("glance") args="GLANCE_API_SERVICE_HOST GLANCE_API_SERVICE_PORT" ;; + ("keystone") args="KEYSTONE_PUBLIC_SERVICE_HOST KEYSTONE_PUBLIC_SERVICE_PORT v2.0" ;; + ("neutron") args="NEUTRON_SERVER_SERVICE_HOST NEUTRON_SERVER_SERVICE_PORT" ;; + ("nova") args="NOVA_API_SERVICE_HOST NOVA_API_SERVICE_PORT" ;; + (*) + echo "Unknown service $service" + return 1 ;; + esac + check_for_os_service_endpoint $service $args +} + +fail_unless_os_service_running() { + check_for_os_service_running $@ || exit $? +} + +# Check if we receive a successful response from the database server. +# Optionally takes a database name to check for. Defaults to 'mysql'. +check_for_db() { + local database=${1:-mysql} + check_required_vars MARIADB_SERVICE_HOST DB_ROOT_PASSWORD + + mysql -h ${MARIADB_SERVICE_HOST} -u root -p"${DB_ROOT_PASSWORD}" \ + -e "select 1" $database > /dev/null 2>&1 || { + echo "ERROR: database $database is not available @ $MARIADB_SERVICE_HOST" >&2 + return 1 + } + + echo "database is active @ ${MARIADB_SERVICE_HOST}" +} + +fail_unless_db() { + check_for_db $@ || exit $? +} + +# Dump shell environment to a file +dump_vars() { + set -o posix + set > /pid_$$_vars.sh + set +o posix +} + diff --git a/docker/centos/binary/base/service_hosts.sh b/docker/centos/binary/base/service_hosts.sh new file mode 100755 index 000000000..c3006f720 --- /dev/null +++ b/docker/centos/binary/base/service_hosts.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +# Kubernetes currently creates FOO_SERVICE_HOST and FOO_SERVICE_PORT env vars +# as part of starting the containers. However this is not done when starting +# them with plain docker. Defaulting variables to their common version if +# they're not already set allows the usage of --link in plain 'docker run' to +# wire together containers. + +: ${BARBICAN_ADMIN_SERVICE_HOST:=$BARBICAN_ADMIN_PORT_9312_TCP_ADDR} +: ${BARBICAN_ADMIN_SERVICE_PORT:=9312} +: ${BARBICAN_PUBLIC_SERVICE_HOST:=$BARBICAN_PUBLIC_PORT_9311_TCP_ADDR} +: ${BARBICAN_PUBLIC_SERVICE_PORT:=9311} +: ${CEILOMETER_API_SERVICE_HOST:=$CEILOMETER_API_PORT_8777_TCP_ADDR} +: ${CEILOMETER_API_SERVICE_PORT:=8777} +: ${GLANCE_API_SERVICE_HOST:=$GLANCE_API_PORT_9292_TCP_ADDR} +: ${GLANCE_API_SERVICE_PORT:=9292} +: ${GLANCE_REGISTRY_SERVICE_HOST:=$GLANCE_REGISTRY_PORT_9191_TCP_ADDR} +: ${GLANCE_REGISTRY_SERVICE_PORT:=9191} +: ${HEAT_API_SERVICE_HOST:=$HEAT_API_PORT_8004_TCP_ADDR} +: ${HEAT_API_SERVICE_PORT:=8004} +: ${HORIZON_SERVICE_HOST:=$HORIZON_PORT_80_TCP_ADDR} +: ${HORIZON_SERVICE_PORT:=80} +: ${KEYSTONE_ADMIN_SERVICE_HOST:=$KEYSTONE_PORT_35357_TCP_ADDR} +: ${KEYSTONE_ADMIN_SERVICE_PORT:=35357} +: ${KEYSTONE_PUBLIC_SERVICE_HOST:=$KEYSTONE_PORT_5000_TCP_ADDR} +: ${KEYSTONE_PUBLIC_SERVICE_PORT:=5000} +: ${MARIADB_SERVICE_HOST:=$MARIADB_PORT_3306_TCP_ADDR} +: ${MARIADB_SERVICE_PORT:=3306} +: ${MONGODB_SERVICE_HOST:=$MONGODB_PORT_27017_TCP_ADDR} +: ${MONGODB_SERVICE_PORT:=27017} +: ${NEUTRON_SERVER_SERVICE_HOST:=$NEUTRON_SERVER_PORT_9696_TCP_ADDR} +: ${NEUTRON_SERVER_SERVICE_PORT:=9696} +: ${NOVA_API_SERVICE_HOST:=$NOVA_API_PORT_8774_TCP_ADDR} +: ${NOVA_API_SERVICE_PORT:=8774} +: ${NOVA_EC2_API_SERVICE_HOST:=$NOVA_EC2_API_PORT_8773_TCP_ADDR} +: ${NOVA_EC2_API_SERVICE_PORT:=8773} +: ${NOVA_LIBVIRT_SERVICE_HOST:=$NOVA_LIBVIRT_PORT_16509_TCP_ADDR} +: ${NOVA_LIBVIRT_SERVICE_PORT:=16509} +: ${NOVA_METADATA_API_SERVICE_HOST:=$NOVA_METADATA_API_PORT_8775_TCP_ADDR} +: ${NOVA_METADATA_API_SERVICE_PORT:=8775} +: ${RABBITMQ_SERVICE_HOST:=$RABBITMQ_PORT_5672_TCP_ADDR} +: ${RABBITMQ_SERVICE_PORT:=5672} +: ${ZAQAR_SERVER_SERVICE_HOST:=$ZAQAR_SERVER_PORT_8888_TCP_ADDR} +: ${ZAQAR_SERVER_SERVICE_PORT:=8888} + |
