1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
|
#!/bin/bash
set -ex
PROGRAM=$(basename "$0")
TARGET=${PROGRAM}
# The autopkgtests are run in throwaway environments, let's be good citizens
# regardless, and attempt to clean up any environment modifications.
function cleanup {
rc=$?
set +e
# Dump the log to console on error
if [ $rc -ne 0 ]; then
for logfile in ./_debian/tests/system-*-testsuite.log; do
printf "%s:\n" "$(basename "$logfile")"
cat "$logfile"
done
fi
if [ -L /usr/bin/nc ]; then
rm -f /usr/bin/nc
fi
# The DPDK test requires post-test cleanup steps.
if [ "$PROGRAM" = "dpdk" ]; then
mv /etc/dpdk/dpdk.conf.bak /etc/dpdk/dpdk.conf
systemctl restart dpdk
update-alternatives \
--set ovs-vswitchd \
/usr/lib/openvswitch-switch/ovs-vswitchd
fi
exit $rc
}
trap cleanup EXIT
# The OVS system test suite relies on behavior of the NMAP projects
# reimplementation of Netcat.
apt-get remove --yes --purge netcat-openbsd || true
ln -sf /usr/bin/ncat /usr/bin/nc
# The DPDK test requires preparing steps.
if [ "$PROGRAM" = "dpdk" ]; then
if [ ! -x /usr/lib/openvswitch-switch-dpdk/ovs-vswitchd-dpdk ]; then
echo "DPDK enabled binary not detected, SKIP test"
exit 77
fi
ARCH=$(dpkg --print-architecture)
echo "Check required features on arch: ${ARCH}"
case "${ARCH}" in
amd64)
# For amd64 the OVS DPDK support works with ssse3
# https://github.com/openvswitch/ovs/blob/8045c0f8de5192355ca438ed7eef77457c3c1625/acinclude.m4#LL441C52-L441C52
if ! grep -q '^flags.*sse3' /proc/cpuinfo; then
echo "Missing ssse3 on ${ARCH} - not supported, SKIP test"
exit 77
fi
;;
arm64)
if ! grep -q '^Features.*crc32' /proc/cpuinfo; then
echo "Missing crc32 on ${ARCH} - not supported, SKIP test"
exit 77
fi
;;
esac
echo "no known missing feature on ${ARCH}, continue test"
# Allocate hugepages, use 2M pages when possible because of higher
# probability of successful allocation at runtime and smaller test
# footprint in CI virtual machines.
#
# If the tests are to be run on real physical hardware, you may need
# to adjust these variables depending on CPU architecture and topology.
numa_node=$(lscpu | awk '/NUMA node\(s\)/{print$3}')
if [ -z "$numa_node" ] || [ "$numa_node" -eq 0 ]; then
numa_node=1
fi
case "${ARCH}" in
arm64)
# Avoid DPDK erroring out with "couldn't find suitable memseg_list"
# (LP: #2059400 and LP: #2063112).
DPDK_NR_1G_PAGES=${DPDK_NR_1G_PAGES:-$((numa_node * 3))}
# We need to allocate at least one 2M hugepage because the system
# default hugepagesize is most likely 2M and consequently what
# shows up in /proc/meminfo used by the test.
#
# https://github.com/ovn-org/ovn/blob/dc52bf70cb7e/tests/system-dpdk-macros.at#L18-L29
DPDK_NR_2M_PAGES=${DPDK_NR_2M_PAGES:-1}
;;
*)
DPDK_NR_1G_PAGES=${DPDK_NR_1G_PAGES:-0}
DPDK_NR_2M_PAGES=${DPDK_NR_2M_PAGES:-$((numa_node * (2667 + 512) / 2))}
;;
esac
printf "Determine hugepage allocation for %s NUMA Node(s) on arch: %s\n" \
"${numa_node}" "${ARCH}"
echo "DPDK_NR_2M_PAGES=${DPDK_NR_2M_PAGES}"
echo "DPDK_NR_1G_PAGES=${DPDK_NR_1G_PAGES}"
mv /etc/dpdk/dpdk.conf /etc/dpdk/dpdk.conf.bak
cat << EOF > /etc/dpdk/dpdk.conf
NR_1G_PAGES=${DPDK_NR_1G_PAGES}
NR_2M_PAGES=${DPDK_NR_2M_PAGES}
DROPCACHE_BEFORE_HP_ALLOC=1
EOF
systemctl restart dpdk
realhp_2m=$(cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages)
realhp_1g=$(cat /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages)
if [ "$realhp_2m" != "$DPDK_NR_2M_PAGES" ] || \
[ "$realhp_1g" != "$DPDK_NR_1G_PAGES" ]; then
echo "Unable to allocate huge pages required for the test, SKIP test"
exit 77
fi
# Point `ovs-vswitchd` at the DPDK enabled binary.
update-alternatives \
--set ovs-vswitchd \
/usr/lib/openvswitch-switch-dpdk/ovs-vswitchd-dpdk
fi
# Ensure none of the Open vSwitch daemons are running.
systemctl stop \
openvswitch-ipsec \
ovs-vswitchd \
ovsdb-server
# List of tests to run, an empty list means run all tests.
TEST_LIST=${TEST_LIST:-""}
# Run the testsuite.
#
# By not having paths from build directory in AUTOTEST_PATH, apart from
# `tests`, will ensure binaries are executed from system PATH, i.e. from the
# binary package under test, and not the built source tree.
#
# Note that the built testsuite artifacts are put under tests/ in the top level
# source directory regardless of the use of `make -C ...` in the package
# source. The testsuite's configuration (atlocal) is however placed in
# relation to the value of `-C`.
#
# We also cannot use `make` to invoke the testsuite, as we have removed the
# build dependencies, and `make` will notice the missing sytem headers.
#
# The sum of this leads to the invocation method below.
case "${TARGET}" in
dpdk)
# Check that the conditional build of debian/control works properly by
# including both DPDK and AFXDP tests for the DPDK enabled package.
testsuites="afxdp ${TARGET}"
;;
*)
testsuites=${TARGET}
;;
esac
for testsuite in ${testsuites}; do
test_list="${TEST_LIST}"
if [ -z "${test_list}" ] && \
stat -t debian/tests/"${testsuite}"-*skip-tests.txt; then
test_list=$(cat "debian/tests/${testsuite}-skip-tests.txt" \
"debian/tests/${testsuite}-${ARCH}-skip-tests.txt" \
2>/dev/null | debian/tests/testlist.py - \
"tests/system-${testsuite}-testsuite")
fi
set /bin/bash "tests/system-${testsuite}-testsuite" \
-C _debian/tests \
-j1 \
AUTOTEST_PATH="$(realpath ./tests)":"$(realpath ./_debian/tests)"
# We cannot double quote the test_list variable below as that would make
# bash put single quotes around it for empty test list, which autotest
# does not understand.
#
# shellcheck disable=SC2086
"$@" ${test_list} || "$@" --recheck
done
|