diff options
author | Ashlee Young <ashlee@onosfw.com> | 2015-09-09 22:15:21 -0700 |
---|---|---|
committer | Ashlee Young <ashlee@onosfw.com> | 2015-09-09 22:15:21 -0700 |
commit | 13d05bc8458758ee39cb829098241e89616717ee (patch) | |
tree | 22a4d1ce65f15952f07a3df5af4b462b4697cb3a /framework/src/onos/tools/test/topos/attcli.py | |
parent | 6139282e1e93c2322076de4b91b1c85d0bc4a8b3 (diff) |
ONOS checkin based on commit tag e796610b1f721d02f9b0e213cf6f7790c10ecd60
Change-Id: Ife8810491034fe7becdba75dda20de4267bd15cd
Diffstat (limited to 'framework/src/onos/tools/test/topos/attcli.py')
-rw-r--r-- | framework/src/onos/tools/test/topos/attcli.py | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/framework/src/onos/tools/test/topos/attcli.py b/framework/src/onos/tools/test/topos/attcli.py new file mode 100644 index 00000000..19453204 --- /dev/null +++ b/framework/src/onos/tools/test/topos/attcli.py @@ -0,0 +1,138 @@ +#!/usr/bin/python + +""" +CLI for test with AttMplsTopo +""" + +from mininet.net import Mininet +from mininet.cli import CLI +from mininet.util import quietRun +from mininet.log import setLogLevel, info, output, error +from mininet.node import RemoteController + +from attmplsfast import AttMplsTopo + +from subprocess import PIPE, STDOUT +from time import time +import random + +class IperfCLI( CLI ): + "CLI with iperf UDP traffic generation" + + def __init__( self, net, *args, **kwargs ): + self.iperfs = {} + self.bw = '12k' + self.mn = net + self.lastbw = {} # last bandwidth reports + self.start() + quietRun( 'rm /tmp/*.iperf /tmp/*.client' ) + CLI.__init__( self, net, *args, **kwargs ) + + def __del__( self ): + "Destructor: kill *all* iperf servers and clients!" + quietRun( 'pkill -9 iperf' ) + + def start( self ): + "Start iperf servers" + for h in sorted( self.mn.hosts ): + with open( '/tmp/%s.iperf' % h, 'w' ) as f: + cmd = 'iperf -f k -i 1 -s -u' + popen = h.popen( cmd, stdin=PIPE, stdout=f, stderr=STDOUT ) + self.iperfs[ h ] = popen + + def udpstart( self, h1, h2, bw): + "Start up a udp iperf from h1 to h2 with bandwidth bw" + # For udp we don't have to wait for startup + self.udpstop( h1 ) + h1.cmdPrint( 'iperf -c', h2.IP(), + '-t 36000 -u -b', bw, + '1>/tmp/%s.client 2>&1 &' % h1 ) + + def udpstop( self, h ): + "udpstop h: Stop udp client on host h" + h.cmdPrint( 'kill %iperf && wait %iperf' ) + h.cmdPrint( 'rm /tmp/%s.client' % h ) + + def do_udp( self, line ): + """udp h1 h2 [rate]: start a udp iperf session from h1 to h2 + rate: udp transmit rate [12k]""" + args = line.split() + if len( args ) not in ( 2, 3 ): + error( 'usage: udp h1 h2 [rate]\n' ) + return + h1, h2 = self.mn.get( *args[ :2 ] ) + bw = self.bw if len( args ) == 2 else args[ 2 ] + self.udpstart( h1, h2, bw ) + + def do_stop( self, line ): + "stop [host | all]: Stop iperf client on host" + if not line or line == 'all': + hosts = self.mn.hosts + else: + hosts = [ self.mn.get( line ) ] + for h in hosts: + self.udpstop( h ) + + def do_bw( self, line ): + "bw: show last reported iperf server ingress bandwidth" + output( "Last reported iperf UDP server input bandwidth:\n" ) + for h in self.mn.hosts: + lastout, lasttime = self.lastbw.get( h, ( '', 0 ) ) + out = h.cmd( 'tail -1 /tmp/%s.iperf' % h ) + if '---' in out or ( out == lastout and + time() - lasttime > 1.5 ): + # Stale update - don't display + out = '\n' + else: + self.lastbw[ h ] = ( out, time() ) + output( '%s:' % h, out ) + + def do_rand( self, line ): + """rand [N [bw]]: Start N random flows (default: 10) + at the given bandwidth (default: 12k) + Note: this may replace existing flows""" + args = line.split() + N = 10 + if args: + try: + N = int( args[ 0 ] ) + except: + error( 'please specify an integer' ) + return + output( 'Starting/restarting', N, 'random flows...\n' ) + bw = self.bw if len( args ) < 2 else args[ 1 ] + servers = random.sample( self.mn.hosts, N ) + clients = [] + for server in servers: + allclients = [ h for h in self.mn.hosts + if h not in clients ] + client = random.choice( allclients ) + clients.append( client ) + self.udpstart( client, server, bw ) + + def do_jobs( self, line ): + "jobs: List iperf jobs" + output( "Currently running jobs:\n" ) + for h in self.mn.hosts: + output( '%s:' % h, h.cmd( 'jobs' ).strip(), '\n' ) + + +def run( Topo=AttMplsTopo ): + "Create network and run CLI" + topo = Topo() + net = Mininet( topo=topo, controller=RemoteController ) + net.start() + info( '\n### Welcome to the custom iperf udp CLI!\n' + '###\n' + '### udp h1 h2 [bw] start iperf udp from h1 to h2\n' + '### stop h1 h2 stop iperf udp from h1 to h2\n' + '### rand [N] start/restart N random udp iperfs\n' + '### bw show last reported udp ingress bandwidth\n' + '### jobs list iperf jobs\n\n' ) + IperfCLI( net ) + net.stop() + + +if __name__ == '__main__': + setLogLevel( 'info' ) + run() |