diff --git a/net/bridge.go b/net/bridge.go index da0bd40a..6845c0bf 100644 --- a/net/bridge.go +++ b/net/bridge.go @@ -2,6 +2,7 @@ package net import ( "fmt" + "net" "github.com/Sirupsen/logrus" "github.com/vishvananda/netlink" @@ -86,3 +87,24 @@ func DetectHairpin(portIfName string, log *logrus.Logger) error { return nil } + +var ErrBridgeNoIP = fmt.Errorf("Bridge has no IP address") + +func FindBridgeIP(bridgeName string, subnet *net.IPNet) (net.IP, error) { + netdev, err := GetBridgeNetDev(bridgeName) + if err != nil { + return nil, fmt.Errorf("Failed to get netdev for %q bridge: %s", bridgeName, err) + } + if len(netdev.CIDRs) == 0 { + return nil, ErrBridgeNoIP + } + if subnet != nil { + for _, cidr := range netdev.CIDRs { + if subnet.Contains(cidr.IP) { + return cidr.IP, nil + } + } + } + // No subnet, or none in the required subnet; just return the first one + return netdev.CIDRs[0].IP, nil +} diff --git a/plugin/net/cni.go b/plugin/net/cni.go index 3145e49d..5ed1c35a 100644 --- a/plugin/net/cni.go +++ b/plugin/net/cni.go @@ -73,8 +73,8 @@ func (c *CNIPlugin) CmdAdd(args *skel.CmdArgs) error { // If config says nothing about routes or gateway, default one will be via the bridge if result.IP4.Routes == nil && result.IP4.Gateway == nil { - bridgeIP, err := findBridgeIP(conf.BrName, result.IP4.IP) - if err == errBridgeNoIP { + bridgeIP, err := weavenet.FindBridgeIP(conf.BrName, &result.IP4.IP) + if err == weavenet.ErrBridgeNoIP { bridgeArgs := *args bridgeArgs.ContainerID = "weave:expose" bridgeIPResult, err := c.getIP(conf.IPAM.Type, &bridgeArgs) @@ -164,25 +164,6 @@ func assignBridgeIP(bridgeName string, ipnet net.IPNet) error { return nil } -var errBridgeNoIP = fmt.Errorf("Bridge has no IP address") - -func findBridgeIP(bridgeName string, subnet net.IPNet) (net.IP, error) { - netdev, err := weavenet.GetBridgeNetDev(bridgeName) - if err != nil { - return nil, fmt.Errorf("Failed to get netdev for %q bridge: %s", bridgeName, err) - } - if len(netdev.CIDRs) == 0 { - return nil, errBridgeNoIP - } - for _, cidr := range netdev.CIDRs { - if subnet.Contains(cidr.IP) { - return cidr.IP, nil - } - } - // None in the required subnet; just return the first one - return netdev.CIDRs[0].IP, nil -} - func (c *CNIPlugin) CmdDel(args *skel.CmdArgs) error { conf, err := loadNetConf(args.StdinData) if err != nil { diff --git a/proxy/proxy.go b/proxy/proxy.go index ab3c7825..e753ae26 100644 --- a/proxy/proxy.go +++ b/proxy/proxy.go @@ -148,14 +148,11 @@ func NewProxy(c Config) (*Proxy, error) { p.client = client.Client if !p.WithoutDNS { - netDev, err := weavenet.GetBridgeNetDev(c.DockerBridge) + ip, err := weavenet.FindBridgeIP(c.DockerBridge, nil) if err != nil { return nil, err } - if len(netDev.CIDRs) < 1 { - return nil, fmt.Errorf("Could not obtain address of %s", c.DockerBridge) - } - p.dockerBridgeIP = netDev.CIDRs[0].IP.String() + p.dockerBridgeIP = ip.String() Log.Infof("Using docker bridge IP for DNS: %v", p.dockerBridgeIP) }