ae3379e070
It may be necessary, in certain situations when using IPv6, to ping the default gateways first before attempting to ping other hosts in the validation script. This swaps the order of the pings between the controllers and default gateways. Change-Id: I14b7fcffb0609aee3f0f53150496461396348322 Closes-Bug: 1793598
131 lines
3.4 KiB
Bash
131 lines
3.4 KiB
Bash
#!/bin/bash
|
|
set -e
|
|
|
|
function ping_retry() {
|
|
local IP_ADDR=$1
|
|
local TIMES=${2:-'10'}
|
|
local COUNT=0
|
|
local PING_CMD=ping
|
|
if [[ $IP_ADDR =~ ":" ]]; then
|
|
PING_CMD=ping6
|
|
fi
|
|
until [ $COUNT -ge $TIMES ]; do
|
|
if $PING_CMD -w 10 -c 1 $IP_ADDR &> /dev/null; then
|
|
echo "Ping to $IP_ADDR succeeded."
|
|
return 0
|
|
fi
|
|
echo "Ping to $IP_ADDR failed. Retrying..."
|
|
COUNT=$(($COUNT + 1))
|
|
sleep 60
|
|
done
|
|
return 1
|
|
}
|
|
|
|
# For each unique remote IP (specified via Heat) we check to
|
|
# see if one of the locally configured networks matches and if so we
|
|
# attempt a ping test the remote network IP.
|
|
function ping_controller_ips() {
|
|
local REMOTE_IPS=$1
|
|
for REMOTE_IP in $(echo $REMOTE_IPS | sed -e "s| |\n|g" | sort -u); do
|
|
if [[ $REMOTE_IP =~ ":" ]]; then
|
|
networks=$(ip -6 r | grep -v default | cut -d " " -f 1 | grep -v "unreachable")
|
|
else
|
|
networks=$(ip r | grep -v default | cut -d " " -f 1)
|
|
fi
|
|
for LOCAL_NETWORK in $networks; do
|
|
in_network=$(python -c "import ipaddress; net=ipaddress.ip_network(u'$LOCAL_NETWORK'); addr=ipaddress.ip_address(u'$REMOTE_IP'); print(addr in net)")
|
|
if [[ $in_network == "True" ]]; then
|
|
echo "Trying to ping $REMOTE_IP for local network ${LOCAL_NETWORK}."
|
|
set +e
|
|
if ! ping_retry $REMOTE_IP; then
|
|
echo "FAILURE"
|
|
echo "$REMOTE_IP is not pingable. Local Network: $LOCAL_NETWORK" >&2
|
|
exit 1
|
|
fi
|
|
set -e
|
|
echo "SUCCESS"
|
|
fi
|
|
done
|
|
done
|
|
}
|
|
|
|
# Ping all default gateways. There should only be one
|
|
# if using upstream t-h-t network templates but we test
|
|
# all of them should some manual network config have
|
|
# multiple gateways.
|
|
function ping_default_gateways() {
|
|
DEFAULT_GW=$(ip r | grep ^default | cut -d " " -f 3)
|
|
set +e
|
|
for GW in $DEFAULT_GW; do
|
|
echo -n "Trying to ping default gateway ${GW}..."
|
|
if ! ping_retry $GW; then
|
|
echo "FAILURE"
|
|
echo "$GW is not pingable."
|
|
exit 1
|
|
fi
|
|
done
|
|
set -e
|
|
echo "SUCCESS"
|
|
}
|
|
|
|
# Verify the FQDN from the nova/ironic deployment matches
|
|
# FQDN in the heat templates.
|
|
function fqdn_check() {
|
|
HOSTNAME=$(hostname)
|
|
SHORT_NAME=$(hostname -s)
|
|
FQDN_FROM_HOSTS=$(awk '$3 == "'${SHORT_NAME}'"{print $2}' /etc/hosts)
|
|
echo -n "Checking hostname vs /etc/hosts entry..."
|
|
if [[ $HOSTNAME != $FQDN_FROM_HOSTS ]]; then
|
|
echo "FAILURE"
|
|
echo -e "System hostname: ${HOSTNAME}\nEntry from /etc/hosts: ${FQDN_FROM_HOSTS}\n"
|
|
exit 1
|
|
fi
|
|
echo "SUCCESS"
|
|
}
|
|
|
|
# run chrony/ntpdate as available
|
|
function _run_ntp_sync() {
|
|
local NTP_SERVER=$1
|
|
if ! type ntpdate 2>/dev/null; then
|
|
chronyd -Q "server $NTP_SERVER iburst"
|
|
else
|
|
ntpdate -qud $NTP_SERVER
|
|
fi
|
|
}
|
|
|
|
# Verify at least one time source is available.
|
|
function ntp_check() {
|
|
NTP_SERVERS=$(hiera ntp::servers nil |tr -d '[],"')
|
|
if [[ "$NTP_SERVERS" != "nil" ]];then
|
|
echo -n "Testing NTP..."
|
|
NTP_SUCCESS=0
|
|
for NTP_SERVER in $NTP_SERVERS; do
|
|
set +e
|
|
NTPDATE_OUT=$(_run_ntp_sync $NTP_SERVER 2>&1)
|
|
NTPDATE_EXIT=$?
|
|
set -e
|
|
if [[ "$NTPDATE_EXIT" == "0" ]];then
|
|
NTP_SUCCESS=1
|
|
break
|
|
else
|
|
NTPDATE_OUT_FULL="$NTPDATE_OUT_FULL $NTPDATE_OUT"
|
|
fi
|
|
done
|
|
if [[ "$NTP_SUCCESS" == "0" ]];then
|
|
echo "FAILURE"
|
|
echo "$NTPDATE_OUT_FULL"
|
|
exit 1
|
|
fi
|
|
echo "SUCCESS"
|
|
fi
|
|
}
|
|
|
|
ping_default_gateways
|
|
ping_controller_ips "$ping_test_ips"
|
|
if [[ $validate_fqdn == "True" ]];then
|
|
fqdn_check
|
|
fi
|
|
if [[ $validate_ntp == "True" ]];then
|
|
ntp_check
|
|
fi
|