Brian O'Connor
Committed by Gerrit Code Review

Adding background iperf to onosnet.py

Also, doing some other cleanup and improvements

Change-Id: I17ee64126e5e8de986e460641994a279e18c9492
1 #!/usr/bin/python 1 #!/usr/bin/python
2 2
3 import sys 3 import sys
4 -from threading import Thread 4 +import itertools
5 +from time import sleep
5 6
6 from mininet.net import Mininet 7 from mininet.net import Mininet
7 from mininet.log import setLogLevel 8 from mininet.log import setLogLevel
8 from mininet.node import RemoteController 9 from mininet.node import RemoteController
9 -from mininet.log import info, debug 10 +from mininet.log import info, debug, output
10 from mininet.util import quietRun 11 from mininet.util import quietRun
11 from mininet.link import TCLink 12 from mininet.link import TCLink
12 from mininet.cli import CLI 13 from mininet.cli import CLI
...@@ -62,19 +63,16 @@ class ONOSMininet( Mininet ): ...@@ -62,19 +63,16 @@ class ONOSMininet( Mininet ):
62 info( '\nWARNING: arping is not found, using ping instead.\n' 63 info( '\nWARNING: arping is not found, using ping instead.\n'
63 'For higher performance, install arping: sudo apt-get install iputils-arping\n\n' ) 64 'For higher performance, install arping: sudo apt-get install iputils-arping\n\n' )
64 65
65 - threads = [ self.threadPing(s, d) for (s, d) in zip( self.hosts, self.hosts[1:] + self.hosts[0:1] ) ] 66 + procs = [ s.popen( 'ping -w 0.1 -W 0.1 -c1 %s > /dev/null; printf "%s "'
66 - for t in threads: 67 + % ( d.IP(), s.name ), shell=True )
67 - t.join() 68 + for (s, d) in zip( self.hosts, self.hosts[1:] + self.hosts[0:1] ) ]
68 - info ( '\n' ) 69 + for t in procs:
69 - 70 + out, err = t.communicate()
70 - def threadPing( self, src, dst ): 71 + if err:
71 - "Ping from src to dst in a thread" 72 + info ( err )
72 - def p(): 73 + else:
73 - src.cmd( 'ping -w 0.1 -W 0.1 -c1 ' + dst.IP() ) 74 + info ( out )
74 - t = Thread( target=p ) 75 + info ( '\n' )
75 - info ( '%s ' % src.name )
76 - t.start()
77 - return t
78 76
79 def pingloop( self ): 77 def pingloop( self ):
80 "Loop forever pinging the full mesh of hosts" 78 "Loop forever pinging the full mesh of hosts"
...@@ -85,9 +83,65 @@ class ONOSMininet( Mininet ): ...@@ -85,9 +83,65 @@ class ONOSMininet( Mininet ):
85 finally: 83 finally:
86 setLogLevel( 'info' ) 84 setLogLevel( 'info' )
87 85
86 + def bgIperf( self, hosts=[], seconds=10 ):
87 + #TODO check if the hosts are strings or objects
88 + # h1 = net.getNodeByName('h1')
89 + servers = [ host.popen("iperf -s") for host in hosts ]
90 +
91 + clients = []
92 + for pair in itertools.combinations(hosts, 2):
93 + info ( '%s <--> %s\n' % ( pair[0].name, pair[1].name ))
94 + cmd = "iperf -c %s -t %s" % (pair[1].IP(), seconds)
95 + clients.append(pair[0].popen(cmd))
96 +
97 + progress( seconds )
98 +
99 + for c in clients:
100 + out, err = c.communicate()
101 + if err:
102 + info( err )
103 + else:
104 + debug( out )
105 + #TODO parse output and print summary
106 +
107 + for s in servers:
108 + s.terminate()
109 +
110 +def progress(t):
111 + while t > 0:
112 + sys.stdout.write( '.' )
113 + t -= 1
114 + sys.stdout.flush()
115 + sleep(1)
116 + print
117 +
88 # Initialize ONOSMininet the first time that the class is loaded 118 # Initialize ONOSMininet the first time that the class is loaded
89 ONOSMininet.setup() 119 ONOSMininet.setup()
90 120
121 +def do_iperf( self, line ):
122 + args = line.split()
123 + if not args:
124 + output( 'Provide a list of hosts.\n' )
125 + hosts = []
126 + err = False
127 + for arg in args:
128 + if arg not in self.mn:
129 + err = True
130 + error( "node '%s' not in network\n" % arg )
131 + else:
132 + hosts.append( self.mn[ arg ] )
133 + if "bgIperf" in dir(self.mn) and not err:
134 + self.mn.bgIperf( hosts )
135 +
136 +def do_gratuitousArp( self, _line ):
137 + if "gratuitousArp" in dir(self.mn):
138 + self.mn.gratuitousArp()
139 + else:
140 + output( 'Gratuitous ARP is not support.\n' )
141 +
142 +CLI.do_bgIperf = do_iperf
143 +CLI.do_gratuitousArp = do_gratuitousArp
144 +
91 def run( topo, controllers=None, link=TCLink, autoSetMacs=True ): 145 def run( topo, controllers=None, link=TCLink, autoSetMacs=True ):
92 if not controllers and len( sys.argv ) > 1: 146 if not controllers and len( sys.argv ) > 1:
93 controllers = sys.argv[ 1: ] 147 controllers = sys.argv[ 1: ]
......