Message ID | 20231130040105.1265779-2-liuhangbin@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 25ae948b447881bf689d459cd5bd4629d9c04b20 |
Headers | show |
Series | Conver net selftests to run in unique namespace (Part 1) | expand |
Hangbin Liu <liuhangbin@gmail.com> writes: > Add a lib.sh for net selftests. This file can be used to define commonly > used variables and functions. Some commonly used functions can be moved > from forwarding/lib.sh to this lib file. e.g. busywait(). > > Add function setup_ns() for user to create unique namespaces with given > prefix name. > > Signed-off-by: Hangbin Liu <liuhangbin@gmail.com> LGTM. I took it for a spin with a couple tests that we use for mlxsw, mainly to make sure the "source ../lib.sh" bit works when invoking tests from other directories. All seems fine. Reviewed-by: Petr Machata <petrm@nvidia.com>
On Thu, Nov 30, 2023 at 12:01 PM Hangbin Liu <liuhangbin@gmail.com> wrote: > > Add a lib.sh for net selftests. This file can be used to define commonly > used variables and functions. Some commonly used functions can be moved > from forwarding/lib.sh to this lib file. e.g. busywait(). > > Add function setup_ns() for user to create unique namespaces with given > prefix name. > > Signed-off-by: Hangbin Liu <liuhangbin@gmail.com> > --- > tools/testing/selftests/net/Makefile | 2 +- > tools/testing/selftests/net/forwarding/lib.sh | 27 +----- > tools/testing/selftests/net/lib.sh | 85 +++++++++++++++++++ > 3 files changed, 87 insertions(+), 27 deletions(-) > create mode 100644 tools/testing/selftests/net/lib.sh > > diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile > index 9274edfb76ff..14bd68da7466 100644 > --- a/tools/testing/selftests/net/Makefile > +++ b/tools/testing/selftests/net/Makefile > @@ -54,7 +54,7 @@ TEST_PROGS += ip_local_port_range.sh > TEST_PROGS += rps_default_mask.sh > TEST_PROGS += big_tcp.sh > TEST_PROGS_EXTENDED := in_netns.sh setup_loopback.sh setup_veth.sh > -TEST_PROGS_EXTENDED += toeplitz_client.sh toeplitz.sh > +TEST_PROGS_EXTENDED += toeplitz_client.sh toeplitz.sh lib.sh > TEST_GEN_FILES = socket nettest > TEST_GEN_FILES += psock_fanout psock_tpacket msg_zerocopy reuseport_addr_any > TEST_GEN_FILES += tcp_mmap tcp_inq psock_snd txring_overwrite > diff --git a/tools/testing/selftests/net/forwarding/lib.sh b/tools/testing/selftests/net/forwarding/lib.sh > index e37a15eda6c2..8f6ca458af9a 100755 > --- a/tools/testing/selftests/net/forwarding/lib.sh > +++ b/tools/testing/selftests/net/forwarding/lib.sh > @@ -4,9 +4,6 @@ > ############################################################################## > # Defines > > -# Kselftest framework requirement - SKIP code is 4. > -ksft_skip=4 > - > # Can be overridden by the configuration file. > PING=${PING:=ping} > PING6=${PING6:=ping6} > @@ -41,6 +38,7 @@ if [[ -f $relative_path/forwarding.config ]]; then > source "$relative_path/forwarding.config" > fi > > +source ../lib.sh > ############################################################################## > # Sanity checks > > @@ -395,29 +393,6 @@ log_info() > echo "INFO: $msg" > } > > -busywait() > -{ > - local timeout=$1; shift > - > - local start_time="$(date -u +%s%3N)" > - while true > - do > - local out > - out=$("$@") > - local ret=$? > - if ((!ret)); then > - echo -n "$out" > - return 0 > - fi > - > - local current_time="$(date -u +%s%3N)" > - if ((current_time - start_time > timeout)); then > - echo -n "$out" > - return 1 > - fi > - done > -} > - > not() > { > "$@" > diff --git a/tools/testing/selftests/net/lib.sh b/tools/testing/selftests/net/lib.sh > new file mode 100644 > index 000000000000..518eca57b815 > --- /dev/null > +++ b/tools/testing/selftests/net/lib.sh > @@ -0,0 +1,85 @@ > +#!/bin/bash > +# SPDX-License-Identifier: GPL-2.0 > + > +############################################################################## > +# Defines > + > +# Kselftest framework requirement - SKIP code is 4. > +ksft_skip=4 > + > +############################################################################## > +# Helpers > +busywait() > +{ > + local timeout=$1; shift > + > + local start_time="$(date -u +%s%3N)" > + while true > + do > + local out > + out=$("$@") > + local ret=$? > + if ((!ret)); then > + echo -n "$out" > + return 0 > + fi > + > + local current_time="$(date -u +%s%3N)" > + if ((current_time - start_time > timeout)); then > + echo -n "$out" > + return 1 > + fi > + done > +} > + > +cleanup_ns() > +{ > + local ns="" > + local errexit=0 > + local ret=0 > + > + # disable errexit temporary > + if [[ $- =~ "e" ]]; then > + errexit=1 > + set +e > + fi > + > + for ns in "$@"; do > + ip netns delete "${ns}" &> /dev/null > + if ! busywait 2 ip netns list \| grep -vq "^$ns$" &> /dev/null; then > + echo "Warn: Failed to remove namespace $ns" > + ret=1 > + fi > + done > + > + [ $errexit -eq 1 ] && set -e > + return $ret > +} > + > +# setup netns with given names as prefix. e.g > +# setup_ns local remote > +setup_ns() > +{ > + local ns="" > + local ns_name="" > + local ns_list="" > + for ns_name in "$@"; do > + # Some test may setup/remove same netns multi times > + if unset ${ns_name} 2> /dev/null; then > + ns="${ns_name,,}-$(mktemp -u XXXXXX)" > + eval readonly ${ns_name}="$ns" > + else > + eval ns='$'${ns_name} > + cleanup_ns "$ns" > + > + fi > + > + if ! ip netns add "$ns"; then > + echo "Failed to create namespace $ns_name" > + cleanup_ns "$ns_list" > + return $ksft_skip > + fi > + ip -n "$ns" link set lo up I got this patchset tested the result is looking good. However it seems that not all of the tests require this loopback bring up, e.g. * arp_ndisc_untracked_subnets.sh * cmsg_ipv6.sh * cmsg_so_mark.sh * cmsg_time.sh * drop_monitor_tests.sh * icmp.sh * ndisc_unsolicited_na_test.sh * sctp_vrf.sh * unicast_extensions.sh A possible solution could be adding an extra flag to setup_ns(), bring lo up on demand. Not sure if this is needed, as I can't think of possible impacts of this for the moment. (Maybe a test does not require loopback device in such state?) Other might be able to provide some feedback about this. > + ns_list="$ns_list $ns" > + done > +} > -- > 2.41.0 >
On Fri, Dec 01, 2023 at 01:56:51PM +0800, Po-Hsu Lin wrote: > > +# setup netns with given names as prefix. e.g > > +# setup_ns local remote > > +setup_ns() > > +{ > > + local ns="" > > + local ns_name="" > > + local ns_list="" > > + for ns_name in "$@"; do > > + # Some test may setup/remove same netns multi times > > + if unset ${ns_name} 2> /dev/null; then > > + ns="${ns_name,,}-$(mktemp -u XXXXXX)" > > + eval readonly ${ns_name}="$ns" > > + else > > + eval ns='$'${ns_name} > > + cleanup_ns "$ns" > > + > > + fi > > + > > + if ! ip netns add "$ns"; then > > + echo "Failed to create namespace $ns_name" > > + cleanup_ns "$ns_list" > > + return $ksft_skip > > + fi > > + ip -n "$ns" link set lo up > I got this patchset tested the result is looking good. However it > seems that not all of the tests require this loopback bring up, e.g. > * arp_ndisc_untracked_subnets.sh > * cmsg_ipv6.sh > * cmsg_so_mark.sh > * cmsg_time.sh > * drop_monitor_tests.sh > * icmp.sh > * ndisc_unsolicited_na_test.sh > * sctp_vrf.sh > * unicast_extensions.sh > > A possible solution could be adding an extra flag to setup_ns(), bring > lo up on demand. > > Not sure if this is needed, as I can't think of possible impacts of > this for the moment. > (Maybe a test does not require loopback device in such state?) > Other might be able to provide some feedback about this. Yes, I also can't think of impact of set lo up. So I just do it explicit. If someone could help find out the impact, I can add a flag for this function. Thanks Hangbin
diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile index 9274edfb76ff..14bd68da7466 100644 --- a/tools/testing/selftests/net/Makefile +++ b/tools/testing/selftests/net/Makefile @@ -54,7 +54,7 @@ TEST_PROGS += ip_local_port_range.sh TEST_PROGS += rps_default_mask.sh TEST_PROGS += big_tcp.sh TEST_PROGS_EXTENDED := in_netns.sh setup_loopback.sh setup_veth.sh -TEST_PROGS_EXTENDED += toeplitz_client.sh toeplitz.sh +TEST_PROGS_EXTENDED += toeplitz_client.sh toeplitz.sh lib.sh TEST_GEN_FILES = socket nettest TEST_GEN_FILES += psock_fanout psock_tpacket msg_zerocopy reuseport_addr_any TEST_GEN_FILES += tcp_mmap tcp_inq psock_snd txring_overwrite diff --git a/tools/testing/selftests/net/forwarding/lib.sh b/tools/testing/selftests/net/forwarding/lib.sh index e37a15eda6c2..8f6ca458af9a 100755 --- a/tools/testing/selftests/net/forwarding/lib.sh +++ b/tools/testing/selftests/net/forwarding/lib.sh @@ -4,9 +4,6 @@ ############################################################################## # Defines -# Kselftest framework requirement - SKIP code is 4. -ksft_skip=4 - # Can be overridden by the configuration file. PING=${PING:=ping} PING6=${PING6:=ping6} @@ -41,6 +38,7 @@ if [[ -f $relative_path/forwarding.config ]]; then source "$relative_path/forwarding.config" fi +source ../lib.sh ############################################################################## # Sanity checks @@ -395,29 +393,6 @@ log_info() echo "INFO: $msg" } -busywait() -{ - local timeout=$1; shift - - local start_time="$(date -u +%s%3N)" - while true - do - local out - out=$("$@") - local ret=$? - if ((!ret)); then - echo -n "$out" - return 0 - fi - - local current_time="$(date -u +%s%3N)" - if ((current_time - start_time > timeout)); then - echo -n "$out" - return 1 - fi - done -} - not() { "$@" diff --git a/tools/testing/selftests/net/lib.sh b/tools/testing/selftests/net/lib.sh new file mode 100644 index 000000000000..518eca57b815 --- /dev/null +++ b/tools/testing/selftests/net/lib.sh @@ -0,0 +1,85 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +############################################################################## +# Defines + +# Kselftest framework requirement - SKIP code is 4. +ksft_skip=4 + +############################################################################## +# Helpers +busywait() +{ + local timeout=$1; shift + + local start_time="$(date -u +%s%3N)" + while true + do + local out + out=$("$@") + local ret=$? + if ((!ret)); then + echo -n "$out" + return 0 + fi + + local current_time="$(date -u +%s%3N)" + if ((current_time - start_time > timeout)); then + echo -n "$out" + return 1 + fi + done +} + +cleanup_ns() +{ + local ns="" + local errexit=0 + local ret=0 + + # disable errexit temporary + if [[ $- =~ "e" ]]; then + errexit=1 + set +e + fi + + for ns in "$@"; do + ip netns delete "${ns}" &> /dev/null + if ! busywait 2 ip netns list \| grep -vq "^$ns$" &> /dev/null; then + echo "Warn: Failed to remove namespace $ns" + ret=1 + fi + done + + [ $errexit -eq 1 ] && set -e + return $ret +} + +# setup netns with given names as prefix. e.g +# setup_ns local remote +setup_ns() +{ + local ns="" + local ns_name="" + local ns_list="" + for ns_name in "$@"; do + # Some test may setup/remove same netns multi times + if unset ${ns_name} 2> /dev/null; then + ns="${ns_name,,}-$(mktemp -u XXXXXX)" + eval readonly ${ns_name}="$ns" + else + eval ns='$'${ns_name} + cleanup_ns "$ns" + + fi + + if ! ip netns add "$ns"; then + echo "Failed to create namespace $ns_name" + cleanup_ns "$ns_list" + return $ksft_skip + fi + ip -n "$ns" link set lo up + ns_list="$ns_list $ns" + done +}
Add a lib.sh for net selftests. This file can be used to define commonly used variables and functions. Some commonly used functions can be moved from forwarding/lib.sh to this lib file. e.g. busywait(). Add function setup_ns() for user to create unique namespaces with given prefix name. Signed-off-by: Hangbin Liu <liuhangbin@gmail.com> --- tools/testing/selftests/net/Makefile | 2 +- tools/testing/selftests/net/forwarding/lib.sh | 27 +----- tools/testing/selftests/net/lib.sh | 85 +++++++++++++++++++ 3 files changed, 87 insertions(+), 27 deletions(-) create mode 100644 tools/testing/selftests/net/lib.sh