experiment.py revision f395c26437cbdabc2960447fba89b226f4409e82
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, email_to):
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.email_to = email_to
30    self.results_directory = os.path.join(self.working_directory,
31                                          self.name + "_results")
32
33    self.labels = labels
34    self.benchmarks = benchmarks
35    self.num_complete = 0
36
37    # We need one chromeos_root to run the benchmarks in, but it doesn't
38    # matter where it is, unless the ABIs are different.
39    if not chromeos_root:
40      for label in self.labels:
41        if label.chromeos_root:
42          chromeos_root = label.chromeos_root
43    if not chromeos_root:
44      raise Exception("No chromeos_root given and could not determine one from "
45                      "the image path.")
46
47    self.machine_manager = MachineManager(chromeos_root)
48    self.l = logger.GetLogger()
49
50    for machine in remote:
51      self.machine_manager.AddMachine(machine)
52    self.machine_manager.ComputeCommonCheckSum()
53    self.machine_manager.ComputeCommonCheckSumString()
54
55    self.start_time = None
56    self.benchmark_runs = self._GenerateBenchmarkRuns()
57
58  def _GenerateBenchmarkRuns(self):
59    """Generate benchmark runs from labels and benchmark defintions."""
60    benchmark_runs = []
61    for label in self.labels:
62      for benchmark in self.benchmarks:
63        for iteration in range(1, benchmark.iterations + 1):
64
65          benchmark_run_name = "%s: %s (%s)" % (label.name, benchmark.name,
66                                                iteration)
67          full_name = "%s_%s_%s" % (label.name, benchmark.name, iteration)
68          logger_to_use = logger.Logger(os.path.dirname(__file__),
69                                        "run.%s" % (full_name),
70                                        True)
71          benchmark_run = BenchmarkRun(benchmark_run_name,
72                                       benchmark.name,
73                                       benchmark.autotest_name,
74                                       benchmark.autotest_args,
75                                       label.name,
76                                       label.chromeos_root,
77                                       label.chromeos_image,
78                                       label.board,
79                                       iteration,
80                                       self.cache_conditions,
81                                       benchmark.outlier_range,
82                                       benchmark.perf_args,
83                                       self.machine_manager,
84                                       logger_to_use)
85
86          benchmark_runs.append(benchmark_run)
87    return benchmark_runs
88
89  def Build(self):
90    pass
91
92  def Terminate(self):
93    for t in self.benchmark_runs:
94      if t.isAlive():
95        self.l.LogError("Terminating run: '%s'." % t.name)
96        t.Terminate()
97
98  def IsComplete(self):
99    if self.active_threads:
100      for t in self.active_threads:
101        if t.isAlive():
102          t.join(0)
103        if not t.isAlive():
104          self.num_complete += 1
105          self.active_threads.remove(t)
106      return False
107    return True
108
109  def Run(self):
110    self.start_time = time.time()
111    self.active_threads = []
112    for benchmark_run in self.benchmark_runs:
113      # Set threads to daemon so program exits when ctrl-c is pressed.
114      benchmark_run.daemon = True
115      benchmark_run.start()
116      self.active_threads.append(benchmark_run)
117
118  def SetCacheConditions(self, cache_conditions):
119    for benchmark_run in self.benchmark_runs:
120      benchmark_run.SetCacheConditions(cache_conditions)
121
122  def Cleanup(self):
123    self.machine_manager.Cleanup()
124