diff --git a/vendor.conf b/vendor.conf index 32b3d9fb46..5bab46244d 100644 --- a/vendor.conf +++ b/vendor.conf @@ -25,7 +25,7 @@ github.com/RackSec/srslog 456df3a81436d29ba874f3590eeeee25d666f8a5 github.com/imdario/mergo 0.2.1 #get libnetwork packages -github.com/docker/libnetwork b13e0604016a4944025aaff521d9c125850b0d04 +github.com/docker/libnetwork 5dc95a3f9ce4b70bf08492ca37ec55c5b6d84975 github.com/docker/go-events 18b43f1bc85d9cdd42c05a6cd2d444c7a200a894 github.com/armon/go-radix e39d623f12e8e41c7b5529e9a9dd67a1e2261f80 github.com/armon/go-metrics eb0af217e5e9747e41dd5303755356b62d28e3ec diff --git a/vendor/github.com/docker/libnetwork/agent.go b/vendor/github.com/docker/libnetwork/agent.go index ff1869055f..785e731c6e 100644 --- a/vendor/github.com/docker/libnetwork/agent.go +++ b/vendor/github.com/docker/libnetwork/agent.go @@ -39,11 +39,21 @@ type agent struct { networkDB *networkdb.NetworkDB bindAddr string advertiseAddr string + dataPathAddr string epTblCancel func() driverCancelFuncs map[string][]func() sync.Mutex } +func (a *agent) dataPathAddress() string { + a.Lock() + defer a.Unlock() + if a.dataPathAddr != "" { + return a.dataPathAddr + } + return a.advertiseAddr +} + const libnetworkEPTable = "endpoint_table" func getBindAddr(ifaceName string) (string, error) { @@ -187,16 +197,25 @@ func (c *controller) agentSetup() error { clusterProvider := c.cfg.Daemon.ClusterProvider agent := c.agent c.Unlock() + + if clusterProvider == nil { + msg := "Aborting initialization of Libnetwork Agent because cluster provider is now unset" + logrus.Errorf(msg) + return fmt.Errorf(msg) + } + bindAddr := clusterProvider.GetLocalAddress() advAddr := clusterProvider.GetAdvertiseAddress() + dataAddr := clusterProvider.GetDataPathAddress() remote := clusterProvider.GetRemoteAddress() remoteAddr, _, _ := net.SplitHostPort(remote) listen := clusterProvider.GetListenAddress() listenAddr, _, _ := net.SplitHostPort(listen) - logrus.Infof("Initializing Libnetwork Agent Listen-Addr=%s Local-addr=%s Adv-addr=%s Remote-addr =%s", listenAddr, bindAddr, advAddr, remoteAddr) + logrus.Infof("Initializing Libnetwork Agent Listen-Addr=%s Local-addr=%s Adv-addr=%s Data-addr=%s Remote-addr=%s", + listenAddr, bindAddr, advAddr, dataAddr, remoteAddr) if advAddr != "" && agent == nil { - if err := c.agentInit(listenAddr, bindAddr, advAddr); err != nil { + if err := c.agentInit(listenAddr, bindAddr, advAddr, dataAddr); err != nil { logrus.Errorf("Error in agentInit : %v", err) } else { c.drvRegistry.WalkDrivers(func(name string, driver driverapi.Driver, capability driverapi.Capability) bool { @@ -262,7 +281,7 @@ func (c *controller) getPrimaryKeyTag(subsys string) ([]byte, uint64, error) { return keys[1].Key, keys[1].LamportTime, nil } -func (c *controller) agentInit(listenAddr, bindAddrOrInterface, advertiseAddr string) error { +func (c *controller) agentInit(listenAddr, bindAddrOrInterface, advertiseAddr, dataPathAddr string) error { if !c.isAgent() { return nil } @@ -296,6 +315,7 @@ func (c *controller) agentInit(listenAddr, bindAddrOrInterface, advertiseAddr st networkDB: nDB, bindAddr: bindAddr, advertiseAddr: advertiseAddr, + dataPathAddr: dataPathAddr, epTblCancel: cancel, driverCancelFuncs: make(map[string][]func()), } @@ -336,25 +356,22 @@ func (c *controller) agentDriverNotify(d driverapi.Driver) { return } - d.DiscoverNew(discoverapi.NodeDiscovery, discoverapi.NodeDiscoveryData{ - Address: agent.advertiseAddr, + if err := d.DiscoverNew(discoverapi.NodeDiscovery, discoverapi.NodeDiscoveryData{ + Address: agent.dataPathAddress(), BindAddress: agent.bindAddr, Self: true, - }) + }); err != nil { + logrus.Warnf("Failed the node discovery in driver: %v", err) + } drvEnc := discoverapi.DriverEncryptionConfig{} keys, tags := c.getKeys(subsysIPSec) drvEnc.Keys = keys drvEnc.Tags = tags - c.drvRegistry.WalkDrivers(func(name string, driver driverapi.Driver, capability driverapi.Capability) bool { - err := driver.DiscoverNew(discoverapi.EncryptionKeysConfig, drvEnc) - if err != nil { - logrus.Warnf("Failed to set datapath keys in driver %s: %v", name, err) - } - return false - }) - + if err := d.DiscoverNew(discoverapi.EncryptionKeysConfig, drvEnc); err != nil { + logrus.Warnf("Failed to set datapath keys in driver: %v", err) + } } func (c *controller) agentClose() { diff --git a/vendor/github.com/docker/libnetwork/cluster/provider.go b/vendor/github.com/docker/libnetwork/cluster/provider.go index 572bac85a6..24f40c56eb 100644 --- a/vendor/github.com/docker/libnetwork/cluster/provider.go +++ b/vendor/github.com/docker/libnetwork/cluster/provider.go @@ -12,6 +12,7 @@ type Provider interface { GetLocalAddress() string GetListenAddress() string GetAdvertiseAddress() string + GetDataPathAddress() string GetRemoteAddress() string ListenClusterEvents() <-chan struct{} AttachNetwork(string, string, []string) (*network.NetworkingConfig, error) diff --git a/vendor/github.com/docker/libnetwork/default_gateway.go b/vendor/github.com/docker/libnetwork/default_gateway.go index b042539b88..bf1592435f 100644 --- a/vendor/github.com/docker/libnetwork/default_gateway.go +++ b/vendor/github.com/docker/libnetwork/default_gateway.go @@ -4,6 +4,7 @@ import ( "fmt" "strings" + "github.com/Sirupsen/logrus" "github.com/docker/libnetwork/netlabel" "github.com/docker/libnetwork/types" ) @@ -72,9 +73,19 @@ func (sb *sandbox) setupDefaultGW() error { if err != nil { return fmt.Errorf("container %s: endpoint create on GW Network failed: %v", sb.containerID, err) } + + defer func() { + if err != nil { + if err2 := newEp.Delete(true); err2 != nil { + logrus.Warnf("Failed to remove gw endpoint for container %s after failing to join the gateway network: %v", + sb.containerID, err2) + } + } + }() + epLocal := newEp.(*endpoint) - if err := epLocal.sbJoin(sb); err != nil { + if err = epLocal.sbJoin(sb); err != nil { return fmt.Errorf("container %s: endpoint join on GW Network failed: %v", sb.containerID, err) } diff --git a/vendor/github.com/docker/libnetwork/endpoint.go b/vendor/github.com/docker/libnetwork/endpoint.go index de63cf34e8..8e70c38d76 100644 --- a/vendor/github.com/docker/libnetwork/endpoint.go +++ b/vendor/github.com/docker/libnetwork/endpoint.go @@ -427,7 +427,7 @@ func (ep *endpoint) Join(sbox Sandbox, options ...EndpointOption) error { return ep.sbJoin(sb, options...) } -func (ep *endpoint) sbJoin(sb *sandbox, options ...EndpointOption) error { +func (ep *endpoint) sbJoin(sb *sandbox, options ...EndpointOption) (err error) { n, err := ep.getNetworkFromStore() if err != nil { return fmt.Errorf("failed to get network from store during join: %v", err) @@ -462,7 +462,7 @@ func (ep *endpoint) sbJoin(sb *sandbox, options ...EndpointOption) error { d, err := n.driver(true) if err != nil { - return fmt.Errorf("failed to join endpoint: %v", err) + return fmt.Errorf("failed to get driver during join: %v", err) } err = d.Join(nid, epid, sb.Key(), ep, sb.Labels()) @@ -471,8 +471,8 @@ func (ep *endpoint) sbJoin(sb *sandbox, options ...EndpointOption) error { } defer func() { if err != nil { - if err := d.Leave(nid, epid); err != nil { - logrus.Warnf("driver leave failed while rolling back join: %v", err) + if e := d.Leave(nid, epid); e != nil { + logrus.Warnf("driver leave failed while rolling back join: %v", e) } } }() @@ -538,11 +538,11 @@ func (ep *endpoint) sbJoin(sb *sandbox, options ...EndpointOption) error { logrus.Debugf("Revoking external connectivity on endpoint %s (%s)", extEp.Name(), extEp.ID()) extN, err := extEp.getNetworkFromStore() if err != nil { - return fmt.Errorf("failed to get network from store during join: %v", err) + return fmt.Errorf("failed to get network from store for revoking external connectivity during join: %v", err) } extD, err := extN.driver(true) if err != nil { - return fmt.Errorf("failed to join endpoint: %v", err) + return fmt.Errorf("failed to get driver for revoking external connectivity during join: %v", err) } if err = extD.RevokeExternalConnectivity(extEp.network.ID(), extEp.ID()); err != nil { return types.InternalErrorf( @@ -570,9 +570,9 @@ func (ep *endpoint) sbJoin(sb *sandbox, options ...EndpointOption) error { } if !sb.needDefaultGW() { - if err := sb.clearDefaultGW(); err != nil { + if e := sb.clearDefaultGW(); e != nil { logrus.Warnf("Failure while disconnecting sandbox %s (%s) from gateway network: %v", - sb.ID(), sb.ContainerID(), err) + sb.ID(), sb.ContainerID(), e) } } @@ -705,7 +705,7 @@ func (ep *endpoint) sbLeave(sb *sandbox, force bool, options ...EndpointOption) d, err := n.driver(!force) if err != nil { - return fmt.Errorf("failed to leave endpoint: %v", err) + return fmt.Errorf("failed to get driver during endpoint leave: %v", err) } ep.Lock() @@ -765,11 +765,11 @@ func (ep *endpoint) sbLeave(sb *sandbox, force bool, options ...EndpointOption) logrus.Debugf("Programming external connectivity on endpoint %s (%s)", extEp.Name(), extEp.ID()) extN, err := extEp.getNetworkFromStore() if err != nil { - return fmt.Errorf("failed to get network from store during leave: %v", err) + return fmt.Errorf("failed to get network from store for programming external connectivity during leave: %v", err) } extD, err := extN.driver(true) if err != nil { - return fmt.Errorf("failed to leave endpoint: %v", err) + return fmt.Errorf("failed to get driver for programming external connectivity during leave: %v", err) } if err := extD.ProgramExternalConnectivity(extEp.network.ID(), extEp.ID(), sb.Labels()); err != nil { logrus.Warnf("driver failed programming external connectivity on endpoint %s: (%s) %v", diff --git a/vendor/github.com/docker/libnetwork/networkdb/broadcast.go b/vendor/github.com/docker/libnetwork/networkdb/broadcast.go index 5555634179..3fe9f6271a 100644 --- a/vendor/github.com/docker/libnetwork/networkdb/broadcast.go +++ b/vendor/github.com/docker/libnetwork/networkdb/broadcast.go @@ -86,6 +86,15 @@ func (nDB *NetworkDB) sendNodeEvent(event NodeEvent_Type) error { notify: notifyCh, }) + nDB.RLock() + noPeers := len(nDB.nodes) <= 1 + nDB.RUnlock() + + // Message enqueued, do not wait for a send if no peer is present + if noPeers { + return nil + } + // Wait for the broadcast select { case <-notifyCh: diff --git a/vendor/github.com/docker/libnetwork/networkdb/cluster.go b/vendor/github.com/docker/libnetwork/networkdb/cluster.go index 62d05c0aea..54c392c5a4 100644 --- a/vendor/github.com/docker/libnetwork/networkdb/cluster.go +++ b/vendor/github.com/docker/libnetwork/networkdb/cluster.go @@ -17,7 +17,7 @@ import ( ) const ( - reapInterval = 60 * time.Second + reapInterval = 30 * time.Minute reapPeriod = 5 * time.Second retryInterval = 1 * time.Second nodeReapInterval = 24 * time.Hour