blob: e9dc3d073206d34936fdf80fb20f28639de7c68d [file] [log] [blame]
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08001#!/usr/bin/python
2
3# Copyright 2011 Google Inc. All Rights Reserved.
4
Ahmad Sharif4467f002012-12-20 12:09:49 -08005"""The experiment setting module."""
6
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08007import os
8import time
Ahmad Sharif4467f002012-12-20 12:09:49 -08009
10from utils import logger
11
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080012from autotest_runner import AutotestRunner
13from benchmark_run import BenchmarkRun
14from machine_manager import MachineManager
Ahmad Sharif4467f002012-12-20 12:09:49 -080015from machine_manager import MockMachineManager
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080016from results_cache import ResultsCache
17from results_report import HTMLResultsReport
Ahmad Sharif4467f002012-12-20 12:09:49 -080018import test_flag
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080019
20
21class Experiment(object):
22 """Class representing an Experiment to be run."""
23
24 def __init__(self, name, remote, rerun_if_failed, working_directory,
25 chromeos_root, cache_conditions, labels, benchmarks,
Ahmad Shariff395c262012-10-09 17:48:09 -070026 experiment_file, email_to):
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080027 self.name = name
28 self.rerun_if_failed = rerun_if_failed
29 self.working_directory = working_directory
30 self.remote = remote
31 self.chromeos_root = chromeos_root
32 self.cache_conditions = cache_conditions
33 self.experiment_file = experiment_file
Ahmad Shariff395c262012-10-09 17:48:09 -070034 self.email_to = email_to
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080035 self.results_directory = os.path.join(self.working_directory,
36 self.name + "_results")
37
38 self.labels = labels
39 self.benchmarks = benchmarks
40 self.num_complete = 0
Ahmad Sharif4467f002012-12-20 12:09:49 -080041 self.num_run_complete = 0
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080042
43 # We need one chromeos_root to run the benchmarks in, but it doesn't
44 # matter where it is, unless the ABIs are different.
45 if not chromeos_root:
46 for label in self.labels:
47 if label.chromeos_root:
48 chromeos_root = label.chromeos_root
49 if not chromeos_root:
50 raise Exception("No chromeos_root given and could not determine one from "
51 "the image path.")
52
Ahmad Sharif4467f002012-12-20 12:09:49 -080053 if test_flag.GetTestMode():
54 self.machine_manager = MockMachineManager(chromeos_root)
55 else:
56 self.machine_manager = MachineManager(chromeos_root)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080057 self.l = logger.GetLogger()
58
59 for machine in remote:
60 self.machine_manager.AddMachine(machine)
Ahmad Sharif4467f002012-12-20 12:09:49 -080061 for label in labels:
62 self.machine_manager.ComputeCommonCheckSum(label)
63 self.machine_manager.ComputeCommonCheckSumString(label)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080064
65 self.start_time = None
66 self.benchmark_runs = self._GenerateBenchmarkRuns()
67
68 def _GenerateBenchmarkRuns(self):
69 """Generate benchmark runs from labels and benchmark defintions."""
70 benchmark_runs = []
71 for label in self.labels:
72 for benchmark in self.benchmarks:
73 for iteration in range(1, benchmark.iterations + 1):
74
75 benchmark_run_name = "%s: %s (%s)" % (label.name, benchmark.name,
76 iteration)
77 full_name = "%s_%s_%s" % (label.name, benchmark.name, iteration)
78 logger_to_use = logger.Logger(os.path.dirname(__file__),
79 "run.%s" % (full_name),
80 True)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080081 benchmark_run = BenchmarkRun(benchmark_run_name,
Ahmad Sharif4467f002012-12-20 12:09:49 -080082 benchmark,
83 label,
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080084 iteration,
85 self.cache_conditions,
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080086 self.machine_manager,
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080087 logger_to_use)
88
89 benchmark_runs.append(benchmark_run)
90 return benchmark_runs
91
92 def Build(self):
93 pass
94
95 def Terminate(self):
96 for t in self.benchmark_runs:
97 if t.isAlive():
98 self.l.LogError("Terminating run: '%s'." % t.name)
99 t.Terminate()
100
101 def IsComplete(self):
102 if self.active_threads:
103 for t in self.active_threads:
104 if t.isAlive():
105 t.join(0)
106 if not t.isAlive():
107 self.num_complete += 1
Ahmad Sharif4467f002012-12-20 12:09:49 -0800108 if not t.cache_hit:
109 self.num_run_complete += 1
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -0800110 self.active_threads.remove(t)
111 return False
112 return True
113
114 def Run(self):
115 self.start_time = time.time()
116 self.active_threads = []
117 for benchmark_run in self.benchmark_runs:
118 # Set threads to daemon so program exits when ctrl-c is pressed.
119 benchmark_run.daemon = True
120 benchmark_run.start()
121 self.active_threads.append(benchmark_run)
122
123 def SetCacheConditions(self, cache_conditions):
124 for benchmark_run in self.benchmark_runs:
125 benchmark_run.SetCacheConditions(cache_conditions)
126
127 def Cleanup(self):
128 self.machine_manager.Cleanup()