Pārlūkot izejas kodu

Merge pull request #1241 from mavenugo/per

Cleanup any stale overlay bridge with overlapping subnet in hostMode
Alessandro Boch 9 gadi atpakaļ
vecāks
revīzija
91c837fd77

+ 8 - 2
libnetwork/drivers/overlay/ov_network.go

@@ -361,7 +361,11 @@ func (n *network) generateBridgeName(s *subnet) string {
 		id = n.id[:5]
 	}
 
-	return "ov-" + fmt.Sprintf("%06x", n.vxlanID(s)) + "-" + id
+	return n.getBridgeNamePrefix(s) + "-" + id
+}
+
+func (n *network) getBridgeNamePrefix(s *subnet) string {
+	return "ov-" + fmt.Sprintf("%06x", n.vxlanID(s))
 }
 
 func isOverlap(nw *net.IPNet) bool {
@@ -388,7 +392,9 @@ func (n *network) initSubnetSandbox(s *subnet) error {
 
 	if hostMode {
 		// Try to delete stale bridge interface if it exists
-		deleteInterface(brName)
+		if err := deleteInterface(brName); err != nil {
+			deleteInterfaceBySubnet(n.getBridgeNamePrefix(s), s)
+		}
 		// Try to delete the vxlan interface by vni if already present
 		deleteVxlanByVNI("", n.vxlanID(s))
 

+ 33 - 0
libnetwork/drivers/overlay/ov_utils.go

@@ -2,7 +2,9 @@ package overlay
 
 import (
 	"fmt"
+	"strings"
 
+	"github.com/Sirupsen/logrus"
 	"github.com/docker/libnetwork/netutils"
 	"github.com/docker/libnetwork/ns"
 	"github.com/docker/libnetwork/osl"
@@ -69,6 +71,37 @@ func createVxlan(name string, vni uint32) error {
 	return nil
 }
 
+func deleteInterfaceBySubnet(brPrefix string, s *subnet) error {
+	defer osl.InitOSContext()()
+
+	nlh := ns.NlHandle()
+	links, err := nlh.LinkList()
+	if err != nil {
+		return fmt.Errorf("failed to list interfaces while deleting bridge interface by subnet: %v", err)
+	}
+
+	for _, l := range links {
+		name := l.Attrs().Name
+		if _, ok := l.(*netlink.Bridge); ok && strings.HasPrefix(name, brPrefix) {
+			addrList, err := nlh.AddrList(l, netlink.FAMILY_V4)
+			if err != nil {
+				logrus.Errorf("error getting AddressList for bridge %s", name)
+				continue
+			}
+			for _, addr := range addrList {
+				if netutils.NetworkOverlaps(addr.IPNet, s.subnetIP) {
+					err = nlh.LinkDel(l)
+					if err != nil {
+						logrus.Errorf("error deleting bridge (%s) with subnet %v: %v", name, addr.IPNet, err)
+					}
+				}
+			}
+		}
+	}
+	return nil
+
+}
+
 func deleteInterface(name string) error {
 	defer osl.InitOSContext()()