Removed underscores for public Node methods. Minor cleanup & comments.

This commit is contained in:
Bob Lantz
2010-03-08 15:32:41 -08:00
parent 2626693241
commit 80be564274
12 changed files with 223 additions and 188 deletions
+97 -75
View File
@@ -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' ):