diff --git a/watcher/decision_engine/audit/continuous.py b/watcher/decision_engine/audit/continuous.py index aa5a34fcf..ed942f0d3 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. - 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() + 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 93834f719..1e3f2aa4f 100644 --- a/watcher/tests/decision_engine/audit/test_audit_handlers.py +++ b/watcher/tests/decision_engine/audit/test_audit_handlers.py @@ -446,3 +446,23 @@ class TestContinuousAuditHandler(base.DbTestCase): self.assertEqual( expected_calls, self.m_audit_notifications.send_action_notification.call_args_list) + + @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)