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)