#!/bin/sh set -e INFIX_TEST=ghcr.io/kernelkit/infix-test:1.1 extract_yang() { local imgfile="$1" [ "$imgfile" ] || { true && return; } unsquashfs -q -n -f \ -d $envdir/yangdir \ "$imgfile" \ /usr/share/yang INFAMY_ARGS="$INFAMY_ARGS -y $envdir/yangdir" } start_topology() { local qenethdir="$1" local imgfile="$2" [ "$qenethdir" ] || { true && return; } rm -rf $envdir/qeneth cp -a "$qenethdir" $envdir/qeneth if [ "$imgfile" ]; then local imgname=$(basename "$imgfile") imgfile=$(readlink -f "$imgfile") ln -sf "$imgfile" $envdir/qeneth/"$imgname" fi (cd $envdir/qeneth/ && $qeneth generate && $qeneth start) INFAMY_ARGS="$INFAMY_ARGS $envdir/qeneth/topology.dot" cat <"$envdir/bin/qeneth" #!/bin/sh set -x cd $senvdir/qeneth && exec $testdir/qeneth/qeneth "\$@" EOF chmod +x "$envdir/bin/qeneth" } usage() { cat <] -f -q [...] test/env [] -C -f -t [...] Run in a pre-packaged container with all the packages required for running the test suite installed. Options: -C Don't containerize the command, run it directly in the current namespaces -f Infix image to test. YANG models from this image are extracted for use by Infamy. When starting a qeneth network, this image is used on all nodes. -h Show this help message -K Even if /dev/kvm is usable, do not map it the container. This is useful to see how tests will run in a CI setting, where KVM is typically not available -p Infix RAUC bundle to use for upgrade tests. -q Directory containing a topology.dot.in, suitable for consumption by qeneth. A copy of this network is created, and launched. The resulting topology is used as the default physical topology when running tests -t Rather than starting a qeneth network, attach to this existing topology. Mostly useful together with -C EOF } testdir=$(dirname $(readlink -f "$0")) ixdir=$(readlink -f "$testdir/..") logdir=$(readlink -f "$testdir/.log") envdir="$HOME/.infix-test-venv" qeneth="$testdir/qeneth/qeneth" # Global options containerize=yes [ -c /dev/kvm ] && kvm="--device=/dev/kvm" while getopts "Cf:hKp:q:t:" opt; do case ${opt} in C) containerize= ;; f) imgfile="$OPTARG" ;; h) usage && exit 0 ;; K) kvm= ;; p) INFAMY_ARGS="$INFAMY_ARGS -p $OPTARG" ;; q) qenethdir="$OPTARG" ;; t) topology="$OPTARG" ;; esac done if [ "$containerize" ]; then if which podman >/dev/null; then runner=podman elif which docker >/dev/null; then runner=docker else echo "Error: Neither podman nor docker is installed" exit 1 fi exec $runner run \ --cap-add=NET_ADMIN \ --device=/dev/net/tun \ --expose 9000-9050 \ --interactive \ --rm \ --security-opt seccomp=unconfined \ --sysctl net.ipv6.conf.all.disable_ipv6=0 \ --tty \ --volume "$ixdir":"$ixdir" \ --workdir $(pwd) \ $kvm \ $INFIX_TEST \ "$0" -C "$@" else if [ ! -f ~/.9pm.rc ]; then cat <<-EOF >~/.9pm.rc # Generated by Infix env SSH_OPTS: "-o StrictHostKeyChecking=no" LOG_PATH: "$logdir" EOF fi fi shift $((OPTIND - 1)) if [ $# -lt 1 ]; then usage && exit 1 fi . "$envdir/bin/activate" export PYTHONPATH="$testdir" extract_yang "$imgfile" start_topology "$qenethdir" "$imgfile" [ "$topology" ] && INFAMY_ARGS="$INFAMY_ARGS $topology" export INFAMY_ARGS exec "$@"