From dc41af1f3fe81dd77ff8ed5f8e21041cc1e7713b Mon Sep 17 00:00:00 2001 From: Marc Bonnici Date: Tue, 22 May 2018 17:45:59 +0100 Subject: [PATCH] framework/tm: Ensure RebootPolicy is respected with unresponsive target Expose the RebootPolicy as an attribute of the ExectionContext and ensure that that the target is not automatically rebooted if the reboot policy is set to "Never". --- wa/framework/execution.py | 12 ++++++++---- wa/framework/instrument.py | 2 +- wa/framework/target/manager.py | 6 ++++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/wa/framework/execution.py b/wa/framework/execution.py index da2c304c..96c8b3cb 100644 --- a/wa/framework/execution.py +++ b/wa/framework/execution.py @@ -85,6 +85,10 @@ class ExecutionContext(object): def output_directory(self): return self.output.basepath + @property + def reboot_policy(self): + return self.cm.run_config.reboot_policy + def __init__(self, cm, tm, output): self.logger = logging.getLogger('context') self.cm = cm @@ -486,7 +490,7 @@ class Runner(object): if isinstance(e, TargetNotRespondingError): raise e elif isinstance(e, TargetError): - context.tm.verify_target_responsive() + context.tm.verify_target_responsive(context.reboot_policy.can_reboot) finally: self.logger.info('Completing job {}'.format(job.id)) self.send(signal.JOB_COMPLETED) @@ -518,7 +522,7 @@ class Runner(object): job.set_status(Status.FAILED) log.log_error(e, self.logger) if isinstance(e, TargetError) or isinstance(e, TimeoutError): - context.tm.verify_target_responsive() + context.tm.verify_target_responsive(context.reboot_policy.can_reboot) self.context.record_ui_state('setup-error') raise e @@ -535,7 +539,7 @@ class Runner(object): job.set_status(Status.FAILED) log.log_error(e, self.logger) if isinstance(e, TargetError) or isinstance(e, TimeoutError): - context.tm.verify_target_responsive() + context.tm.verify_target_responsive(context.reboot_policy.can_reboot) self.context.record_ui_state('run-error') raise e finally: @@ -547,7 +551,7 @@ class Runner(object): except Exception as e: job.set_status(Status.PARTIAL) if isinstance(e, TargetError) or isinstance(e, TimeoutError): - context.tm.verify_target_responsive() + context.tm.verify_target_responsive(context.reboot_policy.can_reboot) self.context.record_ui_state('output-error') raise diff --git a/wa/framework/instrument.py b/wa/framework/instrument.py index 7d5c3d8d..38c024ec 100644 --- a/wa/framework/instrument.py +++ b/wa/framework/instrument.py @@ -278,7 +278,7 @@ class ManagedCallback(object): if isinstance(e, WorkloadError): context.set_status('FAILED') elif isinstance(e, TargetError) or isinstance(e, TimeoutError): - context.tm.verify_target_responsive() + context.tm.verify_target_responsive(context.reboot_policy.can_reboot) else: if context.current_job: context.set_status('PARTIAL') diff --git a/wa/framework/target/manager.py b/wa/framework/target/manager.py index fa231f7c..3ebc1dbc 100644 --- a/wa/framework/target/manager.py +++ b/wa/framework/target/manager.py @@ -83,10 +83,12 @@ class TargetManager(object): def commit_runtime_parameters(self, parameters): self.rpm.commit_runtime_parameters(parameters) - def verify_target_responsive(self): + def verify_target_responsive(self, can_reboot=True): if not self.target.check_responsive(explode=False): self.is_responsive = False - if self.target.has('hard_reset'): + if not can_reboot: + raise TargetNotRespondingError('Target unresponsive and is not allowed to reboot.') + elif self.target.has('hard_reset'): self.logger.info('Target unresponsive; performing hard reset') self.target.reboot(hard=True) self.is_responsive = True