diff --git a/examples/sshd.py b/examples/sshd.py new file mode 100755 index 0000000000000000000000000000000000000000..ad18ddd2e5d7c3acd9d360dc5ac823c4e7332aab --- /dev/null +++ b/examples/sshd.py @@ -0,0 +1,55 @@ +#!/usr/bin/python + +"Create a network and start sshd on the hosts." + +from mininet import init, Node, createLink, TreeNet, Cli + +def nets( hosts ): + "Return list of networks (/24) for hosts." + nets = {} + for host in hosts: + net = host.IP().split( '.' )[ : -1 ] + net = '.'.join ( net ) + '.0/24' + nets[ net ] = True + return nets.keys() + +def addRoutes( node, nets, intf ): + """Add routes from node to nets through intf, assuming + a 24-bit netmask.""" + for net in nets: + node.cmdPrint( 'route add -net ' + net + ' dev ' + intf ) + +def removeRoutes( node, nets ): + "Remove routes to nets from node." + for net in nets: + node.cmdPrint( 'route del -net ' + net ) + +def sshd( network ): + "Start sshd up on each host, routing appropriately." + controllers, switches, hosts = ( + network.controllers, network.switches, network.hosts ) + # Create a node in root ns and link to switch 0 + root = Node( 'root', inNamespace=False ) + createLink( root, switches[ 0 ] ) + ip = '10.0.123.1' + root.setIP( root.intfs[ 0 ], ip, '/24' ) + network.start() + # Add routes + routes = nets( hosts ) + addRoutes( root, routes, root.intfs[ 0 ] ) + # Start up sshd on each host + for host in hosts: host.cmdPrint( '/usr/sbin/sshd' ) + # Dump out IP addresses and run CLI + print + print "*** Hosts are running sshd at the following addresses:" + for host in hosts: print host.name, host.IP() + print + print "*** Starting Mininet CLI - type 'exit' or ^D to exit" + network.runTest( Cli ) + network.stop() + removeRoutes( root, routes ) + +if __name__ == '__main__': + init() + network = TreeNet( depth=1, fanout=2, kernel=True ) + sshd( network ) diff --git a/examples/xterms.py b/examples/xterms.py index 40ef1b0cebab68c65ff48bf09f0202f7462ff7a0..9ef419e59a86deeb8e85ebed507018a397dd3e24 100755 --- a/examples/xterms.py +++ b/examples/xterms.py @@ -9,9 +9,12 @@ def makeXterm( node, title ): "Run screen on a node, and hook up an xterm." node.cmdPrint( 'screen -dmS ' + node.name ) - cmd = 'xterm -title ' + title + ':' + node.name - cmd += ' -e screen -D -RR -S ' + node.name - return Popen( cmd.split( ' ' ) ) + title += ': ' + node.name + if not node.inNamespace: + title += ' (root ns)' + cmd = [ 'xterm', '-title', title ] + cmd += [ '-e', 'screen', '-D', '-RR', '-S', node.name ] + return Popen( cmd ) def makeXterms( nodes, title ): terms = [] @@ -31,7 +34,7 @@ def xterms( controllers, switches, hosts ): def treeXterms(): print "Running xterms on", os.environ[ 'DISPLAY' ] - network = TreeNet( depth=2, fanout=4, kernel=True ) + network = TreeNet( depth=2, fanout=2, kernel=True ) network.run( xterms ) if __name__ == '__main__': diff --git a/mininet.py b/mininet.py index 22e98529471149c89ed7465926314d1920b098da..53aacb2a5f173760ee1a2cba5360ceeb009c04f2 100755 --- a/mininet.py +++ b/mininet.py @@ -445,15 +445,12 @@ def __init__( self, kernel=True, startAddr=( 192, 168, 123, 1) ): print "*** Error: ofdatapath not loaded:", print " kernel datapath not supported" exit( 1 ) - # In progress: we probably want to decouple creating/starting/stopping - # the network and running tests, since we might wish to run - # multiple tests on the same network. It's not clear if the network - # should always be started/stopped for each test or not. Probably - # not... - def run( self, test ): + # Create network, but don't start things up yet! + self.prepareNet() + def prepareNet( self ): """Create a network by calling makeNet as follows: (switches, hosts ) = makeNet() - and then run test( controller, switches, hosts ) on it.""" + Create a controller here as well.""" kernel = self.kernel if kernel: print "*** Using kernel datapath" else: print "*** Using user datapath" @@ -467,21 +464,39 @@ def run( self, test ): configRoutedControlNetwork( controller, switches ) print "*** Configuring hosts" configHosts( hosts, self.startAddr ) + self.controllers = [ controller ] + self.switches = switches + self.hosts = hosts + def start( self ): + "Start controller and switches" print "*** Starting reference controller" - controller.start() - print "*** Starting", len( switches ), "switches" - for switch in switches: - switch.start( controller ) - print "*** Running test" - result = test( [ controller ], switches, hosts ) + for controller in self.controllers: + controller.start() + print "*** Starting", len( self.switches ), "switches" + for switch in self.switches: + switch.start( self.controllers[ 0 ] ) + def stop( self ): + "Stop the controller(s), switches and hosts" print "*** Stopping controller" - controller.stop(); controller.terminate() + for controller in self.controllers: + controller.stop(); controller.terminate() print "*** Stopping switches" - for switch in switches: + for switch in self.switches: switch.stop() ; switch.terminate() print "*** Stopping hosts" - for host in hosts: host.terminate() + for host in self.hosts: + host.terminate() print "*** Test complete" + def runTest( self, test ): + "Run a given test, called as test( controllers, switches, hosts)" + return test( self.controllers, self.switches, self.hosts ) + def run( self, test ): + """Perform a complete start/test/stop cycle; test is of the form + test( controllers, switches, hosts )""" + self.start() + print "*** Running test" + result = self.runTest( test ) + self.stop() return result def interact( self ): "Create a network and run our simple CLI."