Add local address autodetection on swarm init

- when advertise-addr is not local and listen-addr is
  not specified

Signed-off-by: Alessandro Boch <aboch@docker.com>
This commit is contained in:
Alessandro Boch 2016-11-10 13:45:32 -08:00
parent 02918908af
commit c8d0cb9e71
2 changed files with 17 additions and 16 deletions

View File

@ -415,31 +415,32 @@ func (c *Cluster) Init(req types.InitRequest) (string, error) {
localAddr := listenHost localAddr := listenHost
// If the advertise address is not one of the system's // If the local address is undetermined, the advertise address
// addresses, we also require a listen address. // will be used as local address, if it belongs to this system.
listenAddrIP := net.ParseIP(listenHost) // If the advertise address is not local, then we try to find
if listenAddrIP != nil && listenAddrIP.IsUnspecified() { // a system address to use as local address. If this fails,
// we give up and ask user to pass the listen address.
if net.ParseIP(localAddr).IsUnspecified() {
advertiseIP := net.ParseIP(advertiseHost) advertiseIP := net.ParseIP(advertiseHost)
if advertiseIP == nil {
// not an IP
c.Unlock()
return "", errMustSpecifyListenAddr
}
systemIPs := listSystemIPs()
found := false found := false
for _, systemIP := range systemIPs { for _, systemIP := range listSystemIPs() {
if systemIP.Equal(advertiseIP) { if systemIP.Equal(advertiseIP) {
localAddr = advertiseIP.String()
found = true found = true
break break
} }
} }
if !found { if !found {
c.Unlock() ip, err := c.resolveSystemAddr()
return "", errMustSpecifyListenAddr if err != nil {
c.Unlock()
logrus.Warnf("Could not find a local address: %v", err)
return "", errMustSpecifyListenAddr
}
localAddr = ip.String()
} }
localAddr = advertiseIP.String()
} }
// todo: check current state existing // todo: check current state existing

View File

@ -9,7 +9,7 @@ import (
var ( var (
errNoSuchInterface = errors.New("no such interface") errNoSuchInterface = errors.New("no such interface")
errNoIP = errors.New("could not find the system's IP address") errNoIP = errors.New("could not find the system's IP address")
errMustSpecifyListenAddr = errors.New("must specify a listening address because the address to advertise is not recognized as a system address") errMustSpecifyListenAddr = errors.New("must specify a listening address because the address to advertise is not recognized as a system address, and a system's IP address to use could not be uniquely identified")
errBadListenAddr = errors.New("listen address must be an IP address or network interface (with optional port number)") errBadListenAddr = errors.New("listen address must be an IP address or network interface (with optional port number)")
errBadAdvertiseAddr = errors.New("advertise address must be an IP address or network interface (with optional port number)") errBadAdvertiseAddr = errors.New("advertise address must be an IP address or network interface (with optional port number)")
errBadDefaultAdvertiseAddr = errors.New("default advertise address must be an IP address or network interface (without a port number)") errBadDefaultAdvertiseAddr = errors.New("default advertise address must be an IP address or network interface (without a port number)")