From 39a3b73f856f4df1a4d6064473ed4099cbeff895 Mon Sep 17 00:00:00 2001 From: Tomasz Buchert <tomek.buchert@gmail.com> Date: Wed, 13 Aug 2014 16:51:41 +0200 Subject: [PATCH] fallback to ovsb when no OF controller is unavailable --- bin/mn | 16 ++++++++++++++-- mininet/node.py | 12 +++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/bin/mn b/bin/mn index e94515d3..02639954 100755 --- a/bin/mn +++ b/bin/mn @@ -27,7 +27,8 @@ from mininet.net import Mininet, MininetWithControlNet, VERSION from mininet.node import ( Host, CPULimitedHost, Controller, OVSController, NOX, RemoteController, DefaultController, UserSwitch, OVSBridge, OVSSwitch, - OVSLegacyKernelSwitch, IVSSwitch ) + OVSLegacyKernelSwitch, IVSSwitch, + getAvailableController ) from mininet.nodelib import LinuxBridge from mininet.link import Link, TCLink from mininet.topo import SingleSwitchTopo, LinearTopo, SingleSwitchReversedTopo @@ -65,7 +66,7 @@ CONTROLLERS = { 'ref': Controller, 'ovsc': OVSController, 'nox': NOX, 'remote': RemoteController, - 'default': DefaultController, + 'default': None, 'none': lambda name: None } LINKDEF = 'default' @@ -230,6 +231,17 @@ class MininetRunner( object ): start = time.time() + if self.options.controller == "default": + controller_name = getAvailableController() + if controller_name is not None: + self.options.controller = controller_name + else: + # fallback to OVS Bridge switch, which does not use OF controller + info('*** No default OpenFlow implementation found!\n') + info(' Fallback to ovsb switch implementation.\n') + self.options.switch = 'ovsb' + self.options.controller = 'none' + topo = buildTopo( TOPOS, self.options.topo ) switch = customConstructor( SWITCHES, self.options.switch ) host = customConstructor( HOSTS, self.options.host ) diff --git a/mininet/node.py b/mininet/node.py index a10abbf2..922b442a 100644 --- a/mininet/node.py +++ b/mininet/node.py @@ -1382,9 +1382,19 @@ def checkListening( self ): warn( "Unable to contact the remote controller" " at %s:%d\n" % ( self.ip, self.port ) ) +DEFAULT_CONTROLLERS = [ ('ref', Controller), ('ovsc', OVSController) ] +DEFAULT_CONTROLLERS_CLASSES = [ klass for _, klass in DEFAULT_CONTROLLERS ] -def DefaultController( name, order=[ Controller, OVSController ], **kwargs ): +def getAvailableController(): + "find name of any default controller that is available; None if nothing is available" + for name, controller in DEFAULT_CONTROLLERS: + if controller.isAvailable(): + return name + return None + +def DefaultController( name, order = DEFAULT_CONTROLLERS_CLASSES, **kwargs ): "find any controller that is available and run it" for controller in order: if controller.isAvailable(): return controller( name, **kwargs ) + return None -- GitLab