This gives more consistent test execution times, and also make image fetch failures more apparent and decoupled from the tests. We could *always* just run pull, but it's an expensive operation, so we check for the presence of the image first. The downside is that we could be running old images. That is not a problem on our CI infrastructure though since it spins up fresh VMs per for every tun.
187 lines
4.1 KiB
Bash
187 lines
4.1 KiB
Bash
# NB only to be sourced
|
|
|
|
set -e
|
|
|
|
# Protect against being sourced multiple times to prevent
|
|
# overwriting assert.sh global state
|
|
if ! [ -z "$SOURCED_CONFIG_SH" ]; then
|
|
return
|
|
fi
|
|
SOURCED_CONFIG_SH=true
|
|
|
|
# these ought to match what is in Vagrantfile
|
|
N_MACHINES=${N_MACHINES:-2}
|
|
IP_PREFIX=${IP_PREFIX:-192.168.48}
|
|
IP_SUFFIX_BASE=${IP_SUFFIX_BASE:-10}
|
|
|
|
if [ -z "$HOSTS" ] ; then
|
|
for i in $(seq 1 $N_MACHINES); do
|
|
IP="${IP_PREFIX}.$((${IP_SUFFIX_BASE}+$i))"
|
|
HOSTS="$HOSTS $IP"
|
|
done
|
|
fi
|
|
|
|
# these are used by the tests
|
|
HOST1=$(echo $HOSTS | cut -f 1 -d ' ')
|
|
HOST2=$(echo $HOSTS | cut -f 2 -d ' ')
|
|
|
|
. ./assert.sh
|
|
|
|
SSH=${SSH:-ssh -l vagrant -i ./insecure_private_key -o UserKnownHostsFile=./.ssh_known_hosts -o CheckHostIP=no -o StrictHostKeyChecking=no}
|
|
|
|
SMALL_IMAGE="gliderlabs/alpine"
|
|
DNS_IMAGE="aanand/docker-dnsutils"
|
|
TEST_IMAGES="$SMALL_IMAGE $DNS_IMAGE"
|
|
|
|
PING="ping -nq -W 1 -c 1"
|
|
CHECK_ETHWE_UP="grep ^1$ /sys/class/net/ethwe/carrier"
|
|
|
|
DOCKER_PORT=2375
|
|
|
|
WEAVEDNS_ARGS="--no-cache"
|
|
[ -n "$DEBUG" ] && WEAVEDNS_ARGS="$WEAVEDNS_ARGS --debug"
|
|
|
|
remote() {
|
|
rem=$1
|
|
shift 1
|
|
"$@" > >(while read line; do echo -e "\e[0;34m$rem>\e[0m $line"; done)
|
|
}
|
|
|
|
colourise() {
|
|
[ -t 0 ] && echo -ne '\e['$1'm' || true
|
|
shift
|
|
# It's important that we don't do this in a subshell, as some
|
|
# commands we execute need to modify global state
|
|
"$@"
|
|
[ -t 0 ] && echo -ne '\e[0m' || true
|
|
}
|
|
|
|
whitely() {
|
|
colourise '1;37' "$@"
|
|
}
|
|
|
|
greyly () {
|
|
colourise '0;37' "$@"
|
|
}
|
|
|
|
redly() {
|
|
colourise '1;31' "$@"
|
|
}
|
|
|
|
greenly() {
|
|
colourise '1;32' "$@"
|
|
}
|
|
|
|
run_on() {
|
|
host=$1
|
|
shift 1
|
|
[ -z "$DEBUG" ] || greyly echo "Running on $host: $@" >&2
|
|
remote $host $SSH $host "$@"
|
|
}
|
|
|
|
docker_on() {
|
|
host=$1
|
|
shift 1
|
|
[ -z "$DEBUG" ] || greyly echo "Docker on $host:$DOCKER_PORT: $@" >&2
|
|
docker -H tcp://$host:$DOCKER_PORT "$@"
|
|
}
|
|
|
|
proxy() {
|
|
DOCKER_PORT=12375 "$@"
|
|
}
|
|
|
|
weave_on() {
|
|
host=$1
|
|
shift 1
|
|
[ -z "$DEBUG" ] || greyly echo "Weave on $host:$DOCKER_PORT: $@" >&2
|
|
DOCKER_HOST=tcp://$host:$DOCKER_PORT $WEAVE "$@"
|
|
}
|
|
|
|
exec_on() {
|
|
host=$1
|
|
container=$2
|
|
shift 2
|
|
docker -H tcp://$host:$DOCKER_PORT exec $container "$@"
|
|
}
|
|
|
|
launch_dns_on() {
|
|
host=$1
|
|
shift 1
|
|
weave_on $host launch-dns $@ $WEAVEDNS_ARGS
|
|
}
|
|
|
|
start_container() {
|
|
host=$1
|
|
shift 1
|
|
weave_on $host run "$@" -t $SMALL_IMAGE /bin/sh
|
|
}
|
|
|
|
start_container_with_dns() {
|
|
host=$1
|
|
shift 1
|
|
weave_on $host run --with-dns "$@" -t $DNS_IMAGE /bin/sh
|
|
}
|
|
|
|
rm_containers() {
|
|
host=$1
|
|
shift
|
|
[ $# -eq 0 ] || docker_on $host rm -f "$@" >/dev/null
|
|
}
|
|
|
|
container_ip() {
|
|
weave_on $1 ps $2 | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
|
|
}
|
|
|
|
# assert_dns_record <host> <container> <name> [<ip> ...]
|
|
assert_dns_record() {
|
|
host=$1
|
|
container=$2
|
|
name=$3
|
|
shift 3
|
|
exp_ips_regex=$(echo "$@" | sed -r 's/ /\\\|/g')
|
|
|
|
[ -z "$DEBUG" ] || greyly echo "Checking whether $name exists at $host:$container"
|
|
assert_raises "exec_on $host $container getent hosts $name | grep -q '$exp_ips_regex'"
|
|
|
|
[ -z "$DEBUG" ] || greyly echo "Checking whether the IPs '$@' exists at $host:$container"
|
|
for ip in "$@" ; do
|
|
assert "exec_on $host $container getent hosts $ip | tr -s ' '" "$ip $name"
|
|
done
|
|
}
|
|
|
|
# assert_no_dns_record <host> <container> <name>
|
|
assert_no_dns_record() {
|
|
host=$1
|
|
container=$2
|
|
name=$3
|
|
|
|
[ -z "$DEBUG" ] || greyly echo "Checking if '$name' does not exist at $host:$container"
|
|
assert_raises "exec_on $host $container getent hosts $name" 2
|
|
}
|
|
|
|
# assert_dns_a_record <host> <container> <name> <ip>
|
|
assert_dns_a_record() {
|
|
assert "exec_on $1 $2 getent hosts $3 | tr -s ' '" "$4 $3"
|
|
}
|
|
|
|
# assert_dns_ptr_record <host> <container> <name> <ip>
|
|
assert_dns_ptr_record() {
|
|
assert "exec_on $1 $2 getent hosts $4 | tr -s ' '" "$4 $3"
|
|
}
|
|
|
|
start_suite() {
|
|
for host in $HOST1 $HOST2; do
|
|
[ -z "$DEBUG" ] || echo "Cleaning up on $host: removing all containers and resetting weave"
|
|
rm_containers $host $(docker_on $host ps -aq 2>/dev/null)
|
|
weave_on $host reset 2>/dev/null
|
|
done
|
|
whitely echo "$@"
|
|
}
|
|
|
|
end_suite() {
|
|
whitely assert_end
|
|
}
|
|
|
|
WEAVE=../weave
|
|
DOCKER_NS=./bin/docker-ns
|