From 71d1a77250774c0743ce914ee785556ca8d28361 Mon Sep 17 00:00:00 2001
From: licanwei
Date: Fri, 2 Nov 2018 16:57:18 +0800
Subject: [PATCH] Fix create_audit failed
if actionplan is running, create_audit will fail, we retry 5 times
Closes-Bug: #1801295
Change-Id: I3d35735bb6557cddd370f54f657cd7eb5428b69f
---
.../tests/api/admin/base.py | 41 +++++++++++++++++--
.../tests/api/admin/test_audit.py | 2 +-
2 files changed, 38 insertions(+), 5 deletions(-)
diff --git a/watcher_tempest_plugin/tests/api/admin/base.py b/watcher_tempest_plugin/tests/api/admin/base.py
index 9b17b1c..6a508f9 100644
--- a/watcher_tempest_plugin/tests/api/admin/base.py
+++ b/watcher_tempest_plugin/tests/api/admin/base.py
@@ -176,10 +176,27 @@ class BaseInfraOptimTest(test.BaseTestCase):
:param parameters: list of execution parameters
:return: A tuple with The HTTP response and its body
"""
- resp, body = cls.client.create_audit(
- audit_template_uuid=audit_template_uuid, audit_type=audit_type,
- state=state, interval=interval, parameters=parameters, name=name)
+ # if actionplan is running, create_audit will fail, we retry 5 times.
+ retry = 5
+ audit_success = False
+ while not audit_success and retry:
+ resp, body = cls.client.create_audit(
+ audit_template_uuid=audit_template_uuid,
+ audit_type=audit_type, state=state, interval=interval,
+ parameters=parameters, name=name)
+ audit_uuid = body['uuid']
+ test_utils.call_until_true(
+ func=functools.partial(cls.has_audit_finished, audit_uuid),
+ duration=30,
+ sleep_for=2
+ )
+ if cls.has_audit_failed(audit_uuid):
+ audit_success = False
+ else:
+ audit_success = True
+ retry -= 1
+ assert audit_success
cls.created_audits.add(body['uuid'])
cls.created_action_plans_audit_uuids.add(body['uuid'])
@@ -205,6 +222,12 @@ class BaseInfraOptimTest(test.BaseTestCase):
:param audit_uuid: The unique identifier of the audit.
:return: the HTTP response
"""
+ _, audit = cls.client.show_audit(audit_uuid)
+ if audit.get('state') == 'ONGOING':
+ cls.update_audit(
+ audit_uuid,
+ [{'op': 'replace', 'path': '/state', 'value': 'CANCELLED'}]
+ )
resp, _ = cls.client.delete_audit(audit_uuid)
if audit_uuid in cls.created_audits:
@@ -220,7 +243,17 @@ class BaseInfraOptimTest(test.BaseTestCase):
@classmethod
def has_audit_finished(cls, audit_uuid):
_, audit = cls.client.show_audit(audit_uuid)
- return audit.get('state') in cls.FINISHED_STATES
+ finished_states = cls.FINISHED_STATES
+ if audit.get('audit_type') == 'CONTINUOUS':
+ finished_states += ('ONGOING',)
+ return audit.get('state') in finished_states
+
+ @classmethod
+ def has_audit_failed(cls, audit_uuid):
+ _, audit = cls.client.show_audit(audit_uuid)
+ return audit.get('state') in ('FAILED',
+ 'CANCELLED',
+ 'SUPERSEDED')
@classmethod
def is_audit_idle(cls, audit_uuid):
diff --git a/watcher_tempest_plugin/tests/api/admin/test_audit.py b/watcher_tempest_plugin/tests/api/admin/test_audit.py
index cbc6426..03a241e 100644
--- a/watcher_tempest_plugin/tests/api/admin/test_audit.py
+++ b/watcher_tempest_plugin/tests/api/admin/test_audit.py
@@ -32,7 +32,7 @@ class TestCreateUpdateDeleteAudit(base.BaseInfraOptimTest):
'CANCELLED', 'DELETED', 'PENDING', 'SUSPENDED']
def assert_expected(self, expected, actual,
- keys=('created_at', 'updated_at',
+ keys=('created_at', 'updated_at', 'next_run_time',
'deleted_at', 'state', 'hostname')):
super(TestCreateUpdateDeleteAudit, self).assert_expected(
expected, actual, keys)