Added multipoll and multiping examples.
This commit is contained in:
@@ -35,6 +35,15 @@ miniedit.py:
|
|||||||
|
|
||||||
This example demonstrates creating a network via a graphical editor.
|
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:
|
multitest.py:
|
||||||
|
|
||||||
This example creates a network and runs multiple tests on it.
|
This example creates a network and runs multiple tests on it.
|
||||||
|
|||||||
Executable
+94
@@ -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 )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Executable
+83
@@ -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()
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user