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