mirror of
https://github.com/ARM-software/workload-automation.git
synced 2025-02-21 20:38:57 +00:00
Implement Executor's postamble
This commit is contained in:
parent
add6dafa2d
commit
326ab827ed
@ -33,10 +33,10 @@ KIND_MAP = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
RunStatus = enum(['NEW', 'STARTED', 'CONNECTED', 'INITIALIZED', 'RUNNING',
|
RunStatus = enum(['NEW', 'STARTED', 'CONNECTED', 'INITIALIZED', 'RUNNING',
|
||||||
'COMPLETED', 'OK', 'FAILED', 'PARTIAL', 'ABORTED'])
|
'ABORTED', 'FAILED', 'PARTIAL', 'OK'])
|
||||||
|
|
||||||
JobStatus = enum(['NEW', 'PENDING', 'RUNNING',
|
JobStatus = enum(['NEW', 'PENDING', 'RUNNING',
|
||||||
'OK', 'FAILED', 'PARTIAL', 'ABORTED', 'SKIPPED'])
|
'SKIPPED', 'ABORTED', 'FAILED', 'PARTIAL', 'OK'])
|
||||||
|
|
||||||
|
|
||||||
##########################
|
##########################
|
||||||
|
@ -212,7 +212,6 @@ class Executor(object):
|
|||||||
pluginloader = None
|
pluginloader = None
|
||||||
self.device_manager = None
|
self.device_manager = None
|
||||||
self.device = None
|
self.device = None
|
||||||
self.context = None
|
|
||||||
|
|
||||||
def execute(self, config_manager, output):
|
def execute(self, config_manager, output):
|
||||||
"""
|
"""
|
||||||
@ -256,35 +255,31 @@ class Executor(object):
|
|||||||
runner = Runner(context)
|
runner = Runner(context)
|
||||||
signal.send(signal.RUN_STARTED, self)
|
signal.send(signal.RUN_STARTED, self)
|
||||||
runner.run()
|
runner.run()
|
||||||
#TODO: postamble goes here.
|
self.execute_postamble(context, output)
|
||||||
signal.send(signal.RUN_COMPLETED, self)
|
signal.send(signal.RUN_COMPLETED, self)
|
||||||
|
|
||||||
def execute_postamble(self):
|
def execute_postamble(self, context, output):
|
||||||
"""
|
|
||||||
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
|
|
||||||
self.logger.info('Done.')
|
self.logger.info('Done.')
|
||||||
self.logger.info('Run duration: {}'.format(format_duration(self.context.run_info.duration)))
|
duration = format_duration(output.info.duration)
|
||||||
status_summary = 'Ran a total of {} iterations: '.format(sum(self.context.job_iteration_counts.values()))
|
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 = []
|
parts = []
|
||||||
for status in JobStatus.values:
|
for status in reversed(JobStatus.values):
|
||||||
if status in counter:
|
if status in counter:
|
||||||
parts.append('{} {}'.format(counter[status], status))
|
parts.append('{} {}'.format(counter[status], status))
|
||||||
self.logger.info(status_summary + ', '.join(parts))
|
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:
|
if self.error_logged:
|
||||||
self.logger.warn('There were errors during execution.')
|
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:
|
elif self.warning_logged:
|
||||||
self.logger.warn('There were warnings during execution.')
|
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):
|
def _error_signalled_callback(self):
|
||||||
self.error_logged = True
|
self.error_logged = True
|
||||||
|
@ -14,11 +14,11 @@
|
|||||||
#
|
#
|
||||||
import uuid
|
import uuid
|
||||||
import logging
|
import logging
|
||||||
|
from collections import OrderedDict, Counter
|
||||||
from copy import copy
|
from copy import copy
|
||||||
from datetime import datetime, timedelta
|
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):
|
class RunInfo(object):
|
||||||
@ -73,6 +73,11 @@ class RunState(object):
|
|||||||
instance.jobs = OrderedDict(((js.id, js.iteration), js) for js in jss)
|
instance.jobs = OrderedDict(((js.id, js.iteration), js) for js in jss)
|
||||||
return instance
|
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):
|
def __init__(self):
|
||||||
self.jobs = OrderedDict()
|
self.jobs = OrderedDict()
|
||||||
self.status = RunStatus.NEW
|
self.status = RunStatus.NEW
|
||||||
@ -87,6 +92,12 @@ class RunState(object):
|
|||||||
state.status = job.status
|
state.status = job.status
|
||||||
state.timestamp = datetime.now()
|
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):
|
def to_pod(self):
|
||||||
return OrderedDict(
|
return OrderedDict(
|
||||||
status=str(self.status),
|
status=str(self.status),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user