...
1 package netns
2
3 import (
4 "fmt"
5 "os"
6 "runtime"
7 "testing"
8
9 "github.com/vishvananda/netlink"
10 "github.com/vishvananda/netns"
11 )
12
13 var (
14 testNamespaceLinkName = "lo"
15 dummyLinkName = "ens4"
16 dummyMTU = 1440
17 )
18
19
20 func NewTestingNetworkNamespace(t *testing.T) (netns.NsHandle, func()) {
21 if os.Getuid() != 0 {
22 t.Skip("networking test requires root privileges, ensure bazel sandbox strategy is set to linux-sandbox.")
23 }
24 runtime.LockOSThread()
25 ns, err := netns.New()
26 if err != nil {
27 t.Fatal(err)
28 }
29 return ns, func() {
30 ns.Close()
31 runtime.UnlockOSThread()
32 }
33 }
34
35
36 func CreateDummyLink() error {
37 lo, err := netlink.LinkByName(testNamespaceLinkName)
38 if err != nil {
39 return err
40 }
41
42 la := netlink.NewLinkAttrs()
43 la.Name = dummyLinkName
44 la.MTU = dummyMTU
45 bridge := &netlink.Bridge{LinkAttrs: la}
46 bridge.ParentIndex = lo.Attrs().Index
47 if err := netlink.LinkAdd(bridge); err != nil {
48 return err
49 }
50 return netlink.LinkSetUp(bridge)
51 }
52
53
54 func GetDummyLink() (netlink.Link, error) {
55 return GetByName(dummyLinkName)
56 }
57
58 func GetByName(name string) (netlink.Link, error) {
59 link, err := netlink.LinkByName(name)
60 if err != nil {
61 return nil, fmt.Errorf("error getting link %s: %w", name, err)
62 }
63 return link, nil
64 }
65
View as plain text