moby/libnetwork/ipamutils/utils_test.go

118 lines
2.5 KiB
Go
Raw Normal View History

package ipamutils
import (
"net"
"testing"
"github.com/docker/libnetwork/testutils"
"github.com/docker/libnetwork/types"
"github.com/vishvananda/netlink"
)
Remove pre-defined networks from package init This moves the initialization of the pre-defined networks to where it's used instead of in package init. This reason for this change is having this be populated in `init()` causes it to always consume cpu, and memory (4.3MB of memory), to populate even if the package is unused (like for instnace, in a re-exec). Here is a memory profile of docker/docker just after starting the daemon of the top 10 largest memory consumers: Before: ``` flat flat% sum% cum cum% 0 0% 0% 11.89MB 95.96% runtime.goexit 0 0% 0% 6.79MB 54.82% runtime.main 0 0% 0% 5.79MB 46.74% main.init 0 0% 0% 4.79MB 38.67% github.com/docker/docker/api/server/router/network.init 0 0% 0% 4.79MB 38.67% github.com/docker/libnetwork.init 0 0% 0% 4.29MB 34.63% github.com/docker/libnetwork/ipam.init 0 0% 0% 4.29MB 34.63% github.com/docker/libnetwork/ipams/builtin.init 0 0% 0% 4.29MB 34.63% github.com/docker/libnetwork/ipamutils.init 0 0% 0% 4.29MB 34.63% github.com/docker/libnetwork/ipamutils.init.1 4.29MB 34.63% 34.63% 4.29MB 34.63% github.com/docker/libnetwork/ipamutils.initGranularPredefinedNetworks ``` After: ``` flat flat% sum% cum cum% 0 0% 0% 4439.37kB 89.66% runtime.goexit 0 0% 0% 4439.37kB 89.66% runtime.main 0 0% 0% 3882.11kB 78.40% github.com/docker/docker/cli.(*Cli).Run 0 0% 0% 3882.11kB 78.40% main.main 3882.11kB 78.40% 78.40% 3882.11kB 78.40% reflect.callMethod 0 0% 78.40% 3882.11kB 78.40% reflect.methodValueCall 0 0% 78.40% 557.26kB 11.25% github.com/docker/docker/api/server.init 557.26kB 11.25% 89.66% 557.26kB 11.25% html.init 0 0% 89.66% 557.26kB 11.25% html/template.init 0 0% 89.66% 557.26kB 11.25% main.init ``` Now, of course the docker daemon will still need to consume this memory, but at least now re-execs and such won't have to re-init these variables. Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-04 13:50:26 +00:00
func init() {
InitNetworks()
}
func TestGranularPredefined(t *testing.T) {
for _, nw := range PredefinedGranularNetworks {
if ones, bits := nw.Mask.Size(); bits != 32 || ones != 24 {
t.Fatalf("Unexpected size for network in granular list: %v", nw)
}
}
for _, nw := range PredefinedBroadNetworks {
if ones, bits := nw.Mask.Size(); bits != 32 || (ones != 20 && ones != 16) {
t.Fatalf("Unexpected size for network in broad list: %v", nw)
}
}
}
func TestNetworkRequest(t *testing.T) {
defer testutils.SetupTestOSContext(t)()
_, exp, err := net.ParseCIDR("172.17.0.0/16")
if err != nil {
t.Fatal(err)
}
nw, err := FindAvailableNetwork(PredefinedBroadNetworks)
if err != nil {
t.Fatal(err)
}
if !types.CompareIPNet(exp, nw) {
t.Fatalf("exected %s. got %s", exp, nw)
}
_, exp, err = net.ParseCIDR("10.0.0.0/24")
if err != nil {
t.Fatal(err)
}
nw, err = FindAvailableNetwork(PredefinedGranularNetworks)
if err != nil {
t.Fatal(err)
}
if !types.CompareIPNet(exp, nw) {
t.Fatalf("exected %s. got %s", exp, nw)
}
// Add iface and ssert returned address on request
createInterface(t, "test", "172.17.42.1/16")
_, exp, err = net.ParseCIDR("172.18.0.0/16")
if err != nil {
t.Fatal(err)
}
nw, err = FindAvailableNetwork(PredefinedBroadNetworks)
if err != nil {
t.Fatal(err)
}
if !types.CompareIPNet(exp, nw) {
t.Fatalf("exected %s. got %s", exp, nw)
}
}
func TestElectInterfaceAddress(t *testing.T) {
defer testutils.SetupTestOSContext(t)()
nws := "172.101.202.254/16"
createInterface(t, "test", nws)
ipv4Nw, ipv6Nw, err := ElectInterfaceAddresses("test")
if err != nil {
t.Fatal(err)
}
if ipv4Nw == nil {
t.Fatalf("unexpected empty ipv4 network addresses")
}
if len(ipv6Nw) == 0 {
t.Fatalf("unexpected empty ipv4 network addresses")
}
if nws != ipv4Nw.String() {
t.Fatalf("expected %s. got %s", nws, ipv4Nw)
}
}
func createInterface(t *testing.T, name, nw string) {
// Add interface
link := &netlink.Bridge{
LinkAttrs: netlink.LinkAttrs{
Name: "test",
},
}
bip, err := types.ParseCIDR(nw)
if err != nil {
t.Fatal(err)
}
if err = netlink.LinkAdd(link); err != nil {
t.Fatalf("Failed to create interface via netlink: %v", err)
}
if err := netlink.AddrAdd(link, &netlink.Addr{IPNet: bip}); err != nil {
t.Fatal(err)
}
if err = netlink.LinkSetUp(link); err != nil {
t.Fatal(err)
}
}