summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/topotests/docker/motd.txt4
-rwxr-xr-xtests/topotests/docker/topotests_run.sh123
2 files changed, 103 insertions, 24 deletions
diff --git a/tests/topotests/docker/motd.txt b/tests/topotests/docker/motd.txt
index 1427fafcf..cb02540f5 100644
--- a/tests/topotests/docker/motd.txt
+++ b/tests/topotests/docker/motd.txt
@@ -14,7 +14,3 @@ Here are some useful tips:
* The topotests log directory can be found on your host machine on
`/tmp/topotests_logs`.
-
-* You may open an `xterm` inside the container. We do our best to detect
- the X session on your host machine
-
diff --git a/tests/topotests/docker/topotests_run.sh b/tests/topotests/docker/topotests_run.sh
index 07e9f28b2..8bca756b8 100755
--- a/tests/topotests/docker/topotests_run.sh
+++ b/tests/topotests/docker/topotests_run.sh
@@ -22,30 +22,113 @@
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
+set -e
-# Source folders
-FRR_DIR=$HOME/src/frr
-TOPOTESTS_DIR=$HOME/src/topotests
+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...]
+
+ Its behavior can be 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_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_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_PATH If set, don't use the tests built into the image
+ but the ones at the given path.
+
+ To get information about the commands available inside of the container,
+ run \`$0 help\`.
+ EOF
+ exit 1
+fi
+
+#
+# These two modules are needed to run the MPLS tests.
+# They are often not automatically loaded.
#
-# Script begin
+# 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.
#
-CMD=$1
-if [ -z $1 ]; then
- CMD=bash
+
+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
+
+if [ -z "$TOPOTEST_LOGS" ]; then
+ mkdir -p /tmp/topotest_logs
+ TOPOTEST_LOGS="/tmp/topotest_logs"
fi
-docker run --rm -ti \
- -v "/lib/modules:/lib/modules" \
- -v "/tmp/topotests_logs:/tmp" \
- -v "$FRR_DIR:/root/frr:ro" \
- -v "$TOPOTESTS_DIR:/root/topotests:ro" \
- -v "/tmp/.X11-unix:/tmp/.X11-unix" \
- -v "$HOME/.Xauthority:/root/.Xauthority" \
- -e DISPLAY=$DISPLAY \
- --net=host \
- --privileged \
- topotests
-
-exit 0
+if [ -z "$TOPOTEST_FRR" ]; then
+ TOPOTEST_FRR="$(pwd)"
+fi
+
+if [ -z "$TOPOTEST_BUILDCACHE" ]; then
+ TOPOTEST_BUILDCACHE=topotest-buildcache
+ docker volume inspect "${TOPOTEST_BUILDCACHE}" &> /dev/null \
+ || docker volume create "${TOPOTEST_BUILDCACHE}"
+fi
+
+if [ -z "$TOPOTEST_PATH" ]; then
+ docker run --rm -ti \
+ -v "$TOPOTEST_LOGS:/tmp" \
+ -v "$TOPOTEST_FRR:/root/frr:ro" \
+ -v "$TOPOTEST_BUILDCACHE:/root/frr-build" \
+ --privileged \
+ $TOPOTEST_OPTIONS \
+ frrouting/topotests "$@"
+else
+ docker run --rm -ti \
+ -v "$TOPOTEST_LOGS:/tmp" \
+ -v "$TOPOTEST_FRR:/root/frr:ro" \
+ -v "$TOPOTEST_BUILDCACHE:/root/frr-build" \
+ -v "$TOPOTEST_PATH:/root/topotests:ro" \
+ --privileged \
+ $TOPOTEST_OPTIONS \
+ frrouting/topotests "$@"
+fi