Re: [PATCH net-next v3 2/9] selftests: net: add helpers for running a command on other targets

From: Petr Machata

Date: Fri Mar 20 2026 - 07:16:28 EST



Ioana Ciornei <ioana.ciornei@xxxxxxx> writes:

> Add a couple of helpers which can be used by tests which need to run a
> specific bash command on a different target than the local system, be it
> either another netns or a remote system accessible through ssh.
>
> The run_cmd() function decides where to execute the command passed
> through $@ based on the env variable TARGET value while run_on() will
> receive the target through its first argument.
>
> Signed-off-by: Ioana Ciornei <ioana.ciornei@xxxxxxx>
> ---
> Changes in v3:
> - s/TARGET/CUR_TARGET
> - always fallback on running a command locally when either TARGETS is
> not declared or there is no entry for a specific interface
> Changes in v2:
> - patch is new
>
> tools/testing/selftests/net/lib.sh | 39 ++++++++++++++++++++++++++++++
> 1 file changed, 39 insertions(+)
>
> diff --git a/tools/testing/selftests/net/lib.sh b/tools/testing/selftests/net/lib.sh
> index b40694573f4c..f7c54d05758e 100644
> --- a/tools/testing/selftests/net/lib.sh
> +++ b/tools/testing/selftests/net/lib.sh
> @@ -28,6 +28,10 @@ EXIT_STATUS=0
> # Per-test return value. Clear at the beginning of each test.
> RET=0
>
> +# If a specific command needs to be executed on another target than local, set
> +# this appropriately before calling run_cmd
> +CUR_TARGET="local:"
> +

These are new functions, they should just expose these parameters as
actual function parameters, not as hidden environment. If it is
desirable that run_cmd() can run local commands, maybe it makes sense to
make the current run_cmd() a helper like __run_cmd(), which takes the
remote-config parameter, and have run_cmd() be a wrapper:

run_cmd()
{
__run_cmd local: "$@"
}

> ##############################################################################
> # Helpers
>
> @@ -670,3 +674,38 @@ cmd_jq()
> # return success only in case of non-empty output
> [ ! -z "$output" ]
> }
> +
> +run_cmd()
> +{
> + IFS=':' read -r type args <<< "$CUR_TARGET"
> +
> + case "$type" in
> + netns)
> + # Execute command in network namespace
> + # args contains the namespace name
> + ip netns exec "$args" "$@"
> + ;;
> + ssh)
> + # Execute command via SSH args contains user@host
> + ssh -n "$args" "$@"
> + ;;
> + local|*)
> + # Execute command locally. This is also the fallback
> + # case in case the CUR_TARGET is not set.
> + "$@"
> + ;;
> + esac
> +}
> +
> +run_on()
> +{
> + local iface=$1; shift
> +
> + if declare -p TARGETS &>/dev/null; then
> + CUR_TARGET="${TARGETS[$iface]}"
> + else
> + CUR_TARGET="local:"
> + fi
> +
> + run_cmd "$@"
> +}