Fix get event triggers

* Added get event triggers for all projects
   and the corresponding rule in policy.json
 * Fixed corresponding policy rule names for
   event triggers API

Change-Id: I74e65a1cee8d074cfd637e460465922b610237c5
This commit is contained in:
Nikolay Mahotkin 2017-07-10 18:31:08 +03:00
parent 1e5437f412
commit c430a4620b
6 changed files with 34 additions and 14 deletions

View File

@ -61,5 +61,6 @@
"event_triggers:delete": "rule:admin_or_owner", "event_triggers:delete": "rule:admin_or_owner",
"event_triggers:get": "rule:admin_or_owner", "event_triggers:get": "rule:admin_or_owner",
"event_triggers:list": "rule:admin_or_owner", "event_triggers:list": "rule:admin_or_owner",
"event_triggers:list:all_projects": "rule:admin_only",
"event_triggers:update": "rule:admin_or_owner" "event_triggers:update": "rule:admin_or_owner"
} }

View File

@ -37,7 +37,7 @@ class EventTriggersController(rest.RestController):
@wsme_pecan.wsexpose(resources.EventTrigger, types.uuid) @wsme_pecan.wsexpose(resources.EventTrigger, types.uuid)
def get(self, id): def get(self, id):
"""Returns the specified event_trigger.""" """Returns the specified event_trigger."""
acl.enforce('event_trigger:get', auth_ctx.ctx()) acl.enforce('event_triggers:get', auth_ctx.ctx())
LOG.info('Fetch event trigger [id=%s]', id) LOG.info('Fetch event trigger [id=%s]', id)
@ -50,7 +50,7 @@ class EventTriggersController(rest.RestController):
status_code=201) status_code=201)
def post(self, event_trigger): def post(self, event_trigger):
"""Creates a new event trigger.""" """Creates a new event trigger."""
acl.enforce('event_trigger:create', auth_ctx.ctx()) acl.enforce('event_triggers:create', auth_ctx.ctx())
values = event_trigger.to_dict() values = event_trigger.to_dict()
input_keys = [k for k in values if values[k]] input_keys = [k for k in values if values[k]]
@ -85,7 +85,7 @@ class EventTriggersController(rest.RestController):
change them is to delete the event trigger first, then create a new change them is to delete the event trigger first, then create a new
event trigger with new params. event trigger with new params.
""" """
acl.enforce('event_trigger:update', auth_ctx.ctx()) acl.enforce('event_triggers:update', auth_ctx.ctx())
values = event_trigger.to_dict() values = event_trigger.to_dict()
@ -109,7 +109,7 @@ class EventTriggersController(rest.RestController):
@wsme_pecan.wsexpose(None, types.uuid, status_code=204) @wsme_pecan.wsexpose(None, types.uuid, status_code=204)
def delete(self, id): def delete(self, id):
"""Delete event trigger.""" """Delete event trigger."""
acl.enforce('event_trigger:delete', auth_ctx.ctx()) acl.enforce('event_triggers:delete', auth_ctx.ctx())
LOG.info("Delete event trigger [id=%s]", id) LOG.info("Delete event trigger [id=%s]", id)
@ -121,15 +121,20 @@ class EventTriggersController(rest.RestController):
@rest_utils.wrap_wsme_controller_exception @rest_utils.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(resources.EventTriggers, types.uuid, int, @wsme_pecan.wsexpose(resources.EventTriggers, types.uuid, int,
types.uniquelist, types.list, types.uniquelist, types.uniquelist, types.list, types.uniquelist,
types.jsontype) bool, types.jsontype)
def get_all(self, marker=None, limit=None, sort_keys='created_at', def get_all(self, marker=None, limit=None, sort_keys='created_at',
sort_dirs='asc', fields='', **filters): sort_dirs='asc', fields='', all_projects=False, **filters):
"""Return all event triggers.""" """Return all event triggers."""
acl.enforce('event_trigger:list', auth_ctx.ctx()) acl.enforce('event_triggers:list', auth_ctx.ctx())
LOG.info("Fetch event triggers. marker=%s, limit=%s, sort_keys=%s, " if all_projects:
"sort_dirs=%s, fields=%s, filters=%s", marker, limit, acl.enforce('event_triggers:list:all_projects', auth_ctx.ctx())
sort_keys, sort_dirs, fields, filters)
LOG.info(
"Fetch event triggers. marker=%s, limit=%s, sort_keys=%s, "
"sort_dirs=%s, fields=%s, all_projects=%s, filters=%s", marker,
limit, sort_keys, sort_dirs, fields, all_projects, filters
)
return rest_utils.get_all( return rest_utils.get_all(
resources.EventTriggers, resources.EventTriggers,
@ -142,5 +147,6 @@ class EventTriggersController(rest.RestController):
sort_keys=sort_keys, sort_keys=sort_keys,
sort_dirs=sort_dirs, sort_dirs=sort_dirs,
fields=fields, fields=fields,
all_projects=all_projects,
**filters **filters
) )

