Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 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 | |
| 7 | import atexit |
| 8 | import optparse |
| 9 | import os |
| 10 | import sys |
| 11 | from experiment_runner import ExperimentRunner |
| 12 | from experiment_runner import MockExperimentRunner |
| 13 | from experiment_factory import ExperimentFactory |
| 14 | from experiment_file import ExperimentFile |
| 15 | from help import Help |
| 16 | from settings_factory import GlobalSettings |
| 17 | from utils import logger |
| 18 | |
Ahmad Sharif | 4467f00 | 2012-12-20 12:09:49 -0800 | [diff] [blame] | 19 | import test_flag |
Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 20 | |
Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 21 | |
| 22 | class MyIndentedHelpFormatter(optparse.IndentedHelpFormatter): |
| 23 | def format_description(self, description): |
| 24 | return description |
| 25 | |
| 26 | |
| 27 | def 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 | |
| 46 | def 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 | |
| 56 | def Cleanup(experiment): |
| 57 | """Handler function which is registered to the atexit handler.""" |
| 58 | experiment.Cleanup() |
| 59 | |
| 60 | |
| 61 | def Main(argv): |
| 62 | parser = optparse.OptionParser(usage=Help().GetUsage(), |
| 63 | description=Help().GetHelp(), |
| 64 | formatter=MyIndentedHelpFormatter(), |
| 65 | version="%prog 0.1") |
Luis Lozano | f81680c | 2013-03-15 14:44:13 -0700 | [diff] [blame] | 66 | |
| 67 | parser.add_option("-l", "--log_dir", |
| 68 | dest="log_dir", |
| 69 | default="", |
| 70 | help="The log_dir, default is under <crosperf_logs>/logs") |
| 71 | |
Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 72 | SetupParserOptions(parser) |
| 73 | options, args = parser.parse_args(argv) |
| 74 | |
| 75 | # Convert the relevant options that are passed in into a settings |
| 76 | # object which will override settings in the experiment file. |
| 77 | option_settings = ConvertOptionsToSettings(options) |
Luis Lozano | f81680c | 2013-03-15 14:44:13 -0700 | [diff] [blame] | 78 | log_dir = os.path.abspath(os.path.expanduser(options.log_dir)) |
| 79 | logger.GetLogger(log_dir) |
Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 80 | |
| 81 | if len(args) == 2: |
| 82 | experiment_filename = args[1] |
| 83 | else: |
| 84 | parser.error("Invalid number arguments.") |
| 85 | |
| 86 | working_directory = os.getcwd() |
Ahmad Sharif | 4467f00 | 2012-12-20 12:09:49 -0800 | [diff] [blame] | 87 | if options.dry_run: |
| 88 | test_flag.SetTestMode(True) |
| 89 | |
Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 90 | experiment_file = ExperimentFile(open(experiment_filename, "rb"), |
| 91 | option_settings) |
Ahmad Sharif | 822c55d | 2012-02-08 20:55:47 -0800 | [diff] [blame] | 92 | if not experiment_file.GetGlobalSettings().GetField("name"): |
| 93 | experiment_name = os.path.basename(experiment_filename) |
| 94 | experiment_file.GetGlobalSettings().SetField("name", experiment_name) |
Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 95 | experiment = ExperimentFactory().GetExperiment(experiment_file, |
Luis Lozano | f81680c | 2013-03-15 14:44:13 -0700 | [diff] [blame] | 96 | working_directory, |
| 97 | log_dir) |
Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 98 | |
| 99 | atexit.register(Cleanup, experiment) |
| 100 | |
| 101 | if options.dry_run: |
| 102 | runner = MockExperimentRunner(experiment) |
| 103 | else: |
| 104 | runner = ExperimentRunner(experiment) |
| 105 | runner.Run() |
| 106 | |
| 107 | if __name__ == "__main__": |
| 108 | Main(sys.argv) |