From 3a29b4e710990cb11cc908a0742721f1fc8527df Mon Sep 17 00:00:00 2001 From: Hidekazu Nakamura Date: Thu, 27 Jul 2017 15:19:52 +0900 Subject: [PATCH] Fix continuous audit fails once it fails Currently continuous audit fails once it fails because continous audit tries to remove job even if job is not exists. This patch set fixes it. Change-Id: Ic461408c97d71e14c57e368f8436b26fe355fa4e Closes-Bug: #1706857 --- watcher/decision_engine/audit/continuous.py | 9 ++++---- .../audit/test_audit_handlers.py | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/watcher/decision_engine/audit/continuous.py b/watcher/decision_engine/audit/continuous.py index 2afcafe69..b6833ac19 100644 --- a/watcher/decision_engine/audit/continuous.py +++ b/watcher/decision_engine/audit/continuous.py @@ -62,10 +62,11 @@ class ContinuousAuditHandler(base.AuditHandler): if objects.audit.AuditStateTransitionManager().is_inactive(audit): # if audit isn't in active states, audit's job must be removed to # prevent using of inactive audit in future. - [job for job in self.scheduler.get_jobs() - if job.name == 'execute_audit' and - job.args[0].uuid == audit.uuid][0].remove() - return True + if self.scheduler.get_jobs(): + [job for job in self.scheduler.get_jobs() + if job.name == 'execute_audit' and + job.args[0].uuid == audit.uuid][0].remove() + return True return False diff --git a/watcher/tests/decision_engine/audit/test_audit_handlers.py b/watcher/tests/decision_engine/audit/test_audit_handlers.py index ed5ca9651..80ea326de 100644 --- a/watcher/tests/decision_engine/audit/test_audit_handlers.py +++ b/watcher/tests/decision_engine/audit/test_audit_handlers.py @@ -361,3 +361,26 @@ class TestContinuousAuditHandler(base.DbTestCase): self.assertTrue(is_inactive) is_inactive = audit_handler._is_audit_inactive(self.audits[0]) self.assertTrue(is_inactive) + + @mock.patch.object(objects.service.Service, 'list') + @mock.patch.object(sq_api, 'get_engine') + @mock.patch.object(scheduling.BackgroundSchedulerService, 'get_jobs') + @mock.patch.object(objects.audit.AuditStateTransitionManager, + 'is_inactive') + @mock.patch.object(continuous.ContinuousAuditHandler, 'execute') + def test_execute_audit_with_interval_no_job( + self, + m_execute, + m_is_inactive, + m_get_jobs, + m_get_engine, + m_service): + audit_handler = continuous.ContinuousAuditHandler() + self.audits[0].next_run_time = (datetime.datetime.now() - + datetime.timedelta(seconds=1800)) + m_is_inactive.return_value = True + m_get_jobs.return_value = None + + audit_handler.execute_audit(self.audits[0], self.context) + m_execute.assert_called_once_with(self.audits[0], self.context) + self.assertIsNotNone(self.audits[0].next_run_time)