blob: 65f74f267222329c8f412bf0a1643f5cc0cb844e [file] [log] [blame]
cmtice4859f5f2014-05-30 13:15:37 -07001#!/usr/bin/python
2#
3# Copyright Google Inc. 2014
4
cmtice4536ef62014-07-08 11:17:21 -07005import datetime
cmtice4859f5f2014-05-30 13:15:37 -07006import optparse
7import os
cmtice4536ef62014-07-08 11:17:21 -07008import sys
9import time
cmtice4859f5f2014-05-30 13:15:37 -070010
11from utils import constants
12from utils import command_executer
13
cmtice4536ef62014-07-08 11:17:21 -070014WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
cmtice4859f5f2014-05-30 13:15:37 -070015DATA_ROOT_DIR = os.path.join(constants.CROSTC_WORKSPACE,
16 'weekly_test_data')
cmtice4859f5f2014-05-30 13:15:37 -070017EXPERIMENT_FILE = os.path.join(DATA_ROOT_DIR, 'weekly_report')
cmtice3717ea82015-06-24 16:37:40 -070018MAIL_PROGRAM = "~/var/bin/mail-sheriff"
cmtice4859f5f2014-05-30 13:15:37 -070019
20
21def Generate_Vanilla_Report_File(vanilla_image_paths, board, remote,
22 chromeos_root, cmd_executer):
23
24 experiment_header = """
25name: weekly_vanilla_report
Luis Lozano7141db22015-04-08 15:07:35 -070026cache_only: True
27same_specs: False
cmtice4859f5f2014-05-30 13:15:37 -070028board: %s
29remote: %s
30""" % (board, remote)
31
32
33 experiment_tests = """
Luis Lozano95cd4492015-07-21 17:05:07 -070034benchmark: all_toolchain_perf {
cmtice4859f5f2014-05-30 13:15:37 -070035 suite: telemetry_Crosperf
36 iterations: 3
37}
38"""
39
40 filename = "%s_%s_vanilla.exp" % (EXPERIMENT_FILE, board)
41 if os.path.exists(filename):
42 cmd = "rm %s" % filename
43 cmd_executer.RunCommand(cmd)
44
45 with open(filename, "w") as f:
46 print >>f, experiment_header
47 print >>f, experiment_tests
48
49 # Add each vanilla image
50 for test_path in vanilla_image_paths:
51 pieces = test_path.split("/")
52 test_name = pieces[-1]
53 test_image = """
54%s {
55 chromeos_root: %s
56 chromeos_image: %s
57}
Luis Lozano8a68b2d2015-04-23 14:37:09 -070058""" % (test_name, chromeos_root, os.path.join (test_path,
59 "chromiumos_test_image.bin"))
cmtice4859f5f2014-05-30 13:15:37 -070060 print >>f, test_image
61
62 return filename
63
64def Generate_Test_File(test_image_paths, vanilla_image_path, board, remote,
65 chromeos_root, cmd_executer):
66
67 experiment_header = """
68name: weekly_report
Luis Lozano7141db22015-04-08 15:07:35 -070069cache_only: True
70same_specs: False
cmtice4859f5f2014-05-30 13:15:37 -070071board: %s
72remote: %s
73""" % (board, remote)
74
75
76 experiment_tests = """
Luis Lozano95cd4492015-07-21 17:05:07 -070077benchmark: all_toolchain_perf {
cmtice4859f5f2014-05-30 13:15:37 -070078 suite: telemetry_Crosperf
79 iterations: 3
80}
81"""
82
83 filename = "%s_%s.exp" % (EXPERIMENT_FILE, board)
84 if os.path.exists(filename):
85 cmd = "rm %s" % filename
86 cmd_executer.RunCommand(cmd)
87
88 with open(filename, "w") as f:
89 print >>f, experiment_header
90 print >>f, experiment_tests
91
92 # Add vanilla image (first)
93 vanilla_image = """
Luis Lozano8a68b2d2015-04-23 14:37:09 -070094%s {
cmtice4859f5f2014-05-30 13:15:37 -070095 chromeos_root: %s
96 chromeos_image: %s
97}
Luis Lozano8a68b2d2015-04-23 14:37:09 -070098""" % (vanilla_image_path.split("/")[-1],
99 chromeos_root, os.path.join(vanilla_image_path,
100 "chromiumos_test_image.bin"))
cmtice4859f5f2014-05-30 13:15:37 -0700101
102 print >>f, vanilla_image
103
104 # Add each test image
105 for test_path in test_image_paths:
106 pieces = test_path.split("/")
107 test_name = pieces[-1]
108 test_image = """
109%s {
110 chromeos_root: %s
111 chromeos_image: %s
112}
Luis Lozano8a68b2d2015-04-23 14:37:09 -0700113""" % (test_name, chromeos_root, os.path.join (test_path,
114 "chromiumos_test_image.bin"))
cmtice4859f5f2014-05-30 13:15:37 -0700115 print >>f, test_image
116
117 return filename
118
119
120
121def Main(argv):
122
123 parser = optparse.OptionParser()
124 parser.add_option('-b', '--board', dest='board',
125 help='Target board.')
126 parser.add_option("-r", "--remote", dest="remote",
127 help="Target device.")
128 parser.add_option("-v", "--vanilla_only", dest="vanilla_only",
129 action="store_true",
130 default=False,
131 help="Generate a report comparing only the vanilla images.")
132
133 options = parser.parse_args(argv[1:])[0]
134
135 if not options.board:
136 print "Must specify a board."
137 return 1
138
139 if not options.remote:
140 print "Must specify at least one remote."
141 return 1
142
143 cmd_executer = command_executer.GetCommandExecuter(log_level="average")
144
cmtice4536ef62014-07-08 11:17:21 -0700145 # Find starting index, for cycling through days of week, generating
146 # reports starting 6 days ago from today. Generate list of indices for
147 # order in which to look at weekdays for report:
148 todays_index = datetime.datetime.today().isoweekday()
149 indices = []
150 start = todays_index + 1
151 end = start + 7
152 for i in range(start,end):
153 indices.append(i % 7)
154 # E.g. if today is Sunday, then start report with last Monday, so
155 # indices = [1, 2, 3, 4, 5, 6, 0].
156
157
158
cmtice4859f5f2014-05-30 13:15:37 -0700159 # Find all the test image tar files, untar them and add them to
160 # the list. Also find and untar vanilla image tar files, and keep
161 # track of the first vanilla image.
162 report_image_paths = []
163 vanilla_image_paths = []
164 first_vanilla_image = None
cmtice4536ef62014-07-08 11:17:21 -0700165 for i in indices:
166 day = WEEKDAYS[i]
cmtice4859f5f2014-05-30 13:15:37 -0700167 data_path = os.path.join(DATA_ROOT_DIR, options.board, day)
168 if os.path.exists(data_path):
169 # First, untar the test image.
170 tar_file_name = "%s_test_image.tar" % day
171 tar_file_path = os.path.join(data_path, tar_file_name)
172 image_dir = "%s_test_image" % day
173 image_path = os.path.join(data_path, image_dir)
174 if os.path.exists(tar_file_path):
175 if not os.path.exists(image_path):
176 os.makedirs(image_path)
177 cmd = ("cd %s; tar -xvf %s -C %s --strip-components 1" %
178 (data_path, tar_file_path, image_path))
179 ret = cmd_executer.RunCommand(cmd)
180 if not ret:
181 report_image_paths.append(image_path)
182 # Next, untar the vanilla image.
183 vanilla_file = "%s_vanilla_image.tar" % day
184 v_file_path = os.path.join(data_path, vanilla_file)
185 image_dir = "%s_vanilla_image" % day
186 image_path = os.path.join(data_path, image_dir)
187 if os.path.exists(v_file_path):
188 if not os.path.exists(image_path):
189 os.makedirs(image_path)
190 cmd = ("cd %s; tar -xvf %s -C %s --strip-components 1" %
191 (data_path, v_file_path, image_path))
192 ret = cmd_executer.RunCommand(cmd)
193 if not ret:
194 vanilla_image_paths.append(image_path)
195 if not first_vanilla_image:
196 first_vanilla_image = image_path
197
198 # Find a chroot we can use. Look for a directory containing both
199 # an experiment file and a chromeos directory (the experiment file will
200 # only be created if both images built successfully, i.e. the chroot is
201 # good).
202 chromeos_root = None
cmtice3717ea82015-06-24 16:37:40 -0700203 timestamp = datetime.datetime.strftime(datetime.datetime.now(),
204 "%Y-%m-%d_%H:%M:%S")
205 results_dir = os.path.join(os.path.expanduser("~/nightly_test_reports"),
cmtice80fd9bf2015-06-25 09:18:49 -0700206 "%s.%s" % (timestamp,
207 options.board),
cmtice3717ea82015-06-24 16:37:40 -0700208 "weekly_tests")
209
cmtice4859f5f2014-05-30 13:15:37 -0700210 for day in WEEKDAYS:
211 startdir = os.path.join(constants.CROSTC_WORKSPACE, day)
212 num_dirs = os.listdir(startdir)
213 for d in num_dirs:
214 exp_file = os.path.join(startdir, d, "toolchain_experiment.txt")
215 chroot = os.path.join(startdir, d, "chromeos")
216 if os.path.exists(chroot) and os.path.exists(exp_file):
217 chromeos_root = chroot
218 if chromeos_root:
219 break;
220 if chromeos_root:
221 break;
222
223 if not chromeos_root:
224 print "Unable to locate a usable chroot. Exiting without report."
225 return 1
226
227
228 # Create the Crosperf experiment file for generating the weekly report.
229 if not options.vanilla_only:
230 filename = Generate_Test_File (report_image_paths, first_vanilla_image,
231 options.board, options.remote,
232 chromeos_root, cmd_executer)
233 else:
234 filename = Generate_Vanilla_Report_File (vanilla_image_paths,
235 options.board, options.remote,
236 chromeos_root, cmd_executer)
237
238 # Run Crosperf on the file to generate the weekly report.
239 cmd = ("%s/toolchain-utils/crosperf/crosperf "
cmtice3717ea82015-06-24 16:37:40 -0700240 "%s --no_email=True --results_dir=%s" %
241 (constants.CROSTC_WORKSPACE, filename, results_dir))
cmtice4859f5f2014-05-30 13:15:37 -0700242 retval = cmd_executer.RunCommand(cmd)
cmtice3717ea82015-06-24 16:37:40 -0700243 if retval == 0:
244 # Send the email, if the crosperf command worked.
245 filename = os.path.join(results_dir, "msg_body.html")
246 if (os.path.exists(filename) and
247 os.path.exists(os.path.expanduser(MAIL_PROGRAM))):
248 vanilla_string = " "
249 if options.vanilla_only:
250 vanilla_string = " Vanilla "
251 command = ('cat %s | %s -s "Weekly%sReport results, %s" -team -html'
252 % (filename, MAIL_PROGRAM, vanilla_string, options.board))
253 retval = cmd_executer.RunCommand(command)
254
cmtice4859f5f2014-05-30 13:15:37 -0700255 return retval
256
257
258
259if __name__ == '__main__':
260 retval = Main(sys.argv)
261 sys.exit(retval)