32 lines
969 B
Bash
32 lines
969 B
Bash
#!/bin/sh
|
|||
|
|
# Drives traffic from a Site-B client to the anycast address and shows which
|
||
|
|
# A-node (a1/a2/a3) answered each request, demonstrating ECMP distribution.
|
||
|
|
# Usage: scripts/traffic-test.sh [client] [request-count]
|
||
|
|
set -e
|
||
|
|
cd "$(dirname "$0")/.."
|
||
|
|
|
||
|
|
CLIENT="${1:-c1}"
|
||
|
|
COUNT="${2:-20}"
|
||
|
|
DST="10.200.200.1"
|
||
|
|
|
||
|
|
echo "==== $CLIENT: ping $DST ===="
|
||
|
|
docker compose exec -T "$CLIENT" ping -c 4 "$DST"
|
||
|
|
|
||
|
|
echo
|
||
|
|
echo "==== $CLIENT: traceroute $DST ===="
|
||
|
|
docker compose exec -T "$CLIENT" traceroute -n -m 5 "$DST" 2>&1 || true
|
||
|
|
|
||
|
|
echo
|
||
|
|
echo "==== $CLIENT: $COUNT requests to http://$DST, varying source port (ECMP hash input) ===="
|
||
|
|
RESULTS=$(docker compose exec -T "$CLIENT" sh -c '
|
||
|
|
for i in $(seq 1 '"$COUNT"'); do
|
||
|
|
port=$((30000 + i))
|
||
|
|
node=$(curl -s --local-port "$port" --max-time 3 "http://'"$DST"'/" || echo "no-answer")
|
||
|
|
echo "req $i (src-port $port) -> $node"
|
||
|
|
done
|
||
|
|
')
|
||
|
|
echo "$RESULTS"
|
||
|
|
|
||
|
|
echo
|
||
|
|
echo "Distribution:"
|
||
|
|
echo "$RESULTS" | awk '{print $NF}' | sort | uniq -c
|