From 42539bbe0d00dfad968e0a6b20162b2264b4f047 Mon Sep 17 00:00:00 2001 From: Sergei Trofimov Date: Mon, 6 Mar 2017 11:10:25 +0000 Subject: New target description + moving target stuff under "framework" Changing the way target descriptions work from a static mapping to something that is dynamically generated and is extensible via plugins. Also moving core target implementation stuff under "framework". --- wa/commands/run.py | 133 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 90 insertions(+), 43 deletions(-) (limited to 'wa/commands/run.py') diff --git a/wa/commands/run.py b/wa/commands/run.py index c967a316..dc351e68 100644 --- a/wa/commands/run.py +++ b/wa/commands/run.py @@ -18,70 +18,117 @@ import os import sys import shutil +import wa from wa import Command, settings -from wa.framework import log -from wa.framework.agenda import Agenda -from wa.framework.output import RunOutput +from wa.framework import pluginloader +from wa.framework.configuration import RunConfiguration +from wa.framework.configuration.parsers import AgendaParser, ConfigParser +from wa.framework.execution import Executor +from wa.framework.output import init_wa_output +from wa.framework.version import get_wa_version +from wa.framework.exception import NotFoundError, ConfigError +from wa.utils import log +from wa.utils.types import toggle_set class RunCommand(Command): name = 'run' - description = """ + description = ''' Execute automated workloads on a remote device and process the resulting output. - """ + + ''' def initialize(self, context): self.parser.add_argument('agenda', metavar='AGENDA', help=""" - Agenda for this workload automation run. This defines which - workloads will be executed, how many times, with which - tunables, etc. See example agendas in {} for an example of - how this file should be structured. - """.format(os.path.dirname(wlauto.__file__))) + Agenda for this workload automation run. This + defines which workloads will be executed, how + many times, with which tunables, etc. See + example agendas in {} for an example of how + this file should be structured. + """.format(os.path.dirname(wa.__file__))) self.parser.add_argument('-d', '--output-directory', metavar='DIR', default=None, help=""" - Specify a directory where the output will be generated. If - the directory already exists, the script will abort unless -f - option (see below) is used, in which case the contents of the - directory will be overwritten. If this option is not specified, - then {} will be used instead. - """.format(settings.output_directory)) + Specify a directory where the output will be + generated. If the directory already exists, + the script will abort unless -f option (see + below) is used, in which case the contents of + the directory will be overwritten. If this + option is not specified, then {} will be used + instead. + """.format(settings.default_output_directory)) self.parser.add_argument('-f', '--force', action='store_true', help=""" - Overwrite output directory if it exists. By default, the script - will abort in this situation to prevent accidental data loss. + Overwrite output directory if it exists. By + default, the script will abort in this + situation to prevent accidental data loss. """) self.parser.add_argument('-i', '--id', action='append', dest='only_run_ids', metavar='ID', help=""" - Specify a workload spec ID from an agenda to run. If this is - specified, only that particular spec will be run, and other - workloads in the agenda will be ignored. This option may be - used to specify multiple IDs. + Specify a workload spec ID from an agenda to + run. If this is specified, only that + particular spec will be run, and other + workloads in the agenda will be ignored. This + option may be used to specify multiple IDs. """) self.parser.add_argument('--disable', action='append', dest='instruments_to_disable', + default=[], metavar='INSTRUMENT', help=""" - Specify an instrument to disable from the command line. This - equivalent to adding "~{metavar}" to the instrumentation list in - the agenda. This can be used to temporarily disable a troublesome - instrument for a particular run without introducing permanent - change to the config (which one might then forget to revert). - This option may be specified multiple times. + Specify an instrument to disable from the + command line. This equivalent to adding + "~{metavar}" to the instrumentation list in + the agenda. This can be used to temporarily + disable a troublesome instrument for a + particular run without introducing permanent + change to the config (which one might then + forget to revert). This option may be + specified multiple times. """) - def execute(self, args): # NOQA + def execute(self, config, args): + output = self.set_up_output_directory(config, args) + log.add_file(output.logfile) + + self.logger.debug('Version: {}'.format(get_wa_version())) + self.logger.debug('Command Line: {}'.format(' '.join(sys.argv))) + + disabled_instruments = toggle_set(["~{}".format(i) + for i in args.instruments_to_disable]) + config.jobs_config.disable_instruments(disabled_instruments) + config.jobs_config.only_run_ids(args.only_run_ids) + + parser = AgendaParser() + if os.path.isfile(args.agenda): + parser.load_from_path(config, args.agenda) + shutil.copy(args.agenda, output.raw_config_dir) + else: + try: + pluginloader.get_plugin_class(args.agenda, kind='workload') + agenda = {'workloads': [{'name': args.agenda}]} + parser.load(config, agenda, 'CMDLINE_ARGS') + except NotFoundError: + msg = 'Agenda file "{}" does not exist, and there no workload '\ + 'with that name.\nYou can get a list of available '\ + 'by running "wa list workloads".' + raise ConfigError(msg.format(args.agenda)) + + executor = Executor() + executor.execute(config, output) + + def set_up_output_directory(self, config, args): + if args.output_directory: + output_directory = args.output_directory + else: + output_directory = settings.default_output_directory + self.logger.debug('Using output directory: {}'.format(output_directory)) try: - executor = Executor(args.output_directory, args.force) - except RuntimeError: - self.logger.error('Output directory {} exists.'.format(args.output_directory)) - self.logger.error('Please specify another location, or use -f option to overwrite.\n') - return 2 - for path in settings.get_config_paths(): - executor.load_config(path) - executor.load_agenda(args.agenda) - for itd in args.instruments_to_disable: - self.logger.debug('Globally disabling instrument "{}" (from command line option)'.format(itd)) - executor.disable_instrument(itd) - executor.initialize() - executor.execute(selectors={'ids': args.only_run_ids}) - executor.finalize() + return init_wa_output(output_directory, config, args.force) + except RuntimeError as e: + if 'path exists' in str(e): + msg = 'Output directory "{}" exists.\nPlease specify another '\ + 'location, or use -f option to overwrite.' + self.logger.critical(msg.format(output_directory)) + sys.exit(1) + else: + raise e -- cgit v1.2.3