Support subnet and iprange arguments on network create

This commit is contained in:
Bryan Boreham authored and Matthias Radestock committed 2016-01-22 13:37:36 +00:00
1 parent 7f3dc6f202
commit 1a59734cdb
3 files changed
+81 -20

No files matched your search

+47 -10
View File
@@ -1,7 +1,9 @@
package ipamplugin
import (
"fmt"
"net"
"strings"
"github.com/docker/libnetwork/ipamapi"
"github.com/docker/libnetwork/netlabel"
@@ -29,14 +31,29 @@ func (i *ipam) GetDefaultAddressSpaces() (string, string, error) {
return "weavelocal", "weaveglobal", nil
}
func (i *ipam) RequestPool(addressSpace, pool, subPool string, options map[string]string, v6 bool) (string, *net.IPNet, map[string]string, error) {
func (i *ipam) RequestPool(addressSpace, pool, subPool string, options map[string]string, v6 bool) (poolname string, subnet *net.IPNet, data map[string]string, err error) {
Log.Debugln("RequestPool", addressSpace, pool, subPool, options)
cidr, err := i.weave.DefaultSubnet()
Log.Debugln("RequestPool returning ", cidr, err)
defer func() { Log.Debugln("RequestPool returning", poolname, subnet, data, err) }()
if pool == "" {
subnet, err = i.weave.DefaultSubnet()
} else {
_, subnet, err = net.ParseCIDR(pool)
}
if err != nil {
return
}
iprange := subnet
if subPool != "" {
if _, iprange, err = net.ParseCIDR(subPool); err != nil {
return
}
}
// Cunningly-constructed pool "name" which gives us what we need later
poolname = strings.Join([]string{"weave", subnet.String(), iprange.String()}, "-")
// Pass back a fake "gateway address"; we don't actually use it,
// so just give the network address.
data := map[string]string{netlabel.Gateway: cidr.String()}
return "weavepool", cidr, data, err
data = map[string]string{netlabel.Gateway: subnet.String()}
return
}
func (i *ipam) ReleasePool(poolID string) error {
@@ -44,12 +61,32 @@ func (i *ipam) ReleasePool(poolID string) error {
return nil
}
func (i *ipam) RequestAddress(poolID string, address net.IP, options map[string]string) (*net.IPNet, map[string]string, error) {
func (i *ipam) RequestAddress(poolID string, address net.IP, options map[string]string) (ip *net.IPNet, _ map[string]string, err error) {
Log.Debugln("RequestAddress", poolID, address, options)
// Pass magic string to weave IPAM, which then stores the address under its own string
ip, err := i.weave.AllocateIP("_")
Log.Debugln("allocateIP returned", ip, err)
return ip, nil, err
defer func() { Log.Debugln("allocateIP returned", ip, err) }()
// If we pass magic string "_" to weave IPAM it stores the address under its own string
if poolID == "weavepool" { // old-style
ip, err = i.weave.AllocateIP("_")
return
}
parts := strings.Split(poolID, "-")
if len(parts) != 3 || parts[0] != "weave" {
err = fmt.Errorf("Unrecognized pool ID: %s", poolID)
return
}
var subnet, iprange *net.IPNet
if _, subnet, err = net.ParseCIDR(parts[1]); err != nil {
return
}
if _, iprange, err = net.ParseCIDR(parts[2]); err != nil {
return
}
// We are lying slightly to IPAM here: the range is not a subnet
if ip, err = i.weave.AllocateIPInSubnet("_", iprange); err != nil {
return
}
ip.Mask = subnet.Mask // fix up the subnet we lied about
return
}
func (i *ipam) ReleaseAddress(poolID string, address net.IP) error {