mbligh | 0526936 | 2007-10-16 16:58:11 +0000 | [diff] [blame] | 1 | # Copyright Martin J. Bligh, Andy Whitcroft, 2007 |
| 2 | # |
mbligh | ea397bb | 2008-02-02 19:17:51 +0000 | [diff] [blame] | 3 | # Define the server-side test class |
mbligh | 0526936 | 2007-10-16 16:58:11 +0000 | [diff] [blame] | 4 | # |
mbligh | 0526936 | 2007-10-16 16:58:11 +0000 | [diff] [blame] | 5 | |
jadmanski | 54f90af | 2008-10-10 16:20:55 +0000 | [diff] [blame^] | 6 | import os, tempfile |
mbligh | ea397bb | 2008-02-02 19:17:51 +0000 | [diff] [blame] | 7 | |
jadmanski | 54f90af | 2008-10-10 16:20:55 +0000 | [diff] [blame^] | 8 | from autotest_lib.client.common_lib import log, utils, test as common_test |
mbligh | 0526936 | 2007-10-16 16:58:11 +0000 | [diff] [blame] | 9 | |
| 10 | |
mbligh | ccb9e18 | 2008-04-17 15:42:10 +0000 | [diff] [blame] | 11 | class test(common_test.base_test): |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 12 | pass |
mbligh | dccabe3 | 2008-02-01 17:39:32 +0000 | [diff] [blame] | 13 | |
| 14 | |
jadmanski | 54f90af | 2008-10-10 16:20:55 +0000 | [diff] [blame^] | 15 | _sysinfo_before_script = """\ |
| 16 | import pickle |
| 17 | from autotest_lib.client.bin import test |
| 18 | mytest = test.test(job, '', %r) |
| 19 | job.sysinfo.log_before_each_test(mytest) |
| 20 | sysinfo_pickle = os.path.join(mytest.outputdir, 'sysinfo.pickle') |
| 21 | pickle.dump(job.sysinfo, open(sysinfo_pickle, 'w')) |
| 22 | job.record('GOOD', '', 'sysinfo.before') |
| 23 | """ |
| 24 | |
| 25 | _sysinfo_after_script = """\ |
| 26 | import pickle |
| 27 | from autotest_lib.client.bin import test |
| 28 | mytest = test.test(job, '', %r) |
| 29 | sysinfo_pickle = os.path.join(mytest.outputdir, 'sysinfo.pickle') |
| 30 | if os.path.exists(sysinfo_pickle): |
| 31 | job.sysinfo = pickle.load(open(sysinfo_pickle)) |
| 32 | job.sysinfo.__init__(job.resultdir) |
| 33 | job.sysinfo.log_after_each_test(mytest) |
| 34 | job.record('GOOD', '', 'sysinfo.after') |
| 35 | """ |
| 36 | |
| 37 | |
| 38 | class _sysinfo_logger(object): |
| 39 | def __init__(self, job): |
| 40 | self.job = job |
| 41 | self.pickle = None |
| 42 | if len(job.machines) != 1: |
| 43 | # disable logging on multi-machine tests |
| 44 | self.before_hook = self.after_hook = None |
| 45 | |
| 46 | |
| 47 | def _install(self): |
| 48 | from autotest_lib.server import hosts, autotest |
| 49 | host = hosts.create_host(self.job.machines[0], auto_monitor=False) |
| 50 | tmp_dir = host.get_tmp_dir() |
| 51 | at = autotest.Autotest(host) |
| 52 | at.install_base(autodir=tmp_dir) |
| 53 | return host, at |
| 54 | |
| 55 | |
| 56 | @log.log_and_ignore_errors("pre-test server sysinfo error:") |
| 57 | def before_hook(self, mytest): |
| 58 | host, at = self._install() |
| 59 | outputdir = host.get_tmp_dir() |
| 60 | |
| 61 | # run the pre-test sysinfo script |
| 62 | at.run(_sysinfo_before_script % outputdir, |
| 63 | results_dir=self.job.resultdir) |
| 64 | |
| 65 | # pull back the sysinfo pickle |
| 66 | fd, path = tempfile.mkstemp(dir=self.job.tmpdir) |
| 67 | os.close(fd) |
| 68 | host.get_file(os.path.join(outputdir, "sysinfo.pickle"), path) |
| 69 | self.pickle = path |
| 70 | |
| 71 | |
| 72 | @log.log_and_ignore_errors("post-test server sysinfo error:") |
| 73 | def after_hook(self, mytest): |
| 74 | host, at = self._install() |
| 75 | outputdir = host.get_tmp_dir() |
| 76 | |
| 77 | # push the sysinfo pickle out to the remote machine |
| 78 | if self.pickle: |
| 79 | host.send_file(self.pickle, |
| 80 | os.path.join(outputdir, "sysinfo.pickle")) |
| 81 | os.remove(self.pickle) |
| 82 | self.pickle = None |
| 83 | |
| 84 | # run the post-test sysinfo script |
| 85 | at.run(_sysinfo_after_script % outputdir, |
| 86 | results_dir=self.job.resultdir) |
| 87 | |
| 88 | # pull the sysinfo data back on to the server |
| 89 | host.get_file(os.path.join(outputdir, "sysinfo"), mytest.outputdir) |
| 90 | |
| 91 | # pull the keyval data back into the local one |
| 92 | fd, path = tempfile.mkstemp(dir=self.job.tmpdir) |
| 93 | os.close(fd) |
| 94 | host.get_file(os.path.join(outputdir, "keyval"), path) |
| 95 | keyval = utils.read_keyval(path) |
| 96 | os.remove(path) |
| 97 | mytest.write_test_keyval(keyval) |
| 98 | |
| 99 | |
mbligh | 0526936 | 2007-10-16 16:58:11 +0000 | [diff] [blame] | 100 | def runtest(job, url, tag, args, dargs): |
jadmanski | 54f90af | 2008-10-10 16:20:55 +0000 | [diff] [blame^] | 101 | logger = _sysinfo_logger(job) |
| 102 | common_test.runtest(job, url, tag, args, dargs, locals(), globals(), |
| 103 | logger.before_hook, logger.after_hook) |