blob: e107ea480b0c12ce3561a3501b882e3a7f4ea8da [file] [log] [blame]
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08001#!/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
Luis Lozano45b53c52015-09-30 11:36:27 -070010import signal
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080011import sys
12from experiment_runner import ExperimentRunner
13from experiment_runner import MockExperimentRunner
14from experiment_factory import ExperimentFactory
15from experiment_file import ExperimentFile
16from help import Help
17from settings_factory import GlobalSettings
18from utils import logger
19
Ahmad Sharif4467f002012-12-20 12:09:49 -080020import test_flag
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080021
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080022
23class MyIndentedHelpFormatter(optparse.IndentedHelpFormatter):
24 def format_description(self, description):
25 return description
26
27
28def SetupParserOptions(parser):
29 """Add all options to the parser."""
30 parser.add_option("--dry_run",
31 dest="dry_run",
32 help=("Parse the experiment file and "
33 "show what will be done"),
34 action="store_true",
35 default=False)
36 # Allow each of the global fields to be overridden by passing in
37 # options. Add each global field as an option.
38 option_settings = GlobalSettings("")
39 for field_name in option_settings.fields:
40 field = option_settings.fields[field_name]
41 parser.add_option("--%s" % field.name,
42 dest=field.name,
43 help=field.description,
44 action="store")
45
46
47def ConvertOptionsToSettings(options):
48 """Convert options passed in into global settings."""
49 option_settings = GlobalSettings("option_settings")
50 for option_name in options.__dict__:
51 if (options.__dict__[option_name] is not None and
52 option_name in option_settings.fields):
53 option_settings.SetField(option_name, options.__dict__[option_name])
54 return option_settings
55
56
57def Cleanup(experiment):
58 """Handler function which is registered to the atexit handler."""
59 experiment.Cleanup()
60
61
Luis Lozano45b53c52015-09-30 11:36:27 -070062def CallExitHandler(signum, _):
63 """Signal handler that transforms a signal into a call to exit.
64
65 This is useful because functionality registered by "atexit" will
66 be called. It also means you can "catch" the signal by catching
67 the SystemExit exception.
68 """
69 sys.exit(128 + signum)
70
71
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080072def Main(argv):
73 parser = optparse.OptionParser(usage=Help().GetUsage(),
74 description=Help().GetHelp(),
75 formatter=MyIndentedHelpFormatter(),
cmtice98a53692014-04-16 14:48:47 -070076 version="%prog 3.0")
Luis Lozanof81680c2013-03-15 14:44:13 -070077
Han Shen43494292015-09-14 10:26:40 -070078 parser.add_option("--noschedv2",
79 dest="noschedv2",
80 default=False,
Han Shenba649282015-08-05 17:19:55 -070081 action="store_true",
Han Shen43494292015-09-14 10:26:40 -070082 help=("Do not use new scheduler. "
83 "Use original scheduler instead."))
Luis Lozanof81680c2013-03-15 14:44:13 -070084 parser.add_option("-l", "--log_dir",
85 dest="log_dir",
86 default="",
87 help="The log_dir, default is under <crosperf_logs>/logs")
88
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080089 SetupParserOptions(parser)
90 options, args = parser.parse_args(argv)
91
92 # Convert the relevant options that are passed in into a settings
93 # object which will override settings in the experiment file.
94 option_settings = ConvertOptionsToSettings(options)
Luis Lozanof81680c2013-03-15 14:44:13 -070095 log_dir = os.path.abspath(os.path.expanduser(options.log_dir))
96 logger.GetLogger(log_dir)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080097
98 if len(args) == 2:
99 experiment_filename = args[1]
100 else:
101 parser.error("Invalid number arguments.")
102
103 working_directory = os.getcwd()
Ahmad Sharif4467f002012-12-20 12:09:49 -0800104 if options.dry_run:
105 test_flag.SetTestMode(True)
106
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -0800107 experiment_file = ExperimentFile(open(experiment_filename, "rb"),
108 option_settings)
Ahmad Sharif822c55d2012-02-08 20:55:47 -0800109 if not experiment_file.GetGlobalSettings().GetField("name"):
110 experiment_name = os.path.basename(experiment_filename)
111 experiment_file.GetGlobalSettings().SetField("name", experiment_name)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -0800112 experiment = ExperimentFactory().GetExperiment(experiment_file,
Luis Lozanof81680c2013-03-15 14:44:13 -0700113 working_directory,
114 log_dir)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -0800115
Caroline Ticeef4ca8a2015-08-25 12:53:38 -0700116 json_report = experiment_file.GetGlobalSettings().GetField("json_report")
117
Luis Lozano45b53c52015-09-30 11:36:27 -0700118 signal.signal(signal.SIGTERM, CallExitHandler)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -0800119 atexit.register(Cleanup, experiment)
120
121 if options.dry_run:
122 runner = MockExperimentRunner(experiment)
123 else:
Caroline Ticeef4ca8a2015-08-25 12:53:38 -0700124 runner = ExperimentRunner(experiment, json_report,
Han Shene205d902015-09-15 11:04:05 -0700125 using_schedv2=(not options.noschedv2))
Han Shenba649282015-08-05 17:19:55 -0700126
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -0800127 runner.Run()
128
129if __name__ == "__main__":
130 Main(sys.argv)