crosperf.py revision ba64928c5dcbacbc70b4358881a89ad96227164d
1#!/usr/bin/python
2
3# Copyright 2011 Google Inc. All Rights Reserved.
4
5"""The driver script for running performance benchmarks on ChromeOS."""
6
7import atexit
8import optparse
9import os
10import sys
11from experiment_runner import ExperimentRunner
12from experiment_runner import MockExperimentRunner
13from experiment_factory import ExperimentFactory
14from experiment_file import ExperimentFile
15from help import Help
16from settings_factory import GlobalSettings
17from utils import logger
18
19import test_flag
20
21
22class MyIndentedHelpFormatter(optparse.IndentedHelpFormatter):
23  def format_description(self, description):
24    return description
25
26
27def SetupParserOptions(parser):
28  """Add all options to the parser."""
29  parser.add_option("--dry_run",
30                    dest="dry_run",
31                    help=("Parse the experiment file and "
32                          "show what will be done"),
33                    action="store_true",
34                    default=False)
35  # Allow each of the global fields to be overridden by passing in
36  # options. Add each global field as an option.
37  option_settings = GlobalSettings("")
38  for field_name in option_settings.fields:
39    field = option_settings.fields[field_name]
40    parser.add_option("--%s" % field.name,
41                      dest=field.name,
42                      help=field.description,
43                      action="store")
44
45
46def ConvertOptionsToSettings(options):
47  """Convert options passed in into global settings."""
48  option_settings = GlobalSettings("option_settings")
49  for option_name in options.__dict__:
50    if (options.__dict__[option_name] is not None and
51        option_name in option_settings.fields):
52      option_settings.SetField(option_name, options.__dict__[option_name])
53  return option_settings
54
55
56def Cleanup(experiment):
57  """Handler function which is registered to the atexit handler."""
58  experiment.Cleanup()
59
60
61def Main(argv):
62  parser = optparse.OptionParser(usage=Help().GetUsage(),
63                                 description=Help().GetHelp(),
64                                 formatter=MyIndentedHelpFormatter(),
65                                 version="%prog 3.0")
66
67  parser.add_option("--schedv2",
68                    dest="schedv2",
69                    action="store_true",
70                    help="Use crosperf scheduler v2 (feature in progress).")
71  parser.add_option("-l", "--log_dir",
72                    dest="log_dir",
73                    default="",
74                    help="The log_dir, default is under <crosperf_logs>/logs")
75
76  SetupParserOptions(parser)
77  options, args = parser.parse_args(argv)
78
79  # Convert the relevant options that are passed in into a settings
80  # object which will override settings in the experiment file.
81  option_settings = ConvertOptionsToSettings(options)
82  log_dir = os.path.abspath(os.path.expanduser(options.log_dir))
83  logger.GetLogger(log_dir)
84
85  if len(args) == 2:
86    experiment_filename = args[1]
87  else:
88    parser.error("Invalid number arguments.")
89
90  working_directory = os.getcwd()
91  if options.dry_run:
92    test_flag.SetTestMode(True)
93
94  experiment_file = ExperimentFile(open(experiment_filename, "rb"),
95                                   option_settings)
96  if not experiment_file.GetGlobalSettings().GetField("name"):
97    experiment_name = os.path.basename(experiment_filename)
98    experiment_file.GetGlobalSettings().SetField("name", experiment_name)
99  experiment = ExperimentFactory().GetExperiment(experiment_file,
100                                                 working_directory,
101                                                 log_dir)
102
103  atexit.register(Cleanup, experiment)
104
105  if options.dry_run:
106    runner = MockExperimentRunner(experiment)
107  else:
108    runner = ExperimentRunner(experiment, using_schedv2=options.schedv2)
109
110  runner.Run()
111
112if __name__ == "__main__":
113  Main(sys.argv)
114