Removed underscores for public Node methods. Minor cleanup & comments.
This commit is contained in:
+97
-75
@@ -20,99 +20,121 @@ import os
|
||||
import re
|
||||
import select
|
||||
import sys
|
||||
import time
|
||||
from time import time
|
||||
|
||||
flush = sys.stdout.flush
|
||||
|
||||
from mininet.log import lg
|
||||
from mininet.log import lg
|
||||
from mininet.net import init, Mininet
|
||||
from mininet.node import Host, KernelSwitch
|
||||
from mininet.node import KernelSwitch
|
||||
from mininet.topolib import TreeTopo
|
||||
from mininet.util import quietRun
|
||||
|
||||
# Some useful stuff: buffered readline and host monitoring
|
||||
|
||||
def readline( host, buffer ):
|
||||
"Read a line from a host, buffering with buffer."
|
||||
buffer += host.read( 1024 )
|
||||
if '\n' not in buffer: return None, buffer
|
||||
pos = buffer.find( '\n' )
|
||||
line = buffer[ 0 : pos ]
|
||||
rest = buffer[ pos + 1 :]
|
||||
return line, rest
|
||||
def readline( host, buf ):
|
||||
"Read a line from a host, buffering with buffer."
|
||||
buf += host.read( 1024 )
|
||||
if '\n' not in buffer:
|
||||
return None, buffer
|
||||
pos = buf.find( '\n' )
|
||||
line = buf[ 0 : pos ]
|
||||
rest = buf[ pos + 1: ]
|
||||
return line, rest
|
||||
|
||||
def monitor( hosts, seconds ):
|
||||
"Monitor a set of hosts and yield their output."
|
||||
poller = select.poll()
|
||||
Node = hosts[ 0 ] # so we can call class method fdToNode
|
||||
buffers = {}
|
||||
for host in hosts:
|
||||
poller.register( host.stdout )
|
||||
buffers[ host ] = ''
|
||||
quitTime = time.time() + seconds
|
||||
while time.time() < quitTime:
|
||||
ready = poller.poll()
|
||||
for fd, event in ready:
|
||||
host = Node.fdToNode( fd )
|
||||
line, buffers[ host ] = readline( host, buffers[ host ] )
|
||||
if line: yield host, line
|
||||
yield None, ''
|
||||
"Monitor a set of hosts and yield their output."
|
||||
poller = select.poll()
|
||||
Node = hosts[ 0 ] # so we can call class method fdToNode
|
||||
buffers = {}
|
||||
for host in hosts:
|
||||
poller.register( host.stdout )
|
||||
buffers[ host ] = ''
|
||||
quitTime = time() + seconds
|
||||
while time() < quitTime:
|
||||
ready = poller.poll()
|
||||
for fd, event in ready:
|
||||
host = Node.fdToNode( fd )
|
||||
if event & select.POLLIN:
|
||||
line, buffers[ host ] = readline( host, buffers[ host ] )
|
||||
if line:
|
||||
yield host, line
|
||||
yield None, ''
|
||||
|
||||
# bwtest support
|
||||
|
||||
def parsebwtest( line,
|
||||
r=re.compile( r'(\d+) s: in ([\d\.]+) Mbps, out ([\d\.]+) Mbps' ) ):
|
||||
match = r.match( line )
|
||||
return match.group( 1, 2, 3 ) if match else ( None, None, None )
|
||||
|
||||
r=re.compile( r'(\d+) s: in ([\d\.]+) Mbps, out ([\d\.]+) Mbps' ) ):
|
||||
"Parse udpbwtest.c output, returning seconds, inbw, outbw."
|
||||
match = r.match( line )
|
||||
if match:
|
||||
seconds, inbw, outbw = match.group( 1, 2, 3 )
|
||||
return int( seconds ), float( inbw ), float( outbw )
|
||||
return None, None, None
|
||||
|
||||
def printTotalHeader():
|
||||
print
|
||||
print "time(s)\thosts\ttotal in/out (Mbps)\tavg in/out (Mbps)"
|
||||
"Print header for bandwidth stats."
|
||||
print
|
||||
print "time(s)\thosts\ttotal in/out (Mbps)\tavg in/out (Mbps)"
|
||||
|
||||
# Annoyingly, pylint isn't smart enough to notice
|
||||
# when an unused variable is an iteration tuple
|
||||
# pylint: disable-msg=W0612
|
||||
|
||||
def printTotal( seconds=None, result=None ):
|
||||
"Compute and print total bandwidth for given results set."
|
||||
intotal = outtotal = 0.0
|
||||
count = len( result )
|
||||
for host, inbw, outbw in result:
|
||||
intotal += inbw
|
||||
outtotal += outbw
|
||||
inavg = intotal / count if count > 0 else 0
|
||||
outavg = outtotal / count if count > 0 else 0
|
||||
print '%d\t%d\t%.2f/%.2f\t\t%.2f/%.2f' % ( seconds, count,
|
||||
intotal, outtotal, inavg, outavg )
|
||||
|
||||
# pylint: enable-msg=W0612
|
||||
|
||||
# Pylint also isn't smart enough to understand iterator.next()
|
||||
# pylint: disable-msg=E1101
|
||||
|
||||
def printTotal( time=None, result=None ):
|
||||
intotal = outtotal = 0.0
|
||||
count = len( result )
|
||||
for host, inbw, outbw in result:
|
||||
intotal += inbw
|
||||
outtotal += outbw
|
||||
inavg = intotal / count if count > 0 else 0
|
||||
outavg = outtotal / count if count > 0 else 0
|
||||
print '%d\t%d\t%.2f/%.2f\t\t%.2f/%.2f' % ( time, count, intotal, outtotal,
|
||||
inavg, outavg )
|
||||
|
||||
def udpbwtest( net, seconds ):
|
||||
"Start up and monitor udpbwtest on each of our hosts."
|
||||
hosts, switches = net.hosts, net.switches
|
||||
hostCount = len( hosts )
|
||||
print "*** Starting udpbwtest on hosts"
|
||||
for host in hosts:
|
||||
ips = [ h.IP() for h in hosts if h != host ]
|
||||
print host.name, ; flush()
|
||||
host.cmd( './udpbwtest ' + ' '.join( ips ) + ' &' )
|
||||
print
|
||||
results = {}
|
||||
print "*** Monitoring hosts"
|
||||
output = monitor( hosts, seconds )
|
||||
while True:
|
||||
host, line = output.next()
|
||||
if host is None: break
|
||||
time, inbw, outbw = parsebwtest( line )
|
||||
if time is not None:
|
||||
time, inbw, outbw = int( time ), float( inbw ), float( outbw )
|
||||
result = results.get( time, [] ) + [ ( host, inbw, outbw ) ]
|
||||
if len( result ) == hostCount: printTotal( time, result )
|
||||
results[ time ] = result
|
||||
print "*** Stopping udpbwtest processes"
|
||||
# We *really* don't want these things hanging around!
|
||||
quietRun( 'killall -9 udpbwtest' )
|
||||
print
|
||||
print "*** Results:"
|
||||
printTotalHeader()
|
||||
times = sorted( results.keys() )
|
||||
for time in times:
|
||||
printTotal( time - times[ 0 ] , results[ time ] )
|
||||
print
|
||||
|
||||
"Start up and monitor udpbwtest on each of our hosts."
|
||||
hosts = net.hosts
|
||||
hostCount = len( hosts )
|
||||
print "*** Starting udpbwtest on hosts"
|
||||
for host in hosts:
|
||||
ips = [ h.IP() for h in hosts if h != host ]
|
||||
print host.name,
|
||||
flush()
|
||||
host.cmd( './udpbwtest ' + ' '.join( ips ) + ' &' )
|
||||
print
|
||||
results = {}
|
||||
print "*** Monitoring hosts"
|
||||
output = monitor( hosts, seconds )
|
||||
while True:
|
||||
host, line = output.next()
|
||||
if host is None:
|
||||
break
|
||||
seconds, inbw, outbw = parsebwtest( line )
|
||||
if seconds is not None:
|
||||
result = results.get( seconds, [] ) + [ ( host, inbw, outbw ) ]
|
||||
if len( result ) == hostCount:
|
||||
printTotal( seconds, result )
|
||||
results[ seconds ] = result
|
||||
print "*** Stopping udpbwtest processes"
|
||||
# We *really* don't want these things hanging around!
|
||||
quietRun( 'killall -9 udpbwtest' )
|
||||
print
|
||||
print "*** Results:"
|
||||
printTotalHeader()
|
||||
times = sorted( results.keys() )
|
||||
for t in times:
|
||||
printTotal( t - t[ 0 ] , results[ t ] )
|
||||
print
|
||||
|
||||
# pylint: enable-msg=E1101
|
||||
|
||||
if __name__ == '__main__':
|
||||
lg.setLogLevel( 'info' )
|
||||
if not os.path.exists( './udpbwtest' ):
|
||||
|
||||
Reference in New Issue
Block a user