View File

@ -507,7 +507,7 @@ def get_event_trigger(id, insecure=False):
def get_event_triggers(insecure=False, limit=None, marker=None, sort_keys=None, def get_event_triggers(insecure=False, limit=None, marker=None, sort_keys=None,
sort_dirs=None, fields=None, **kwargs): sort_dirs=None, fields=None, **kwargs):
return IMPL.get_event_triggers( return IMPL.get_event_triggers(
insecure=False, insecure=insecure,
limit=limit, limit=limit,
marker=marker, marker=marker,
sort_keys=sort_keys, sort_keys=sort_keys,

View File

@ -212,7 +212,7 @@ class DefaultEventEngine(base.EventEngine):
def _start_listeners(self): def _start_listeners(self):
triggers = db_api.get_event_triggers(insecure=True) triggers = db_api.get_event_triggers(insecure=True)
LOG.info('Find %s event triggers.', len(triggers)) LOG.info('Found %s event triggers.', len(triggers))
for trigger in triggers: for trigger in triggers:
exchange_topic = (trigger.exchange, trigger.topic) exchange_topic = (trigger.exchange, trigger.topic)

View File

@ -20,6 +20,7 @@ from mistral.db.v2 import api as db_api
from mistral.db.v2.sqlalchemy import models from mistral.db.v2.sqlalchemy import models
from mistral import exceptions as exc from mistral import exceptions as exc
from mistral.tests.unit.api import base from mistral.tests.unit.api import base
from mistral.tests.unit import base as unit_base
WF = models.WorkflowDefinition( WF = models.WorkflowDefinition(
spec={ spec={
@ -209,3 +210,15 @@ class TestEventTriggerController(base.APITest):
self.assertEqual(1, len(resp.json['event_triggers'])) self.assertEqual(1, len(resp.json['event_triggers']))
self.assertDictEqual(TRIGGER, resp.json['event_triggers'][0]) self.assertDictEqual(TRIGGER, resp.json['event_triggers'][0])
@mock.patch('mistral.db.v2.api.get_event_triggers')
@mock.patch('mistral.context.MistralContext.from_environ')
def test_get_all_projects_admin(self, mock_context, mock_get_wf_defs):
admin_ctx = unit_base.get_context(admin=True)
mock_context.return_value = admin_ctx
resp = self.app.get('/v2/event_triggers?all_projects=true')
self.assertEqual(200, resp.status_int)
self.assertTrue(mock_get_wf_defs.call_args[1].get('insecure', False))

View File

@ -2957,7 +2957,7 @@ class EventTriggerTest(SQLAlchemyTest):
self.assertEqual(created, fetched) self.assertEqual(created, fetched)
def test_get_event_triggers_insecure(self): def test_get_event_triggers_not_insecure(self):
for t in EVENT_TRIGGERS: for t in EVENT_TRIGGERS:
db_api.create_event_trigger(t) db_api.create_event_trigger(t)
@ -2965,7 +2965,7 @@ class EventTriggerTest(SQLAlchemyTest):
self.assertEqual(2, len(fetched)) self.assertEqual(2, len(fetched))
def test_get_event_triggers_not_insecure(self): def test_get_event_triggers_insecure(self):
db_api.create_event_trigger(EVENT_TRIGGERS[0]) db_api.create_event_trigger(EVENT_TRIGGERS[0])
# Switch to another tenant. # Switch to another tenant.