From 326ab827ed3fc75893b5827525a30d38c967d54f Mon Sep 17 00:00:00 2001 From: Sergei Trofimov Date: Fri, 17 Mar 2017 17:05:40 +0000 Subject: [PATCH] Implement Executor's postamble --- wa/framework/configuration/core.py | 4 ++-- wa/framework/execution.py | 31 +++++++++++++----------------- wa/framework/run.py | 15 +++++++++++++-- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/wa/framework/configuration/core.py b/wa/framework/configuration/core.py index 4dc94169..11595e83 100644 --- a/wa/framework/configuration/core.py +++ b/wa/framework/configuration/core.py @@ -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']) ########################## diff --git a/wa/framework/execution.py b/wa/framework/execution.py index 5697075c..77d66a63 100644 --- a/wa/framework/execution.py +++ b/wa/framework/execution.py @@ -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 diff --git a/wa/framework/run.py b/wa/framework/run.py index b5ca5979..50c35be5 100644 --- a/wa/framework/run.py +++ b/wa/framework/run.py @@ -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),