Merge "Fix multinode tempest test failure"
This commit is contained in:
commit
547bf0529f
|
@ -213,6 +213,18 @@ class InfraOptimClientJSON(base.BaseInfraOptimClient):
|
|||
|
||||
return self._patch_request('/action_plans', action_plan_uuid, patch)
|
||||
|
||||
@base.handle_errors
|
||||
def start_action_plan(self, action_plan_uuid):
|
||||
"""Start the specified action plan
|
||||
|
||||
:param action_plan_uuid: The unique identifier of the action_plan
|
||||
:return: Tuple with the server response and the updated action_plan
|
||||
"""
|
||||
|
||||
return self._patch_request(
|
||||
'/action_plans', action_plan_uuid,
|
||||
[{'path': '/state', 'op': 'replace', 'value': 'PENDING'}])
|
||||
|
||||
# ### GOALS ### #
|
||||
|
||||
@base.handle_errors
|
||||
|
|
|
@ -214,7 +214,7 @@ class BaseInfraOptimTest(test.BaseTestCase):
|
|||
audit_uuid = audit['uuid']
|
||||
|
||||
assert test.call_until_true(
|
||||
func=functools.partial(cls.has_audit_succeeded, audit_uuid),
|
||||
func=functools.partial(cls.has_audit_finished, audit_uuid),
|
||||
duration=30,
|
||||
sleep_for=.5
|
||||
)
|
||||
|
|
|
@ -35,7 +35,7 @@ class TestShowListAction(base.BaseInfraOptimTest):
|
|||
_, cls.audit = cls.create_audit(cls.audit_template['uuid'])
|
||||
|
||||
assert test.call_until_true(
|
||||
func=functools.partial(cls.has_audit_succeeded, cls.audit['uuid']),
|
||||
func=functools.partial(cls.has_audit_finished, cls.audit['uuid']),
|
||||
duration=30,
|
||||
sleep_for=.5
|
||||
)
|
||||
|
@ -45,19 +45,23 @@ class TestShowListAction(base.BaseInfraOptimTest):
|
|||
|
||||
@test.attr(type='smoke')
|
||||
def test_show_one_action(self):
|
||||
_, action_uuid = self.client.list_actions(
|
||||
action_plan_uuid=self.action_plan['uuid'])['actions'][0]['uuid']
|
||||
_, action = self.client.show_action(action_uuid)
|
||||
_, body = self.client.list_actions(
|
||||
action_plan_uuid=self.action_plan["uuid"])
|
||||
actions = body['actions']
|
||||
|
||||
self.assertEqual(action_uuid, action['uuid'])
|
||||
self.assertEqual("nop", action['action_type'])
|
||||
_, action = self.client.show_action(actions[0]["uuid"])
|
||||
|
||||
self.assertEqual(self.action_plan["uuid"], action['action_plan_uuid'])
|
||||
self.assertEqual("PENDING", action['state'])
|
||||
|
||||
@test.attr(type='smoke')
|
||||
def test_show_action_with_links(self):
|
||||
_, action_uuid = self.client.list_actions(
|
||||
action_plan_uuid=self.action_plan['uuid'])['actions'][0]['uuid']
|
||||
_, action = self.client.show_action(action_uuid)
|
||||
_, body = self.client.list_actions(
|
||||
action_plan_uuid=self.action_plan["uuid"])
|
||||
actions = body['actions']
|
||||
|
||||
_, action = self.client.show_action(actions[0]["uuid"])
|
||||
|
||||
self.assertIn('links', action.keys())
|
||||
self.assertEqual(2, len(action['links']))
|
||||
self.assertIn(action['uuid'], action['links'][0]['href'])
|
||||
|
|
|
@ -29,12 +29,12 @@ class TestCreateDeleteExecuteActionPlan(base.BaseInfraOptimTest):
|
|||
|
||||
@test.attr(type='smoke')
|
||||
def test_create_action_plan(self):
|
||||
_, goal = self.client.show_goal("DUMMY")
|
||||
_, goal = self.client.show_goal("dummy")
|
||||
_, audit_template = self.create_audit_template(goal['uuid'])
|
||||
_, audit = self.create_audit(audit_template['uuid'])
|
||||
|
||||
self.assertTrue(test.call_until_true(
|
||||
func=functools.partial(self.has_audit_succeeded, audit['uuid']),
|
||||
func=functools.partial(self.has_audit_finished, audit['uuid']),
|
||||
duration=30,
|
||||
sleep_for=.5
|
||||
))
|
||||
|
@ -49,12 +49,12 @@ class TestCreateDeleteExecuteActionPlan(base.BaseInfraOptimTest):
|
|||
|
||||
@test.attr(type='smoke')
|
||||
def test_delete_action_plan(self):
|
||||
_, goal = self.client.show_goal("DUMMY")
|
||||
_, goal = self.client.show_goal("dummy")
|
||||
_, audit_template = self.create_audit_template(goal['uuid'])
|
||||
_, audit = self.create_audit(audit_template['uuid'])
|
||||
|
||||
self.assertTrue(test.call_until_true(
|
||||
func=functools.partial(self.has_audit_succeeded, audit['uuid']),
|
||||
func=functools.partial(self.has_audit_finished, audit['uuid']),
|
||||
duration=30,
|
||||
sleep_for=.5
|
||||
))
|
||||
|
@ -71,12 +71,12 @@ class TestCreateDeleteExecuteActionPlan(base.BaseInfraOptimTest):
|
|||
|
||||
@test.attr(type='smoke')
|
||||
def test_execute_dummy_action_plan(self):
|
||||
_, goal = self.client.show_goal("DUMMY")
|
||||
_, goal = self.client.show_goal("dummy")
|
||||
_, audit_template = self.create_audit_template(goal['uuid'])
|
||||
_, audit = self.create_audit(audit_template['uuid'])
|
||||
|
||||
self.assertTrue(test.call_until_true(
|
||||
func=functools.partial(self.has_audit_succeeded, audit['uuid']),
|
||||
func=functools.partial(self.has_audit_finished, audit['uuid']),
|
||||
duration=30,
|
||||
sleep_for=.5
|
||||
))
|
||||
|
@ -86,11 +86,13 @@ class TestCreateDeleteExecuteActionPlan(base.BaseInfraOptimTest):
|
|||
|
||||
_, action_plan = self.client.show_action_plan(action_plan['uuid'])
|
||||
|
||||
if action_plan['state'] in ['SUPERSEDED', 'SUCCEEDED']:
|
||||
# This means the action plan is superseded so we cannot trigger it,
|
||||
# or it is empty.
|
||||
return
|
||||
|
||||
# Execute the action by changing its state to PENDING
|
||||
_, updated_ap = self.client.update_action_plan(
|
||||
action_plan['uuid'],
|
||||
patch=[{'path': '/state', 'op': 'replace', 'value': 'PENDING'}]
|
||||
)
|
||||
_, updated_ap = self.client.start_action_plan(action_plan['uuid'])
|
||||
|
||||
self.assertTrue(test.call_until_true(
|
||||
func=functools.partial(
|
||||
|
@ -110,12 +112,12 @@ class TestShowListActionPlan(base.BaseInfraOptimTest):
|
|||
@classmethod
|
||||
def resource_setup(cls):
|
||||
super(TestShowListActionPlan, cls).resource_setup()
|
||||
_, cls.goal = cls.client.show_goal("DUMMY")
|
||||
_, cls.goal = cls.client.show_goal("dummy")
|
||||
_, cls.audit_template = cls.create_audit_template(cls.goal['uuid'])
|
||||
_, cls.audit = cls.create_audit(cls.audit_template['uuid'])
|
||||
|
||||
assert test.call_until_true(
|
||||
func=functools.partial(cls.has_audit_succeeded, cls.audit['uuid']),
|
||||
func=functools.partial(cls.has_audit_finished, cls.audit['uuid']),
|
||||
duration=30,
|
||||
sleep_for=.5
|
||||
)
|
||||
|
|
|
@ -38,7 +38,7 @@ class TestCreateUpdateDeleteAudit(base.BaseInfraOptimTest):
|
|||
|
||||
@test.attr(type='smoke')
|
||||
def test_create_audit_oneshot(self):
|
||||
_, goal = self.client.show_goal("DUMMY")
|
||||
_, goal = self.client.show_goal("dummy")
|
||||
_, audit_template = self.create_audit_template(goal['uuid'])
|
||||
|
||||
audit_params = dict(
|
||||
|
@ -56,7 +56,7 @@ class TestCreateUpdateDeleteAudit(base.BaseInfraOptimTest):
|
|||
|
||||
@test.attr(type='smoke')
|
||||
def test_create_audit_continuous(self):
|
||||
_, goal = self.client.show_goal("DUMMY")
|
||||
_, goal = self.client.show_goal("dummy")
|
||||
_, audit_template = self.create_audit_template(goal['uuid'])
|
||||
|
||||
audit_params = dict(
|
||||
|
@ -85,7 +85,7 @@ class TestCreateUpdateDeleteAudit(base.BaseInfraOptimTest):
|
|||
|
||||
@test.attr(type='smoke')
|
||||
def test_create_audit_with_invalid_state(self):
|
||||
_, goal = self.client.show_goal("DUMMY")
|
||||
_, goal = self.client.show_goal("dummy")
|
||||
_, audit_template = self.create_audit_template(goal['uuid'])
|
||||
|
||||
audit_params = dict(
|
||||
|
@ -98,7 +98,7 @@ class TestCreateUpdateDeleteAudit(base.BaseInfraOptimTest):
|
|||
|
||||
@test.attr(type='smoke')
|
||||
def test_create_audit_with_no_state(self):
|
||||
_, goal = self.client.show_goal("DUMMY")
|
||||
_, goal = self.client.show_goal("dummy")
|
||||
_, audit_template = self.create_audit_template(goal['uuid'])
|
||||
|
||||
audit_params = dict(
|
||||
|
@ -120,7 +120,7 @@ class TestCreateUpdateDeleteAudit(base.BaseInfraOptimTest):
|
|||
|
||||
@test.attr(type='smoke')
|
||||
def test_delete_audit(self):
|
||||
_, goal = self.client.show_goal("DUMMY")
|
||||
_, goal = self.client.show_goal("dummy")
|
||||
_, audit_template = self.create_audit_template(goal['uuid'])
|
||||
_, body = self.create_audit(audit_template['uuid'])
|
||||
audit_uuid = body['uuid']
|
||||
|
@ -158,7 +158,7 @@ class TestShowListAudit(base.BaseInfraOptimTest):
|
|||
@classmethod
|
||||
def resource_setup(cls):
|
||||
super(TestShowListAudit, cls).resource_setup()
|
||||
_, cls.goal = cls.client.show_goal("DUMMY")
|
||||
_, cls.goal = cls.client.show_goal("dummy")
|
||||
_, cls.audit_template = cls.create_audit_template(cls.goal['uuid'])
|
||||
_, cls.audit = cls.create_audit(cls.audit_template['uuid'])
|
||||
|
||||
|
|
|
@ -36,6 +36,11 @@ CONF = config.CONF
|
|||
class BaseInfraOptimScenarioTest(manager.ScenarioTest):
|
||||
"""Base class for Infrastructure Optimization API tests."""
|
||||
|
||||
# States where the object is waiting for some event to perform a transition
|
||||
IDLE_STATES = ('RECOMMENDED', 'FAILED', 'SUCCEEDED', 'CANCELLED')
|
||||
# States where the object can only be DELETED (end of its life-cycle)
|
||||
FINISHED_STATES = ('FAILED', 'SUCCEEDED', 'CANCELLED', 'SUPERSEDED')
|
||||
|
||||
@classmethod
|
||||
def setup_credentials(cls):
|
||||
cls._check_network_config()
|
||||
|
@ -142,6 +147,11 @@ class BaseInfraOptimScenarioTest(manager.ScenarioTest):
|
|||
|
||||
return audit.get('state') == 'SUCCEEDED'
|
||||
|
||||
@classmethod
|
||||
def has_audit_finished(cls, audit_uuid):
|
||||
_, audit = cls.client.show_audit(audit_uuid)
|
||||
return audit.get('state') in cls.FINISHED_STATES
|
||||
|
||||
# ### ACTION PLANS ### #
|
||||
|
||||
def delete_action_plan(self, action_plan_uuid):
|
||||
|
|
|
@ -148,24 +148,31 @@ class TestExecuteBasicStrategy(base.BaseInfraOptimScenarioTest):
|
|||
try:
|
||||
self.assertTrue(test.call_until_true(
|
||||
func=functools.partial(
|
||||
self.has_audit_succeeded, audit['uuid']),
|
||||
self.has_audit_finished, audit['uuid']),
|
||||
duration=600,
|
||||
sleep_for=2
|
||||
))
|
||||
except ValueError:
|
||||
self.fail("The audit has failed!")
|
||||
|
||||
_, finished_audit = self.client.show_audit(audit['uuid'])
|
||||
if finished_audit.get('state') in ('FAILED', 'CANCELLED'):
|
||||
self.fail("The audit ended in unexpected state: %s!",
|
||||
finished_audit.get('state'))
|
||||
|
||||
_, action_plans = self.client.list_action_plans(
|
||||
audit_uuid=audit['uuid'])
|
||||
action_plan = action_plans['action_plans'][0]
|
||||
|
||||
_, action_plan = self.client.show_action_plan(action_plan['uuid'])
|
||||
|
||||
if action_plan['state'] in ('SUPERSEDED', 'SUCCEEDED'):
|
||||
# This means the action plan is superseded so we cannot trigger it,
|
||||
# or it is empty.
|
||||
return
|
||||
|
||||
# Execute the action by changing its state to PENDING
|
||||
_, updated_ap = self.client.update_action_plan(
|
||||
action_plan['uuid'],
|
||||
patch=[{'path': '/state', 'op': 'replace', 'value': 'PENDING'}]
|
||||
)
|
||||
_, updated_ap = self.client.start_action_plan(action_plan['uuid'])
|
||||
|
||||
self.assertTrue(test.call_until_true(
|
||||
func=functools.partial(
|
||||
|
|
|
@ -42,21 +42,26 @@ class TestExecuteDummyStrategy(base.BaseInfraOptimScenarioTest):
|
|||
_, audit = self.create_audit(audit_template['uuid'])
|
||||
|
||||
self.assertTrue(test.call_until_true(
|
||||
func=functools.partial(self.has_audit_succeeded, audit['uuid']),
|
||||
func=functools.partial(self.has_audit_finished, audit['uuid']),
|
||||
duration=30,
|
||||
sleep_for=.5
|
||||
))
|
||||
|
||||
self.assertTrue(self.has_audit_succeeded(audit['uuid']))
|
||||
|
||||
_, action_plans = self.client.list_action_plans(
|
||||
audit_uuid=audit['uuid'])
|
||||
action_plan = action_plans['action_plans'][0]
|
||||
|
||||
_, action_plan = self.client.show_action_plan(action_plan['uuid'])
|
||||
|
||||
if action_plan['state'] in ['SUPERSEDED', 'SUCCEEDED']:
|
||||
# This means the action plan is superseded so we cannot trigger it,
|
||||
# or it is empty.
|
||||
return
|
||||
|
||||
# Execute the action by changing its state to PENDING
|
||||
_, updated_ap = self.client.update_action_plan(
|
||||
action_plan['uuid'],
|
||||
patch=[{'path': '/state', 'op': 'replace', 'value': 'PENDING'}]
|
||||
)
|
||||
_, updated_ap = self.client.start_action_plan(action_plan['uuid'])
|
||||
|
||||
self.assertTrue(test.call_until_true(
|
||||
func=functools.partial(
|
||||
|
|
Loading…
Reference in New Issue