IpamOptions per network not per ipam subnet

Signed-off-by: Ryan Belgrave <rmb1993@gmail.com>
This commit is contained in:
Ryan Belgrave 2016-01-07 15:57:22 -05:00
parent 60bbe6e2d4
commit 16ff947fb6
5 changed files with 19 additions and 27 deletions

View File

@ -435,7 +435,7 @@ func ipamOption(bridgeName string) libnetwork.NetworkOption {
if hip.IsGlobalUnicast() { if hip.IsGlobalUnicast() {
ipamV4Conf.Gateway = nw.IP.String() ipamV4Conf.Gateway = nw.IP.String()
} }
return libnetwork.NetworkOptionIpam("default", "", []*libnetwork.IpamConf{ipamV4Conf}, nil) return libnetwork.NetworkOptionIpam("default", "", []*libnetwork.IpamConf{ipamV4Conf}, nil, nil)
} }
return nil return nil
} }

View File

@ -56,7 +56,7 @@ The following sections explain the each of the above API's semantics, when they
A libnetwork user can provide IPAM related configuration when creating a network, via the `NetworkOptionIpam` setter function. A libnetwork user can provide IPAM related configuration when creating a network, via the `NetworkOptionIpam` setter function.
```go ```go
func NetworkOptionIpam(ipamDriver string, addrSpace string, ipV4 []*IpamConf, ipV6 []*IpamConf) NetworkOption func NetworkOptionIpam(ipamDriver string, addrSpace string, ipV4 []*IpamConf, ipV6 []*IpamConf, opts map[string]string) NetworkOption
``` ```
The caller has to provide the IPAM driver name and may provide the address space and a list of `IpamConf` structures for IPv4 and a list for IPv6. The IPAM driver name is the only mandatory field. If not provided, network creation will fail. The caller has to provide the IPAM driver name and may provide the address space and a list of `IpamConf` structures for IPv4 and a list for IPv6. The IPAM driver name is the only mandatory field. If not provided, network creation will fail.

View File

