blob: 5b9e6944a9b8a3c7ba10b8088f619199ffd055e7 [file] [log] [blame]
Caroline Tice4bd70462016-10-05 15:41:13 -07001#!/usr/bin/env python2
Ting-Yuan Huang4f59a622017-08-16 12:32:56 -07002#
3# Copyright 2017 The Chromium OS Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
Yunlian Jiangc5713372016-06-15 11:37:50 -07006"""Script for running llvm validation tests on ChromeOS.
7
8This script launches a buildbot to build ChromeOS with the llvm on
9a particular board; then it finds and downloads the trybot image and the
10corresponding official image, and runs test for correctness.
11It then generates a report, emails it to the c-compiler-chrome, as
12well as copying the result into a directory.
13"""
14
15# Script to test different toolchains against ChromeOS benchmarks.
16
17from __future__ import print_function
18
19import argparse
20import datetime
21import os
22import sys
23import time
24
Caroline Ticea8af9a72016-07-20 12:52:59 -070025from cros_utils import command_executer
26from cros_utils import logger
Yunlian Jiangc5713372016-06-15 11:37:50 -070027
Caroline Ticea8af9a72016-07-20 12:52:59 -070028from cros_utils import buildbot_utils
Yunlian Jiangc5713372016-06-15 11:37:50 -070029
Yunlian Jiangc5713372016-06-15 11:37:50 -070030CROSTC_ROOT = '/usr/local/google/crostc'
31ROLE_ACCOUNT = 'mobiletc-prebuild'
32TOOLCHAIN_DIR = os.path.dirname(os.path.realpath(__file__))
33MAIL_PROGRAM = '~/var/bin/mail-sheriff'
34VALIDATION_RESULT_DIR = os.path.join(CROSTC_ROOT, 'validation_result')
35START_DATE = datetime.date(2016, 1, 1)
Manoj Guptadd8675b2018-01-25 10:59:06 -080036TEST_PER_DAY = 4
Caroline Ticefeb442e2018-04-19 23:27:38 -070037DATA_DIR = '/google/data/rw/users/mo/mobiletc-prebuild/waterfall-report-data/'
Caroline Tice09cacd02017-08-11 13:02:29 -070038
39# Information about Rotating Boards
Rahul Chaudhryedcf3d32018-01-30 13:50:37 -080040# Board Arch Reference Platform Kernel
41# Board Version
42# ------------ ------- ------------ ------------- -------
Manoj Gupta26391db2018-03-15 11:14:18 -070043# cave x86_64 glados skylake-y 3.18
Rahul Chaudhryedcf3d32018-01-30 13:50:37 -080044# daisy armv7 daisy exynos-5250 3.8.11
45# elm aarch64 oak mediatek-8173 3.18
Rahul Chaudhryedcf3d32018-01-30 13:50:37 -080046# fizz x86_64 fizz kabylake-u/r 4.4.*
47# gale armv7 3.18
Manoj Guptae8ba0542018-04-18 13:58:43 -070048# grunt x86_64 grunt stoney ridge 4.14.*
Rahul Chaudhryedcf3d32018-01-30 13:50:37 -080049# guado_moblab x86_64 3.14
Rahul Chaudhryedcf3d32018-01-30 13:50:37 -080050# kevin aarch64 gru rockchip-3399 4.4.*
51# lakitu x86_64 4.4.*
Manoj Gupta26391db2018-03-15 11:14:18 -070052# lars x86_64 kunimitsu skylake-u 3.18
Rahul Chaudhryedcf3d32018-01-30 13:50:37 -080053# link x86_64 ivybridge ivybridge 3.8.11
Manoj Gupta26391db2018-03-15 11:14:18 -070054# nautilus x86_64 poppy kabylake-y 4.4.*
Rahul Chaudhryedcf3d32018-01-30 13:50:37 -080055# nyan_big armv7 nyan tegra 3.10.18
56# peach_pit armv7 peach exynos-5420 3.8.11
57# peppy x86_64 slippy haswell 3.8.11
Rahul Chaudhryedcf3d32018-01-30 13:50:37 -080058# samus x86_64 auron broadwell 3.14
Manoj Gupta26391db2018-03-15 11:14:18 -070059# snappy x86_64 reef apollo lake 4.4.*
Rahul Chaudhryedcf3d32018-01-30 13:50:37 -080060# swanky x86_64 rambi baytrail 4.4.*
61# terra x86_64 strago braswell 3.18
62# veyron_jaq armv7 veyron-pinky rockchip-3288 3.14
63# whirlwind armv7 3.14
64# zoombini x86_64 zoombini cannonlake-y 4.14.*
Caroline Tice09cacd02017-08-11 13:02:29 -070065
Yunlian Jiangc5713372016-06-15 11:37:50 -070066TEST_BOARD = [
Manoj Gupta26391db2018-03-15 11:14:18 -070067 'cave',
Caroline Tice09cacd02017-08-11 13:02:29 -070068 'daisy',
Rahul Chaudhryedcf3d32018-01-30 13:50:37 -080069 # 'elm', tested by arm64-llvm-next-toolchain builder.
Manoj Gupta470bbf52018-01-23 09:54:28 -080070 'fizz',
Caroline Tice09cacd02017-08-11 13:02:29 -070071 'gale',
Manoj Guptae8ba0542018-04-18 13:58:43 -070072 'grunt',
Manoj Guptadd8675b2018-01-25 10:59:06 -080073 'guado_moblab',
Caroline Tice09cacd02017-08-11 13:02:29 -070074 'kevin',
Caroline Tice856bc6c2017-06-29 16:21:43 -070075 'lakitu',
Manoj Gupta26391db2018-03-15 11:14:18 -070076 'lars',
Caroline Tice09cacd02017-08-11 13:02:29 -070077 'link',
Manoj Gupta26391db2018-03-15 11:14:18 -070078 'nautilus',
Caroline Tice09cacd02017-08-11 13:02:29 -070079 'nyan_big',
80 'peach_pit',
81 'peppy',
Rahul Chaudhryedcf3d32018-01-30 13:50:37 -080082 # 'samus', tested by amd64-llvm-next-toolchain builder.
Manoj Gupta26391db2018-03-15 11:14:18 -070083 'snappy',
Manoj Guptaac5072d2017-09-29 10:51:20 -070084 'swanky',
Caroline Tice09cacd02017-08-11 13:02:29 -070085 'terra',
Rahul Chaudhryedcf3d32018-01-30 13:50:37 -080086 # 'veyron_jaq', tested by arm-llvm-next-toolchain builder.
Caroline Tice856bc6c2017-06-29 16:21:43 -070087 'whirlwind',
Manoj Gupta470bbf52018-01-23 09:54:28 -080088 'zoombini',
Caroline Ticea12e9742016-09-08 13:35:02 -070089]
90
Yunlian Jiangc5713372016-06-15 11:37:50 -070091
92class ToolchainVerifier(object):
93 """Class for the toolchain verifier."""
94
Caroline Ticea12e9742016-09-08 13:35:02 -070095 def __init__(self, board, chromeos_root, weekday, patches, compiler):
Yunlian Jiangc5713372016-06-15 11:37:50 -070096 self._board = board
97 self._chromeos_root = chromeos_root
98 self._base_dir = os.getcwd()
99 self._ce = command_executer.GetCommandExecuter()
100 self._l = logger.GetLogger()
Caroline Tice314ea562016-06-24 15:59:01 -0700101 self._compiler = compiler
Yunlian Jiangbddbcd32017-11-27 10:59:30 -0800102 self._build = '%s-%s-toolchain-tryjob' % (board, compiler)
Caroline Ticede600772016-10-18 15:27:51 -0700103 self._patches = patches.split(',') if patches else []
Yunlian Jiangc5713372016-06-15 11:37:50 -0700104 self._patches_string = '_'.join(str(p) for p in self._patches)
105
106 if not weekday:
107 self._weekday = time.strftime('%a')
108 else:
109 self._weekday = weekday
Caroline Ticed00ad412016-07-02 18:00:18 -0700110 self._reports = os.path.join(VALIDATION_RESULT_DIR, compiler, board)
Yunlian Jiangc5713372016-06-15 11:37:50 -0700111
112 def _FinishSetup(self):
113 """Make sure testing_rsa file is properly set up."""
114 # Fix protections on ssh key
115 command = ('chmod 600 /var/cache/chromeos-cache/distfiles/target'
116 '/chrome-src-internal/src/third_party/chromite/ssh_keys'
117 '/testing_rsa')
118 ret_val = self._ce.ChrootRunCommand(self._chromeos_root, command)
119 if ret_val != 0:
120 raise RuntimeError('chmod for testing_rsa failed')
121
Ting-Yuan Huang6a9a98a2018-03-07 17:35:13 -0800122 def DoAll(self):
Yunlian Jiangc5713372016-06-15 11:37:50 -0700123 """Main function inside ToolchainComparator class.
124
125 Launch trybot, get image names, create crosperf experiment file, run
126 crosperf, and copy images into seven-day report directories.
127 """
Caroline Ticefeb442e2018-04-19 23:27:38 -0700128 buildbucket_id, _ = buildbot_utils.GetTrybotImage(
Ting-Yuan Huang6a9a98a2018-03-07 17:35:13 -0800129 self._chromeos_root,
130 self._build,
131 self._patches,
Ting-Yuan Huang6a9a98a2018-03-07 17:35:13 -0800132 tryjob_flags=['--hwtest'],
133 async=True)
Yunlian Jiangc5713372016-06-15 11:37:50 -0700134
Caroline Ticefeb442e2018-04-19 23:27:38 -0700135 return buildbucket_id
136
137
138def WriteRotatingReportsData(results_dict, date):
139 """Write data for waterfall report."""
140 fname = '%d-%02d-%02d.builds' % (date.year, date.month, date.day)
141 filename = os.path.join(DATA_DIR, 'rotating-builders', fname)
142 with open(filename, 'w') as out_file:
143 for board in results_dict.keys():
144 buildbucket_id = results_dict[board]
145 out_file.write('%s,%s\n' % (buildbucket_id, board))
Yunlian Jiangc5713372016-06-15 11:37:50 -0700146
Manoj Guptad575b8a2017-03-08 10:51:28 -0800147
Yunlian Jiangc5713372016-06-15 11:37:50 -0700148def Main(argv):
149 """The main function."""
150
151 # Common initializations
152 command_executer.InitCommandExecuter()
153 parser = argparse.ArgumentParser()
Caroline Ticea12e9742016-09-08 13:35:02 -0700154 parser.add_argument(
155 '--chromeos_root',
156 dest='chromeos_root',
157 help='The chromeos root from which to run tests.')
158 parser.add_argument(
159 '--weekday',
160 default='',
161 dest='weekday',
162 help='The day of the week for which to run tests.')
163 parser.add_argument(
164 '--board', default='', dest='board', help='The board to test.')
165 parser.add_argument(
166 '--patch',
167 dest='patches',
Caroline Ticede600772016-10-18 15:27:51 -0700168 default='',
Caroline Ticea12e9742016-09-08 13:35:02 -0700169 help='The patches to use for the testing, '
170 "seprate the patch numbers with ',' "
171 'for more than one patches.')
172 parser.add_argument(
173 '--compiler',
174 dest='compiler',
Caroline Tice4bd70462016-10-05 15:41:13 -0700175 help='Which compiler (llvm, llvm-next or gcc) to use for '
Caroline Ticea12e9742016-09-08 13:35:02 -0700176 'testing.')
Yunlian Jiangc5713372016-06-15 11:37:50 -0700177
178 options = parser.parse_args(argv[1:])
179 if not options.chromeos_root:
180 print('Please specify the ChromeOS root directory.')
181 return 1
Caroline Tice314ea562016-06-24 15:59:01 -0700182 if not options.compiler:
Caroline Tice4bd70462016-10-05 15:41:13 -0700183 print('Please specify which compiler to test (gcc, llvm, or llvm-next).')
Caroline Tice314ea562016-06-24 15:59:01 -0700184 return 1
Yunlian Jiangc5713372016-06-15 11:37:50 -0700185
186 if options.board:
187 fv = ToolchainVerifier(options.board, options.chromeos_root,
Manoj Guptad575b8a2017-03-08 10:51:28 -0800188 options.weekday, options.patches, options.compiler)
Yunlian Jiangc5713372016-06-15 11:37:50 -0700189 return fv.Doall()
190
191 today = datetime.date.today()
192 delta = today - START_DATE
193 days = delta.days
194
195 start_board = (days * TEST_PER_DAY) % len(TEST_BOARD)
Caroline Ticefeb442e2018-04-19 23:27:38 -0700196 results_dict = dict()
Yunlian Jiangc5713372016-06-15 11:37:50 -0700197 for i in range(TEST_PER_DAY):
Yunlian Jiang54e72b32016-06-21 14:13:03 -0700198 try:
Caroline Ticea12e9742016-09-08 13:35:02 -0700199 board = TEST_BOARD[(start_board + i) % len(TEST_BOARD)]
200 fv = ToolchainVerifier(board, options.chromeos_root, options.weekday,
Manoj Gupta86fe1ed2017-03-09 10:37:35 -0800201 options.patches, options.compiler)
Caroline Ticefeb442e2018-04-19 23:27:38 -0700202 buildbucket_id = fv.DoAll()
203 if buildbucket_id:
204 results_dict[board] = buildbucket_id
Yunlian Jiang54e72b32016-06-21 14:13:03 -0700205 except SystemExit:
Caroline Ticed00ad412016-07-02 18:00:18 -0700206 logfile = os.path.join(VALIDATION_RESULT_DIR, options.compiler, board)
Yunlian Jiang54e72b32016-06-21 14:13:03 -0700207 with open(logfile, 'w') as f:
Caroline Ticea12e9742016-09-08 13:35:02 -0700208 f.write('Verifier got an exception, please check the log.\n')
Caroline Ticefeb442e2018-04-19 23:27:38 -0700209 WriteRotatingReportsData(results_dict, today)
Yunlian Jiangc5713372016-06-15 11:37:50 -0700210
Caroline Ticea12e9742016-09-08 13:35:02 -0700211
Yunlian Jiangc5713372016-06-15 11:37:50 -0700212if __name__ == '__main__':
213 retval = Main(sys.argv)
214 sys.exit(retval)