bbb3853486
Update this script to use 'set -e' for all commands except
the ping checks themselves which we allow to fail so we
can give enhanced output.
This resolves an issue where some commands could fail and cause
an undetectable error (the scripted exits with success) thus causing
a case where Heat won't detect any network errors at all. This
was recently the case with git commit 45be848
where we switched
to use python -c 'import ipaddr' which wasn't even installed as a
library on our overcloud nodes, thus causing all network validations
to silently fail.
Change-Id: I40ed6a537136e866357cc0d9304e905afdd28522
Depends-On: Ia617f44b4673b89202e5e5cdcac9b50f46b3e6c8
Related-bug: #1551048
55 lines
1.7 KiB
Bash
55 lines
1.7 KiB
Bash
#!/bin/bash
|
|
set -e
|
|
|
|
# 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")
|
|
ping=ping6
|
|
else
|
|
networks=$(ip r | grep -v default | cut -d " " -f 1)
|
|
ping=ping
|
|
fi
|
|
for LOCAL_NETWORK in $networks; do
|
|
in_network=$(python -c "import ipaddr; net=ipaddr.IPNetwork('$LOCAL_NETWORK'); addr=ipaddr.IPAddress('$REMOTE_IP'); print(addr in net)")
|
|
if [[ $in_network == "True" ]]; then
|
|
echo -n "Trying to ping $REMOTE_IP for local network $LOCAL_NETWORK..."
|
|
set +e
|
|
if ! $ping -W 300 -c 1 $REMOTE_IP &> /dev/null; 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 -c 1 $GW &> /dev/null; then
|
|
echo "FAILURE"
|
|
echo "$GW is not pingable."
|
|
exit 1
|
|
fi
|
|
done
|
|
set -e
|
|
echo "SUCCESS"
|
|
}
|
|
|
|
ping_controller_ips "$ping_test_ips"
|
|
ping_default_gateways
|