Adding ATT topo with CLI to generate traffic - courtesy of Bob Lantz.

Change-Id: I8c00db5b1dde774f9599cd49ac2418a1026f4748
diff --git a/tools/test/topos/attcli.py b/tools/test/topos/attcli.py
new file mode 100644
index 0000000..1945320
--- /dev/null
+++ b/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()