blob: 3f68f8beda6a95c49599b7a8420eea93625be0c3 [file] [log] [blame]
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08001#!/usr/bin/python
2
3# Copyright 2011 Google Inc. All Rights Reserved.
4
5import os
6import time
7from autotest_runner import AutotestRunner
8from benchmark_run import BenchmarkRun
9from machine_manager import MachineManager
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080010from results_cache import ResultsCache
11from results_report import HTMLResultsReport
12from utils import logger
13from utils.file_utils import FileUtils
14
15
16class Experiment(object):
17 """Class representing an Experiment to be run."""
18
19 def __init__(self, name, remote, rerun_if_failed, working_directory,
20 chromeos_root, cache_conditions, labels, benchmarks,
21 experiment_file):
22 self.name = name
23 self.rerun_if_failed = rerun_if_failed
24 self.working_directory = working_directory
25 self.remote = remote
26 self.chromeos_root = chromeos_root
27 self.cache_conditions = cache_conditions
28 self.experiment_file = experiment_file
29 self.results_directory = os.path.join(self.working_directory,
30 self.name + "_results")
31
32 self.labels = labels
33 self.benchmarks = benchmarks
34 self.num_complete = 0
35
36 # We need one chromeos_root to run the benchmarks in, but it doesn't
37 # matter where it is, unless the ABIs are different.
38 if not chromeos_root:
39 for label in self.labels:
40 if label.chromeos_root:
41 chromeos_root = label.chromeos_root
42 if not chromeos_root:
43 raise Exception("No chromeos_root given and could not determine one from "
44 "the image path.")
45
46 self.machine_manager = MachineManager(chromeos_root)
47 self.l = logger.GetLogger()
48
49 for machine in remote:
50 self.machine_manager.AddMachine(machine)
51
52 self.start_time = None
53 self.benchmark_runs = self._GenerateBenchmarkRuns()
54
55 def _GenerateBenchmarkRuns(self):
56 """Generate benchmark runs from labels and benchmark defintions."""
57 benchmark_runs = []
58 for label in self.labels:
59 for benchmark in self.benchmarks:
60 for iteration in range(1, benchmark.iterations + 1):
61
62 benchmark_run_name = "%s: %s (%s)" % (label.name, benchmark.name,
63 iteration)
64 full_name = "%s_%s_%s" % (label.name, benchmark.name, iteration)
65 logger_to_use = logger.Logger(os.path.dirname(__file__),
66 "run.%s" % (full_name),
67 True)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080068 benchmark_run = BenchmarkRun(benchmark_run_name,
69 benchmark.name,
70 benchmark.autotest_name,
71 benchmark.autotest_args,
72 label.name,
73 label.chromeos_root,
74 label.chromeos_image,
75 label.board,
76 iteration,
77 self.cache_conditions,
78 benchmark.outlier_range,
79 benchmark.profile_counters,
80 benchmark.profile_type,
81 self.machine_manager,
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080082 logger_to_use)
83
84 benchmark_runs.append(benchmark_run)
85 return benchmark_runs
86
87 def Build(self):
88 pass
89
90 def Terminate(self):
91 for t in self.benchmark_runs:
92 if t.isAlive():
93 self.l.LogError("Terminating run: '%s'." % t.name)
94 t.Terminate()
95
96 def IsComplete(self):
97 if self.active_threads:
98 for t in self.active_threads:
99 if t.isAlive():
100 t.join(0)
101 if not t.isAlive():
102 self.num_complete += 1
103 self.active_threads.remove(t)
104 return False
105 return True
106
107 def Run(self):
108 self.start_time = time.time()
109 self.active_threads = []
110 for benchmark_run in self.benchmark_runs:
111 # Set threads to daemon so program exits when ctrl-c is pressed.
112 benchmark_run.daemon = True
113 benchmark_run.start()
114 self.active_threads.append(benchmark_run)
115
116 def SetCacheConditions(self, cache_conditions):
117 for benchmark_run in self.benchmark_runs:
118 benchmark_run.SetCacheConditions(cache_conditions)
119
120 def Cleanup(self):
121 self.machine_manager.Cleanup()