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