Added suspended audit state
New audit state SUSPENDED is added in this patch set. If audit state with continuous mode is changed from ONGOING to SUSPENDED, audit's job is removed and the audit is not executed. If audit state changed from SUSPENDED to ONGOING in reverse, audit is executed again periodically. Change-Id: I32257f56a40c0352a7c24f3fb80ad95ec28dc614 Implements: blueprint suspended-audit-state
This commit is contained in:
@@ -345,23 +345,10 @@ class TestPatch(api_base.FunctionalTest):
|
||||
|
||||
|
||||
ALLOWED_TRANSITIONS = [
|
||||
{"original_state": objects.audit.State.PENDING,
|
||||
"new_state": objects.audit.State.ONGOING},
|
||||
{"original_state": objects.audit.State.PENDING,
|
||||
"new_state": objects.audit.State.CANCELLED},
|
||||
{"original_state": objects.audit.State.ONGOING,
|
||||
"new_state": objects.audit.State.FAILED},
|
||||
{"original_state": objects.audit.State.ONGOING,
|
||||
"new_state": objects.audit.State.SUCCEEDED},
|
||||
{"original_state": objects.audit.State.ONGOING,
|
||||
"new_state": objects.audit.State.CANCELLED},
|
||||
{"original_state": objects.audit.State.FAILED,
|
||||
"new_state": objects.audit.State.DELETED},
|
||||
{"original_state": objects.audit.State.SUCCEEDED,
|
||||
"new_state": objects.audit.State.DELETED},
|
||||
{"original_state": objects.audit.State.CANCELLED,
|
||||
"new_state": objects.audit.State.DELETED},
|
||||
]
|
||||
{"original_state": key, "new_state": value}
|
||||
for key, values in (
|
||||
objects.audit.AuditStateTransitionManager.TRANSITIONS.items())
|
||||
for value in values]
|
||||
|
||||
|
||||
class TestPatchStateTransitionDenied(api_base.FunctionalTest):
|
||||
|
||||
@@ -53,6 +53,10 @@ class TestDbAuditFilters(base.DbTestCase):
|
||||
self.audit3 = utils.create_test_audit(
|
||||
audit_template_id=self.audit_template.id, id=3, uuid=None,
|
||||
state=objects.audit.State.CANCELLED)
|
||||
with freezegun.freeze_time(self.FAKE_OLDER_DATE):
|
||||
self.audit4 = utils.create_test_audit(
|
||||
audit_template_id=self.audit_template.id, id=4, uuid=None,
|
||||
state=objects.audit.State.SUSPENDED)
|
||||
|
||||
def _soft_delete_audits(self):
|
||||
with freezegun.freeze_time(self.FAKE_TODAY):
|
||||
@@ -92,8 +96,9 @@ class TestDbAuditFilters(base.DbTestCase):
|
||||
res = self.dbapi.get_audit_list(
|
||||
self.context, filters={'deleted': False})
|
||||
|
||||
self.assertEqual([self.audit2['id'], self.audit3['id']],
|
||||
[r.id for r in res])
|
||||
self.assertEqual(
|
||||
[self.audit2['id'], self.audit3['id'], self.audit4['id']],
|
||||
[r.id for r in res])
|
||||
|
||||
def test_get_audit_list_filter_deleted_at_eq(self):
|
||||
self._soft_delete_audits()
|
||||
@@ -154,7 +159,7 @@ class TestDbAuditFilters(base.DbTestCase):
|
||||
self.context, filters={'created_at__lt': self.FAKE_TODAY})
|
||||
|
||||
self.assertEqual(
|
||||
[self.audit2['id'], self.audit3['id']],
|
||||
[self.audit2['id'], self.audit3['id'], self.audit4['id']],
|
||||
[r.id for r in res])
|
||||
|
||||
def test_get_audit_list_filter_created_at_lte(self):
|
||||
@@ -162,7 +167,7 @@ class TestDbAuditFilters(base.DbTestCase):
|
||||
self.context, filters={'created_at__lte': self.FAKE_OLD_DATE})
|
||||
|
||||
self.assertEqual(
|
||||
[self.audit2['id'], self.audit3['id']],
|
||||
[self.audit2['id'], self.audit3['id'], self.audit4['id']],
|
||||
[r.id for r in res])
|
||||
|
||||
def test_get_audit_list_filter_created_at_gt(self):
|
||||
@@ -230,18 +235,22 @@ class TestDbAuditFilters(base.DbTestCase):
|
||||
def test_get_audit_list_filter_state_in(self):
|
||||
res = self.dbapi.get_audit_list(
|
||||
self.context,
|
||||
filters={'state__in': (objects.audit.State.FAILED,
|
||||
objects.audit.State.CANCELLED)})
|
||||
filters={
|
||||
'state__in':
|
||||
objects.audit.AuditStateTransitionManager.INACTIVE_STATES
|
||||
})
|
||||
|
||||
self.assertEqual(
|
||||
[self.audit2['id'], self.audit3['id']],
|
||||
[self.audit2['id'], self.audit3['id'], self.audit4['id']],
|
||||
[r.id for r in res])
|
||||
|
||||
def test_get_audit_list_filter_state_notin(self):
|
||||
res = self.dbapi.get_audit_list(
|
||||
self.context,
|
||||
filters={'state__notin': (objects.audit.State.FAILED,
|
||||
objects.audit.State.CANCELLED)})
|
||||
filters={
|
||||
'state__notin':
|
||||
objects.audit.AuditStateTransitionManager.INACTIVE_STATES
|
||||
})
|
||||
|
||||
self.assertEqual(
|
||||
[self.audit1['id']],
|
||||
|
||||
@@ -274,16 +274,18 @@ class TestContinuousAuditHandler(base.DbTestCase):
|
||||
audit_handler = continuous.ContinuousAuditHandler(mock.MagicMock())
|
||||
mock_list.return_value = self.audits
|
||||
mock_jobs.return_value = mock.MagicMock()
|
||||
self.audits[1].state = objects.audit.State.CANCELLED
|
||||
calls = [mock.call(audit_handler.execute_audit, 'interval',
|
||||
args=[mock.ANY, mock.ANY],
|
||||
seconds=3600,
|
||||
name='execute_audit',
|
||||
next_run_time=mock.ANY)]
|
||||
audit_handler.launch_audits_periodically()
|
||||
m_add_job.assert_has_calls(calls)
|
||||
|
||||
audit_handler.update_audit_state(self.audits[1],
|
||||
objects.audit.State.CANCELLED)
|
||||
is_inactive = audit_handler._is_audit_inactive(self.audits[1])
|
||||
for state in [objects.audit.State.CANCELLED,
|
||||
objects.audit.State.SUSPENDED]:
|
||||
self.audits[1].state = state
|
||||
calls = [mock.call(audit_handler.execute_audit, 'interval',
|
||||
args=[mock.ANY, mock.ANY],
|
||||
seconds=3600,
|
||||
name='execute_audit',
|
||||
next_run_time=mock.ANY)]
|
||||
audit_handler.launch_audits_periodically()
|
||||
m_add_job.assert_has_calls(calls)
|
||||
|
||||
audit_handler.update_audit_state(self.audits[1], state)
|
||||
is_inactive = audit_handler._is_audit_inactive(self.audits[1])
|
||||
self.assertTrue(is_inactive)
|
||||
|
||||
Reference in New Issue
Block a user