12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- package netnsutils
- import (
- "errors"
- "syscall"
- "testing"
- "github.com/vishvananda/netns"
- "golang.org/x/sys/unix"
- "gotest.tools/v3/assert"
- )
- // AssertSocketSameNetNS makes a best-effort attempt to assert that conn is in
- // the same network namespace as the current goroutine's thread.
- func AssertSocketSameNetNS(t testing.TB, conn syscall.Conn) {
- t.Helper()
- sc, err := conn.SyscallConn()
- assert.NilError(t, err)
- sc.Control(func(fd uintptr) {
- srvnsfd, err := unix.IoctlRetInt(int(fd), unix.SIOCGSKNS)
- if err != nil {
- if errors.Is(err, unix.EPERM) {
- t.Log("Cannot determine socket's network namespace. Do we have CAP_NET_ADMIN?")
- return
- }
- if errors.Is(err, unix.ENOSYS) {
- t.Log("Cannot query socket's network namespace due to missing kernel support.")
- return
- }
- t.Fatal(err)
- }
- srvns := netns.NsHandle(srvnsfd)
- defer srvns.Close()
- curns, err := netns.Get()
- assert.NilError(t, err)
- defer curns.Close()
- if !srvns.Equal(curns) {
- t.Fatalf("Socket is in network namespace %s, but test goroutine is in %s", srvns, curns)
- }
- })
- }
|