| import os, time, logging |
| from autotest_lib.client.bin import test, utils |
| from autotest_lib.client.common_lib import error |
| |
| |
| class netpipe(test.test): |
| version = 1 |
| NP_FILE = '/tmp/np.out' |
| |
| # http://www.scl.ameslab.gov/netpipe/code/NetPIPE-3.7.1.tar.gz |
| def setup(self, tarball='NetPIPE-3.7.1.tar.gz'): |
| tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir) |
| utils.extract_tarball_to_dir(tarball, self.srcdir) |
| os.chdir(self.srcdir) |
| utils.system('patch -p1 < ../makefile.patch') |
| utils.make() |
| |
| |
| def initialize(self): |
| self.job.require_gcc() |
| |
| # Add arguments later |
| self.server_path = '%s %%s' % os.path.join(self.srcdir, 'NPtcp') |
| # Add server_ip and arguments later |
| base_path = os.path.join(self.srcdir, 'NPtcp -h') |
| self.client_path = '%s %%s -o %s %%s' % (base_path, self.NP_FILE) |
| self.results = [] |
| |
| def cleanup(self): |
| # Just in case... |
| utils.system('killall -9 NPtcp', ignore_status=True) |
| |
| |
| def run_once(self, server_ip, client_ip, role, bidirectional=False, |
| buffer_size=None, upper_bound=None, |
| perturbation_size=3): |
| self.role = role |
| |
| # Any arguments used must be the same on both the client and the server |
| args = '-p %d ' % perturbation_size |
| if bidirectional: |
| args += '-2 ' |
| if buffer_size: |
| args += '-b %d ' % buffer_size |
| if upper_bound: |
| args += '-u %d ' % upper_bound |
| |
| |
| server_tag = server_ip + '#netpipe-server' |
| client_tag = client_ip + '#netpipe-client' |
| all = [server_tag, client_tag] |
| |
| if role == 'server': |
| # Wait up to ten minutes for both to reach this point. |
| self.job.barrier(server_tag, 'start', 600).rendezvous(*all) |
| self.server_start(args) |
| # Both the client and server should be closed so just to make |
| # sure they are both at the same point wait at most five minutes. |
| self.job.barrier(server_tag, 'stop', 300).rendezvous(*all) |
| elif role == 'client': |
| # Wait up to ten minutes for the server to start |
| self.job.barrier(client_tag, 'start', 600).rendezvous(*all) |
| # Sleep 10 seconds to make sure the server is started |
| time.sleep(10) |
| self.client(server_ip, args) |
| # Wait up to five minutes for the server to also reach this point |
| self.job.barrier(client_tag, 'stop', 300).rendezvous(*all) |
| else: |
| raise error.TestError('invalid role specified') |
| |
| |
| def server_start(self, args): |
| cmd = self.server_path % args |
| self.results.append(utils.system_output(cmd, retain_output=True)) |
| |
| |
| def client(self, server_ip, args): |
| cmd = self.client_path % (server_ip, args) |
| |
| try: |
| # We don't care about the actual output since the important stuff |
| # goes to self.NP_FILE |
| utils.system(cmd) |
| except error.CmdError, e: |
| """ Catch errors due to timeout, but raise others |
| The actual error string is: |
| "Command did not complete within %d seconds" |
| called in function join_bg_job in the file common_lib/utils.py |
| |
| Looking for 'within' is probably not the best way to do this but |
| works for now""" |
| |
| if ('within' in e.additional_text |
| or 'non-zero' in e.additional_text): |
| logging.debug(e.additional_text) |
| else: |
| raise |
| |
| |
| def postprocess(self): |
| if self.role == 'client': |
| try: |
| output = open(self.NP_FILE) |
| for line in output.readlines(): |
| buff, bandwidth, latency = line.split() |
| attr = {'buffer_size':buff} |
| keyval = {'bandwidth':bandwidth, 'latency':latency} |
| self.write_iteration_keyval(attr, keyval) |
| finally: |
| output.close() |
| os.remove(self.NP_FILE) |