1fa3827ac4130595ebb93b40a9e5cb0abc6715e0cGwendal Grignouimport os, time, logging
267a72f9db02009cee4a8ae90720190c8f83ddef6mblighfrom autotest_lib.client.bin import test, utils
3443942444d5888634ae6faa314f89425dacc8002mblighfrom autotest_lib.client.bin.net import net_utils
467a72f9db02009cee4a8ae90720190c8f83ddef6mblighfrom autotest_lib.client.common_lib import error
59f8579202a07a123a3f73c1eb2211d8fe9553b11mbligh
6443942444d5888634ae6faa314f89425dacc8002mblighMPSTAT_IX = 0
7443942444d5888634ae6faa314f89425dacc8002mblighNETPERF_IX = 1
856a91f076c57a1cfbbbcf9663af1a6e35d949ba4mbligh
956a91f076c57a1cfbbbcf9663af1a6e35d949ba4mblighclass netperf2(test.test):
108acfcfa572b3fae6c73937fcf9764580e7974101Kelly Lucas    version = 4
110afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski
120570b9736b7e80afd4d6a53cce29ebc95e501f82lmr    # ftp://ftp.netperf.org/netperf/netperf-2.4.5.tar.bz2
130570b9736b7e80afd4d6a53cce29ebc95e501f82lmr    def setup(self, tarball = 'netperf-2.4.5.tar.bz2'):
14443942444d5888634ae6faa314f89425dacc8002mbligh        self.job.require_gcc()
158b352856e457518fde6bab947d8fcdb3f53a39admbligh        tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir)
1653da18eddf69243ca175d9a4603cba5b55300726mbligh        utils.extract_tarball_to_dir(tarball, self.srcdir)
170afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski        os.chdir(self.srcdir)
180afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski
19443942444d5888634ae6faa314f89425dacc8002mbligh        utils.system('patch -p0 < ../wait_before_data.patch')
20f5ca5acd83f068df858572424b5145042d30e69fKenneth Waters        utils.configure()
216f27d4f22a1ba5063968b8c322fa0845f3279adeEric Li        utils.make()
220afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski
230afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski
240afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski    def initialize(self):
25443942444d5888634ae6faa314f89425dacc8002mbligh        self.server_prog = '%s&' % os.path.join(self.srcdir, 'src/netserver')
26443942444d5888634ae6faa314f89425dacc8002mbligh        self.client_prog = '%s' % os.path.join(self.srcdir, 'src/netperf')
27443942444d5888634ae6faa314f89425dacc8002mbligh        self.valid_tests = ['TCP_STREAM', 'TCP_MAERTS', 'TCP_RR', 'TCP_CRR',
28443942444d5888634ae6faa314f89425dacc8002mbligh                            'TCP_SENDFILE', 'UDP_STREAM', 'UDP_RR']
29a5630a5382d4b04a02728684aebec3dce984e2bfmbligh        self.results = []
30865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh        self.actual_times = []
31443942444d5888634ae6faa314f89425dacc8002mbligh        self.netif = ''
32443942444d5888634ae6faa314f89425dacc8002mbligh        self.network = net_utils.network()
33443942444d5888634ae6faa314f89425dacc8002mbligh        self.network_utils = net_utils.network_utils()
340afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski
350afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski
36443942444d5888634ae6faa314f89425dacc8002mbligh    def run_once(self, server_ip, client_ip, role, test = 'TCP_STREAM',
37443942444d5888634ae6faa314f89425dacc8002mbligh                 test_time = 15, stream_list = [1], test_specific_args = '',
38443942444d5888634ae6faa314f89425dacc8002mbligh                 cpu_affinity = '', dev = '', bidi = False, wait_time = 5):
39443942444d5888634ae6faa314f89425dacc8002mbligh        """
40443942444d5888634ae6faa314f89425dacc8002mbligh        server_ip: IP address of host running netserver
41443942444d5888634ae6faa314f89425dacc8002mbligh        client_ip: IP address of host running netperf client(s)
42443942444d5888634ae6faa314f89425dacc8002mbligh        role: 'client' or 'server'
43443942444d5888634ae6faa314f89425dacc8002mbligh        test: one of TCP_STREAM, TCP_MEARTS, TCP_RR, TCP_CRR, TCP_SENDFILE,
44443942444d5888634ae6faa314f89425dacc8002mbligh            UDP_STREAM or UDP_RR
45443942444d5888634ae6faa314f89425dacc8002mbligh        test_time: time to run the test for in seconds
46443942444d5888634ae6faa314f89425dacc8002mbligh        stream_list: list of number of netperf streams to launch
47443942444d5888634ae6faa314f89425dacc8002mbligh        test_specific_args: Optional test specific args.  For example to set
48443942444d5888634ae6faa314f89425dacc8002mbligh            the request,response size for RR tests to 200,100, set it
49443942444d5888634ae6faa314f89425dacc8002mbligh            to: '-- -r 200,100'.  Or, to set the send buffer size of STREAM
50443942444d5888634ae6faa314f89425dacc8002mbligh            tests to 200, set it to: '-- -m 200'
51443942444d5888634ae6faa314f89425dacc8002mbligh        cpu_affinity: netperf/netserver processes will get taskset to the
52443942444d5888634ae6faa314f89425dacc8002mbligh            cpu_affinity.  cpu_affinity is specified as a bitmask in hex
53443942444d5888634ae6faa314f89425dacc8002mbligh            without the leading 0x.  For example, to run on CPUs 0 & 5,
54443942444d5888634ae6faa314f89425dacc8002mbligh            cpu_affinity needs to be '21'
55443942444d5888634ae6faa314f89425dacc8002mbligh        dev: device on which to run traffic on.  For example, to run on
56443942444d5888634ae6faa314f89425dacc8002mbligh            inteface eth1, set it to 'eth1'.
57443942444d5888634ae6faa314f89425dacc8002mbligh        bidi: bi-directional traffic.  This is supported for TCP_STREAM
58443942444d5888634ae6faa314f89425dacc8002mbligh            test only. The RR & CRR tests are bi-directional by nature.
59443942444d5888634ae6faa314f89425dacc8002mbligh        wait_time: Time to wait after establishing data/control connections
60443942444d5888634ae6faa314f89425dacc8002mbligh            but before sending data traffic.
61443942444d5888634ae6faa314f89425dacc8002mbligh        """
62a5630a5382d4b04a02728684aebec3dce984e2bfmbligh        if test not in self.valid_tests:
63a5630a5382d4b04a02728684aebec3dce984e2bfmbligh            raise error.TestError('invalid test specified')
64a5630a5382d4b04a02728684aebec3dce984e2bfmbligh        self.role = role
6552fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        self.test = test
66865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh        self.test_time = test_time
67443942444d5888634ae6faa314f89425dacc8002mbligh        self.wait_time = wait_time
6852fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        self.stream_list = stream_list
69443942444d5888634ae6faa314f89425dacc8002mbligh        self.bidi = bidi
70a5630a5382d4b04a02728684aebec3dce984e2bfmbligh
710afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski        server_tag = server_ip + '#netperf-server'
720afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski        client_tag = client_ip + '#netperf-client'
730afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski        all = [server_tag, client_tag]
74a5630a5382d4b04a02728684aebec3dce984e2bfmbligh
75443942444d5888634ae6faa314f89425dacc8002mbligh        # If a specific device has been requested, configure it.
76443942444d5888634ae6faa314f89425dacc8002mbligh        if dev:
77443942444d5888634ae6faa314f89425dacc8002mbligh            timeout = 60
78443942444d5888634ae6faa314f89425dacc8002mbligh            if role == 'server':
79443942444d5888634ae6faa314f89425dacc8002mbligh                self.configure_interface(dev, server_ip)
80443942444d5888634ae6faa314f89425dacc8002mbligh                self.ping(client_ip, timeout)
81443942444d5888634ae6faa314f89425dacc8002mbligh            else:
82443942444d5888634ae6faa314f89425dacc8002mbligh                self.configure_interface(dev, client_ip)
83443942444d5888634ae6faa314f89425dacc8002mbligh                self.ping(server_ip, timeout)
84443942444d5888634ae6faa314f89425dacc8002mbligh
85a5630a5382d4b04a02728684aebec3dce984e2bfmbligh        for num_streams in stream_list:
86a5630a5382d4b04a02728684aebec3dce984e2bfmbligh            if role == 'server':
87443942444d5888634ae6faa314f89425dacc8002mbligh                self.server_start(cpu_affinity)
88a5630a5382d4b04a02728684aebec3dce984e2bfmbligh                try:
8915b8a26d5ba95adacb523305f940ca010c191ef1mbligh                    # Wait up to ten minutes for the client to reach this
9052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                    # point.
9115b8a26d5ba95adacb523305f940ca010c191ef1mbligh                    self.job.barrier(server_tag, 'start_%d' % num_streams,
92443942444d5888634ae6faa314f89425dacc8002mbligh                                     600).rendezvous(*all)
9315b8a26d5ba95adacb523305f940ca010c191ef1mbligh                    # Wait up to test_time + 5 minutes for the test to
9452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                    # complete
9515b8a26d5ba95adacb523305f940ca010c191ef1mbligh                    self.job.barrier(server_tag, 'stop_%d' % num_streams,
96443942444d5888634ae6faa314f89425dacc8002mbligh                                     test_time+300).rendezvous(*all)
97a5630a5382d4b04a02728684aebec3dce984e2bfmbligh                finally:
98a5630a5382d4b04a02728684aebec3dce984e2bfmbligh                    self.server_stop()
99a5630a5382d4b04a02728684aebec3dce984e2bfmbligh
100a5630a5382d4b04a02728684aebec3dce984e2bfmbligh            elif role == 'client':
10115b8a26d5ba95adacb523305f940ca010c191ef1mbligh                # Wait up to ten minutes for the server to start
10215b8a26d5ba95adacb523305f940ca010c191ef1mbligh                self.job.barrier(client_tag, 'start_%d' % num_streams,
103443942444d5888634ae6faa314f89425dacc8002mbligh                                 600).rendezvous(*all)
104443942444d5888634ae6faa314f89425dacc8002mbligh                self.client(server_ip, test, test_time, num_streams,
105443942444d5888634ae6faa314f89425dacc8002mbligh                            test_specific_args, cpu_affinity)
10615b8a26d5ba95adacb523305f940ca010c191ef1mbligh                # Wait up to 5 minutes for the server to also reach this point
10715b8a26d5ba95adacb523305f940ca010c191ef1mbligh                self.job.barrier(client_tag, 'stop_%d' % num_streams,
108443942444d5888634ae6faa314f89425dacc8002mbligh                                 300).rendezvous(*all)
109a5630a5382d4b04a02728684aebec3dce984e2bfmbligh            else:
110a5630a5382d4b04a02728684aebec3dce984e2bfmbligh                raise error.TestError('invalid role specified')
1110afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski
112443942444d5888634ae6faa314f89425dacc8002mbligh        self.restore_interface()
113443942444d5888634ae6faa314f89425dacc8002mbligh
114443942444d5888634ae6faa314f89425dacc8002mbligh
115443942444d5888634ae6faa314f89425dacc8002mbligh    def configure_interface(self, dev, ip_addr):
116443942444d5888634ae6faa314f89425dacc8002mbligh        self.netif = net_utils.netif(dev)
117443942444d5888634ae6faa314f89425dacc8002mbligh        self.netif.up()
118443942444d5888634ae6faa314f89425dacc8002mbligh        if self.netif.get_ipaddr() != ip_addr:
119443942444d5888634ae6faa314f89425dacc8002mbligh            self.netif.set_ipaddr(ip_addr)
120443942444d5888634ae6faa314f89425dacc8002mbligh
1210afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski
122443942444d5888634ae6faa314f89425dacc8002mbligh    def restore_interface(self):
123443942444d5888634ae6faa314f89425dacc8002mbligh        if self.netif:
124443942444d5888634ae6faa314f89425dacc8002mbligh            self.netif.restore()
125443942444d5888634ae6faa314f89425dacc8002mbligh
126443942444d5888634ae6faa314f89425dacc8002mbligh
127443942444d5888634ae6faa314f89425dacc8002mbligh    def server_start(self, cpu_affinity):
12878be24a78e28a0352197593345d097a71f9e1e14mbligh        utils.system('killall netserver', ignore_status=True)
129443942444d5888634ae6faa314f89425dacc8002mbligh        cmd = self.server_prog
130443942444d5888634ae6faa314f89425dacc8002mbligh        if cpu_affinity:
131443942444d5888634ae6faa314f89425dacc8002mbligh            cmd = 'taskset %s %s' % (cpu_affinity, cmd)
132443942444d5888634ae6faa314f89425dacc8002mbligh
133443942444d5888634ae6faa314f89425dacc8002mbligh        self.results.append(utils.system_output(cmd, retain_output=True))
1340afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski
1350afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski
1360afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski    def server_stop(self):
137a5630a5382d4b04a02728684aebec3dce984e2bfmbligh        utils.system('killall netserver', ignore_status=True)
1380afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski
1390afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181jadmanski
140443942444d5888634ae6faa314f89425dacc8002mbligh    def client(self, server_ip, test, test_time, num_streams,
141443942444d5888634ae6faa314f89425dacc8002mbligh               test_specific_args, cpu_affinity):
142443942444d5888634ae6faa314f89425dacc8002mbligh        args = '-H %s -t %s -l %d' % (server_ip, test, test_time)
1438acfcfa572b3fae6c73937fcf9764580e7974101Kelly Lucas
144443942444d5888634ae6faa314f89425dacc8002mbligh        if self.wait_time:
145443942444d5888634ae6faa314f89425dacc8002mbligh            args += ' -s %d ' % self.wait_time
146443942444d5888634ae6faa314f89425dacc8002mbligh
147443942444d5888634ae6faa314f89425dacc8002mbligh        # Append the test specific arguments.
148443942444d5888634ae6faa314f89425dacc8002mbligh        if test_specific_args:
149443942444d5888634ae6faa314f89425dacc8002mbligh            args += ' ' + test_specific_args
150443942444d5888634ae6faa314f89425dacc8002mbligh
151443942444d5888634ae6faa314f89425dacc8002mbligh        cmd = '%s %s' % (self.client_prog, args)
152443942444d5888634ae6faa314f89425dacc8002mbligh
153443942444d5888634ae6faa314f89425dacc8002mbligh        if cpu_affinity:
154443942444d5888634ae6faa314f89425dacc8002mbligh            cmd = 'taskset %s %s' % (cpu_affinity, cmd)
155a5630a5382d4b04a02728684aebec3dce984e2bfmbligh
156a5630a5382d4b04a02728684aebec3dce984e2bfmbligh        try:
157443942444d5888634ae6faa314f89425dacc8002mbligh            cmds = []
158443942444d5888634ae6faa314f89425dacc8002mbligh
159443942444d5888634ae6faa314f89425dacc8002mbligh            # Get 5 mpstat samples. Since tests with large number of streams
160443942444d5888634ae6faa314f89425dacc8002mbligh            # take a long time to start up all the streams, we'll toss out the
161443942444d5888634ae6faa314f89425dacc8002mbligh            # first and last sample when recording results
162443942444d5888634ae6faa314f89425dacc8002mbligh            interval = max(1, test_time / 5)
163fa3827ac4130595ebb93b40a9e5cb0abc6715e0cGwendal Grignou            cmds.append('sleep %d && %s -P ALL %s 5' %
164fa3827ac4130595ebb93b40a9e5cb0abc6715e0cGwendal Grignou                        (self.wait_time, 'mpstat', interval))
165443942444d5888634ae6faa314f89425dacc8002mbligh
166443942444d5888634ae6faa314f89425dacc8002mbligh            # Add the netperf commands
167443942444d5888634ae6faa314f89425dacc8002mbligh            for i in xrange(num_streams):
168443942444d5888634ae6faa314f89425dacc8002mbligh                cmds.append(cmd)
169443942444d5888634ae6faa314f89425dacc8002mbligh                if self.bidi and test == 'TCP_STREAM':
170443942444d5888634ae6faa314f89425dacc8002mbligh                    cmds.append(cmd.replace('TCP_STREAM', 'TCP_MAERTS'))
171443942444d5888634ae6faa314f89425dacc8002mbligh
172865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh            t0 = time.time()
173443942444d5888634ae6faa314f89425dacc8002mbligh            # Launch all commands in parallel
174443942444d5888634ae6faa314f89425dacc8002mbligh            out = utils.run_parallel(cmds, timeout=test_time + 500,
175443942444d5888634ae6faa314f89425dacc8002mbligh                                     ignore_status=True)
176865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh            t1 = time.time()
177865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh
178443942444d5888634ae6faa314f89425dacc8002mbligh            self.results.append(out)
179443942444d5888634ae6faa314f89425dacc8002mbligh            self.actual_times.append(t1 - t0 - self.wait_time)
180443942444d5888634ae6faa314f89425dacc8002mbligh            # Log test output
181443942444d5888634ae6faa314f89425dacc8002mbligh            logging.info(out)
182865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh
183a5630a5382d4b04a02728684aebec3dce984e2bfmbligh        except error.CmdError, e:
184a5630a5382d4b04a02728684aebec3dce984e2bfmbligh            """ Catch errors due to timeout, but raise others
185a5630a5382d4b04a02728684aebec3dce984e2bfmbligh            The actual error string is:
186a5630a5382d4b04a02728684aebec3dce984e2bfmbligh              "Command did not complete within %d seconds"
187a5630a5382d4b04a02728684aebec3dce984e2bfmbligh            called in function join_bg_job in the file common_lib/utils.py
188a5630a5382d4b04a02728684aebec3dce984e2bfmbligh
189a5630a5382d4b04a02728684aebec3dce984e2bfmbligh            Looking for 'within' is probably not the best way to do this but
190a5630a5382d4b04a02728684aebec3dce984e2bfmbligh            works for now"""
191a5630a5382d4b04a02728684aebec3dce984e2bfmbligh
19252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh            if ('within' in e.additional_text
19352fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                or 'non-zero' in e.additional_text):
1944c607f2bce87c8dbfc4e0136b9b909be0f62f952lmr                logging.debug(e.additional_text)
195443942444d5888634ae6faa314f89425dacc8002mbligh                self.results.append(None)
196865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh                self.actual_times.append(1)
197a5630a5382d4b04a02728684aebec3dce984e2bfmbligh            else:
198a5630a5382d4b04a02728684aebec3dce984e2bfmbligh                raise
199a5630a5382d4b04a02728684aebec3dce984e2bfmbligh
200a5630a5382d4b04a02728684aebec3dce984e2bfmbligh
201a5630a5382d4b04a02728684aebec3dce984e2bfmbligh    def postprocess(self):
20252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        if self.role == 'client':
203443942444d5888634ae6faa314f89425dacc8002mbligh            # if profilers are enabled, the test gets runs twice
204443942444d5888634ae6faa314f89425dacc8002mbligh            if (len(self.stream_list) != len(self.results) and
205443942444d5888634ae6faa314f89425dacc8002mbligh               2*len(self.stream_list) != len(self.results)):
20652fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                raise error.TestError('Mismatched number of results')
20752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
20852fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh            function = None
20952fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh            keys = None
21052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
21152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh            # Each of the functions return tuples in which the keys define
21252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh            # what that item in the tuple represents
213443942444d5888634ae6faa314f89425dacc8002mbligh            if self.test in ['TCP_STREAM', 'TCP_MAERTS', 'TCP_SENDFILE']:
21452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                function = self.process_tcp_stream
21552fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                keys = ('Throughput',)
21652fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh            elif self.test == 'UDP_STREAM':
21752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                function = self.process_udp_stream
21852fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                keys = ('Throughput', 'Errors')
21952fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh            elif self.test in ['TCP_RR', 'TCP_CRR', 'UDP_RR']:
22052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                function = self.process_request_response
22152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                keys = ('Transfer_Rate',)
22252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh            else:
22352fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                raise error.TestError('Unhandled test')
22452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
22552fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh            for i, streams in enumerate(self.stream_list):
22652fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                attr = {'stream_count':streams}
22752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                keyval = {}
22852fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                temp_vals = []
22952fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
23052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                # Short circuit to handle errors due to client timeouts
231443942444d5888634ae6faa314f89425dacc8002mbligh                if not self.results[i]:
23252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                    self.write_iteration_keyval(attr, keyval)
23352fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                    continue
23452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
235443942444d5888634ae6faa314f89425dacc8002mbligh                # Collect output of netperf sessions
236443942444d5888634ae6faa314f89425dacc8002mbligh                failed_streams_count = 0
237443942444d5888634ae6faa314f89425dacc8002mbligh                for result in self.results[i][NETPERF_IX:]:
238443942444d5888634ae6faa314f89425dacc8002mbligh                    if result.exit_status:
239443942444d5888634ae6faa314f89425dacc8002mbligh                        failed_streams_count += 1
240443942444d5888634ae6faa314f89425dacc8002mbligh                    else:
241443942444d5888634ae6faa314f89425dacc8002mbligh                        temp_vals.append(function(result.stdout))
242443942444d5888634ae6faa314f89425dacc8002mbligh
243443942444d5888634ae6faa314f89425dacc8002mbligh                keyval['Failed_streams_count'] = failed_streams_count
244443942444d5888634ae6faa314f89425dacc8002mbligh
245443942444d5888634ae6faa314f89425dacc8002mbligh                # Process mpstat output
246443942444d5888634ae6faa314f89425dacc8002mbligh                mpstat_out = self.results[i][MPSTAT_IX].stdout
247443942444d5888634ae6faa314f89425dacc8002mbligh                cpu_stats = self.network_utils.process_mpstat(mpstat_out, 5)
248443942444d5888634ae6faa314f89425dacc8002mbligh                keyval['CPU_C'] = 100 - cpu_stats['idle']
249443942444d5888634ae6faa314f89425dacc8002mbligh                keyval['CPU_C_SYS'] = cpu_stats['sys']
250443942444d5888634ae6faa314f89425dacc8002mbligh                keyval['CPU_C_HI'] = cpu_stats['irq']
251443942444d5888634ae6faa314f89425dacc8002mbligh                keyval['CPU_C_SI'] = cpu_stats['soft']
252443942444d5888634ae6faa314f89425dacc8002mbligh                keyval['INTRS_C'] = cpu_stats['intr/s']
253443942444d5888634ae6faa314f89425dacc8002mbligh
254443942444d5888634ae6faa314f89425dacc8002mbligh                actual_time = self.actual_times[i]
255443942444d5888634ae6faa314f89425dacc8002mbligh                keyval['actual_time'] = actual_time
256443942444d5888634ae6faa314f89425dacc8002mbligh                logging.info('actual_time: %f', actual_time)
25752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
2586d858fa16693074e41b51b8068aa0d5a670c6e56mbligh                # Compute the sum of elements returned from function which
25952fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                # represent the string contained in keys
26052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                for j, key in enumerate(keys):
26152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                    vals = [x[j] for x in temp_vals]
262865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh                    # scale result by the actual time taken
263443942444d5888634ae6faa314f89425dacc8002mbligh                    keyval[key] = sum(vals)
264865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh
265865ee82c4d530f88d8c41ca934920ad6d85bd019mbligh                # record 'Efficiency' as perf/CPU
266443942444d5888634ae6faa314f89425dacc8002mbligh                if keyval['CPU_C'] != 0:
267443942444d5888634ae6faa314f89425dacc8002mbligh                    keyval['Efficieny_C'] = keyval[keys[0]]/keyval['CPU_C']
268443942444d5888634ae6faa314f89425dacc8002mbligh                else:
269443942444d5888634ae6faa314f89425dacc8002mbligh                    keyval['Efficieny_C'] = keyval[keys[0]]
27052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
27152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh                self.write_iteration_keyval(attr, keyval)
27252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
27352fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
27452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh    def process_tcp_stream(self, output):
275443942444d5888634ae6faa314f89425dacc8002mbligh        """Parses the following (works for both TCP_STREAM, TCP_MAERTS and
276443942444d5888634ae6faa314f89425dacc8002mbligh        TCP_SENDFILE) and returns a singleton containing throughput.
27752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
278443942444d5888634ae6faa314f89425dacc8002mbligh        TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to foo.bar.com \
279443942444d5888634ae6faa314f89425dacc8002mbligh        (10.10.10.3) port 0 AF_INET
28052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        Recv   Send    Send
28152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        Socket Socket  Message  Elapsed
28252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        Size   Size    Size     Time     Throughput
28352fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        bytes  bytes   bytes    secs.    10^6bits/sec
28452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
28552fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        87380  16384  16384    2.00      941.28
28652fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        """
28752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
28852fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        return float(output.splitlines()[6].split()[4]),
28952fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
29052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
29152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh    def process_udp_stream(self, output):
29252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        """Parses the following and returns a touple containing throughput
29352fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        and the number of errors.
29452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
295443942444d5888634ae6faa314f89425dacc8002mbligh        UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET \
296443942444d5888634ae6faa314f89425dacc8002mbligh        to foo.bar.com (10.10.10.3) port 0 AF_INET
29752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        Socket  Message  Elapsed      Messages
29852fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        Size    Size     Time         Okay Errors   Throughput
29952fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        bytes   bytes    secs            #      #   10^6bits/sec
30052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
30152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        129024   65507   2.00         3673      0     961.87
30252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        131072           2.00         3673            961.87
30352fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        """
30452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
30552fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        line_tokens = output.splitlines()[5].split()
30652fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        return float(line_tokens[5]), int(line_tokens[4])
30752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
30852fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
30952fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh    def process_request_response(self, output):
31052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        """Parses the following which works for both rr (TCP and UDP) and crr
31152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        tests and returns a singleton containing transfer rate.
31252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
313443942444d5888634ae6faa314f89425dacc8002mbligh        TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET \
314443942444d5888634ae6faa314f89425dacc8002mbligh        to foo.bar.com (10.10.10.3) port 0 AF_INET
31552fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        Local /Remote
31652fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        Socket Size   Request  Resp.   Elapsed  Trans.
31752fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        Send   Recv   Size     Size    Time     Rate
31852fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        bytes  Bytes  bytes    bytes   secs.    per sec
31952fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
32052fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        16384  87380  1        1       2.00     14118.53
32152fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        16384  87380
32252fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        """
32352fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh
32452fa69285dbeb9e9a0d49de4b1e12b52cda39fc6mbligh        return float(output.splitlines()[6].split()[5]),
325443942444d5888634ae6faa314f89425dacc8002mbligh
326443942444d5888634ae6faa314f89425dacc8002mbligh
327443942444d5888634ae6faa314f89425dacc8002mbligh    def ping(self, ip, timeout):
328443942444d5888634ae6faa314f89425dacc8002mbligh        curr_time = time.time()
329443942444d5888634ae6faa314f89425dacc8002mbligh        end_time = curr_time + timeout
330443942444d5888634ae6faa314f89425dacc8002mbligh        while curr_time < end_time:
331443942444d5888634ae6faa314f89425dacc8002mbligh            if not os.system('ping -c 1 ' + ip):
332443942444d5888634ae6faa314f89425dacc8002mbligh                # Ping succeeded
333443942444d5888634ae6faa314f89425dacc8002mbligh                return
334443942444d5888634ae6faa314f89425dacc8002mbligh            # Ping failed. Lets sleep a bit and try again.
335443942444d5888634ae6faa314f89425dacc8002mbligh            time.sleep(5)
336443942444d5888634ae6faa314f89425dacc8002mbligh            curr_time = time.time()
337443942444d5888634ae6faa314f89425dacc8002mbligh
338443942444d5888634ae6faa314f89425dacc8002mbligh        return
339