#!/usr/bin/python
#
# Copyright 2011 Google Inc. All Rights Reserved.
__author__ = 'kbaclawski@google.com (Krystian Baclawski)'
import logging
import optparse
import pickle
import sys
import xmlrpclib
from automation.clients.helper import crosstool
from automation.common import job_group
from automation.common import logger
class CrosstoolNightlyClient(object):
VALID_TARGETS = ['gcc-4.6.x-ubuntu_lucid-arm',
'gcc-4.6.x-ubuntu_lucid-x86_64',
'gcc-4.6.x-grtev2-armv7a-vfpv3.d16-hard',
'gcc-4.6.x-glibc-2.11.1-grte',
'gcc-4.6.x-glibc-2.11.1-powerpc']
VALID_BOARDS = ['qemu', 'pandaboard', 'unix']
def __init__(self, target, boards):
assert target in self.VALID_TARGETS
assert all(board in self.VALID_BOARDS for board in boards)
self._target = target
self._boards = boards
def Run(self):
server = xmlrpclib.Server('http://localhost:8000')
server.ExecuteJobGroup(pickle.dumps(self.CreateJobGroup()))
def CreateJobGroup(self):
factory = crosstool.JobsFactory()
checkout_crosstool_job, checkout_dir, manifests_dir = \
factory.CheckoutCrosstool(self._target)
all_jobs = [checkout_crosstool_job]
# Build crosstool target
build_release_job, build_tree_dir = factory.BuildRelease(checkout_dir,
self._target)
all_jobs.append(build_release_job)
testruns = []
# Perform crosstool tests
for board in self._boards:
for component in ('gcc', 'binutils'):
test_job, testrun_dir = factory.RunTests(checkout_dir, build_tree_dir,
self._target, board, component)
all_jobs.append(test_job)
testruns.append(testrun_dir)
if testruns:
all_jobs.append(factory.GenerateReport(testruns, manifests_dir,
self._target, self._boards))
return job_group.JobGroup('Crosstool Nightly Build (%s)' % self._target,
all_jobs, True, False)
@logger.HandleUncaughtExceptions
def Main(argv):
valid_boards_string = ', '.join(CrosstoolNightlyClient.VALID_BOARDS)
parser = optparse.OptionParser()
parser.add_option(
'-b',
'--board',
dest='boards',
action='append',
choices=CrosstoolNightlyClient.VALID_BOARDS,
default=[],
help=('Run DejaGNU tests on selected boards: %s.' % valid_boards_string))
options, args = parser.parse_args(argv)
if len(args) == 2:
target = args[1]
else:
logging.error('Exactly one target required as a command line argument!')
logging.info('List of valid targets:')
for pair in enumerate(CrosstoolNightlyClient.VALID_TARGETS, start=1):
logging.info('%d) %s', pair)
sys.exit(1)
option_list = [opt.dest for opt in parser.option_list if opt.dest]
kwargs = dict((option, getattr(options, option)) for option in option_list)
client = CrosstoolNightlyClient(target, **kwargs)
client.Run()
if __name__ == '__main__':
logger.SetUpRootLogger(level=logging.DEBUG, display_flags={'name': False})
Main(sys.argv)