chromeos.py revision f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbe
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