#!/bin/bash # SPDX-License-Identifier: MIT # # Copyright 2018 Network Device Education Foundation, Inc. ("NetDEF") set -e if [[ "$1" = "-h" ]] || [[ "$1" = "--help" ]]; then cat >&2 <<-EOF This script runs the FRRouting topotests on the FRR tree in the current working directory. Usage: $0 [args...] If any arguments are provided and the first argument starts with / or ./ the arguments are interpreted as command and will be executed instead of pytest. Behavior can be further modified by the following environment variables: TOPOTEST_AUTOLOAD If set to 1, the script will try to load necessary kernel modules without asking for confirmation first. TOPOTEST_NOLOAD If set to 1, don't try to load necessary kernel modules and don't even ask. TOPOTEST_BUILDCACHE Docker volume used for caching multiple FRR builds over container runs. By default a \`topotest-buildcache\` volume will be created for that purpose. TOPOTEST_CLEAN Clean all previous build artifacts prior to building. Disabled by default, set to 1 to enable. TOPOTEST_DOC Build the documentation associated with FRR. Disabled by default, set to 1 to enable. TOPOTEST_FRR If set, don't test the FRR in the current working directory, but the one at the given path. TOPOTEST_LOGS If set, don't use \`/tmp/topotest_logs\` directory but use the provided path instead. TOPOTEST_OPTIONS These options are appended to the docker-run command for starting the tests. TOPOTEST_PULL If set to 0, don't try to pull the most recent version of the docker image from dockerhub. TOPOTEST_SANITIZER Controls whether to use the address sanitizer. Enabled by default, set to 0 to disable. TOPOTEST_VERBOSE Show detailed build output. Enabled by default, set to 0 to disable. EOF exit 1 fi # # These two modules are needed to run the MPLS tests. # They are often not automatically loaded. # # We cannot load them from the container since we don't # have host kernel modules available there. If we load # them from the host however, they can be used just fine. # export PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin" if [ "$TOPOTEST_NOLOAD" != "1" ]; then for module in mpls-router mpls-iptunnel; do if modprobe -n $module 2> /dev/null; then : else # If the module doesn't exist, we cannot do anything about it continue fi if [ $(grep -c ${module/-/_} /proc/modules) -ne 0 ]; then # If the module is loaded, we don't have to do anything continue fi if [ "$TOPOTEST_AUTOLOAD" != "1" ]; then echo "To run all the possible tests, we need to load $module." echo -n "Do you want to proceed? [y/n] " read answer if [ x"$answer" != x"y" ]; then echo "Not loading." continue fi fi if [ x"$(whoami)" = x"root" ]; then modprobe $module else sudo modprobe $module fi done fi if [ -z "$TOPOTEST_LOGS" ]; then mkdir -p /tmp/topotest_logs TOPOTEST_LOGS="/tmp/topotest_logs" fi if [ -z "$TOPOTEST_FRR" ]; then TOPOTEST_FRR="$(git rev-parse --show-toplevel || true)" if [ -z "$TOPOTEST_FRR" ]; then echo "Could not determine base of FRR tree." >&2 echo "frr-topotests only works if you have your tree in git." >&2 exit 1 fi git -C "$TOPOTEST_FRR" ls-files -z > "${TOPOTEST_LOGS}/git-ls-files" fi if [ -z "$TOPOTEST_BUILDCACHE" ]; then TOPOTEST_BUILDCACHE=topotest-buildcache docker volume inspect "${TOPOTEST_BUILDCACHE}" &> /dev/null \ || docker volume create "${TOPOTEST_BUILDCACHE}" fi if [ "${TOPOTEST_PULL:-1}" = "1" ]; then docker pull frrouting/topotests:latest fi if [[ -n "$TMUX" ]]; then TMUX_OPTIONS="-v $(dirname $TMUX):$(dirname $TMUX) -e TMUX=$TMUX -e TMUX_PANE=$TMUX_PANE" fi if [[ -n "$STY" ]]; then SCREEN_OPTIONS="-v /run/screen:/run/screen -e STY=$STY" fi set -- --rm -i \ -v "$HOME:$HOME:ro" \ -v "$TOPOTEST_LOGS:/tmp" \ -v "$TOPOTEST_FRR:/root/host-frr:ro" \ -v "$TOPOTEST_BUILDCACHE:/root/persist" \ -e "TOPOTEST_CLEAN=$TOPOTEST_CLEAN" \ -e "TOPOTEST_VERBOSE=$TOPOTEST_VERBOSE" \ -e "TOPOTEST_DOC=$TOPOTEST_DOC" \ -e "TOPOTEST_SANITIZER=$TOPOTEST_SANITIZER" \ --privileged \ $SCREEN_OPTINS \ $TMUX_OPTIONS \ $TOPOTEST_OPTIONS \ frrouting/topotests:latest "$@" if [ -t 0 ]; then set -- -t "$@" fi exec docker run "$@"