On Thu, Nov 20, 2025 at 09:44:45PM -0800, Bobby Eshleman wrote:
From: Bobby Eshleman bobbyeshleman@meta.com
Add tests that validate vsock sockets are resilient to deleting namespaces or changing namespace modes from global to local. The vsock sockets should still function normally.
The function check_ns_changes_dont_break_connection() is added to re-use the step-by-step logic of 1) setup connections, 2) do something that would maybe break the connections, 3) check that the connections are still ok.
Signed-off-by: Bobby Eshleman bobbyeshleman@meta.com
Changes in v11:
- remove pipefile (Stefano)
Changes in v9:
- more consistent shell style
- clarify -u usage comment for pipefile
tools/testing/selftests/vsock/vmtest.sh | 119 ++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+)
Reviewed-by: Stefano Garzarella sgarzare@redhat.com
diff --git a/tools/testing/selftests/vsock/vmtest.sh b/tools/testing/selftests/vsock/vmtest.sh index dfa895abfc7f..5f0b24845fad 100755 --- a/tools/testing/selftests/vsock/vmtest.sh +++ b/tools/testing/selftests/vsock/vmtest.sh @@ -69,6 +69,12 @@ readonly TEST_NAMES=( ns_same_local_loopback_ok ns_same_local_host_connect_to_local_vm_ok ns_same_local_vm_connect_to_local_host_ok
- ns_mode_change_connection_continue_vm_ok
- ns_mode_change_connection_continue_host_ok
- ns_mode_change_connection_continue_both_ok
- ns_delete_vm_ok
- ns_delete_host_ok
- ns_delete_both_ok
) readonly TEST_DESCS=( # vm_server_host_client @@ -139,6 +145,24 @@ readonly TEST_DESCS=(
# ns_same_local_vm_connect_to_local_host_ok "Run vsock_test client in VM in a local ns with server in same ns."
- # ns_mode_change_connection_continue_vm_ok
- "Check that changing NS mode of VM namespace from global to local after a connection is established doesn't break the connection"
- # ns_mode_change_connection_continue_host_ok
- "Check that changing NS mode of host namespace from global to local after a connection is established doesn't break the connection"
- # ns_mode_change_connection_continue_both_ok
- "Check that changing NS mode of host and VM namespaces from global to local after a connection is established doesn't break the connection"
- # ns_delete_vm_ok
- "Check that deleting the VM's namespace does not break the socket connection"
- # ns_delete_host_ok
- "Check that deleting the host's namespace does not break the socket connection"
- # ns_delete_both_ok
- "Check that deleting the VM and host's namespaces does not break the socket connection"
)
readonly USE_SHARED_VM=( @@ -1288,6 +1312,101 @@ test_ns_vm_local_mode_rejected() { return "${KSFT_PASS}" }
+check_ns_changes_dont_break_connection() {
- local pipefile pidfile outfile
- local ns0="global0"
- local ns1="global1"
- local port=12345
- local pids=()
- local rc=0
- init_namespaces
- pidfile="$(create_pidfile)"
- if ! vm_start "${pidfile}" "${ns0}"; then
return "${KSFT_FAIL}"- fi
- vm_wait_for_ssh "${ns0}"
- outfile=$(mktemp)
- vm_ssh "${ns0}" -- \
socat VSOCK-LISTEN:"${port}",fork STDOUT > "${outfile}" 2>/dev/null &- pids+=($!)
- vm_wait_for_listener "${ns0}" "${port}" "vsock"
- # We use a pipe here so that we can echo into the pipe instead of using
- # socat and a unix socket file. We just need a name for the pipe (not a
- # regular file) so use -u.
- pipefile=$(mktemp -u /tmp/vmtest_pipe_XXXX)
- ip netns exec "${ns1}" \
socat PIPE:"${pipefile}" VSOCK-CONNECT:"${VSOCK_CID}":"${port}" &- pids+=($!)
- timeout "${WAIT_PERIOD}" \
bash -c 'while [[ ! -e '"${pipefile}"' ]]; do sleep 1; done; exit 0'- if [[ $2 == "delete" ]]; then
if [[ "$1" == "vm" ]]; thenip netns del "${ns0}"elif [[ "$1" == "host" ]]; thenip netns del "${ns1}"elif [[ "$1" == "both" ]]; thenip netns del "${ns0}"ip netns del "${ns1}"fi- elif [[ $2 == "change_mode" ]]; then
if [[ "$1" == "vm" ]]; thenns_set_mode "${ns0}" "local"elif [[ "$1" == "host" ]]; thenns_set_mode "${ns1}" "local"elif [[ "$1" == "both" ]]; thenns_set_mode "${ns0}" "local"ns_set_mode "${ns1}" "local"fi- fi
- echo "TEST" > "${pipefile}"
- timeout "${WAIT_PERIOD}" \
bash -c 'while [[ ! -s '"${outfile}"' ]]; do sleep 1; done; exit 0'- if grep -q "TEST" "${outfile}"; then
rc="${KSFT_PASS}"- else
rc="${KSFT_FAIL}"- fi
- terminate_pidfiles "${pidfile}"
- terminate_pids "${pids[@]}"
- rm -f "${outfile}" "${pipefile}"
- return "${rc}"
+}
+test_ns_mode_change_connection_continue_vm_ok() {
- check_ns_changes_dont_break_connection "vm" "change_mode"
+}
+test_ns_mode_change_connection_continue_host_ok() {
- check_ns_changes_dont_break_connection "host" "change_mode"
+}
+test_ns_mode_change_connection_continue_both_ok() {
- check_ns_changes_dont_break_connection "both" "change_mode"
+}
+test_ns_delete_vm_ok() {
- check_ns_changes_dont_break_connection "vm" "delete"
+}
+test_ns_delete_host_ok() {
- check_ns_changes_dont_break_connection "host" "delete"
+}
+test_ns_delete_both_ok() {
- check_ns_changes_dont_break_connection "both" "delete"
+}
shared_vm_test() { local tname
-- 2.47.3