netperf2.py revision 0afbb6369aa5aa9a75ea67dd9e95ec4b21c0c181
1import os 2from autotest_lib.client.bin import test, autotest_utils 3from autotest_lib.client.common_lib import utils, error 4 5 6class netperf2(test.test): 7 version = 1 8 9 # ftp://ftp.netperf.org/netperf/netperf-2.4.1.tar.gz 10 def setup(self, tarball = 'netperf-2.4.1.tar.gz'): 11 tarball = utils.unmap_url(self.bindir, tarball, 12 self.tmpdir) 13 autotest_utils.extract_tarball_to_dir(tarball, self.srcdir) 14 os.chdir(self.srcdir) 15 16 utils.system('./configure') 17 utils.system('make') 18 19 20 def initialize(self): 21 # netserver doesn't detach properly from the console. When 22 # it is run from ssh, this causes the ssh command not to 23 # return even though netserver meant to be backgrounded. 24 # This behavior is remedied by redirecting fd 0, 1 & 2 25 self.server_path = ('%s &>/dev/null </dev/null' 26 % os.path.join(self.srcdir, 'src/netserver')) 27 self.client_path = os.path.join(self.srcdir, 'src/netperf') 28 29 30 def execute(self, server_ip, client_ip, role, 31 script='snapshot_script', args=''): 32 server_tag = server_ip + '#netperf-server' 33 client_tag = client_ip + '#netperf-client' 34 all = [server_tag, client_tag] 35 job = self.job 36 if (role == 'server'): 37 self.server_start() 38 try: 39 job.barrier(server_tag, 'start', 40 600).rendevous(*all) 41 job.barrier(server_tag, 'stop', 42 3600).rendevous(*all) 43 finally: 44 self.server_stop() 45 elif (role == 'client'): 46 os.environ['NETPERF_CMD'] = self.client_path 47 job.barrier(client_tag, 'start', 600).rendevous(*all) 48 self.client(script, server_ip, args) 49 job.barrier(client_tag, 'stop', 30).rendevous(*all) 50 else: 51 raise error.UnhandledError('invalid role specified') 52 53 54 def server_start(self): 55 # we should really record the pid we forked off, but there 56 # was no obvious way to run the daemon in the foreground. 57 # Hacked it for now 58 system('killall netserver', ignore_status=True) 59 system(self.server_path) 60 61 62 def server_stop(self): 63 # this should really just kill the pid I forked, but ... 64 system('killall netserver') 65 66 67 def client(self, script, server_ip, args = 'CPU'): 68 # run some client stuff 69 stdout_path = os.path.join(self.resultsdir, script + '.stdout') 70 stderr_path = os.path.join(self.resultsdir, script + '.stderr') 71 self.job.stdout.tee_redirect(stdout_path) 72 self.job.stderr.tee_redirect(stderr_path) 73 74 script_path = os.path.join(self.srcdir, 'doc/examples', script) 75 system('%s %s %s' % (script_path, server_ip, args)) 76 77 self.job.stdout.restore() 78 self.job.stderr.restore() 79