linuxkit/test/pkg/ns/runp-runc-net.sh
Rolf Neugebauer 4c74def5c0 tests: Update the netns test package to use runc and rename it to ns
The previous version just created a network name space which does
not allow us to also test additional namespaces, e.g. for unix
domain sockets.

This commit uses runc to create a fully namespaced container to
run a test in. It creates a container, configures the network
interfaces in the new network namespace before starting the
container.

A OCI config.json template is used and then customised for a
given test based on command line arguments.

Finally, instead of iperf, we use the socket stress test from
https://github.com/linuxkit/virtsock as it provides finer-grained
control over the traffic patterns (e.g. long lived vs lots of
short lived connections).

Signed-off-by: Rolf Neugebauer <rolf.neugebauer@docker.com>
2017-07-25 17:31:32 +01:00

192 lines
8.0 KiB
Bash

#!/bin/sh
# This script runs multiple runc-net.sh scripts in parallel. It either
# runs identical versions of runc-net.sh with the arguments supplied
# or a number of pre-defined.
ITER=$1
shift
rm -rf ./logs
mkdir -p ./logs
fail() {
for f in ./logs/*; do
echo
echo "=== $f ==="
cat "$f"
done
echo
dmesg
echo "Test FAILED with $1"
exit 1
}
pids=""
case "$ITER" in
"mix")
echo "Running a mix /runc-net.sh with servers in containers"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 4 -s > ./logs/01.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 4 -s > ./logs/02.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 6 -s > ./logs/03.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 6 -s > ./logs/04.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p unix -s > ./logs/05.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 4 > ./logs/06.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 4 > ./logs/07.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 6 > ./logs/08.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 6 > ./logs/09.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p unix > ./logs/10.log 2>&1 &
pid=$!; pids="$pids $pid"
;;
"mix-reverse")
echo "Running a mix /runc-net.sh with clients in containers"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 4 -s -r > ./logs/01.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 4 -s -r > ./logs/02.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 6 -s -r > ./logs/03.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 6 -s -r > ./logs/04.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p unix -s -r > ./logs/05.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 4 -r > ./logs/06.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 4 -r > ./logs/07.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 6 -r > ./logs/08.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 6 -r > ./logs/09.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p unix -r > ./logs/10.log 2>&1 &
pid=$!; pids="$pids $pid"
;;
"mix-ipv4")
echo "Running a mix /runc-net.sh tests with IPv4 only"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 4 -s > ./logs/01.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 4 -s > ./logs/02.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 4 -s -r > ./logs/03.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 4 -s -r > ./logs/04.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 4 > ./logs/05.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 4 > ./logs/06.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 4 -r > ./logs/07.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 4 -r > ./logs/08.log 2>&1 &
pid=$!; pids="$pids $pid"
;;
"mix-ipv6")
echo "Running a mix /runc-net.sh tests with IPv6 only"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 6 -s > ./logs/01.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 6 -s > ./logs/02.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 6 -s -r > ./logs/03.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 6 -s -r > ./logs/04.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 6 > ./logs/05.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 6 > ./logs/06.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 6 -r > ./logs/07.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 6 -r > ./logs/08.log 2>&1 &
pid=$!; pids="$pids $pid"
;;
"mix-tcp")
echo "Running a mix /runc-net.sh tests with TCP only"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 4 -s > ./logs/01.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 4 -s -r > ./logs/02.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 4 > ./logs/03.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 4 -r > ./logs/04.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 6 -s > ./logs/01.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 6 -s -r > ./logs/02.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 6 > ./logs/03.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p tcp -ip 6 -r > ./logs/04.log 2>&1 &
pid=$!; pids="$pids $pid"
;;
"mix-udp")
echo "Running a mix /runc-net.sh tests with UDP only"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 4 -s > ./logs/01.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 4 -s -r > ./logs/02.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 4 > ./logs/03.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 4 -r > ./logs/04.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 6 -s > ./logs/01.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 6 -s -r > ./logs/02.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 6 > ./logs/03.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p udp -ip 6 -r > ./logs/04.log 2>&1 &
pid=$!; pids="$pids $pid"
;;
"mix-unix")
echo "Running a mix /runc-net.sh tests with unix domain sockets"
/runc-net.sh -i 30 -l 10 -c 5 -p unix -s > ./logs/01.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p unix > ./logs/02.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p unix -s -r > ./logs/03.log 2>&1 &
pid=$!; pids="$pids $pid"
/runc-net.sh -i 30 -l 10 -c 5 -p unix -r > ./logs/04.log 2>&1 &
pid=$!; pids="$pids $pid"
;;
*)
echo "Running $ITER instances of /runc-net.sh $@"
for i in $(seq 1 "$ITER"); do
/runc-net.sh $@ > "./logs/$1-$i.log" &
pid=$!; pids="$pids $pid"
echo "Test $i started with PID=$pid"
done
;;
esac
for pid in $pids; do
wait "$pid"
[ $? -eq 0 ] || fail "$pid return non-zero"
done
dmesg | grep -q 'Call Trace:' && fail "Kernel backtrace"
# A message like:
# unregister_netdevice: waiting for lo to become free. Usage count = 1
# is somewhat benign as it just waits for the ref count to go to 0. However
# it may become a problem if we have to many of them
nd=$(dmesg | grep -q 'unregister_netdevice' | wc -l)
[ "$nd" -gt 10 ] && fail "unregister_netdevice more than 10 times"
echo "netns test suite PASSED"