1#!/usr/bin/python 2# 3# Copyright 2011 Google Inc. All Rights Reserved. 4"""chromeos.py: Build & Test ChromeOS using custom compilers.""" 5 6__author__ = 'asharif@google.com (Ahmad Sharif)' 7 8import logging 9import optparse 10import os 11import pickle 12import sys 13import xmlrpclib 14 15from automation.clients.helper import jobs 16from automation.clients.helper import perforce 17from automation.common import command as cmd 18from automation.common import job_group 19from automation.common import logger 20 21 22class ChromeOSNightlyClient(object): 23 DEPOT2_DIR = '//depot2/' 24 P4_CHECKOUT_DIR = 'perforce2/' 25 P4_VERSION_DIR = os.path.join(P4_CHECKOUT_DIR, 'gcctools/chromeos/v14') 26 27 def __init__(self, board, remote, gcc_githash, p4_snapshot=''): 28 self._board = board 29 self._remote = remote 30 self._gcc_githash = gcc_githash 31 self._p4_snapshot = p4_snapshot 32 33 def Run(self): 34 server = xmlrpclib.Server('http://localhost:8000') 35 server.ExecuteJobGroup(pickle.dumps(self.CreateJobGroup())) 36 37 def CheckoutV14Dir(self): 38 p4view = perforce.View(self.DEPOT2_DIR, [ 39 perforce.PathMapping('gcctools/chromeos/v14/...') 40 ]) 41 return self.GetP4Snapshot(p4view) 42 43 def GetP4Snapshot(self, p4view): 44 p4client = perforce.CommandsFactory(self.P4_CHECKOUT_DIR, p4view) 45 46 if self._p4_snapshot: 47 return p4client.CheckoutFromSnapshot(self._p4_snapshot) 48 else: 49 return p4client.SetupAndDo(p4client.Sync(), p4client.Remove()) 50 51 def CreateJobGroup(self): 52 chain = cmd.Chain( 53 self.CheckoutV14Dir(), 54 cmd.Shell('python', 55 os.path.join(self.P4_VERSION_DIR, 'test_toolchains.py'), 56 '--force-mismatch', 57 '--clean', 58 '--public', # crbug.com/145822 59 '--board=%s' % self._board, 60 '--remote=%s' % self._remote, 61 '--githashes=%s' % self._gcc_githash)) 62 label = 'testlabel' 63 job = jobs.CreateLinuxJob(label, chain, timeout=24 * 60 * 60) 64 65 return job_group.JobGroup(label, [job], True, False) 66 67 68@logger.HandleUncaughtExceptions 69def Main(argv): 70 parser = optparse.OptionParser() 71 parser.add_option('-b', 72 '--board', 73 dest='board', 74 help='Run performance tests on these boards') 75 parser.add_option('-r', 76 '--remote', 77 dest='remote', 78 help='Run performance tests on these remotes') 79 parser.add_option('-g', 80 '--gcc_githash', 81 dest='gcc_githash', 82 help='Use this gcc_githash.') 83 parser.add_option('-p', 84 '--p4_snapshot', 85 dest='p4_snapshot', 86 default='', 87 help='Use this p4_snapshot.') 88 options, _ = parser.parse_args(argv) 89 90 if not all([options.board, options.remote, options.gcc_githash]): 91 logging.error('Specify a board, remote and gcc_githash') 92 return 1 93 94 client = ChromeOSNightlyClient(options.board, 95 options.remote, 96 options.gcc_githash, 97 p4_snapshot=options.p4_snapshot) 98 client.Run() 99 return 0 100 101 102if __name__ == '__main__': 103 logger.SetUpRootLogger(level=logging.DEBUG, display_flags={'name': False}) 104 sys.exit(Main(sys.argv)) 105