"""The ABAT harness interface
The interface as required for ABAT.
"""
__author__ = """Copyright Andy Whitcroft 2006"""
from autotest_lib.client.bin import utils
import os, harness, time, re
def autobench_load(fn):
disks = re.compile(r'^\s*DATS_FREE_DISKS\s*=(.*\S)\s*$')
parts = re.compile(r'^\s*DATS_FREE_PARTITIONS\s*=(.*\S)\s*$')
modules = re.compile(r'^\s*INITRD_MODULES\s*=(.*\S)\s*$')
conf = {}
try:
fd = file(fn, "r")
except:
return conf
for ln in fd.readlines():
m = disks.match(ln)
if m:
val = m.groups()[0]
conf['disks'] = val.strip('"').split()
m = parts.match(ln)
if m:
val = m.groups()[0]
conf['partitions'] = val.strip('"').split()
m = modules.match(ln)
if m:
val = m.groups()[0]
conf['modules'] = val.strip('"').split()
fd.close()
return conf
class harness_ABAT(harness.harness):
"""The ABAT server harness
Properties:
job
The job object for this job
"""
def __init__(self, job, harness_args):
"""
job
The job object for this job
"""
self.setup(job)
if 'ABAT_STATUS' in os.environ:
self.status = file(os.environ['ABAT_STATUS'], "w")
else:
self.status = None
def __send(self, msg):
if self.status:
msg = msg.rstrip()
self.status.write(msg + "\n")
self.status.flush()
def __send_status(self, code, subdir, operation, msg):
self.__send("STATUS %s %s %s %s" % (code, subdir, operation, msg))
def __root_device(self):
device = None
root = re.compile(r'^\S*(/dev/\S+).*\s/\s*$')
df = utils.system_output('df -lP')
for line in df.split("\n"):
m = root.match(line)
if m:
device = m.groups()[0]
return device
def run_start(self):
"""A run within this job is starting"""
self.__send_status('GOOD', '----', '----', 'run starting')
# Load up the autobench.conf if it exists.
conf = autobench_load("/etc/autobench.conf")
if 'partitions' in conf:
self.job.config_set('partition.partitions',
conf['partitions'])
# Search the boot loader configuration for the autobench entry,
# and extract its args.
args = None
for entry in self.job.bootloader.get_entries().itervalues():
if entry['title'].startswith('autobench'):
args = entry.get('args')
if args:
args = re.sub(r'autobench_args:.*', '', args)
args = re.sub(r'root=\S*', '', args)
args += " root=" + self.__root_device()
self.job.config_set('boot.default_args', args)
# Turn off boot_once semantics.
self.job.config_set('boot.set_default', True)
# For RedHat installs we do not load up the module.conf
# as they cannot be builtin. Pass them as arguments.
vendor = utils.get_os_vendor()
if vendor in ['Red Hat', 'Fedora Core'] and 'modules' in conf:
args = '--allow-missing'
for mod in conf['modules']:
args += " --with " + mod
self.job.config_set('kernel.mkinitrd_extra_args', args)
def run_reboot(self):
"""A run within this job is performing a reboot
(expect continue following reboot)
"""
self.__send("REBOOT")
def run_complete(self):
"""A run within this job is completing (all done)"""
self.__send("DONE")
def test_status_detail(self, code, subdir, operation, msg, tag,
optional_fields):
"""A test within this job is completing (detail)"""
# Send the first line with the status code as a STATUS message.
lines = msg.split("\n")
self.__send_status(code, subdir, operation, lines[0])
def test_status(self, msg, tag):
lines = msg.split("\n")
# Send each line as a SUMMARY message.
for line in lines:
self.__send("SUMMARY :" + line)