Commit a382a342 authored by Bobby Eshleman's avatar Bobby Eshleman Committed by Paolo Abeni
Browse files

selftests/vsock: change tests to respect write-once child ns mode



The child_ns_mode sysctl parameter becomes write-once in a future patch
in this series, which breaks existing tests. This patch updates the
tests to respect this new policy. No additional tests are added.

Add "global-parent" and "local-parent" namespaces as intermediaries to
spawn namespaces in the given modes. This avoids the need to change
"child_ns_mode" in the init_ns. nsenter must be used because ip netns
unshares the mount namespace so nested "ip netns add" breaks exec calls
from the init ns. Adds nsenter to the deps check.

Reviewed-by: default avatarStefano Garzarella <sgarzare@redhat.com>
Signed-off-by: default avatarBobby Eshleman <bobbyeshleman@meta.com>
Link: https://patch.msgid.link/20260223-vsock-ns-write-once-v3-1-c0cde6959923@meta.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 97f87e57
Loading
Loading
Loading
Loading
+21 −20
Original line number Diff line number Diff line
@@ -210,16 +210,21 @@ check_result() {
}

add_namespaces() {
	local orig_mode
	orig_mode=$(cat /proc/sys/net/vsock/child_ns_mode)

	for mode in "${NS_MODES[@]}"; do
		echo "${mode}" > /proc/sys/net/vsock/child_ns_mode
		ip netns add "${mode}0" 2>/dev/null
		ip netns add "${mode}1" 2>/dev/null
	done

	echo "${orig_mode}" > /proc/sys/net/vsock/child_ns_mode
	ip netns add "global-parent" 2>/dev/null
	echo "global" | ip netns exec "global-parent" \
		tee /proc/sys/net/vsock/child_ns_mode &>/dev/null
	ip netns add "local-parent" 2>/dev/null
	echo "local" | ip netns exec "local-parent" \
		tee /proc/sys/net/vsock/child_ns_mode &>/dev/null

	nsenter --net=/var/run/netns/global-parent \
		ip netns add "global0" 2>/dev/null
	nsenter --net=/var/run/netns/global-parent \
		ip netns add "global1" 2>/dev/null
	nsenter --net=/var/run/netns/local-parent \
		ip netns add "local0" 2>/dev/null
	nsenter --net=/var/run/netns/local-parent \
		ip netns add "local1" 2>/dev/null
}

init_namespaces() {
@@ -237,6 +242,8 @@ del_namespaces() {
		log_host "removed ns ${mode}0"
		log_host "removed ns ${mode}1"
	done
	ip netns del "global-parent" &>/dev/null
	ip netns del "local-parent" &>/dev/null
}

vm_ssh() {
@@ -287,7 +294,7 @@ check_args() {
}

check_deps() {
	for dep in vng ${QEMU} busybox pkill ssh ss socat; do
	for dep in vng ${QEMU} busybox pkill ssh ss socat nsenter; do
		if [[ ! -x $(command -v "${dep}") ]]; then
			echo -e "skip:    dependency ${dep} not found!\n"
			exit "${KSFT_SKIP}"
@@ -1231,12 +1238,8 @@ test_ns_local_same_cid_ok() {
}

test_ns_host_vsock_child_ns_mode_ok() {
	local orig_mode
	local rc

	orig_mode=$(cat /proc/sys/net/vsock/child_ns_mode)
	local rc="${KSFT_PASS}"

	rc="${KSFT_PASS}"
	for mode in "${NS_MODES[@]}"; do
		local ns="${mode}0"

@@ -1246,15 +1249,13 @@ test_ns_host_vsock_child_ns_mode_ok() {
			continue
		fi

		if ! echo "${mode}" > /proc/sys/net/vsock/child_ns_mode; then
			log_host "child_ns_mode should be writable to ${mode}"
		if ! echo "${mode}" | ip netns exec "${ns}" \
			tee /proc/sys/net/vsock/child_ns_mode &>/dev/null; then
			rc="${KSFT_FAIL}"
			continue
		fi
	done

	echo "${orig_mode}" > /proc/sys/net/vsock/child_ns_mode

	return "${rc}"
}