crosperf.py revision e7c6fbf9cfd5f45dda21f2c4742bf5a62589d2ed
1#!/usr/bin/python2 2 3# Copyright 2011 Google Inc. All Rights Reserved. 4"""The driver script for running performance benchmarks on ChromeOS.""" 5 6from __future__ import print_function 7 8import atexit 9import optparse 10import os 11import signal 12import sys 13from experiment_runner import ExperimentRunner 14from experiment_runner import MockExperimentRunner 15from experiment_factory import ExperimentFactory 16from experiment_file import ExperimentFile 17from help import Help 18from settings_factory import GlobalSettings 19from utils import logger 20 21import test_flag 22 23 24class MyIndentedHelpFormatter(optparse.IndentedHelpFormatter): 25 """Help formatter.""" 26 27 def format_description(self, description): 28 return description 29 30 31def SetupParserOptions(parser): 32 """Add all options to the parser.""" 33 parser.add_option('--dry_run', 34 dest='dry_run', 35 help=('Parse the experiment file and ' 36 'show what will be done'), 37 action='store_true', 38 default=False) 39 # Allow each of the global fields to be overridden by passing in 40 # options. Add each global field as an option. 41 option_settings = GlobalSettings('') 42 for field_name in option_settings.fields: 43 field = option_settings.fields[field_name] 44 parser.add_option('--%s' % field.name, 45 dest=field.name, 46 help=field.description, 47 action='store') 48 49 50def ConvertOptionsToSettings(options): 51 """Convert options passed in into global settings.""" 52 option_settings = GlobalSettings('option_settings') 53 for option_name in options.__dict__: 54 if (options.__dict__[option_name] is not None and 55 option_name in option_settings.fields): 56 option_settings.SetField(option_name, options.__dict__[option_name]) 57 return option_settings 58 59 60def Cleanup(experiment): 61 """Handler function which is registered to the atexit handler.""" 62 experiment.Cleanup() 63 64 65def CallExitHandler(signum, _): 66 """Signal handler that transforms a signal into a call to exit. 67 68 This is useful because functionality registered by "atexit" will 69 be called. It also means you can "catch" the signal by catching 70 the SystemExit exception. 71 """ 72 sys.exit(128 + signum) 73 74 75def Main(argv): 76 parser = optparse.OptionParser(usage=Help().GetUsage(), 77 description=Help().GetHelp(), 78 formatter=MyIndentedHelpFormatter(), 79 version='%prog 3.0') 80 81 parser.add_option('--noschedv2', 82 dest='noschedv2', 83 default=False, 84 action='store_true', 85 help=('Do not use new scheduler. ' 86 'Use original scheduler instead.')) 87 parser.add_option('-l', 88 '--log_dir', 89 dest='log_dir', 90 default='', 91 help='The log_dir, default is under <crosperf_logs>/logs') 92 93 SetupParserOptions(parser) 94 options, args = parser.parse_args(argv) 95 96 # Convert the relevant options that are passed in into a settings 97 # object which will override settings in the experiment file. 98 option_settings = ConvertOptionsToSettings(options) 99 log_dir = os.path.abspath(os.path.expanduser(options.log_dir)) 100 logger.GetLogger(log_dir) 101 102 if len(args) == 2: 103 experiment_filename = args[1] 104 else: 105 parser.error('Invalid number arguments.') 106 107 working_directory = os.getcwd() 108 if options.dry_run: 109 test_flag.SetTestMode(True) 110 111 experiment_file = ExperimentFile( 112 open(experiment_filename, 'rb'), option_settings) 113 if not experiment_file.GetGlobalSettings().GetField('name'): 114 experiment_name = os.path.basename(experiment_filename) 115 experiment_file.GetGlobalSettings().SetField('name', experiment_name) 116 experiment = ExperimentFactory().GetExperiment(experiment_file, 117 working_directory, log_dir) 118 119 json_report = experiment_file.GetGlobalSettings().GetField('json_report') 120 121 signal.signal(signal.SIGTERM, CallExitHandler) 122 atexit.register(Cleanup, experiment) 123 124 if options.dry_run: 125 runner = MockExperimentRunner(experiment, json_report) 126 else: 127 runner = ExperimentRunner(experiment, 128 json_report, 129 using_schedv2=(not options.noschedv2)) 130 131 runner.Run() 132 133 134if __name__ == '__main__': 135 Main(sys.argv) 136