chromeos.py revision f81680c018729fd4499e1e200d04b48c4b90127c
1#!/usr/bin/python2.6
2#
3# Copyright 2011 Google Inc. All Rights Reserved.
4
5__author__ = "asharif@google.com (Ahmad Sharif)"
6
7import os.path
8import re
9
10from automation.clients.helper import jobs
11from automation.clients.helper import perforce
12from automation.common import command as cmd
13from automation.common import machine
14
15
16class ScriptsFactory(object):
17  def __init__(self, chromeos_root, scripts_path):
18    self._chromeos_root = chromeos_root
19    self._scripts_path = scripts_path
20
21  def SummarizeResults(self, logs_path):
22    return cmd.Shell("summarize_results.py",
23                     logs_path,
24                     path=self._scripts_path)
25
26  def Buildbot(self, config_name):
27    buildbot = os.path.join(self._chromeos_root,
28                            "chromite/buildbot/cbuildbot.py")
29
30    return cmd.Shell(buildbot,
31                     "--buildroot=%s" % self._chromeos_root,
32                     "--resume",
33                     "--noarchive",
34                     "--noprebuilts",
35                     "--nosync",
36                     "--nouprev",
37                     "--notests",
38                     "--noclean",
39                     config_name)
40
41  def RunBenchmarks(self, board, tests):
42    image_path = os.path.join(self._chromeos_root,
43                              "src/build/images",
44                              board,
45                              "latest/chromiumos_image.bin")
46
47    return cmd.Shell("cros_run_benchmarks.py",
48                     "--remote=$SECONDARY_MACHINES[0]",
49                     "--board=%s" % board,
50                     "--tests=%s" % tests,
51                     "--full_table",
52                     image_path,
53                     path="/home/mobiletc-prebuild")
54
55  def SetupChromeOS(self, version="latest", use_minilayout=False):
56    setup_chromeos = cmd.Shell("setup_chromeos.py",
57                               "--public",
58                               "--dir=%s" % self._chromeos_root,
59                               "--version=%s" % version,
60                               path=self._scripts_path)
61
62    if use_minilayout:
63      setup_chromeos.AddOption("--minilayout")
64    return setup_chromeos
65
66
67class CommandsFactory(object):
68  DEPOT2_DIR = "//depot2/"
69  P4_CHECKOUT_DIR = "perforce2/"
70  P4_VERSION_DIR = os.path.join(P4_CHECKOUT_DIR, "gcctools/chromeos/v14")
71
72  CHROMEOS_ROOT = "chromeos"
73  CHROMEOS_SCRIPTS_DIR = os.path.join(CHROMEOS_ROOT, "src/scripts")
74  CHROMEOS_BUILDS_DIR = "/home/mobiletc-prebuild/www/chromeos_builds"
75
76  def __init__(self, chromeos_version, board, toolchain, p4_snapshot):
77    self.chromeos_version = chromeos_version
78    self.board = board
79    self.toolchain = toolchain
80    self.p4_snapshot = p4_snapshot
81
82    self.scripts = ScriptsFactory(self.CHROMEOS_ROOT, self.P4_VERSION_DIR)
83
84  def AddBuildbotConfig(self, config_name, config_list):
85    config_header = "add_config(%r, [%s])" % (config_name,
86                                              ", ".join(config_list))
87    config_file = os.path.join(self.CHROMEOS_ROOT,
88                               "chromite/buildbot/cbuildbot_config.py")
89    quoted_config_header = "%r" % config_header
90    quoted_config_header = re.sub("'", "\\\"", quoted_config_header)
91
92    return cmd.Pipe(cmd.Shell("echo", quoted_config_header),
93                    cmd.Shell("tee", "--append", config_file))
94
95  def RunBuildbot(self):
96    config_dict = {"board": self.board,
97                   "build_tests": True,
98                   "chrome_tests": True,
99                   "unittests": False,
100                   "vm_tests": False,
101                   "prebuilts": False,
102                   "latest_toolchain": True,
103                   "useflags": ["chrome_internal"],
104                   "usepkg_chroot": True,
105                   self.toolchain: True}
106    config_name = "%s-toolchain-test" % self.board
107    if "arm" in self.board:
108      config_list = ["arm"]
109    else:
110      config_list = []
111    config_list.extend(["internal", "full", "official", str(config_dict)])
112
113    add_config_shell = self.AddBuildbotConfig(config_name, config_list)
114    return cmd.Chain(add_config_shell, self.scripts.Buildbot(config_name))
115
116  def BuildAndBenchmark(self):
117    return cmd.Chain(
118        self.CheckoutV14Dir(),
119        self.SetupChromeOSCheckout(self.chromeos_version, True),
120        self.RunBuildbot(),
121        self.scripts.RunBenchmarks(self.board, "BootPerfServer,10:Page,3"))
122
123  def GetP4Snapshot(self, p4view):
124    p4client = perforce.CommandsFactory(self.P4_CHECKOUT_DIR, p4view)
125
126    if self.p4_snapshot:
127      return p4client.CheckoutFromSnapshot(self.p4_snapshot)
128    else:
129      return p4client.SetupAndDo(p4client.Sync(), p4client.Remove())
130
131  def CheckoutV14Dir(self):
132    p4view = perforce.View(self.DEPOT2_DIR, [
133        perforce.PathMapping("gcctools/chromeos/v14/...")])
134    return self.GetP4Snapshot(p4view)
135
136  def SetupChromeOSCheckout(self, version, use_minilayout=False):
137    version_re = "^\d+\.\d+\.\d+\.[a-zA-Z0-9]+$"
138
139    location = os.path.join(self.CHROMEOS_BUILDS_DIR, version)
140
141    if version in ["weekly", "quarterly"]:
142      assert os.path.islink(location), "Symlink %s does not exist." % location
143
144      location_expanded = os.path.abspath(os.path.realpath(location))
145      version = os.path.basename(location_expanded)
146
147    if version in ["top", "latest"] or re.match(version_re, version):
148      return self.scripts.SetupChromeOS(version, use_minilayout)
149
150    elif version.endswith("bz2") or version.endswith("gz"):
151      return cmd.UnTar(location_expanded, self.CHROMEOS_ROOT)
152
153    else:
154      signature_file_location = os.path.join(location,
155                                             "src/scripts/enter_chroot.sh")
156      assert os.path.exists(signature_file_location), (
157          "Signature file %s does not exist." % signature_file_location)
158
159      return cmd.Copy(location, to_dir=self.CHROMEOS_ROOT, recursive=True)
160
161
162class JobsFactory(object):
163  def __init__(self, chromeos_version="top", board="x86-mario",
164               toolchain="trunk", p4_snapshot=""):
165    self.chromeos_version = chromeos_version
166    self.board = board
167    self.toolchain = toolchain
168
169    self.commands = CommandsFactory(chromeos_version, board, toolchain,
170                                    p4_snapshot)
171
172  def BuildAndBenchmark(self):
173    command = self.commands.BuildAndBenchmark()
174
175    label = "BuildAndBenchmark(%s,%s,%s)" % (
176        self.toolchain, self.board, self.chromeos_version)
177
178    machine_label = "chromeos-%s" % self.board
179
180    job = jobs.CreateLinuxJob(label, command)
181    job.DependsOnMachine(
182        machine.MachineSpecification(label=machine_label, lock_required=True),
183        False)
184
185    return job
186