From 343a65952a04eee526c1a88a1282b3f8da6ec750 Mon Sep 17 00:00:00 2001 From: licanwei Date: Fri, 20 Jul 2018 03:07:59 -0700 Subject: [PATCH] Check job before removing it Change-Id: Ibbd4da25fac6016a0d76c8f810ac567f6fd075f1 Closes-Bug: #1782731 (cherry picked from commit 4022714f5d5981c70f7569bf73505bef2221e0ae) --- watcher/decision_engine/audit/continuous.py | 11 +++++---- .../audit/test_audit_handlers.py | 23 +++++++++++++++++-- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/watcher/decision_engine/audit/continuous.py b/watcher/decision_engine/audit/continuous.py index b6833ac19..57fd88f05 100644 --- a/watcher/decision_engine/audit/continuous.py +++ b/watcher/decision_engine/audit/continuous.py @@ -62,11 +62,12 @@ 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. - 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 + jobs = [job for job in self.scheduler.get_jobs() + if job.name == 'execute_audit' and + job.args[0].uuid == audit.uuid] + if jobs: + jobs[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 80ea326de..419370618 100644 --- a/watcher/tests/decision_engine/audit/test_audit_handlers.py +++ b/watcher/tests/decision_engine/audit/test_audit_handlers.py @@ -379,8 +379,27 @@ class TestContinuousAuditHandler(base.DbTestCase): 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 + m_get_jobs.return_value = [] 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) + + @mock.patch.object(scheduling.BackgroundSchedulerService, 'get_jobs') + def test_is_audit_inactive(self, mock_jobs): + audit_handler = continuous.ContinuousAuditHandler() + mock_jobs.return_value = mock.MagicMock() + audit_handler._scheduler = mock.MagicMock() + + ap_jobs = [job.Job(mock.MagicMock(), name='execute_audit', + func=audit_handler.execute_audit, + args=(self.audits[0], mock.MagicMock()), + kwargs={}), + ] + + audit_handler.update_audit_state(self.audits[1], + objects.audit.State.CANCELLED) + mock_jobs.return_value = ap_jobs + is_inactive = audit_handler._is_audit_inactive(self.audits[1]) + self.assertTrue(is_inactive) + is_inactive = audit_handler._is_audit_inactive(self.audits[0]) + self.assertFalse(is_inactive)