crosperf.py revision ba64928c5dcbacbc70b4358881a89ad96227164d
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 3.0") 66 67 parser.add_option("--schedv2", 68 dest="schedv2", 69 action="store_true", 70 help="Use crosperf scheduler v2 (feature in progress).") 71 parser.add_option("-l", "--log_dir", 72 dest="log_dir", 73 default="", 74 help="The log_dir, default is under <crosperf_logs>/logs") 75 76 SetupParserOptions(parser) 77 options, args = parser.parse_args(argv) 78 79 # Convert the relevant options that are passed in into a settings 80 # object which will override settings in the experiment file. 81 option_settings = ConvertOptionsToSettings(options) 82 log_dir = os.path.abspath(os.path.expanduser(options.log_dir)) 83 logger.GetLogger(log_dir) 84 85 if len(args) == 2: 86 experiment_filename = args[1] 87 else: 88 parser.error("Invalid number arguments.") 89 90 working_directory = os.getcwd() 91 if options.dry_run: 92 test_flag.SetTestMode(True) 93 94 experiment_file = ExperimentFile(open(experiment_filename, "rb"), 95 option_settings) 96 if not experiment_file.GetGlobalSettings().GetField("name"): 97 experiment_name = os.path.basename(experiment_filename) 98 experiment_file.GetGlobalSettings().SetField("name", experiment_name) 99 experiment = ExperimentFactory().GetExperiment(experiment_file, 100 working_directory, 101 log_dir) 102 103 atexit.register(Cleanup, experiment) 104 105 if options.dry_run: 106 runner = MockExperimentRunner(experiment) 107 else: 108 runner = ExperimentRunner(experiment, using_schedv2=options.schedv2) 109 110 runner.Run() 111 112if __name__ == "__main__": 113 Main(sys.argv) 114