package netns import ( "fmt" "os" "runtime" "testing" "github.com/vishvananda/netlink" "github.com/vishvananda/netns" ) var ( testNamespaceLinkName = "lo" dummyLinkName = "ens4" dummyMTU = 1440 ) // creates a testing network namespace and returns the handle and teardown function func NewTestingNetworkNamespace(t *testing.T) (netns.NsHandle, func()) { if os.Getuid() != 0 { t.Skip("networking test requires root privileges, ensure bazel sandbox strategy is set to linux-sandbox.") } runtime.LockOSThread() ns, err := netns.New() if err != nil { t.Fatal(err) } return ns, func() { ns.Close() runtime.UnlockOSThread() } } // Creates a dummy device bridge to loopback device func CreateDummyLink() error { lo, err := netlink.LinkByName(testNamespaceLinkName) if err != nil { return err } la := netlink.NewLinkAttrs() la.Name = dummyLinkName la.MTU = dummyMTU bridge := &netlink.Bridge{LinkAttrs: la} bridge.ParentIndex = lo.Attrs().Index if err := netlink.LinkAdd(bridge); err != nil { return err } return netlink.LinkSetUp(bridge) } // Returns an up-to-date dummy link func GetDummyLink() (netlink.Link, error) { return GetByName(dummyLinkName) } func GetByName(name string) (netlink.Link, error) { link, err := netlink.LinkByName(name) if err != nil { return nil, fmt.Errorf("error getting link %s: %w", name, err) } return link, nil }