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