apw | 00a69a6 | 2006-10-10 08:35:33 +0000 | [diff] [blame] | 1 | """The ABAT harness interface |
| 2 | |
| 3 | The interface as required for ABAT. |
| 4 | """ |
| 5 | |
| 6 | __author__ = """Copyright Andy Whitcroft 2006""" |
| 7 | |
mbligh | 53da18e | 2009-01-05 21:13:26 +0000 | [diff] [blame] | 8 | from autotest_lib.client.bin import utils |
apw | 7d40038 | 2007-02-28 15:23:09 +0000 | [diff] [blame] | 9 | import os, harness, time, re |
| 10 | |
| 11 | def autobench_load(fn): |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 12 | disks = re.compile(r'^\s*DATS_FREE_DISKS\s*=(.*\S)\s*$') |
| 13 | parts = re.compile(r'^\s*DATS_FREE_PARTITIONS\s*=(.*\S)\s*$') |
| 14 | modules = re.compile(r'^\s*INITRD_MODULES\s*=(.*\S)\s*$') |
apw | 7d40038 | 2007-02-28 15:23:09 +0000 | [diff] [blame] | 15 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 16 | conf = {} |
apw | 7d40038 | 2007-02-28 15:23:09 +0000 | [diff] [blame] | 17 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 18 | try: |
| 19 | fd = file(fn, "r") |
| 20 | except: |
| 21 | return conf |
| 22 | for ln in fd.readlines(): |
| 23 | m = disks.match(ln) |
| 24 | if m: |
| 25 | val = m.groups()[0] |
| 26 | conf['disks'] = val.strip('"').split() |
| 27 | m = parts.match(ln) |
| 28 | if m: |
| 29 | val = m.groups()[0] |
| 30 | conf['partitions'] = val.strip('"').split() |
| 31 | m = modules.match(ln) |
| 32 | if m: |
| 33 | val = m.groups()[0] |
| 34 | conf['modules'] = val.strip('"').split() |
| 35 | fd.close() |
apw | 7d40038 | 2007-02-28 15:23:09 +0000 | [diff] [blame] | 36 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 37 | return conf |
apw | 7d40038 | 2007-02-28 15:23:09 +0000 | [diff] [blame] | 38 | |
apw | 00a69a6 | 2006-10-10 08:35:33 +0000 | [diff] [blame] | 39 | |
| 40 | class harness_ABAT(harness.harness): |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 41 | """The ABAT server harness |
apw | 00a69a6 | 2006-10-10 08:35:33 +0000 | [diff] [blame] | 42 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 43 | Properties: |
| 44 | job |
| 45 | The job object for this job |
| 46 | """ |
apw | 00a69a6 | 2006-10-10 08:35:33 +0000 | [diff] [blame] | 47 | |
Eric Li | 8a12e80 | 2011-02-17 14:24:13 -0800 | [diff] [blame] | 48 | def __init__(self, job, harness_args): |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 49 | """ |
| 50 | job |
| 51 | The job object for this job |
| 52 | """ |
| 53 | self.setup(job) |
apw | 00a69a6 | 2006-10-10 08:35:33 +0000 | [diff] [blame] | 54 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 55 | if 'ABAT_STATUS' in os.environ: |
| 56 | self.status = file(os.environ['ABAT_STATUS'], "w") |
| 57 | else: |
| 58 | self.status = None |
apw | 00a69a6 | 2006-10-10 08:35:33 +0000 | [diff] [blame] | 59 | |
apw | a6fe201 | 2006-11-28 10:00:53 +0000 | [diff] [blame] | 60 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 61 | def __send(self, msg): |
| 62 | if self.status: |
| 63 | msg = msg.rstrip() |
| 64 | self.status.write(msg + "\n") |
| 65 | self.status.flush() |
apw | 00a69a6 | 2006-10-10 08:35:33 +0000 | [diff] [blame] | 66 | |
| 67 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 68 | def __send_status(self, code, subdir, operation, msg): |
mbligh | 8b35285 | 2008-06-07 01:07:08 +0000 | [diff] [blame] | 69 | self.__send("STATUS %s %s %s %s" % (code, subdir, operation, msg)) |
apw | 4b2e4fb | 2007-09-25 16:52:30 +0000 | [diff] [blame] | 70 | |
| 71 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 72 | def __root_device(self): |
| 73 | device = None |
| 74 | root = re.compile(r'^\S*(/dev/\S+).*\s/\s*$') |
apw | 25cf55a | 2007-10-01 17:11:46 +0000 | [diff] [blame] | 75 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 76 | df = utils.system_output('df -lP') |
| 77 | for line in df.split("\n"): |
| 78 | m = root.match(line) |
| 79 | if m: |
| 80 | device = m.groups()[0] |
| 81 | |
| 82 | return device |
apw | 25cf55a | 2007-10-01 17:11:46 +0000 | [diff] [blame] | 83 | |
apw | 55dc5bd5 | 2007-03-04 16:23:06 +0000 | [diff] [blame] | 84 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 85 | def run_start(self): |
| 86 | """A run within this job is starting""" |
| 87 | self.__send_status('GOOD', '----', '----', 'run starting') |
apw | 00a69a6 | 2006-10-10 08:35:33 +0000 | [diff] [blame] | 88 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 89 | # Load up the autobench.conf if it exists. |
| 90 | conf = autobench_load("/etc/autobench.conf") |
| 91 | if 'partitions' in conf: |
mbligh | 4ec32c1 | 2008-10-22 21:05:04 +0000 | [diff] [blame] | 92 | self.job.config_set('partition.partitions', |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 93 | conf['partitions']) |
apw | 7d40038 | 2007-02-28 15:23:09 +0000 | [diff] [blame] | 94 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 95 | # Search the boot loader configuration for the autobench entry, |
| 96 | # and extract its args. |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 97 | args = None |
mbligh | c2ebea0 | 2009-10-02 00:02:33 +0000 | [diff] [blame] | 98 | for entry in self.job.bootloader.get_entries().itervalues(): |
| 99 | if entry['title'].startswith('autobench'): |
| 100 | args = entry.get('args') |
apw | 935903e | 2006-12-01 11:35:10 +0000 | [diff] [blame] | 101 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 102 | if args: |
| 103 | args = re.sub(r'autobench_args:.*', '', args) |
| 104 | args = re.sub(r'root=\S*', '', args) |
| 105 | args += " root=" + self.__root_device() |
apw | 55dc5bd5 | 2007-03-04 16:23:06 +0000 | [diff] [blame] | 106 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 107 | self.job.config_set('boot.default_args', args) |
apw | 935903e | 2006-12-01 11:35:10 +0000 | [diff] [blame] | 108 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 109 | # Turn off boot_once semantics. |
| 110 | self.job.config_set('boot.set_default', True) |
apw | f47934f | 2007-10-04 15:45:10 +0000 | [diff] [blame] | 111 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 112 | # For RedHat installs we do not load up the module.conf |
| 113 | # as they cannot be builtin. Pass them as arguments. |
mbligh | 53da18e | 2009-01-05 21:13:26 +0000 | [diff] [blame] | 114 | vendor = utils.get_os_vendor() |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 115 | if vendor in ['Red Hat', 'Fedora Core'] and 'modules' in conf: |
| 116 | args = '--allow-missing' |
| 117 | for mod in conf['modules']: |
| 118 | args += " --with " + mod |
| 119 | self.job.config_set('kernel.mkinitrd_extra_args', args) |
apw | e43a30b | 2007-09-25 16:51:30 +0000 | [diff] [blame] | 120 | |
apw | 00a69a6 | 2006-10-10 08:35:33 +0000 | [diff] [blame] | 121 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 122 | def run_reboot(self): |
| 123 | """A run within this job is performing a reboot |
| 124 | (expect continue following reboot) |
| 125 | """ |
| 126 | self.__send("REBOOT") |
apw | 2e33c6a | 2006-11-02 00:22:26 +0000 | [diff] [blame] | 127 | |
apw | 2e33c6a | 2006-11-02 00:22:26 +0000 | [diff] [blame] | 128 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 129 | def run_complete(self): |
| 130 | """A run within this job is completing (all done)""" |
| 131 | self.__send("DONE") |
apw | 00a69a6 | 2006-10-10 08:35:33 +0000 | [diff] [blame] | 132 | |
| 133 | |
Eric Li | d656d56 | 2011-04-20 11:48:29 -0700 | [diff] [blame] | 134 | def test_status_detail(self, code, subdir, operation, msg, tag, |
| 135 | optional_fields): |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 136 | """A test within this job is completing (detail)""" |
apw | 00a69a6 | 2006-10-10 08:35:33 +0000 | [diff] [blame] | 137 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 138 | # Send the first line with the status code as a STATUS message. |
| 139 | lines = msg.split("\n") |
| 140 | self.__send_status(code, subdir, operation, lines[0]) |
apw | 4b2e4fb | 2007-09-25 16:52:30 +0000 | [diff] [blame] | 141 | |
apw | f3e7844 | 2007-12-13 06:36:14 +0000 | [diff] [blame] | 142 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 143 | def test_status(self, msg, tag): |
| 144 | lines = msg.split("\n") |
apw | 00a69a6 | 2006-10-10 08:35:33 +0000 | [diff] [blame] | 145 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 146 | # Send each line as a SUMMARY message. |
| 147 | for line in lines: |
| 148 | self.__send("SUMMARY :" + line) |