From e4d89ca14369ea47218690ba4d621692efc69c04 Mon Sep 17 00:00:00 2001
From: licanwei
Date: Thu, 30 May 2019 17:37:45 +0800
Subject: [PATCH] Add execute_strategy method in base class
To improve strategy tempest, add execute_strategy methon in base,
then all strategy tempest can invoke it.
Change-Id: I013725bc387974ca06946ef83cb9ed92704ac3b1
---
watcher_tempest_plugin/tests/scenario/base.py | 76 +++++++++++++++++++
1 file changed, 76 insertions(+)
diff --git a/watcher_tempest_plugin/tests/scenario/base.py b/watcher_tempest_plugin/tests/scenario/base.py
index e001f45..17e6fa2 100644
--- a/watcher_tempest_plugin/tests/scenario/base.py
+++ b/watcher_tempest_plugin/tests/scenario/base.py
@@ -435,3 +435,79 @@ class BaseInfraOptimScenarioTest(manager.ScenarioTest):
if action_plan.get('state') not in self.AP_FINISHED_STATES:
return False
return True
+
+ def execute_strategy(self, goal_name, strategy_name, **audit_kwargs):
+ """Execute an action plan based on the specific strategy
+
+ - create an audit template with the specific strategy
+ - run the audit to create an action plan
+ - get the action plan
+ - run the action plan
+ - get results and make sure it succeeded
+ """
+ _, goal = self.client.show_goal(goal_name)
+ _, strategy = self.client.show_strategy(strategy_name)
+ _, audit_template = self.create_audit_template(
+ goal['uuid'], strategy=strategy['uuid'])
+
+ self.assertTrue(test_utils.call_until_true(
+ func=functools.partial(
+ self.has_action_plans_finished),
+ duration=600,
+ sleep_for=2
+ ))
+
+ audit_type = audit_kwargs.pop('audit_type', 'ONESHOT')
+ state = audit_kwargs.pop('state', None)
+ interval = audit_kwargs.pop('interval', None)
+ parameters = audit_kwargs.pop('parameters', None)
+ _, audit = self.create_audit(
+ audit_template['uuid'],
+ audit_type=audit_type,
+ state=state,
+ interval=interval,
+ parameters=parameters)
+
+ try:
+ self.assertTrue(test_utils.call_until_true(
+ func=functools.partial(
+ 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', 'SUSPENDED'):
+ 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.start_action_plan(action_plan['uuid'])
+
+ self.assertTrue(test_utils.call_until_true(
+ func=functools.partial(
+ self.has_action_plan_finished, action_plan['uuid']),
+ duration=600,
+ sleep_for=2
+ ))
+ _, finished_ap = self.client.show_action_plan(action_plan['uuid'])
+ _, action_list = self.client.list_actions(
+ action_plan_uuid=finished_ap["uuid"])
+ self.assertIn(updated_ap['state'], ('PENDING', 'ONGOING'))
+ self.assertIn(finished_ap['state'], ('SUCCEEDED', 'SUPERSEDED'))
+
+ for action in action_list['actions']:
+ self.assertEqual('SUCCEEDED', action.get('state'))