From 7d8048de06d6074dc83c973a48c1e1a1b60704b6 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 9 Sep 2016 18:56:39 +0200 Subject: [PATCH] Vendor libnetwork @51d88e9ae63f - Fixes #26440 Signed-off-by: Michael Holzheu --- hack/vendor.sh | 2 +- .../libnetwork/drivers/bridge/bridge.go | 36 ++++++++++++++++--- .../libnetwork/drivers/bridge/bridge_store.go | 5 +++ .../bridge/netlink_deprecated_linux_notarm.go | 2 +- .../bridge/netlink_deprecated_linux_s390x.go | 7 ---- .../libnetwork/drivers/bridge/setup_verify.go | 18 ++++++++++ .../github.com/docker/libnetwork/sandbox.go | 2 +- 7 files changed, 58 insertions(+), 14 deletions(-) delete mode 100644 vendor/src/github.com/docker/libnetwork/drivers/bridge/netlink_deprecated_linux_s390x.go diff --git a/hack/vendor.sh b/hack/vendor.sh index 255f0cd35f..b0dad26dcd 100755 --- a/hack/vendor.sh +++ b/hack/vendor.sh @@ -71,7 +71,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 00e7660daeb4b6108a333319d289bf7dc8b9932e +clone git github.com/docker/libnetwork 51d88e9ae63f4164f3678fe74feda89d6990befa clone git github.com/docker/go-events 18b43f1bc85d9cdd42c05a6cd2d444c7a200a894 clone git github.com/armon/go-radix e39d623f12e8e41c7b5529e9a9dd67a1e2261f80 clone git github.com/armon/go-metrics eb0af217e5e9747e41dd5303755356b62d28e3ec diff --git a/vendor/src/github.com/docker/libnetwork/drivers/bridge/bridge.go b/vendor/src/github.com/docker/libnetwork/drivers/bridge/bridge.go index 6c6256a947..0b93eb60b0 100644 --- a/vendor/src/github.com/docker/libnetwork/drivers/bridge/bridge.go +++ b/vendor/src/github.com/docker/libnetwork/drivers/bridge/bridge.go @@ -70,8 +70,19 @@ type networkConfiguration struct { dbIndex uint64 dbExists bool Internal bool + + BridgeIfaceCreator ifaceCreator } +// ifaceCreator represents how the bridge interface was created +type ifaceCreator int8 + +const ( + ifaceCreatorUnknown ifaceCreator = iota + ifaceCreatedByLibnetwork + ifaceCreatedByUser +) + // endpointConfiguration represents the user specified configuration for the sandbox endpoint type endpointConfiguration struct { MacAddress net.HardwareAddr @@ -512,6 +523,17 @@ func parseNetworkOptions(id string, option options.Generic) (*networkConfigurati config.BridgeName = "br-" + id[:12] } + exists, err := bridgeInterfaceExists(config.BridgeName) + if err != nil { + return nil, err + } + + if !exists { + config.BridgeIfaceCreator = ifaceCreatedByLibnetwork + } else { + config.BridgeIfaceCreator = ifaceCreatedByUser + } + config.ID = id return config, nil } @@ -778,11 +800,17 @@ func (d *driver) DeleteNetwork(nid string) error { return err } - // We only delete the bridge when it's not the default bridge. This is keep the backward compatible behavior. - if !config.DefaultBridge { - if err := d.nlh.LinkDel(n.bridge.Link); err != nil { - logrus.Warnf("Failed to remove bridge interface %s on network %s delete: %v", config.BridgeName, nid, err) + switch config.BridgeIfaceCreator { + case ifaceCreatedByLibnetwork, ifaceCreatorUnknown: + // We only delete the bridge if it was created by the bridge driver and + // it is not the default one (to keep the backward compatible behavior.) + if !config.DefaultBridge { + if err := d.nlh.LinkDel(n.bridge.Link); err != nil { + logrus.Warnf("Failed to remove bridge interface %s on network %s delete: %v", config.BridgeName, nid, err) + } } + case ifaceCreatedByUser: + // Don't delete the bridge interface if it was not created by libnetwork. } // clean all relevant iptables rules 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 41c54b00f1..2ed60c7510 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 @@ -143,6 +143,7 @@ func (ncfg *networkConfiguration) MarshalJSON() ([]byte, error) { nMap["DefaultBindingIP"] = ncfg.DefaultBindingIP.String() nMap["DefaultGatewayIPv4"] = ncfg.DefaultGatewayIPv4.String() nMap["DefaultGatewayIPv6"] = ncfg.DefaultGatewayIPv6.String() + nMap["BridgeIfaceCreator"] = ncfg.BridgeIfaceCreator if ncfg.AddressIPv4 != nil { nMap["AddressIPv4"] = ncfg.AddressIPv4.String() @@ -191,6 +192,10 @@ func (ncfg *networkConfiguration) UnmarshalJSON(b []byte) error { ncfg.Internal = v.(bool) } + if v, ok := nMap["BridgeIfaceCreator"]; ok { + ncfg.BridgeIfaceCreator = ifaceCreator(v.(float64)) + } + return nil } diff --git a/vendor/src/github.com/docker/libnetwork/drivers/bridge/netlink_deprecated_linux_notarm.go b/vendor/src/github.com/docker/libnetwork/drivers/bridge/netlink_deprecated_linux_notarm.go index 0852d0f165..df526952f7 100644 --- a/vendor/src/github.com/docker/libnetwork/drivers/bridge/netlink_deprecated_linux_notarm.go +++ b/vendor/src/github.com/docker/libnetwork/drivers/bridge/netlink_deprecated_linux_notarm.go @@ -1,4 +1,4 @@ -// +build !arm,!ppc64,!ppc64le,!s390x +// +build !arm,!ppc64,!ppc64le package bridge diff --git a/vendor/src/github.com/docker/libnetwork/drivers/bridge/netlink_deprecated_linux_s390x.go b/vendor/src/github.com/docker/libnetwork/drivers/bridge/netlink_deprecated_linux_s390x.go deleted file mode 100644 index 2d9abdc2ce..0000000000 --- a/vendor/src/github.com/docker/libnetwork/drivers/bridge/netlink_deprecated_linux_s390x.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build s390x - -package bridge - -func ifrDataByte(b byte) uint8 { - return uint8(b) -} diff --git a/vendor/src/github.com/docker/libnetwork/drivers/bridge/setup_verify.go b/vendor/src/github.com/docker/libnetwork/drivers/bridge/setup_verify.go index f6ef7ae552..0bafed6011 100644 --- a/vendor/src/github.com/docker/libnetwork/drivers/bridge/setup_verify.go +++ b/vendor/src/github.com/docker/libnetwork/drivers/bridge/setup_verify.go @@ -2,8 +2,10 @@ package bridge import ( "fmt" + "strings" log "github.com/Sirupsen/logrus" + "github.com/docker/libnetwork/ns" "github.com/docker/libnetwork/types" "github.com/vishvananda/netlink" ) @@ -51,3 +53,19 @@ func findIPv6Address(addr netlink.Addr, addresses []netlink.Addr) bool { } return false } + +func bridgeInterfaceExists(name string) (bool, error) { + nlh := ns.NlHandle() + link, err := nlh.LinkByName(name) + if err != nil { + if strings.Contains(err.Error(), "Link not found") { + return false, nil + } + return false, fmt.Errorf("failed to check bridge interface existence: %v", err) + } + + if link.Type() == "bridge" { + return true, nil + } + return false, fmt.Errorf("existing interface %s is not a bridge", name) +} diff --git a/vendor/src/github.com/docker/libnetwork/sandbox.go b/vendor/src/github.com/docker/libnetwork/sandbox.go index 775b92ab31..4367518d70 100644 --- a/vendor/src/github.com/docker/libnetwork/sandbox.go +++ b/vendor/src/github.com/docker/libnetwork/sandbox.go @@ -147,7 +147,7 @@ func (sb *sandbox) Key() string { func (sb *sandbox) Labels() map[string]interface{} { sb.Lock() - sb.Unlock() + defer sb.Unlock() opts := make(map[string]interface{}, len(sb.config.generic)) for k, v := range sb.config.generic { opts[k] = v