From f685fe1a9988af8a49225a6e574c231e2a19dc25 Mon Sep 17 00:00:00 2001 From: Santhosh Manohar Date: Tue, 5 Apr 2016 16:39:16 -0700 Subject: [PATCH] Vendor Libnetwork v0.7.0-rc.3 Signed-off-by: Santhosh Manohar (cherry picked from commit 5b892819a60a0a91c168c6a2c1e22c958be143ca) --- hack/vendor.sh | 2 +- .../github.com/docker/libnetwork/CHANGELOG.md | 10 +++ .../libnetwork/drivers/bridge/bridge_store.go | 4 + .../libnetwork/drivers/overlay/ov_network.go | 5 ++ .../libnetwork/ipams/builtin/builtin_unix.go | 4 + .../docker/libnetwork/ipamutils/utils.go | 16 +++- .../libnetwork/ipamutils/utils_linux.go | 2 + .../github.com/docker/libnetwork/resolver.go | 86 ++++++++++++++++--- 8 files changed, 114 insertions(+), 15 deletions(-) diff --git a/hack/vendor.sh b/hack/vendor.sh index e27009c370..10fb59f634 100755 --- a/hack/vendor.sh +++ b/hack/vendor.sh @@ -29,7 +29,7 @@ clone git github.com/RackSec/srslog 259aed10dfa74ea2961eddd1d9847619f6e98837 clone git github.com/imdario/mergo 0.2.1 #get libnetwork packages -clone git github.com/docker/libnetwork v0.7.0-rc.1 +clone git github.com/docker/libnetwork v0.7.0-rc.3 clone git github.com/armon/go-metrics eb0af217e5e9747e41dd5303755356b62d28e3ec clone git github.com/hashicorp/go-msgpack 71c2886f5a673a35f909803f38ece5810165097b clone git github.com/hashicorp/memberlist 9a1e242e454d2443df330bdd51a436d5a9058fc4 diff --git a/vendor/src/github.com/docker/libnetwork/CHANGELOG.md b/vendor/src/github.com/docker/libnetwork/CHANGELOG.md index a91f791228..c690cf095e 100644 --- a/vendor/src/github.com/docker/libnetwork/CHANGELOG.md +++ b/vendor/src/github.com/docker/libnetwork/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 0.7.0-rc.3 (2016-04-05) +- Revert fix for default gateway endoint join/leave. Needs to be reworked. +- Persist the network internal mode for bridge networks + +## 0.7.0-rc.2 (2016-04-05) +- Fixes https://github.com/docker/libnetwork/issues/1070 +- Move IPAM resource initialization out of init() +- Initialize overlay driver before network delete +- Fix the handling for default gateway Endpoint join/lean + ## 0.7.0-rc.1 (2016-03-30) - Fixes https://github.com/docker/libnetwork/issues/985 - Fixes https://github.com/docker/libnetwork/issues/945 diff --git a/vendor/src/github.com/docker/libnetwork/drivers/bridge/bridge_store.go b/vendor/src/github.com/docker/libnetwork/drivers/bridge/bridge_store.go index 066469adc9..eca72bd30b 100644 --- a/vendor/src/github.com/docker/libnetwork/drivers/bridge/bridge_store.go +++ b/vendor/src/github.com/docker/libnetwork/drivers/bridge/bridge_store.go @@ -95,6 +95,7 @@ func (ncfg *networkConfiguration) MarshalJSON() ([]byte, error) { nMap["EnableIPMasquerade"] = ncfg.EnableIPMasquerade nMap["EnableICC"] = ncfg.EnableICC nMap["Mtu"] = ncfg.Mtu + nMap["Internal"] = ncfg.Internal nMap["DefaultBridge"] = ncfg.DefaultBridge nMap["DefaultBindingIP"] = ncfg.DefaultBindingIP.String() nMap["DefaultGatewayIPv4"] = ncfg.DefaultGatewayIPv4.String() @@ -143,6 +144,9 @@ func (ncfg *networkConfiguration) UnmarshalJSON(b []byte) error { ncfg.EnableIPMasquerade = nMap["EnableIPMasquerade"].(bool) ncfg.EnableICC = nMap["EnableICC"].(bool) ncfg.Mtu = int(nMap["Mtu"].(float64)) + if v, ok := nMap["Internal"]; ok { + ncfg.Internal = v.(bool) + } return nil } diff --git a/vendor/src/github.com/docker/libnetwork/drivers/overlay/ov_network.go b/vendor/src/github.com/docker/libnetwork/drivers/overlay/ov_network.go index 9d118ffb4e..18e527a2ba 100644 --- a/vendor/src/github.com/docker/libnetwork/drivers/overlay/ov_network.go +++ b/vendor/src/github.com/docker/libnetwork/drivers/overlay/ov_network.go @@ -104,6 +104,11 @@ func (d *driver) DeleteNetwork(nid string) error { return fmt.Errorf("invalid network id") } + // Make sure driver resources are initialized before proceeding + if err := d.configure(); err != nil { + return err + } + n := d.network(nid) if n == nil { return fmt.Errorf("could not find network with id %s", nid) diff --git a/vendor/src/github.com/docker/libnetwork/ipams/builtin/builtin_unix.go b/vendor/src/github.com/docker/libnetwork/ipams/builtin/builtin_unix.go index 311183fc87..c47674aaf0 100644 --- a/vendor/src/github.com/docker/libnetwork/ipams/builtin/builtin_unix.go +++ b/vendor/src/github.com/docker/libnetwork/ipams/builtin/builtin_unix.go @@ -8,6 +8,7 @@ import ( "github.com/docker/libnetwork/datastore" "github.com/docker/libnetwork/ipam" "github.com/docker/libnetwork/ipamapi" + "github.com/docker/libnetwork/ipamutils" ) // Init registers the built-in ipam service with libnetwork @@ -28,6 +29,9 @@ func Init(ic ipamapi.Callback, l, g interface{}) error { return fmt.Errorf("incorrect global datastore passed to built-in ipam init") } } + + ipamutils.InitNetworks() + a, err := ipam.NewAllocator(localDs, globalDs) if err != nil { return err diff --git a/vendor/src/github.com/docker/libnetwork/ipamutils/utils.go b/vendor/src/github.com/docker/libnetwork/ipamutils/utils.go index 283e003b5c..798a3afa3e 100644 --- a/vendor/src/github.com/docker/libnetwork/ipamutils/utils.go +++ b/vendor/src/github.com/docker/libnetwork/ipamutils/utils.go @@ -1,7 +1,10 @@ // Package ipamutils provides utililty functions for ipam management package ipamutils -import "net" +import ( + "net" + "sync" +) var ( // PredefinedBroadNetworks contains a list of 31 IPv4 private networks with host size 16 and 12 @@ -10,11 +13,16 @@ var ( // PredefinedGranularNetworks contains a list of 64K IPv4 private networks with host size 8 // (10.x.x.x/24) which do not overlap with the networks in `PredefinedBroadNetworks` PredefinedGranularNetworks []*net.IPNet + + initNetworksOnce sync.Once ) -func init() { - PredefinedBroadNetworks = initBroadPredefinedNetworks() - PredefinedGranularNetworks = initGranularPredefinedNetworks() +// InitNetworks initializes the pre-defined networks used by the built-in IP allocator +func InitNetworks() { + initNetworksOnce.Do(func() { + PredefinedBroadNetworks = initBroadPredefinedNetworks() + PredefinedGranularNetworks = initGranularPredefinedNetworks() + }) } func initBroadPredefinedNetworks() []*net.IPNet { diff --git a/vendor/src/github.com/docker/libnetwork/ipamutils/utils_linux.go b/vendor/src/github.com/docker/libnetwork/ipamutils/utils_linux.go index 9706cf39cd..056a234c8f 100644 --- a/vendor/src/github.com/docker/libnetwork/ipamutils/utils_linux.go +++ b/vendor/src/github.com/docker/libnetwork/ipamutils/utils_linux.go @@ -22,6 +22,8 @@ func ElectInterfaceAddresses(name string) (*net.IPNet, []*net.IPNet, error) { err error ) + InitNetworks() + defer osl.InitOSContext()() link, _ := netlink.LinkByName(name) diff --git a/vendor/src/github.com/docker/libnetwork/resolver.go b/vendor/src/github.com/docker/libnetwork/resolver.go index a29e850293..7af1850cf6 100644 --- a/vendor/src/github.com/docker/libnetwork/resolver.go +++ b/vendor/src/github.com/docker/libnetwork/resolver.go @@ -49,8 +49,14 @@ const ( defaultRespSize = 512 maxConcurrent = 50 logInterval = 2 * time.Second + maxDNSID = 65536 ) +type clientConn struct { + dnsID uint16 + respWriter dns.ResponseWriter +} + type extDNSEntry struct { ipStr string extConn net.Conn @@ -69,6 +75,7 @@ type resolver struct { count int32 tStamp time.Time queryLock sync.Mutex + client map[uint16]clientConn } func init() { @@ -78,8 +85,9 @@ func init() { // NewResolver creates a new instance of the Resolver func NewResolver(sb *sandbox) Resolver { return &resolver{ - sb: sb, - err: fmt.Errorf("setup not done yet"), + sb: sb, + err: fmt.Errorf("setup not done yet"), + client: make(map[uint16]clientConn), } } @@ -375,7 +383,9 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) { extConn.SetDeadline(time.Now().Add(extIOTimeout)) co := &dns.Conn{Conn: extConn} - if r.concurrentQueryInc() == false { + // forwardQueryStart stores required context to mux multiple client queries over + // one connection; and limits the number of outstanding concurrent queries. + if r.forwardQueryStart(w, query) == false { old := r.tStamp r.tStamp = time.Now() if r.tStamp.Sub(old) > logInterval { @@ -391,18 +401,25 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) { }() err = co.WriteMsg(query) if err != nil { - r.concurrentQueryDec() + r.forwardQueryEnd(w, query) log.Debugf("Send to DNS server failed, %s", err) continue } resp, err = co.ReadMsg() - r.concurrentQueryDec() if err != nil { + r.forwardQueryEnd(w, query) log.Debugf("Read from DNS server failed, %s", err) continue } + // Retrieves the context for the forwarded query and returns the client connection + // to send the reply to + w = r.forwardQueryEnd(w, resp) + if w == nil { + continue + } + resp.Compress = true break } @@ -418,22 +435,71 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) { } } -func (r *resolver) concurrentQueryInc() bool { +func (r *resolver) forwardQueryStart(w dns.ResponseWriter, msg *dns.Msg) bool { + proto := w.LocalAddr().Network() + dnsID := uint16(rand.Intn(maxDNSID)) + + cc := clientConn{ + dnsID: msg.Id, + respWriter: w, + } + r.queryLock.Lock() defer r.queryLock.Unlock() + if r.count == maxConcurrent { return false } r.count++ + + switch proto { + case "tcp": + break + case "udp": + for ok := true; ok == true; dnsID = uint16(rand.Intn(maxDNSID)) { + _, ok = r.client[dnsID] + } + log.Debugf("client dns id %v, changed id %v", msg.Id, dnsID) + r.client[dnsID] = cc + msg.Id = dnsID + default: + log.Errorf("Invalid protocol..") + return false + } + return true } -func (r *resolver) concurrentQueryDec() bool { +func (r *resolver) forwardQueryEnd(w dns.ResponseWriter, msg *dns.Msg) dns.ResponseWriter { + var ( + cc clientConn + ok bool + ) + proto := w.LocalAddr().Network() + r.queryLock.Lock() defer r.queryLock.Unlock() + if r.count == 0 { - return false + log.Errorf("Invalid concurrent query count") + } else { + r.count-- } - r.count-- - return true + + switch proto { + case "tcp": + break + case "udp": + if cc, ok = r.client[msg.Id]; ok == false { + log.Debugf("Can't retrieve client context for dns id %v", msg.Id) + return nil + } + delete(r.client, msg.Id) + msg.Id = cc.dnsID + w = cc.respWriter + default: + log.Errorf("Invalid protocol") + return nil + } + return w }