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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
package osl
import (
"context"
"fmt"
"runtime"
"sort"
"strings"
"sync"
"testing"
"github.com/docker/docker/internal/nlwrap"
"github.com/docker/docker/internal/sliceutil"
"github.com/vishvananda/netlink"
"github.com/vishvananda/netns"
"gotest.tools/v3/assert"
)
func TestGenerateIfaceName(t *testing.T) {
testcases := []struct {
names []string
want string
}{
{names: []string{"test0", "test1"}, want: "test2"},
{names: []string{"test0", "test2"}, want: "test1"},
{names: []string{"test2"}, want: "test0"},
{names: []string{"test-0", "test-1"}, want: "test0"},
{names: []string{}, want: "test0"},
}
for _, tc := range testcases {
ns := &Namespace{
iFaces: sliceutil.Map(tc.names, func(name string) *Interface {
return &Interface{dstName: name}
}),
}
got := ns.generateIfaceName("test")
assert.Equal(t, got, tc.want)
}
}
// TestAddInterfaceInParallel tests that interface name are correctly generated
// even when many interfaces are added in parallel.
func TestAddInterfaceInParallel(t *testing.T) {
runtime.LockOSThread()
defer runtime.UnlockOSThread()
nsh, err := netns.NewNamed(t.Name())
assert.NilError(t, err)
defer netns.DeleteNamed(t.Name())
defer nsh.Close()
nlh, err := nlwrap.NewHandleAt(nsh)
assert.NilError(t, err)
ns := &Namespace{
path: "/run/netns/" + t.Name(),
nlHandle: nlh,
}
// Create a few dummy interfaces with a dummy name. The call to
// AddInterface below will rename them into their final name (ie. ethX).
for i := range 10 {
nlh.LinkAdd(&netlink.Dummy{
LinkAttrs: netlink.LinkAttrs{
Name: fmt.Sprintf("dummy%d", i),
},
})
}
wg := sync.WaitGroup{}
for i := range 10 {
src := fmt.Sprintf("dummy%d", i)
wg.Add(1)
go func() {
defer wg.Done()
err := ns.AddInterface(context.Background(), src, "eth", "", WithCreatedInContainer(true))
assert.NilError(t, err)
}()
}
wg.Wait()
links, err := nlwrap.LinkList()
assert.NilError(t, err)
var eths []string
for _, link := range links {
if strings.HasPrefix(link.Attrs().Name, "eth") {
eths = append(eths, link.Attrs().Name)
}
}
sort.Strings(eths)
assert.DeepEqual(t, eths, []string{"eth0", "eth1", "eth2", "eth3", "eth4", "eth5", "eth6", "eth7", "eth8", "eth9"})
}
|