@ -67,20 +67,19 @@ func TestNetworkMarshalling(t *testing.T) {
networkType: "bridge", networkType: "bridge",
enableIPv6: true, enableIPv6: true,
persist: true, persist: true,
ipamOptions: map[string]string{
netlabel.MacAddress: "a:b:c:d:e:f",
},
ipamV4Config: []*IpamConf{ ipamV4Config: []*IpamConf{
&IpamConf{ &IpamConf{
PreferredPool: "10.2.0.0/16", PreferredPool: "10.2.0.0/16",
SubPool: "10.2.0.0/24", SubPool: "10.2.0.0/24",
Options: map[string]string{ Gateway: "",
netlabel.MacAddress: "a:b:c:d:e:f", AuxAddresses: nil,
},
Gateway: "",
AuxAddresses: nil,
}, },
&IpamConf{ &IpamConf{
PreferredPool: "10.2.0.0/16", PreferredPool: "10.2.0.0/16",
SubPool: "10.2.1.0/24", SubPool: "10.2.1.0/24",
Options: nil,
Gateway: "10.2.1.254", Gateway: "10.2.1.254",
}, },
}, },
@ -265,7 +264,6 @@ func compareIpamConfList(listA, listB []*IpamConf) bool {
b = listB[i] b = listB[i]
if a.PreferredPool != b.PreferredPool || if a.PreferredPool != b.PreferredPool ||
a.SubPool != b.SubPool || a.SubPool != b.SubPool ||
!compareStringMaps(a.Options, b.Options) ||
a.Gateway != b.Gateway || !compareStringMaps(a.AuxAddresses, b.AuxAddresses) { a.Gateway != b.Gateway || !compareStringMaps(a.AuxAddresses, b.AuxAddresses) {
return false return false
} }
@ -374,7 +372,7 @@ func TestIpamReleaseOnNetDriverFailures(t *testing.T) {
// Test whether ipam state release is invoked on network create failure from net driver // Test whether ipam state release is invoked on network create failure from net driver
// by checking whether subsequent network creation requesting same gateway IP succeeds // by checking whether subsequent network creation requesting same gateway IP succeeds
ipamOpt := NetworkOptionIpam(ipamapi.DefaultIPAM, "", []*IpamConf{&IpamConf{PreferredPool: "10.34.0.0/16", Gateway: "10.34.255.254"}}, nil) ipamOpt := NetworkOptionIpam(ipamapi.DefaultIPAM, "", []*IpamConf{&IpamConf{PreferredPool: "10.34.0.0/16", Gateway: "10.34.255.254"}}, nil, nil)
if _, err := c.NewNetwork(badDriverName, "badnet1", ipamOpt); err == nil { if _, err := c.NewNetwork(badDriverName, "badnet1", ipamOpt); err == nil {
t.Fatalf("bad network driver should have failed network creation") t.Fatalf("bad network driver should have failed network creation")
} }
@ -398,7 +396,7 @@ func TestIpamReleaseOnNetDriverFailures(t *testing.T) {
} }
// Now create good bridge network with different gateway // Now create good bridge network with different gateway
ipamOpt2 := NetworkOptionIpam(ipamapi.DefaultIPAM, "", []*IpamConf{&IpamConf{PreferredPool: "10.34.0.0/16", Gateway: "10.34.255.253"}}, nil) ipamOpt2 := NetworkOptionIpam(ipamapi.DefaultIPAM, "", []*IpamConf{&IpamConf{PreferredPool: "10.34.0.0/16", Gateway: "10.34.255.253"}}, nil, nil)
gnw, err = c.NewNetwork("bridge", "goodnet2", ipamOpt2) gnw, err = c.NewNetwork("bridge", "goodnet2", ipamOpt2)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)

View File

@ -87,7 +87,7 @@ func createController() error {
func createTestNetwork(networkType, networkName string, netOption options.Generic, ipamV4Configs, ipamV6Configs []*libnetwork.IpamConf) (libnetwork.Network, error) { func createTestNetwork(networkType, networkName string, netOption options.Generic, ipamV4Configs, ipamV6Configs []*libnetwork.IpamConf) (libnetwork.Network, error) {
return controller.NewNetwork(networkType, networkName, return controller.NewNetwork(networkType, networkName,
libnetwork.NetworkOptionGeneric(netOption), libnetwork.NetworkOptionGeneric(netOption),
libnetwork.NetworkOptionIpam(ipamapi.DefaultIPAM, "", ipamV4Configs, ipamV6Configs)) libnetwork.NetworkOptionIpam(ipamapi.DefaultIPAM, "", ipamV4Configs, ipamV6Configs, nil))
} }
func getEmptyGenericOption() map[string]interface{} { func getEmptyGenericOption() map[string]interface{} {
@ -333,7 +333,7 @@ func TestBridgeIpv6FromMac(t *testing.T) {
network, err := controller.NewNetwork(bridgeNetType, "testipv6mac", network, err := controller.NewNetwork(bridgeNetType, "testipv6mac",
libnetwork.NetworkOptionGeneric(netOption), libnetwork.NetworkOptionGeneric(netOption),
libnetwork.NetworkOptionIpam(ipamapi.DefaultIPAM, "", ipamV4ConfList, ipamV6ConfList), libnetwork.NetworkOptionIpam(ipamapi.DefaultIPAM, "", ipamV4ConfList, ipamV6ConfList, nil),
libnetwork.NetworkOptionDeferIPv6Alloc(true)) libnetwork.NetworkOptionDeferIPv6Alloc(true))
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
@ -1016,7 +1016,7 @@ func TestEndpointJoin(t *testing.T) {
ipamV6ConfList := []*libnetwork.IpamConf{&libnetwork.IpamConf{PreferredPool: "fe90::/64", Gateway: "fe90::22"}} ipamV6ConfList := []*libnetwork.IpamConf{&libnetwork.IpamConf{PreferredPool: "fe90::/64", Gateway: "fe90::22"}}
n1, err := controller.NewNetwork(bridgeNetType, "testnetwork1", n1, err := controller.NewNetwork(bridgeNetType, "testnetwork1",
libnetwork.NetworkOptionGeneric(netOption), libnetwork.NetworkOptionGeneric(netOption),
libnetwork.NetworkOptionIpam(ipamapi.DefaultIPAM, "", nil, ipamV6ConfList), libnetwork.NetworkOptionIpam(ipamapi.DefaultIPAM, "", nil, ipamV6ConfList, nil),
libnetwork.NetworkOptionDeferIPv6Alloc(true)) libnetwork.NetworkOptionDeferIPv6Alloc(true))
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)

View File

@ -58,7 +58,7 @@ type Network interface {
// NetworkInfo returns some configuration and operational information about the network // NetworkInfo returns some configuration and operational information about the network
type NetworkInfo interface { type NetworkInfo interface {
IpamConfig() (string, []*IpamConf, []*IpamConf) IpamConfig() (string, map[string]string, []*IpamConf, []*IpamConf)
IpamInfo() ([]*IpamInfo, []*IpamInfo) IpamInfo() ([]*IpamInfo, []*IpamInfo)
DriverOptions() map[string]string DriverOptions() map[string]string
Scope() string Scope() string
@ -81,8 +81,6 @@ type IpamConf struct {
// A subset of the master pool. If specified, // A subset of the master pool. If specified,
// this becomes the container pool // this becomes the container pool
SubPool string SubPool string
// Input options for IPAM Driver (optional)
Options map[string]string
// Preferred Network Gateway address (optional) // Preferred Network Gateway address (optional)
Gateway string Gateway string
// Auxiliary addresses for network driver. Must be within the master pool. // Auxiliary addresses for network driver. Must be within the master pool.
@ -152,6 +150,7 @@ type network struct {
networkType string networkType string
id string id string
ipamType string ipamType string
ipamOptions map[string]string
addrSpace string addrSpace string
ipamV4Config []*IpamConf ipamV4Config []*IpamConf
ipamV6Config []*IpamConf ipamV6Config []*IpamConf
@ -255,12 +254,6 @@ func (c *IpamConf) CopyTo(dstC *IpamConf) error {
dstC.PreferredPool = c.PreferredPool dstC.PreferredPool = c.PreferredPool
dstC.SubPool = c.SubPool dstC.SubPool = c.SubPool
dstC.Gateway = c.Gateway dstC.Gateway = c.Gateway
if c.Options != nil {
dstC.Options = make(map[string]string, len(c.Options))
for k, v := range c.Options {
dstC.Options[k] = v
}
}
if c.AuxAddresses != nil { if c.AuxAddresses != nil {
dstC.AuxAddresses = make(map[string]string, len(c.AuxAddresses)) dstC.AuxAddresses = make(map[string]string, len(c.AuxAddresses))
for k, v := range c.AuxAddresses { for k, v := range c.AuxAddresses {
@ -502,11 +495,12 @@ func NetworkOptionInternalNetwork() NetworkOption {
} }
// NetworkOptionIpam function returns an option setter for the ipam configuration for this network // NetworkOptionIpam function returns an option setter for the ipam configuration for this network
func NetworkOptionIpam(ipamDriver string, addrSpace string, ipV4 []*IpamConf, ipV6 []*IpamConf) NetworkOption { func NetworkOptionIpam(ipamDriver string, addrSpace string, ipV4 []*IpamConf, ipV6 []*IpamConf, opts map[string]string) NetworkOption {
return func(n *network) { return func(n *network) {
if ipamDriver != "" { if ipamDriver != "" {
n.ipamType = ipamDriver n.ipamType = ipamDriver
} }
n.ipamOptions = opts
n.addrSpace = addrSpace n.addrSpace = addrSpace
n.ipamV4Config = ipV4 n.ipamV4Config = ipV4
n.ipamV6Config = ipV6 n.ipamV6Config = ipV6
@ -957,7 +951,7 @@ func (n *network) ipamAllocateVersion(ipVer int, ipam ipamapi.Ipam) error {
d := &IpamInfo{} d := &IpamInfo{}
(*infoList)[i] = d (*infoList)[i] = d
d.PoolID, d.Pool, d.Meta, err = ipam.RequestPool(n.addrSpace, cfg.PreferredPool, cfg.SubPool, cfg.Options, ipVer == 6) d.PoolID, d.Pool, d.Meta, err = ipam.RequestPool(n.addrSpace, cfg.PreferredPool, cfg.SubPool, n.ipamOptions, ipVer == 6)
if err != nil { if err != nil {
return err return err
} }
@ -1136,7 +1130,7 @@ func (n *network) Scope() string {
return n.driverScope() return n.driverScope()
} }
func (n *network) IpamConfig() (string, []*IpamConf, []*IpamConf) { func (n *network) IpamConfig() (string, map[string]string, []*IpamConf, []*IpamConf) {
n.Lock() n.Lock()
defer n.Unlock() defer n.Unlock()
@ -1155,7 +1149,7 @@ func (n *network) IpamConfig() (string, []*IpamConf, []*IpamConf) {
v6L[i] = cc v6L[i] = cc
} }
return n.ipamType, v4L, v6L return n.ipamType, n.ipamOptions, v4L, v6L
} }
func (n *network) IpamInfo() ([]*IpamInfo, []*IpamInfo) { func (n *network) IpamInfo() ([]*IpamInfo, []*IpamInfo) {