3 # Copyright 2018 Network Device Education Foundation, Inc. ("NetDEF")
5 # Permission is hereby granted, free of charge, to any person obtaining
6 # a copy of this software and associated documentation files (the
7 # "Software"), to deal in the Software without restriction, including
8 # without limitation the rights to use, copy, modify, merge, publish,
9 # distribute, sublicense, and/or sell copies of the Software, and to
10 # permit persons to whom the Software is furnished to do so, subject to
11 # the following conditions:
13 # The above copyright notice and this permission notice shall be
14 # included in all copies or substantial portions of the Software.
16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20 # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21 # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27 if [[ "$1" = "-h" ]] ||
[[ "$1" = "--help" ]]; then
30 This script runs the FRRouting topotests on the FRR tree
31 in the current working directory.
35 If any arguments are provided and the first argument starts with / or ./
36 the arguments are interpreted as command and will be executed instead
39 Behavior can be further modified by the following environment variables:
41 TOPOTEST_AUTOLOAD If set to 1, the script will try to load necessary
42 kernel modules without asking for confirmation first.
44 TOPOTEST_BUILDCACHE Docker volume used for caching multiple FRR builds
45 over container runs. By default a
46 \`topotest-buildcache\` volume will be created for
49 TOPOTEST_CLEAN Clean all previous build artifacts prior to
50 building. Disabled by default, set to 1 to enable.
52 TOPOTEST_DOC Build the documentation associated with FRR.
53 Disabled by default, set to 1 to enable.
55 TOPOTEST_FRR If set, don't test the FRR in the current working
56 directory, but the one at the given path.
58 TOPOTEST_LOGS If set, don't use \`/tmp/topotest_logs\` directory
59 but use the provided path instead.
61 TOPOTEST_OPTIONS These options are appended to the docker-run
62 command for starting the tests.
64 TOPOTEST_SANITIZER Controls whether to use the address sanitizer.
65 Enabled by default, set to 0 to disable.
67 TOPOTEST_VERBOSE Show detailed build output.
68 Enabled by default, set to 0 to disable.
75 # These two modules are needed to run the MPLS tests.
76 # They are often not automatically loaded.
78 # We cannot load them from the container since we don't
79 # have host kernel modules available there. If we load
80 # them from the host however, they can be used just fine.
83 export PATH
="$PATH:/sbin:/usr/sbin:/usr/local/sbin"
85 for module
in mpls-router mpls-iptunnel
; do
86 if modprobe
-n $module 2> /dev
/null
; then
89 # If the module doesn't exist, we cannot do anything about it
93 if [ $
(grep -c ${module/-/_} /proc
/modules
) -ne 0 ]; then
94 # If the module is loaded, we don't have to do anything
98 if [ "$TOPOTEST_AUTOLOAD" != "1" ]; then
99 echo "To run all the possible tests, we need to load $module."
100 echo -n "Do you want to proceed? [y/n] "
102 if [ x
"$answer" != x
"y" ]; then
108 if [ x
"$(whoami)" = x
"root" ]; then
111 sudo modprobe
$module
115 if [ -z "$TOPOTEST_LOGS" ]; then
116 mkdir
-p /tmp
/topotest_logs
117 TOPOTEST_LOGS
="/tmp/topotest_logs"
120 if [ -z "$TOPOTEST_FRR" ]; then
121 TOPOTEST_FRR
="$(git rev-parse --show-toplevel || true)"
122 if [ -z "$TOPOTEST_FRR" ]; then
123 echo "Could not determine base of FRR tree." >&2
124 echo "frr-topotests only works if you have your tree in git." >&2
129 if [ -z "$TOPOTEST_BUILDCACHE" ]; then
130 TOPOTEST_BUILDCACHE
=topotest-buildcache
131 docker volume inspect
"${TOPOTEST_BUILDCACHE}" &> /dev
/null \
132 || docker volume create
"${TOPOTEST_BUILDCACHE}"
136 -v "$TOPOTEST_LOGS:/tmp" \
137 -v "$TOPOTEST_FRR:/root/host-frr:ro" \
138 -v "$TOPOTEST_BUILDCACHE:/root/persist" \
139 -e "TOPOTEST_CLEAN=$TOPOTEST_CLEAN" \
140 -e "TOPOTEST_VERBOSE=$TOPOTEST_VERBOSE" \
141 -e "TOPOTEST_DOC=$TOPOTEST_DOC" \
142 -e "TOPOTEST_SANITIZER=$TOPOTEST_SANITIZER" \
145 frrouting
/frr
:topotests-latest
"$@"