From bcdd55ca21663975a0ffe3e007c79636aa770575 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Braun Date: Mon, 7 Sep 2015 10:14:14 +0200 Subject: [PATCH] Fix concurrency issue when creating pools A pool can be deleted after the resource_read call and then does not exists anymore when calling make dict. Change-Id: I6995a9a073f981300df903bf869f4dd04c1aa23b Closes-Bug: #1492952 --- .../opencontrail/loadbalancer/resource_manager.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/neutron_plugin_contrail/plugins/opencontrail/loadbalancer/resource_manager.py b/neutron_plugin_contrail/plugins/opencontrail/loadbalancer/resource_manager.py index 5dcee74..85ccb76 100644 --- a/neutron_plugin_contrail/plugins/opencontrail/loadbalancer/resource_manager.py +++ b/neutron_plugin_contrail/plugins/opencontrail/loadbalancer/resource_manager.py @@ -188,22 +188,23 @@ def _get_object_tenant_id(self, obj): def get_resource(self, context, id, fields=None): """ Implement GET by uuid. """ + tenant_id = str(uuid.UUID(context.tenant_id)) try: obj = self.resource_read(id=id) + project_id = self._get_object_tenant_id(obj) + if not context.is_admin and tenant_id != project_id: + raise NoIdError(id) + res = self.make_dict(obj, fields) except NoIdError: raise self.get_exception_notfound(id=id) - tenant_id = str(uuid.UUID(context.tenant_id)) - project_id = self._get_object_tenant_id(obj) - if not context.is_admin and tenant_id != project_id: - raise self.get_exception_notfound(id=id) - return self.make_dict(obj, fields) + return res def _get_resource_dict(self, uuid, filters, fields): try: obj = self.resource_read(id=uuid) + res = self.make_dict(obj, None) except NoIdError: return None - res = self.make_dict(obj, None) if not self._apply_filter(res, filters): return None return self._fields(res, fields)