mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
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:
parent
02918908af
commit
c8d0cb9e71
2 changed files with 17 additions and 16 deletions
|
@ -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
|
||||||
|
|
|
@ -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)")
|
||||||
|
|
Loading…
Reference in a new issue