112 lines
4.0 KiB
Python
112 lines
4.0 KiB
Python
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)
|