fallback to ovsb when no OF controller is unavailable

This commit is contained in:
Tomasz Buchert
2014-08-13 17:04:24 +02:00
parent e8623fdc91
commit 39a3b73f85
2 changed files with 25 additions and 3 deletions
+14 -2
View File
@@ -27,7 +27,8 @@ from mininet.net import Mininet, MininetWithControlNet, VERSION
from mininet.node import ( Host, CPULimitedHost, Controller, OVSController, from mininet.node import ( Host, CPULimitedHost, Controller, OVSController,
NOX, RemoteController, DefaultController, NOX, RemoteController, DefaultController,
UserSwitch, OVSBridge, OVSSwitch, UserSwitch, OVSBridge, OVSSwitch,
OVSLegacyKernelSwitch, IVSSwitch ) OVSLegacyKernelSwitch, IVSSwitch,
getAvailableController )
from mininet.nodelib import LinuxBridge from mininet.nodelib import LinuxBridge
from mininet.link import Link, TCLink from mininet.link import Link, TCLink
from mininet.topo import SingleSwitchTopo, LinearTopo, SingleSwitchReversedTopo from mininet.topo import SingleSwitchTopo, LinearTopo, SingleSwitchReversedTopo
@@ -65,7 +66,7 @@ CONTROLLERS = { 'ref': Controller,
'ovsc': OVSController, 'ovsc': OVSController,
'nox': NOX, 'nox': NOX,
'remote': RemoteController, 'remote': RemoteController,
'default': DefaultController, 'default': None,
'none': lambda name: None } 'none': lambda name: None }
LINKDEF = 'default' LINKDEF = 'default'
@@ -230,6 +231,17 @@ class MininetRunner( object ):
start = time.time() 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 ) topo = buildTopo( TOPOS, self.options.topo )
switch = customConstructor( SWITCHES, self.options.switch ) switch = customConstructor( SWITCHES, self.options.switch )
host = customConstructor( HOSTS, self.options.host ) host = customConstructor( HOSTS, self.options.host )
+11 -1
View File
@@ -1382,9 +1382,19 @@ class RemoteController( Controller ):
warn( "Unable to contact the remote controller" warn( "Unable to contact the remote controller"
" at %s:%d\n" % ( self.ip, self.port ) ) " 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" "find any controller that is available and run it"
for controller in order: for controller in order:
if controller.isAvailable(): if controller.isAvailable():
return controller( name, **kwargs ) return controller( name, **kwargs )
return None