aboutsummaryrefslogtreecommitdiff
path: root/wa/commands/run.py
diff options
context:
space:
mode:
authorSergei Trofimov <sergei.trofimov@arm.com>2017-03-06 11:10:25 +0000
committerSergei Trofimov <sergei.trofimov@arm.com>2017-03-06 11:10:25 +0000
commit42539bbe0d00dfad968e0a6b20162b2264b4f047 (patch)
tree3404ce400cc898982f3aff70b2815837be8c927c /wa/commands/run.py
parent18d001fd768ff65fa59ce7290ae8e875bcac6630 (diff)
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".
Diffstat (limited to 'wa/commands/run.py')
-rw-r--r--wa/commands/run.py133
1 files changed, 90 insertions, 43 deletions
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