experiment.py revision f84bd3b7b64deba46192ae6d15a712ab66e90a6e
1#!/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
10from 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)
68          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,
82                                       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()
122