-
Notifications
You must be signed in to change notification settings - Fork 18.7k
/
sanity_linux.go
43 lines (38 loc) · 1.06 KB
/
sanity_linux.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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)
}
})
}