1
0
mirror of https://github.com/ARM-software/workload-automation.git synced 2025-02-20 20:09:11 +00:00

Implement Executor's postamble

This commit is contained in:
Sergei Trofimov 2017-03-17 17:05:40 +00:00
parent add6dafa2d
commit 326ab827ed
3 changed files with 28 additions and 22 deletions

View File

@ -33,10 +33,10 @@ KIND_MAP = {
}
RunStatus = enum(['NEW', 'STARTED', 'CONNECTED', 'INITIALIZED', 'RUNNING',
'COMPLETED', 'OK', 'FAILED', 'PARTIAL', 'ABORTED'])
'ABORTED', 'FAILED', 'PARTIAL', 'OK'])
JobStatus = enum(['NEW', 'PENDING', 'RUNNING',
'OK', 'FAILED', 'PARTIAL', 'ABORTED', 'SKIPPED'])
'SKIPPED', 'ABORTED', 'FAILED', 'PARTIAL', 'OK'])
##########################

View File

@ -212,7 +212,6 @@ class Executor(object):
pluginloader = None
self.device_manager = None
self.device = None
self.context = None
def execute(self, config_manager, output):
"""
@ -256,35 +255,31 @@ class Executor(object):
runner = Runner(context)
signal.send(signal.RUN_STARTED, self)
runner.run()
#TODO: postamble goes here.
self.execute_postamble(context, output)
signal.send(signal.RUN_COMPLETED, self)
def execute_postamble(self):
"""
This happens after the run has completed. The overall results of the run are
summarised to the user.
"""
result = self.context.run_result
counter = Counter()
for ir in result.iteration_results:
counter[ir.status] += 1
def execute_postamble(self, context, output):
self.logger.info('Done.')
self.logger.info('Run duration: {}'.format(format_duration(self.context.run_info.duration)))
status_summary = 'Ran a total of {} iterations: '.format(sum(self.context.job_iteration_counts.values()))
duration = format_duration(output.info.duration)
self.logger.info('Run duration: {}'.format(duration))
num_ran = context.run_state.num_completed_jobs
status_summary = 'Ran a total of {} iterations: '.format(num_ran)
counter = context.run_state.get_status_counts()
parts = []
for status in JobStatus.values:
for status in reversed(JobStatus.values):
if status in counter:
parts.append('{} {}'.format(counter[status], status))
self.logger.info(status_summary + ', '.join(parts))
self.logger.info('Results can be found in {}'.format(self.config.output_directory))
self.logger.info('Results can be found in {}'.format(output.basepath))
if self.error_logged:
self.logger.warn('There were errors during execution.')
self.logger.warn('Please see {}'.format(self.config.log_file))
self.logger.warn('Please see {}'.format(output.logfile))
elif self.warning_logged:
self.logger.warn('There were warnings during execution.')
self.logger.warn('Please see {}'.format(self.config.log_file))
self.logger.warn('Please see {}'.format(output.logfile))
def _error_signalled_callback(self):
self.error_logged = True

View File

@ -14,11 +14,11 @@
#
import uuid
import logging
from collections import OrderedDict, Counter
from copy import copy
from datetime import datetime, timedelta
from collections import OrderedDict
from wa.framework.configuration.core import RunStatus
from wa.framework.configuration.core import RunStatus, JobStatus
class RunInfo(object):
@ -73,6 +73,11 @@ class RunState(object):
instance.jobs = OrderedDict(((js.id, js.iteration), js) for js in jss)
return instance
@property
def num_completed_jobs(self):
return sum(1 for js in self.jobs.itervalues()
if js.status > JobStatus.SKIPPED)
def __init__(self):
self.jobs = OrderedDict()
self.status = RunStatus.NEW
@ -87,6 +92,12 @@ class RunState(object):
state.status = job.status
state.timestamp = datetime.now()
def get_status_counts(self):
counter = Counter()
for job_state in self.jobs.itervalues():
counter[job_state.status] += 1
return counter
def to_pod(self):
return OrderedDict(
status=str(self.status),