func TestPredefinedPool(t *testing.T) { a, err := getAllocator() if err != nil { t.Fatal(err) } if _, err := a.getPredefinedPool("blue", false); err == nil { t.Fatalf("Expected failure for non default addr space") } exp, err := ipamutils.FindAvailableNetwork(a.predefined[localAddressSpace]) if err != nil { t.Fatal(err) } nw, err := a.getPredefinedPool(localAddressSpace, false) if err != nil { t.Fatal(err) } if !types.CompareIPNet(nw, exp) { t.Fatalf("Unexpected default network returned: %s. Expected: %s", nw, exp) } pid, nw, _, err := a.RequestPool(localAddressSpace, exp.String(), "", nil, false) if err != nil { t.Fatal(err) } if !types.CompareIPNet(nw, exp) { t.Fatalf("Unexpected default network returned: %s. Expected: %s", nw, exp) } nw2, err := a.getPredefinedPool(localAddressSpace, false) if err != nil { t.Fatal(err) } if types.CompareIPNet(nw, nw2) { t.Fatalf("Unexpected default network returned: %s = %s", nw2, nw) } if err := a.ReleasePool(pid); err != nil { t.Fatal(err) } nw, err = a.getPredefinedPool(localAddressSpace, false) if err != nil { t.Fatal(err) } if !types.CompareIPNet(nw, exp) { t.Fatalf("Unexpected default network returned: %s. Expected %s", nw, exp) } }
func (a *Allocator) getPredefinedPool(as string, ipV6 bool) (*net.IPNet, error) { var v ipVersion v = v4 if ipV6 { v = v6 } if as != localAddressSpace && as != globalAddressSpace { return nil, types.NotImplementedErrorf("no default pool availbale for non-default addresss spaces") } aSpace, err := a.getAddrSpace(as) if err != nil { return nil, err } for _, nw := range a.getPredefineds(as) { if v != getAddressVersion(nw.IP) { continue } aSpace.Lock() _, ok := aSpace.subnets[SubnetKey{AddressSpace: as, Subnet: nw.String()}] aSpace.Unlock() if ok { continue } if !aSpace.contains(as, nw) { if as == localAddressSpace { // Check if nw overlap with system routes, name servers if _, err := ipamutils.FindAvailableNetwork([]*net.IPNet{nw}); err == nil { return nw, nil } continue } return nw, nil } } return nil, types.NotFoundErrorf("could not find an available predefined network") }