1
0
mirror of https://github.com/ARM-software/workload-automation.git synced 2024-10-06 10:51:13 +01:00

Augmentations: Allow configuring of augmentations per workload

Add support for enabling and disabling of augmentations (instruments and
output processors) on a per workload basis.
This commit is contained in:
Marc Bonnici 2018-01-29 09:47:52 +00:00 committed by setrofim
parent 557d62ce86
commit 9a556721b6
3 changed files with 99 additions and 12 deletions

View File

@ -273,7 +273,7 @@ class Executor(object):
Params:: Params::
:state: a ``ConfigManager`` containing processed configuraiton :state: a ``ConfigManager`` containing processed configuration
:output: an initialized ``RunOutput`` that will be used to :output: an initialized ``RunOutput`` that will be used to
store the results. store the results.
@ -402,6 +402,7 @@ class Runner(object):
def finalize_run(self): def finalize_run(self):
self.logger.info('Finalizing run') self.logger.info('Finalizing run')
self.context.end_run() self.context.end_run()
self.pm.enable_all()
self.pm.process_run_output(self.context) self.pm.process_run_output(self.context)
self.pm.export_run_output(self.context) self.pm.export_run_output(self.context)
self.pm.finalize() self.pm.finalize()
@ -446,6 +447,9 @@ class Runner(object):
job.set_status(Status.RUNNING) job.set_status(Status.RUNNING)
self.send(signal.JOB_STARTED) self.send(signal.JOB_STARTED)
self.logger.info('Configuring augmentations')
job.configure_augmentations(context, self.pm)
with signal.wrap('JOB_TARGET_CONFIG', self, context): with signal.wrap('JOB_TARGET_CONFIG', self, context):
job.configure_target(context) job.configure_target(context)

View File

@ -1,7 +1,7 @@
import logging import logging
from datetime import datetime from datetime import datetime
from wa.framework import pluginloader, signal from wa.framework import pluginloader, signal, instruments
from wa.framework.configuration.core import Status from wa.framework.configuration.core import Status
# Because of use of Enum (dynamic attrs) # Because of use of Enum (dynamic attrs)
@ -64,6 +64,33 @@ class Job(object):
self.set_status(Status.PENDING) self.set_status(Status.PENDING)
context.update_job_state(self) context.update_job_state(self)
def configure_augmentations(self, context, pm):
instruments_to_enable = set()
output_processors_to_enable = set()
enabled_instruments = set(i.name for i in instruments.get_enabled())
enabled_output_processors = set(p.name for p in pm.get_enabled())
for augmentation in self.spec.augmentations.values():
augmentation_cls = context.cm.plugin_cache.get_plugin_class(augmentation)
if augmentation_cls.kind == 'instrument':
instruments_to_enable.add(augmentation)
elif augmentation_cls.kind == 'output_processor':
output_processors_to_enable.add(augmentation)
# Disable unrequired instruments
for instrument in enabled_instruments.difference(instruments_to_enable):
instruments.disable(instrument)
# Enable additional instruments
for instrument in instruments_to_enable.difference(enabled_instruments):
instruments.enable(instrument)
# Disable unrequired output_processors
for processor in enabled_output_processors.difference(output_processors_to_enable):
pm.disable(processor)
# Enable additional output_processors
for processor in output_processors_to_enable.difference(enabled_output_processors):
pm.enable(processor)
def configure_target(self, context): def configure_target(self, context):
self.logger.info('Configuring target for job {} [{}]'.format(self.id, self.iteration)) self.logger.info('Configuring target for job {} [{}]'.format(self.id, self.iteration))
context.tm.commit_runtime_parameters(self.spec.runtime_parameters) context.tm.commit_runtime_parameters(self.spec.runtime_parameters)

View File

@ -5,6 +5,7 @@ from wa.framework.exception import ConfigError
from wa.framework.instruments import is_installed from wa.framework.instruments import is_installed
from wa.framework.plugin import Plugin from wa.framework.plugin import Plugin
from wa.utils.log import log_error, indent, dedent from wa.utils.log import log_error, indent, dedent
from wa.utils.misc import isiterable
class OutputProcessor(Plugin): class OutputProcessor(Plugin):
@ -12,6 +13,10 @@ class OutputProcessor(Plugin):
kind = 'output_processor' kind = 'output_processor'
requires = [] requires = []
def __init__(self, **kwargs):
super(OutputProcessor, self).__init__(**kwargs)
self.is_enabled = True
def validate(self): def validate(self):
super(OutputProcessor, self).validate() super(OutputProcessor, self).validate()
for instrument in self.requires: for instrument in self.requires:
@ -40,6 +45,43 @@ class ProcessorManager(object):
processor.logger.context = context processor.logger.context = context
self.processors.append(processor) self.processors.append(processor)
def disable_all(self):
for output_processor in self.processors:
self._disable_output_processor(output_processor)
def enable_all(self):
for output_processor in self.processors:
self._enable_output_processor(output_processor)
def enable(self, to_enable):
if isiterable(to_enable):
for inst in to_enable:
self._enable_output_processor(inst)
else:
self._enable_output_processor(to_enable)
def disable(self, to_disable):
if isiterable(to_disable):
for inst in to_disable:
self._disable_output_processor(inst)
else:
self._disable_output_processor(to_disable)
def get_output_processor(self, processor):
if isinstance(processor, OutputProcessor):
return processor
for p in self.processors:
if processor == p.name:
return p
raise ValueError('Output processor {} is not installed'.format(processor))
def get_enabled(self):
return [p for p in self.processors if p.is_enabled]
def get_disabled(self):
return [p for p in self.processors if not p.is_enabled]
def validate(self): def validate(self):
for proc in self.processors: for proc in self.processors:
proc.validate() proc.validate()
@ -74,15 +116,29 @@ class ProcessorManager(object):
try: try:
indent() indent()
for proc in self.processors: for proc in self.processors:
proc_func = getattr(proc, method_name, None) if proc.is_enabled:
if proc_func is None: proc_func = getattr(proc, method_name, None)
continue if proc_func is None:
try: continue
self.logger.info(message.format(proc.name)) try:
proc_func(*args) self.logger.info(message.format(proc.name))
except Exception as e: proc_func(*args)
if isinstance(e, KeyboardInterrupt): except Exception as e:
raise if isinstance(e, KeyboardInterrupt):
log_error(e, self.logger) raise
log_error(e, self.logger)
finally: finally:
dedent() dedent()
def _enable_output_processor(self, inst):
inst = self.get_output_processor(inst)
self.logger.debug('Enabling output processor {}'.format(inst.name))
if not inst.is_enabled:
inst.is_enabled = True
def _disable_output_processor(self, inst):
inst = self.get_output_processor(inst)
self.logger.debug('Disabling output processor {}'.format(inst.name))
if inst.is_enabled:
inst.is_enabled = False