Add trigger verification in API

Currently, we use 'cast' instead of 'call' to send request
from api to operationengine when creating a new trigger.
With 'cast', it will not give a return value to api even the
trigger is invalid, so users can create triggers successfully
with using invalid triggers.

This patch add trigger verification in API side. Before send
create request to operationengine, API send a verify request
to operationengine first, which type is 'call', to make sure
the trigger will be created is valid.

Change-Id: Iea734e1b4a63f6e35afe32cbbb2b60f79d6db085
Closes-Bug: #1736657
This commit is contained in:
jiaopengju 2018-01-25 15:32:47 +08:00
parent fb6d0c8d65
commit bba93226e6
6 changed files with 26 additions and 0 deletions

View File

@ -104,6 +104,7 @@ class TriggersController(wsgi.Controller):
}
try:
trigger = objects.Trigger(context=context, **trigger_definition)
self.operationengine_api.verify_trigger(context, trigger)
self.operationengine_api.create_trigger(context, trigger)
trigger.create()
except exception.Invalid as ex:

View File

@ -40,6 +40,9 @@ class API(base.Base):
self.operationengine_rpcapi.resume_scheduled_operation(
context, operation_id, trigger_id)
def verify_trigger(self, context, trigger):
self.operationengine_rpcapi.verify_trigger(context, trigger)
def create_trigger(self, context, trigger):
self.operationengine_rpcapi.create_trigger(context, trigger)

View File

@ -219,6 +219,13 @@ class OperationEngineManager(manager.Manager):
except Exception:
raise
@messaging.expected_exceptions(exception.InvalidInput)
def verify_trigger(self, context, trigger):
LOG.debug('Verifying trigger (id: "%s" type: "%s")',
trigger.id, trigger.type)
self.trigger_manager.check_trigger_definition(
trigger.type, trigger.properties)
@messaging.expected_exceptions(exception.InvalidInput)
def create_trigger(self, context, trigger):
LOG.debug('Creating trigger (id: "%s" type: "%s")',

View File

@ -63,6 +63,9 @@ class OperationEngineAPI(object):
operation_id=operation_id,
trigger_id=trigger_id)
def verify_trigger(self, ctxt, trigger):
return self._client.call(ctxt, 'verify_trigger', trigger=trigger)
def create_trigger(self, ctxt, trigger):
self._client.prepare(fanout=True).cast(ctxt, 'create_trigger',
trigger=trigger)

View File

@ -31,6 +31,9 @@ class FakeRemoteOperationApi(object):
msg = (_("Invalid trigger time format type"))
raise exception.InvalidInput(msg)
def verify_trigger(self, context, trigger):
pass
def delete_trigger(self, context, trigger_id):
pass

View File

@ -39,6 +39,9 @@ class FakeTriggerManager(object):
def unregister_operation(self, trigger_id, operation_id, **kwargs):
pass
def check_trigger_definition(self, trigger_type, trigger_definition):
pass
def add_trigger(self, trigger_id, trigger_type, trigger_property):
self._trigger[trigger_id] = []
@ -150,6 +153,12 @@ class OperationEngineManagerTestCase(base.TestCase):
self.manager.suspend_scheduled_operation(self.ctxt, op_id, trigger_id)
unregister.assert_called_once_with(trigger_id, op_id)
@mock.patch.object(FakeTriggerManager, 'check_trigger_definition')
def test_verify_trigger(self, check_trigger_definition):
self.manager.verify_trigger(self.ctxt, self._trigger)
check_trigger_definition.assert_called_once_with(
self._trigger.type, self._trigger.properties)
def _create_one_trigger(self):
trigger_info = {
'project_id': "123",