From 32502bbd1ae4dcd519f6c41266c7e7318a0c3bbc Mon Sep 17 00:00:00 2001 From: Bob Lantz Date: Thu, 4 Jul 2013 00:41:30 -0700 Subject: [PATCH] Add controlnet.py example. --- examples/README | 5 ++ examples/controlnet.py | 117 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100755 examples/controlnet.py diff --git a/examples/README b/examples/README index e4ca892..841486e 100644 --- a/examples/README +++ b/examples/README @@ -28,6 +28,11 @@ This example creates a network with multiple controllers by creating an empty network, adding nodes to it, and manually starting the switches. +controlnet.py: + +This examples shows how you can model the control network as well +as the data network, by actually creating two Mininet objects. + cpu.py: This example tests iperf bandwidth for varying CPU limits. diff --git a/examples/controlnet.py b/examples/controlnet.py new file mode 100755 index 0000000..d8b039b --- /dev/null +++ b/examples/controlnet.py @@ -0,0 +1,117 @@ +#!/usr/bin/python + +""" +controlnet.py: Mininet with a custom control network + +We create two Mininet() networks, a control network +and a data network, running four DataControllers on the +control network to control the data network. + +Since we're using UserSwitch on the data network, +it should correctly fail over to a backup controller. + +We also hack/subclass the CLI slightly so it can talk to +both the control and data networks. +""" + +from mininet.net import Mininet +from mininet.node import Controller, UserSwitch +from mininet.cli import CLI +from mininet.topo import Topo +from mininet.topolib import TreeTopo +from mininet.log import setLogLevel, info + +# Some minor hacks + +class DataController( Controller ): + """Data Network Controller. + patched to avoid checkListening error""" + def checkListening( self ): + "Ignore spurious error" + pass + + +class CLI2( CLI ): + "CLI that can talk to two networks" + + def __init__( self, *args, **kwargs ): + "cnet: second network" + self.cnet = kwargs.pop( 'cnet' ) + CLI.__init__( self, *args, **kwargs ) + + def updateVars( self ): + "Update variables to include cnet" + cnet = self.cnet + nodes2 = cnet.controllers + cnet.switches + cnet.hosts + self.nodelist += nodes2 + for node in nodes2: + self.nodemap[ node.name ] = node + self.locals[ 'cnet' ] = cnet + self.locals.update( self.nodemap ) + + def cmdloop( self, *args, **kwargs ): + "Patch to add cnet if needed" + if 'cnet' not in self.locals: + self.updateVars() + CLI.cmdloop( self, *args, **kwargs ) + + +# A real control network! + +class ControlNetwork( Topo ): + "Control Network Topology" + def __init__( self, n, dataController=DataController, **kwargs ): + """n: number of data network controller nodes + dataController: class for data network controllers""" + Topo.__init__( self, **kwargs ) + # Connect everything to a single switch + cs0 = self.addSwitch( 'cs0' ) + # Add hosts which will serve as data network controllers + for i in range( 0, n ): + c = self.addHost( 'c%s' % i, cls=dataController, + inNamespace=True ) + self.addLink( c, cs0 ) + # Connect switch to root namespace so that data network + # switches will be able to talk to us + root = self.addHost( 'root', inNamespace=False ) + self.addLink( root, cs0 ) + + +# Make it Happen!! + +setLogLevel( 'info' ) + +info( '* Creating Control Network\n' ) +ctopo = ControlNetwork( n=4, dataController=DataController ) +cnet = Mininet( topo=ctopo, ipBase='192.168.123.0/24', build=False ) +info( '* Adding Control Network Controller\n') +cnet.addController( 'cc0' ) +info( '* Starting Control Network\n') +cnet.build() +cnet.start() +dataControllers = cnet.hosts[ : -1 ] # ignore 'root' node + +info( '* Creating Data Network\n' ) +topo = TreeTopo( depth=2, fanout=2 ) +# UserSwitch so we can easily test failover +net = Mininet( topo=topo, switch=UserSwitch, build=False ) +info( '* Adding Controllers to Data Network\n' ) +net.controllers = dataControllers +net.build() +info( '* Starting Data Network\n') +net.start() + +CLI2( net, cnet=cnet ) + +info( '* Stopping Data Network\n' ) +net.stop() + +info( '* Stopping Control Network\n' ) +net.hosts = [] # Avoid stopping controllers twice +cnet.stop() + + + + + +