From f37377264b697052c8b0f3b347c6ec857d6c55b7 Mon Sep 17 00:00:00 2001 From: Martynas Pumputis Date: Tue, 27 Jun 2017 18:33:54 +0200 Subject: [PATCH] Fix fallback to pcap based bridge when odp is not supported The fix ensures that if odp is not supported (usually due to missing openvswitch, vxlan or vport-vxlan kernel modules), weaver will create the pcap based bridge instead of crashing. --- net/bridge.go | 18 ++++++++++++------ prog/weaver/main.go | 2 +- prog/weaveutil/bridge.go | 3 ++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/net/bridge.go b/net/bridge.go index f2772a45..61c9fc2c 100644 --- a/net/bridge.go +++ b/net/bridge.go @@ -62,7 +62,8 @@ type Bridge interface { String() string // human-readable type string } -var errBridgeFallback = errors.New("special error value used to trigger a fallback to bridge type") +// Used to indicate a fallback to the Bridge type +var errBridgeNotSupported = errors.New("bridge not supported") type bridgeImpl struct{ bridge netlink.Link } type fastdpImpl struct{ datapathName string } @@ -226,7 +227,7 @@ func (config *BridgeConfig) configuredBridgeType() Bridge { } } -func EnsureBridge(procPath string, config *BridgeConfig) (Bridge, error) { +func EnsureBridge(procPath string, config *BridgeConfig, log *logrus.Logger) (Bridge, error) { bridgeType, err := ExistingBridgeType(config.WeaveBridgeName, config.DatapathName) if bridgeType != nil || err != nil { return bridgeType, err @@ -235,7 +236,8 @@ func EnsureBridge(procPath string, config *BridgeConfig) (Bridge, error) { bridgeType = config.configuredBridgeType() for { if err := bridgeType.init(config); err != nil { - if err == errBridgeFallback { + if errors.Cause(err) == errBridgeNotSupported { + log.Warnf("Skipping bridge creation of %q due to: %s", bridgeType, err) bridgeType = bridgeImpl{} continue } @@ -333,12 +335,16 @@ func (b bridgeImpl) init(config *BridgeConfig) error { func (f fastdpImpl) init(config *BridgeConfig) error { odpSupported, err := odp.CreateDatapath(f.datapathName) + if !odpSupported { + msg := "" + if err != nil { + msg = err.Error() + } + return errors.Wrap(errBridgeNotSupported, msg) + } if err != nil { return errors.Wrapf(err, "creating datapath %q", f.datapathName) } - if !odpSupported { - return errBridgeFallback - } datapath, err := netlink.LinkByName(f.datapathName) if err != nil { return errors.Wrapf(err, "finding datapath %q", f.datapathName) diff --git a/prog/weaver/main.go b/prog/weaver/main.go index 1532572f..ab455cab 100644 --- a/prog/weaver/main.go +++ b/prog/weaver/main.go @@ -282,7 +282,7 @@ func main() { name := peerName(routerName, bridgeConfig.WeaveBridgeName, dbPrefix, hostRoot) bridgeConfig.Mac = name.String() - bridgeType, err := weavenet.EnsureBridge(procPath, &bridgeConfig) + bridgeType, err := weavenet.EnsureBridge(procPath, &bridgeConfig, Log) checkFatal(err) Log.Println("Bridge type is", bridgeType) diff --git a/prog/weaveutil/bridge.go b/prog/weaveutil/bridge.go index a102ea21..930d1e9d 100644 --- a/prog/weaveutil/bridge.go +++ b/prog/weaveutil/bridge.go @@ -4,6 +4,7 @@ import ( "fmt" "strconv" + "github.com/weaveworks/weave/common" weavenet "github.com/weaveworks/weave/net" ) @@ -47,7 +48,7 @@ func createBridge(args []string) error { NPC: args[9] == "--expect-npc", } procPath := args[8] - bridgeType, err := weavenet.EnsureBridge(procPath, &config) + bridgeType, err := weavenet.EnsureBridge(procPath, &config, common.Log) if err != nil { return err }