62 lines
1.9 KiB
Go
62 lines
1.9 KiB
Go
package ipamplugin
|
|
|
|
import (
|
|
"net"
|
|
|
|
"github.com/docker/libnetwork/ipamapi"
|
|
"github.com/docker/libnetwork/netlabel"
|
|
"github.com/weaveworks/weave/api"
|
|
. "github.com/weaveworks/weave/common"
|
|
"github.com/weaveworks/weave/common/docker"
|
|
)
|
|
|
|
const (
|
|
WeaveContainer = "weave"
|
|
)
|
|
|
|
type ipam struct {
|
|
client *docker.Client
|
|
weave *api.Client
|
|
}
|
|
|
|
func NewIpam(client *docker.Client, version string) (ipamapi.Ipam, error) {
|
|
resolver := func() (string, error) { return client.GetContainerIP(WeaveContainer) }
|
|
return &ipam{client: client, weave: api.NewClientWithResolver(resolver)}, nil
|
|
}
|
|
|
|
func (i *ipam) GetDefaultAddressSpaces() (string, string, error) {
|
|
Log.Debugln("GetDefaultAddressSpaces")
|
|
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) {
|
|
Log.Debugln("RequestPool", addressSpace, pool, subPool, options)
|
|
cidr, err := i.weave.DefaultSubnet()
|
|
Log.Debugln("RequestPool returning ", cidr, err)
|
|
if err != nil {
|
|
return "", nil, nil, err
|
|
}
|
|
// 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
|
|
}
|
|
|
|
func (i *ipam) ReleasePool(poolID string) error {
|
|
Log.Debugln("ReleasePool", poolID)
|
|
return nil
|
|
}
|
|
|
|
func (i *ipam) RequestAddress(poolID string, address net.IP, options map[string]string) (*net.IPNet, map[string]string, 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
|
|
}
|
|
|
|
func (i *ipam) ReleaseAddress(poolID string, address net.IP) error {
|
|
Log.Debugln("ReleaseAddress", poolID, address)
|
|
return i.weave.ReleaseIP(address.String())
|
|
}
|