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 | |
| 21 | l = logger.GetLogger() |
| 22 | |
| 23 | |
| 24 | class MyIndentedHelpFormatter(optparse.IndentedHelpFormatter): |
| 25 | def format_description(self, description): |
| 26 | return description |
| 27 | |
| 28 | |
| 29 | def SetupParserOptions(parser): |
| 30 | """Add all options to the parser.""" |
| 31 | parser.add_option("--dry_run", |
| 32 | dest="dry_run", |
| 33 | help=("Parse the experiment file and " |
| 34 | "show what will be done"), |
| 35 | action="store_true", |
| 36 | default=False) |
| 37 | # Allow each of the global fields to be overridden by passing in |
| 38 | # options. Add each global field as an option. |
| 39 | option_settings = GlobalSettings("") |
| 40 | for field_name in option_settings.fields: |
| 41 | field = option_settings.fields[field_name] |
| 42 | parser.add_option("--%s" % field.name, |
| 43 | dest=field.name, |
| 44 | help=field.description, |
| 45 | action="store") |
| 46 | |
| 47 | |
| 48 | def ConvertOptionsToSettings(options): |
| 49 | """Convert options passed in into global settings.""" |
| 50 | option_settings = GlobalSettings("option_settings") |
| 51 | for option_name in options.__dict__: |
| 52 | if (options.__dict__[option_name] is not None and |
| 53 | option_name in option_settings.fields): |
| 54 | option_settings.SetField(option_name, options.__dict__[option_name]) |
| 55 | return option_settings |
| 56 | |
| 57 | |
| 58 | def Cleanup(experiment): |
| 59 | """Handler function which is registered to the atexit handler.""" |
| 60 | experiment.Cleanup() |
| 61 | |
| 62 | |
| 63 | def Main(argv): |
| 64 | parser = optparse.OptionParser(usage=Help().GetUsage(), |
| 65 | description=Help().GetHelp(), |
| 66 | formatter=MyIndentedHelpFormatter(), |
| 67 | version="%prog 0.1") |
| 68 | SetupParserOptions(parser) |
| 69 | options, args = parser.parse_args(argv) |
| 70 | |
| 71 | # Convert the relevant options that are passed in into a settings |
| 72 | # object which will override settings in the experiment file. |
| 73 | option_settings = ConvertOptionsToSettings(options) |
| 74 | |
| 75 | if len(args) == 2: |
| 76 | experiment_filename = args[1] |
| 77 | else: |
| 78 | parser.error("Invalid number arguments.") |
| 79 | |
| 80 | working_directory = os.getcwd() |
Ahmad Sharif | 4467f00 | 2012-12-20 12:09:49 -0800 | [diff] [blame^] | 81 | if options.dry_run: |
| 82 | test_flag.SetTestMode(True) |
| 83 | |
Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 84 | experiment_file = ExperimentFile(open(experiment_filename, "rb"), |
| 85 | option_settings) |
Ahmad Sharif | 822c55d | 2012-02-08 20:55:47 -0800 | [diff] [blame] | 86 | if not experiment_file.GetGlobalSettings().GetField("name"): |
| 87 | experiment_name = os.path.basename(experiment_filename) |
| 88 | experiment_file.GetGlobalSettings().SetField("name", experiment_name) |
Ahmad Sharif | 0dcbc4b | 2012-02-02 16:37:18 -0800 | [diff] [blame] | 89 | experiment = ExperimentFactory().GetExperiment(experiment_file, |
| 90 | working_directory) |
| 91 | |
| 92 | atexit.register(Cleanup, experiment) |
| 93 | |
| 94 | if options.dry_run: |
| 95 | runner = MockExperimentRunner(experiment) |
| 96 | else: |
| 97 | runner = ExperimentRunner(experiment) |
| 98 | runner.Run() |
| 99 | |
| 100 | if __name__ == "__main__": |
| 101 | Main(sys.argv) |