Merge "Optimize audit process"
This commit is contained in:
@@ -267,9 +267,7 @@ class ActionPlanReferenced(Invalid):
|
|||||||
|
|
||||||
|
|
||||||
class ActionPlanIsOngoing(Conflict):
|
class ActionPlanIsOngoing(Conflict):
|
||||||
msg_fmt = _("Action Plan %(action_plan)s is currently running. "
|
msg_fmt = _("Action Plan %(action_plan)s is currently running.")
|
||||||
"New Action Plan %(new_action_plan)s will be set as "
|
|
||||||
"SUPERSEDED")
|
|
||||||
|
|
||||||
|
|
||||||
class ActionNotFound(ResourceNotFound):
|
class ActionNotFound(ResourceNotFound):
|
||||||
|
@@ -102,23 +102,24 @@ class AuditHandler(BaseAuditHandler):
|
|||||||
audit.state = state
|
audit.state = state
|
||||||
audit.save()
|
audit.save()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def check_ongoing_action_plans(request_context):
|
||||||
|
a_plan_filters = {'state': objects.action_plan.State.ONGOING}
|
||||||
|
ongoing_action_plans = objects.ActionPlan.list(
|
||||||
|
request_context, filters=a_plan_filters)
|
||||||
|
if ongoing_action_plans:
|
||||||
|
raise exception.ActionPlanIsOngoing(
|
||||||
|
action_plan=ongoing_action_plans[0].uuid)
|
||||||
|
|
||||||
def pre_execute(self, audit, request_context):
|
def pre_execute(self, audit, request_context):
|
||||||
LOG.debug("Trigger audit %s", audit.uuid)
|
LOG.debug("Trigger audit %s", audit.uuid)
|
||||||
|
self.check_ongoing_action_plans(request_context)
|
||||||
# change state of the audit to ONGOING
|
# change state of the audit to ONGOING
|
||||||
self.update_audit_state(audit, objects.audit.State.ONGOING)
|
self.update_audit_state(audit, objects.audit.State.ONGOING)
|
||||||
|
|
||||||
def post_execute(self, audit, solution, request_context):
|
def post_execute(self, audit, solution, request_context):
|
||||||
action_plan = self.do_schedule(request_context, audit, solution)
|
action_plan = self.do_schedule(request_context, audit, solution)
|
||||||
a_plan_filters = {'state': objects.action_plan.State.ONGOING}
|
if audit.auto_trigger:
|
||||||
ongoing_action_plans = objects.ActionPlan.list(
|
|
||||||
request_context, filters=a_plan_filters)
|
|
||||||
if ongoing_action_plans:
|
|
||||||
action_plan.state = objects.action_plan.State.SUPERSEDED
|
|
||||||
action_plan.save()
|
|
||||||
raise exception.ActionPlanIsOngoing(
|
|
||||||
action_plan=ongoing_action_plans[0].uuid,
|
|
||||||
new_action_plan=action_plan.uuid)
|
|
||||||
elif audit.auto_trigger:
|
|
||||||
applier_client = rpcapi.ApplierAPI()
|
applier_client = rpcapi.ApplierAPI()
|
||||||
applier_client.launch_action_plan(request_context,
|
applier_client.launch_action_plan(request_context,
|
||||||
action_plan.uuid)
|
action_plan.uuid)
|
||||||
|
@@ -19,7 +19,6 @@ import mock
|
|||||||
from oslo_utils import uuidutils
|
from oslo_utils import uuidutils
|
||||||
|
|
||||||
from watcher.applier import rpcapi
|
from watcher.applier import rpcapi
|
||||||
from watcher.common import exception
|
|
||||||
from watcher.decision_engine.audit import continuous
|
from watcher.decision_engine.audit import continuous
|
||||||
from watcher.decision_engine.audit import oneshot
|
from watcher.decision_engine.audit import oneshot
|
||||||
from watcher.decision_engine.model.collector import manager
|
from watcher.decision_engine.model.collector import manager
|
||||||
@@ -190,16 +189,14 @@ class TestAutoTriggerActionPlan(base.DbTestCase):
|
|||||||
strategy=self.strategy,
|
strategy=self.strategy,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@mock.patch.object(oneshot.OneShotAuditHandler, 'do_execute')
|
||||||
@mock.patch.object(objects.action_plan.ActionPlan, 'list')
|
@mock.patch.object(objects.action_plan.ActionPlan, 'list')
|
||||||
@mock.patch.object(objects.audit.Audit, 'get_by_id')
|
def test_trigger_audit_with_actionplan_ongoing(self, mock_list,
|
||||||
def test_trigger_action_plan_with_ongoing(self, mock_get_by_id, mock_list):
|
mock_do_execute):
|
||||||
mock_get_by_id.return_value = self.audit
|
|
||||||
mock_list.return_value = [self.ongoing_action_plan]
|
mock_list.return_value = [self.ongoing_action_plan]
|
||||||
auto_trigger_handler = oneshot.OneShotAuditHandler(mock.MagicMock())
|
audit_handler = oneshot.OneShotAuditHandler(mock.MagicMock())
|
||||||
with mock.patch.object(auto_trigger_handler, 'do_schedule'):
|
audit_handler.execute(self.audit, self.context)
|
||||||
self.assertRaises(exception.ActionPlanIsOngoing,
|
self.assertFalse(mock_do_execute.called)
|
||||||
auto_trigger_handler.post_execute,
|
|
||||||
self.audit, mock.MagicMock(), self.context)
|
|
||||||
|
|
||||||
@mock.patch.object(rpcapi.ApplierAPI, 'launch_action_plan')
|
@mock.patch.object(rpcapi.ApplierAPI, 'launch_action_plan')
|
||||||
@mock.patch.object(objects.action_plan.ActionPlan, 'list')
|
@mock.patch.object(objects.action_plan.ActionPlan, 'list')
|
||||||
|
Reference in New Issue
Block a user