crosperf.py revision f81680c018729fd4499e1e200d04b48c4b90127c
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 7import atexit 8import optparse 9import os 10import sys 11from experiment_runner import ExperimentRunner 12from experiment_runner import MockExperimentRunner 13from experiment_factory import ExperimentFactory 14from experiment_file import ExperimentFile 15from help import Help 16from settings_factory import GlobalSettings 17from utils import logger 18 19import test_flag 20 21 22class MyIndentedHelpFormatter(optparse.IndentedHelpFormatter): 23 def format_description(self, description): 24 return description 25 26 27def 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 46def 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 56def Cleanup(experiment): 57 """Handler function which is registered to the atexit handler.""" 58 experiment.Cleanup() 59 60 61def Main(argv): 62 parser = optparse.OptionParser(usage=Help().GetUsage(), 63 description=Help().GetHelp(), 64 formatter=MyIndentedHelpFormatter(), 65 version="%prog 0.1") 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 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) 78 log_dir = os.path.abspath(os.path.expanduser(options.log_dir)) 79 logger.GetLogger(log_dir) 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() 87 if options.dry_run: 88 test_flag.SetTestMode(True) 89 90 experiment_file = ExperimentFile(open(experiment_filename, "rb"), 91 option_settings) 92 if not experiment_file.GetGlobalSettings().GetField("name"): 93 experiment_name = os.path.basename(experiment_filename) 94 experiment_file.GetGlobalSettings().SetField("name", experiment_name) 95 experiment = ExperimentFactory().GetExperiment(experiment_file, 96 working_directory, 97 log_dir) 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 107if __name__ == "__main__": 108 Main(sys.argv) 109