|
@@ -3,6 +3,7 @@ package cluster // import "github.com/docker/docker/daemon/cluster"
|
|
import (
|
|
import (
|
|
"fmt"
|
|
"fmt"
|
|
"net"
|
|
"net"
|
|
|
|
+ "strings"
|
|
)
|
|
)
|
|
|
|
|
|
const (
|
|
const (
|
|
@@ -87,6 +88,41 @@ func (c *Cluster) resolveAdvertiseAddr(advertiseAddr, listenAddrPort string) (st
|
|
return systemAddr.String(), listenAddrPort, nil
|
|
return systemAddr.String(), listenAddrPort, nil
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// validateDefaultAddrPool validates default address pool
|
|
|
|
+// it also strips white space from the string before validation
|
|
|
|
+func validateDefaultAddrPool(defaultAddrPool []string, size uint32) error {
|
|
|
|
+ if defaultAddrPool == nil {
|
|
|
|
+ // defaultAddrPool is not defined
|
|
|
|
+ return nil
|
|
|
|
+ }
|
|
|
|
+ //if size is not set, then we use default value 24
|
|
|
|
+ if size == 0 {
|
|
|
|
+ size = 24
|
|
|
|
+ }
|
|
|
|
+ // We allow max value as 29. We can have 8 IP addresses for max value 29
|
|
|
|
+ // If we allow 30, then we will get only 4 IP addresses. But with latest
|
|
|
|
+ // libnetwork LB scale implementation, we use total of 4 IP addresses for internal use.
|
|
|
|
+ // Hence keeping 29 as max value, we will have 8 IP addresses. This will be
|
|
|
|
+ // smallest subnet that can be used in overlay network.
|
|
|
|
+ if size > 29 {
|
|
|
|
+ return fmt.Errorf("subnet size is out of range: %d", size)
|
|
|
|
+ }
|
|
|
|
+ for i := range defaultAddrPool {
|
|
|
|
+ // trim leading and trailing white spaces
|
|
|
|
+ defaultAddrPool[i] = strings.TrimSpace(defaultAddrPool[i])
|
|
|
|
+ _, b, err := net.ParseCIDR(defaultAddrPool[i])
|
|
|
|
+ if err != nil {
|
|
|
|
+ return fmt.Errorf("invalid base pool %s: %v", defaultAddrPool[i], err)
|
|
|
|
+ }
|
|
|
|
+ ones, _ := b.Mask.Size()
|
|
|
|
+ if size < uint32(ones) {
|
|
|
|
+ return fmt.Errorf("invalid CIDR: %q. Subnet size is too small for pool: %d", defaultAddrPool[i], size)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
func resolveDataPathAddr(dataPathAddr string) (string, error) {
|
|
func resolveDataPathAddr(dataPathAddr string) (string, error) {
|
|
if dataPathAddr == "" {
|
|
if dataPathAddr == "" {
|
|
// dataPathAddr is not defined
|
|
// dataPathAddr is not defined
|