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