|
@@ -200,6 +200,8 @@ func New(cfgOptions ...config.Option) (NetworkController, error) {
|
|
c.cleanupLocalEndpoints()
|
|
c.cleanupLocalEndpoints()
|
|
c.networkCleanup()
|
|
c.networkCleanup()
|
|
|
|
|
|
|
|
+ c.reservePools()
|
|
|
|
+
|
|
if err := c.startExternalKeyListener(); err != nil {
|
|
if err := c.startExternalKeyListener(); err != nil {
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
@@ -546,6 +548,52 @@ func (c *controller) NewNetwork(networkType, name string, id string, options ...
|
|
return network, nil
|
|
return network, nil
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func (c *controller) reservePools() {
|
|
|
|
+ networks, err := c.getNetworksForScope(datastore.LocalScope)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Warnf("Could not retrieve networks from local store during ipam allocation for existing networks: %v", err)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for _, n := range networks {
|
|
|
|
+ if !doReplayPoolReserve(n) {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ // Construct pseudo configs for the auto IP case
|
|
|
|
+ autoIPv4 := (len(n.ipamV4Config) == 0 || (len(n.ipamV4Config) == 1 && n.ipamV4Config[0].PreferredPool == "")) && len(n.ipamV4Info) > 0
|
|
|
|
+ autoIPv6 := (len(n.ipamV6Config) == 0 || (len(n.ipamV6Config) == 1 && n.ipamV6Config[0].PreferredPool == "")) && len(n.ipamV6Info) > 0
|
|
|
|
+ if autoIPv4 {
|
|
|
|
+ n.ipamV4Config = []*IpamConf{{PreferredPool: n.ipamV4Info[0].Pool.String()}}
|
|
|
|
+ }
|
|
|
|
+ if n.enableIPv6 && autoIPv6 {
|
|
|
|
+ n.ipamV6Config = []*IpamConf{{PreferredPool: n.ipamV6Info[0].Pool.String()}}
|
|
|
|
+ }
|
|
|
|
+ // Account current network gateways
|
|
|
|
+ for i, c := range n.ipamV4Config {
|
|
|
|
+ if c.Gateway == "" && n.ipamV4Info[i].Gateway != nil {
|
|
|
|
+ c.Gateway = n.ipamV4Info[i].Gateway.IP.String()
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ for i, c := range n.ipamV6Config {
|
|
|
|
+ if c.Gateway == "" && n.ipamV6Info[i].Gateway != nil {
|
|
|
|
+ c.Gateway = n.ipamV6Info[i].Gateway.IP.String()
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if err := n.ipamAllocate(); err != nil {
|
|
|
|
+ log.Warnf("Failed to allocate ipam pool(s) for network %q (%s): %v", n.Name(), n.ID(), err)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func doReplayPoolReserve(n *network) bool {
|
|
|
|
+ _, caps, err := n.getController().getIPAMDriver(n.ipamType)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Warnf("Failed to retrieve ipam driver for network %q (%s): %v", n.Name(), n.ID(), err)
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+ return caps.RequiresRequestReplay
|
|
|
|
+}
|
|
|
|
+
|
|
func (c *controller) addNetwork(n *network) error {
|
|
func (c *controller) addNetwork(n *network) error {
|
|
d, err := n.driver(true)
|
|
d, err := n.driver(true)
|
|
if err != nil {
|
|
if err != nil {
|