diff --git a/vendor.conf b/vendor.conf index 2b217120b6..4b88cc6bf4 100644 --- a/vendor.conf +++ b/vendor.conf @@ -39,7 +39,7 @@ github.com/gofrs/flock 392e7fae8f1b0bdbd67dad7237d2 # libnetwork # When updating, also update LIBNETWORK_COMMIT in hack/dockerfile/install/proxy.installer accordingly -github.com/docker/libnetwork ef149a924dfde2e506ea3cb3f617d7d0fa96b8ee +github.com/docker/libnetwork 1a17fb36132631a95fe6bb055b91e24a516ad81d github.com/docker/go-events e31b211e4f1cd09aa76fe4ac244571fab96ae47f 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 fa6ec525b6..4a5c215624 100644 --- a/vendor/github.com/docker/libnetwork/agent.go +++ b/vendor/github.com/docker/libnetwork/agent.go @@ -596,7 +596,7 @@ func (ep *endpoint) deleteDriverInfoFromCluster() error { } func (ep *endpoint) addServiceInfoToCluster(sb *sandbox) error { - if ep.isAnonymous() && len(ep.myAliases) == 0 || ep.Iface().Address() == nil { + if ep.isAnonymous() && len(ep.myAliases) == 0 || ep.Iface() == nil || ep.Iface().Address() == nil { return nil } @@ -719,7 +719,7 @@ func (ep *endpoint) deleteServiceInfoFromCluster(sb *sandbox, fullRemove bool, m } } - if ep.Iface().Address() != nil { + if ep.Iface() != nil && ep.Iface().Address() != nil { if ep.svcID != "" { // This is a task part of a service var ingressPorts []*PortConfig diff --git a/vendor/github.com/docker/libnetwork/controller.go b/vendor/github.com/docker/libnetwork/controller.go index 5a499aa428..642198524d 100644 --- a/vendor/github.com/docker/libnetwork/controller.go +++ b/vendor/github.com/docker/libnetwork/controller.go @@ -67,6 +67,7 @@ import ( "github.com/docker/libnetwork/hostdiscovery" "github.com/docker/libnetwork/ipamapi" "github.com/docker/libnetwork/netlabel" + "github.com/docker/libnetwork/options" "github.com/docker/libnetwork/osl" "github.com/docker/libnetwork/types" "github.com/pkg/errors" @@ -252,6 +253,7 @@ func New(cfgOptions ...config.Option) (NetworkController, error) { return nil, err } + setupArrangeUserFilterRule(c) return c, nil } @@ -909,8 +911,7 @@ addToStore: arrangeIngressFilterRule() c.Unlock() } - - c.arrangeUserFilterRule() + arrangeUserFilterRule() return network, nil } @@ -979,6 +980,10 @@ func (c *controller) reservePools() { continue } for _, ep := range epl { + if ep.Iface() == nil { + logrus.Warnf("endpoint interface is empty for %q (%s)", ep.Name(), ep.ID()) + continue + } if err := ep.assignAddress(ipam, true, ep.Iface().AddressIPv6() != nil); err != nil { logrus.Warnf("Failed to reserve current address for endpoint %q (%s) on network %q (%s)", ep.Name(), ep.ID(), n.Name(), n.ID()) @@ -1363,3 +1368,27 @@ func (c *controller) IsDiagnosticEnabled() bool { defer c.Unlock() return c.DiagnosticServer.IsDiagnosticEnabled() } + +func (c *controller) iptablesEnabled() bool { + c.Lock() + defer c.Unlock() + + if c.cfg == nil { + return false + } + // parse map cfg["bridge"]["generic"]["EnableIPTable"] + cfgBridge, ok := c.cfg.Daemon.DriverCfg["bridge"].(map[string]interface{}) + if !ok { + return false + } + cfgGeneric, ok := cfgBridge[netlabel.GenericData].(options.Generic) + if !ok { + return false + } + enabled, ok := cfgGeneric["EnableIPTables"].(bool) + if !ok { + // unless user explicitly stated, assume iptable is enabled + enabled = true + } + return enabled +} diff --git a/vendor/github.com/docker/libnetwork/firewall_linux.go b/vendor/github.com/docker/libnetwork/firewall_linux.go index 54f9621f81..26ee91346e 100644 --- a/vendor/github.com/docker/libnetwork/firewall_linux.go +++ b/vendor/github.com/docker/libnetwork/firewall_linux.go @@ -7,21 +7,25 @@ import ( const userChain = "DOCKER-USER" -func (c *controller) arrangeUserFilterRule() { - c.Lock() - arrangeUserFilterRule() - c.Unlock() - iptables.OnReloaded(func() { - c.Lock() - arrangeUserFilterRule() - c.Unlock() - }) +var ( + ctrl *controller = nil +) + +func setupArrangeUserFilterRule(c *controller) { + ctrl = c + iptables.OnReloaded(arrangeUserFilterRule) } // This chain allow users to configure firewall policies in a way that persists // docker operations/restarts. Docker will not delete or modify any pre-existing // rules from the DOCKER-USER filter chain. +// Note once DOCKER-USER chain is created, docker engine does not remove it when +// IPTableForwarding is disabled, because it contains rules configured by user that +// are beyond docker engine's control. func arrangeUserFilterRule() { + if ctrl == nil || !ctrl.iptablesEnabled() { + return + } _, err := iptables.NewChain(userChain, iptables.Filter, false) if err != nil { logrus.Warnf("Failed to create %s chain: %v", userChain, err) diff --git a/vendor/github.com/docker/libnetwork/firewall_others.go b/vendor/github.com/docker/libnetwork/firewall_others.go index 901f568fed..4f72ae9df3 100644 --- a/vendor/github.com/docker/libnetwork/firewall_others.go +++ b/vendor/github.com/docker/libnetwork/firewall_others.go @@ -2,5 +2,5 @@ package libnetwork -func (c *controller) arrangeUserFilterRule() { -} +func setupArrangeUserFilterRule(c *controller) {} +func arrangeUserFilterRule() {} diff --git a/vendor/github.com/docker/libnetwork/ipams/builtin/builtin_unix.go b/vendor/github.com/docker/libnetwork/ipams/builtin/builtin_unix.go index b07fb4b632..5ac3def770 100644 --- a/vendor/github.com/docker/libnetwork/ipams/builtin/builtin_unix.go +++ b/vendor/github.com/docker/libnetwork/ipams/builtin/builtin_unix.go @@ -35,7 +35,10 @@ func Init(ic ipamapi.Callback, l, g interface{}) error { } } - ipamutils.ConfigLocalScopeDefaultNetworks(GetDefaultIPAddressPool()) + err := ipamutils.ConfigLocalScopeDefaultNetworks(GetDefaultIPAddressPool()) + if err != nil { + return err + } a, err := ipam.NewAllocator(localDs, globalDs) if err != nil { diff --git a/vendor/github.com/docker/libnetwork/network.go b/vendor/github.com/docker/libnetwork/network.go index 778c62a6e6..1f79577395 100644 --- a/vendor/github.com/docker/libnetwork/network.go +++ b/vendor/github.com/docker/libnetwork/network.go @@ -1329,7 +1329,7 @@ func (n *network) EndpointByID(id string) (Endpoint, error) { func (n *network) updateSvcRecord(ep *endpoint, localEps []*endpoint, isAdd bool) { var ipv6 net.IP epName := ep.Name() - if iface := ep.Iface(); iface.Address() != nil { + if iface := ep.Iface(); iface != nil && iface.Address() != nil { myAliases := ep.MyAliases() if iface.AddressIPv6() != nil { ipv6 = iface.AddressIPv6().IP