fallback to ovsb when no OF controller is unavailable
This commit is contained in:
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user