diff --git a/examples/README b/examples/README index 984c9a3..696a34e 100644 --- a/examples/README +++ b/examples/README @@ -35,6 +35,15 @@ miniedit.py: This example demonstrates creating a network via a graphical editor. +multiping.py: + +This example demonstrates one method for +monitoring output from multiple hosts, using node.monitor(). + +multipoll.py: + +This example demonstrates monitoring output files from multiple hosts. + multitest.py: This example creates a network and runs multiple tests on it. diff --git a/examples/multiping.py b/examples/multiping.py new file mode 100755 index 0000000..6729204 --- /dev/null +++ b/examples/multiping.py @@ -0,0 +1,94 @@ +#!/usr/bin/python + +""" +multiping.py: monitor multiple sets of hosts using ping + +This demonstrates how one may send a simple shell script to +multiple hosts and monitor their output interactively for a period= +of time. +""" + +from mininet.net import Mininet +from mininet.node import Node +from mininet.topo import SingleSwitchTopo +from mininet.log import setLogLevel + +from select import poll, POLLIN +from time import time + +def chunks( l, n ): + "Divide list l into chunks of size n - thanks Stackoverflow" + return [ l[ i : i + n ] for i in range( 0, len( l ), n ) ] + +def startpings( host, targetips ): + "Tell host to repeatedly ping targets" + + targetips.append( '10.0.0.200' ) + + targetips = ' '.join( targetips ) + + # BL: Not sure why loopback intf isn't up! + host.cmd( 'ifconfig lo up' ) + + + # Simple ping loop + cmd = ( 'while true; do ' + ' for ip in %s; do ' % targetips + + ' echo -n %s "->" $ip ' % host.IP() + + ' `ping -c1 -w 1 $ip | grep packets` ;' + ' sleep 1;' + ' done; ' + 'done &' ) + + print ( '*** Host %s (%s) will be pinging ips: %s' % + ( host.name, host.IP(), targetips ) ) + + host.cmd( cmd ) + +def multiping( netsize, chunksize, seconds): + "Ping subsets of size chunksize in net of size netsize" + + # Create network and identify subnets + topo = SingleSwitchTopo( netsize ) + net = Mininet( topo=topo ) + net.start() + hosts = net.hosts + subnets = chunks( hosts, chunksize ) + + # Create polling object + fds = [ host.stdout.fileno() for host in hosts ] + poller = poll() + for fd in fds: + poller.register( fd, POLLIN ) + + # Start pings + for subnet in subnets: + ips = [ host.IP() for host in subnet ] + for host in subnet: + startpings( host, ips ) + + # Monitor output + endTime = time() + seconds + while time() < endTime: + readable = poller.poll(1000) + for fd, _mask in readable: + node = Node.outToNode[ fd ] + print '%s:' % node.name, node.monitor().strip() + + # Stop pings + for host in hosts: + host.cmd( 'kill %while' ) + + net.stop() + + +if __name__ == '__main__': + setLogLevel( 'info' ) + multiping( netsize=20, chunksize=4, seconds=10 ) + + + + + + + \ No newline at end of file diff --git a/examples/multipoll.py b/examples/multipoll.py new file mode 100755 index 0000000..a3ffcc6 --- /dev/null +++ b/examples/multipoll.py @@ -0,0 +1,83 @@ +#!/usr/bin/python + +""" +Simple example of sending output to multiple files and +monitoring them +""" + +from mininet.topo import SingleSwitchTopo +from mininet.net import Mininet +from mininet.log import setLogLevel +from mininet.util import quietRun + +from time import time, sleep +from select import poll, POLLIN +from subprocess import Popen, PIPE + +def monitorFiles( outfiles, seconds, timeoutms ): + devnull = open( '/dev/null', 'w' ) + tails, fdToFile, fdToHost = {}, {}, {} + for h, outfile in outfiles.iteritems(): + tail = Popen( [ 'tail', '-f', outfile ], + stdout=PIPE, stderr=devnull ) + fd = tail.stdout.fileno() + tails[ h ] = tail + fdToFile[ fd ] = tail.stdout + fdToHost[ fd ] = h + # Prepare to poll output files + readable = poll() + for t in tails.values(): + readable.register( t.stdout.fileno(), POLLIN ) + # Run until a set number of seconds have elapsed + endTime = time() + seconds + while time() < endTime: + fdlist = readable.poll(timeoutms) + if fdlist: + for fd, _flags in fdlist: + f = fdToFile[ fd ] + host = fdToHost[ fd ] + # Wait for a line of output + line = f.readline().strip() + yield host, line + else: + # If we timed out, return nothing + yield None, '' + for t in tails.values(): + t.terminate() + devnull.close() # Not really necessary + + +def monitorTest( N=3, seconds=3 ): + "Run pings and monitor multiple hosts" + topo = SingleSwitchTopo( N ) + net = Mininet( topo ) + net.start() + hosts = net.hosts + print "Starting test..." + server = hosts[ 0 ] + outfiles, errfiles = {}, {} + for h in hosts: + # Create and/or erase output files + outfiles[ h ] = '/tmp/%s.out' % h.name + errfiles[ h ] = '/tmp/%s.err' % h.name + h.cmd( 'echo >', outfiles[ h ] ) + h.cmd( 'echo >', errfiles[ h ] ) + # Start pings + h.cmdPrint('ping', server.IP(), + '>', outfiles[ h ], + '2>', errfiles[ h ], + '&' ) + print "Monitoring output for", seconds, "seconds" + for h, line in monitorFiles( outfiles, seconds, timeoutms=500 ): + if h: + print '%s: %s' % ( h.name, line ) + for h in hosts: + h.cmd('kill %ping') + net.stop() + + +if __name__ == '__main__': + setLogLevel('info') + monitorTest() + +