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:
parent
fb6d0c8d65
commit
bba93226e6
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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")',
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in New Issue