|
@@ -31,22 +31,23 @@ const (
|
|
|
var initVxlanIdm = make(chan (bool), 1)
|
|
|
|
|
|
type driver struct {
|
|
|
- eventCh chan serf.Event
|
|
|
- notifyCh chan ovNotify
|
|
|
- exitCh chan chan struct{}
|
|
|
- bindAddress string
|
|
|
- neighIP string
|
|
|
- config map[string]interface{}
|
|
|
- peerDb peerNetworkMap
|
|
|
- secMap *encrMap
|
|
|
- serfInstance *serf.Serf
|
|
|
- networks networkTable
|
|
|
- store datastore.DataStore
|
|
|
- localStore datastore.DataStore
|
|
|
- vxlanIdm *idm.Idm
|
|
|
- once sync.Once
|
|
|
- joinOnce sync.Once
|
|
|
- keys []*key
|
|
|
+ eventCh chan serf.Event
|
|
|
+ notifyCh chan ovNotify
|
|
|
+ exitCh chan chan struct{}
|
|
|
+ bindAddress string
|
|
|
+ advertiseAddress string
|
|
|
+ neighIP string
|
|
|
+ config map[string]interface{}
|
|
|
+ peerDb peerNetworkMap
|
|
|
+ secMap *encrMap
|
|
|
+ serfInstance *serf.Serf
|
|
|
+ networks networkTable
|
|
|
+ store datastore.DataStore
|
|
|
+ localStore datastore.DataStore
|
|
|
+ vxlanIdm *idm.Idm
|
|
|
+ once sync.Once
|
|
|
+ joinOnce sync.Once
|
|
|
+ keys []*key
|
|
|
sync.Mutex
|
|
|
}
|
|
|
|
|
@@ -144,7 +145,7 @@ func (d *driver) restoreEndpoints() error {
|
|
|
}
|
|
|
|
|
|
n.incEndpointCount()
|
|
|
- d.peerDbAdd(ep.nid, ep.id, ep.addr.IP, ep.addr.Mask, ep.mac, net.ParseIP(d.bindAddress), true)
|
|
|
+ d.peerDbAdd(ep.nid, ep.id, ep.addr.IP, ep.addr.Mask, ep.mac, net.ParseIP(d.advertiseAddress), true)
|
|
|
}
|
|
|
return nil
|
|
|
}
|
|
@@ -215,20 +216,25 @@ func validateSelf(node string) error {
|
|
|
return fmt.Errorf("Multi-Host overlay networking requires cluster-advertise(%s) to be configured with a local ip-address that is reachable within the cluster", advIP.String())
|
|
|
}
|
|
|
|
|
|
-func (d *driver) nodeJoin(node string, self bool) {
|
|
|
+func (d *driver) nodeJoin(advertiseAddress, bindAddress string, self bool) {
|
|
|
if self && !d.isSerfAlive() {
|
|
|
- if err := validateSelf(node); err != nil {
|
|
|
- logrus.Errorf("%s", err.Error())
|
|
|
- }
|
|
|
d.Lock()
|
|
|
- d.bindAddress = node
|
|
|
+ d.advertiseAddress = advertiseAddress
|
|
|
+ d.bindAddress = bindAddress
|
|
|
d.Unlock()
|
|
|
|
|
|
// If there is no cluster store there is no need to start serf.
|
|
|
if d.store != nil {
|
|
|
+ if err := validateSelf(advertiseAddress); err != nil {
|
|
|
+ logrus.Warnf("%s", err.Error())
|
|
|
+ }
|
|
|
err := d.serfInit()
|
|
|
if err != nil {
|
|
|
logrus.Errorf("initializing serf instance failed: %v", err)
|
|
|
+ d.Lock()
|
|
|
+ d.advertiseAddress = ""
|
|
|
+ d.bindAddress = ""
|
|
|
+ d.Unlock()
|
|
|
return
|
|
|
}
|
|
|
}
|
|
@@ -236,7 +242,7 @@ func (d *driver) nodeJoin(node string, self bool) {
|
|
|
|
|
|
d.Lock()
|
|
|
if !self {
|
|
|
- d.neighIP = node
|
|
|
+ d.neighIP = advertiseAddress
|
|
|
}
|
|
|
neighIP := d.neighIP
|
|
|
d.Unlock()
|
|
@@ -250,7 +256,7 @@ func (d *driver) nodeJoin(node string, self bool) {
|
|
|
}
|
|
|
})
|
|
|
if err != nil {
|
|
|
- logrus.Errorf("joining serf neighbor %s failed: %v", node, err)
|
|
|
+ logrus.Errorf("joining serf neighbor %s failed: %v", advertiseAddress, err)
|
|
|
d.Lock()
|
|
|
d.joinOnce = sync.Once{}
|
|
|
d.Unlock()
|
|
@@ -290,7 +296,7 @@ func (d *driver) DiscoverNew(dType discoverapi.DiscoveryType, data interface{})
|
|
|
if !ok || nodeData.Address == "" {
|
|
|
return fmt.Errorf("invalid discovery data")
|
|
|
}
|
|
|
- d.nodeJoin(nodeData.Address, nodeData.Self)
|
|
|
+ d.nodeJoin(nodeData.Address, nodeData.BindAddress, nodeData.Self)
|
|
|
case discoverapi.DatastoreConfig:
|
|
|
if d.store != nil {
|
|
|
return types.ForbiddenErrorf("cannot accept datastore configuration: Overlay driver has a datastore configured already")
|