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

+8
View File
@@ -18,6 +18,14 @@ func (client *Client) AllocateIP(ID string) (*net.IPNet, error) {
return client.ipamOp(ID, "POST")
}
func (client *Client) AllocateIPInSubnet(ID string, subnet *net.IPNet) (*net.IPNet, error) {
ip, err := client.httpVerb("POST", fmt.Sprintf("/ip/%s/%s", ID, subnet), nil)
if err != nil {
return nil, err
}
return parseIP(ip)
}
// returns an IP for the ID given, or nil if one has not been
// allocated
func (client *Client) LookupIP(ID string) (*net.IPNet, error) {
+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 {
+26 -10
View File
@@ -33,32 +33,48 @@ The Weave plugin actually provides *two* network drivers to Docker
one named `weave` that can only work with one (like Docker's overlay
driver).
Docker supports creating multiple networks via the plugin, although
Weave Net provides only one network underneath. So long as the IP
addresses for each network are on different subnets, containers on one
network will not be able to communicate with those on a different network.
### `weavemesh` driver
* Weave handles all co-ordination between hosts (referred to by Docker as a "local scope" driver)
* Supports only a single network (we create one named `weave` for you automatically)
* Uses Weave's partition tolerant IPAM
* User must pick different subnets if creating multiple networks.
If you do create additional networks using the `weavemesh` driver,
containers attached to them will be able to communicate with
containers attached to `weave`; there is no isolation between those
networks.
We create a network named `weave` for you automatically, using the
[default subnet](ipam.html#subnets) set for the `weave` router.
To create additional networks using the `weavemesh` driver, pick a
different subnet and run this command on all hosts:
$ docker network create --driver=weavemesh --ipam-driver=weavemesh --subnet=<subnet> <network-name>
The subnets you pick must be within the range covered by Weave's [IP
Address Management](ipam.html#range)
### `weave` driver
* This runs in what Docker call "global scope"; requires a cluster store
* Supports multiple networks (these must be created with `docker network create --driver weave ...`)
* Used with Docker's cluster store based IPAM
* Docker can coordinate choosing different subnets for multiple networks.
To create a network using this driver, once you have your cluster store set up:
$ docker network create --driver=weave <network-name>
### <a name="cluster-store"></a>Cluster store
This is the term used by Docker for a distributed key-value store such
as Consul, Etcd or ZooKeeper.
There's no specific documentation from Docker on using a cluster
store, but the first part of
[Getting Started with Docker Multi-host Networking](https://github.com/docker/docker/blob/master/docs/userguide/networking/get-started-overlay.md)
should point the way.
Note that in the case of multiple networks using the `weave` driver, all containers are
on the same virtual network but Docker allocates their addresses on
different subnets so they cannot talk to each other directly.
## Plugin command-line arguments
If you want to give some arguments to the plugin independently, don't