From 4022714f5d5981c70f7569bf73505bef2221e0ae 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
---
watcher/decision_engine/audit/continuous.py | 9 +++++----
.../audit/test_audit_handlers.py | 20 +++++++++++++++++++
2 files changed, 25 insertions(+), 4 deletions(-)
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)