From e01cbdb1144348c4f5c044ea1f29be7681d61556 Mon Sep 17 00:00:00 2001 From: Deepinder Setia Date: Thu, 21 Jul 2016 15:43:42 -0700 Subject: [PATCH] While returning list collection ensure shared objects are not sent twice Change-Id: I06c78b5e6832826d6f9bf089f44269e56a53e9f2 Fixes-Bug: #1604986 --- src/config/api-server/tests/test_perms2.py | 25 +++++++++++++++++++++ src/config/api-server/vnc_cfg_api_server.py | 4 ++++ 2 files changed, 29 insertions(+) diff --git a/src/config/api-server/tests/test_perms2.py b/src/config/api-server/tests/test_perms2.py index 1a12eb7443d..f01d70b37a0 100644 --- a/src/config/api-server/tests/test_perms2.py +++ b/src/config/api-server/tests/test_perms2.py @@ -967,6 +967,31 @@ def test_chmod_api(self): alice.vnc_lib.chmod(vn.get_uuid(), owner=valid_uuid_2) admin.vnc_lib.chmod(vn.get_uuid(), owner=alice.project_uuid) + def test_bug_1604986(self): + """ + 1) Create a VN + 2) Make is globally shared + 3) list of virtual-networks should not return VN information twice + """ + admin = self.admin + vn_name = "test-vn-1604986" + vn_fq_name = [self.domain_name, admin.project, vn_name] + + test_vn = VirtualNetwork(vn_name, admin.project_obj) + self.admin.vnc_lib.virtual_network_create(test_vn) + + z = self.admin.vnc_lib.resource_list('virtual-network') + test_vn_list = [vn for vn in z['virtual-networks'] if vn['fq_name'][-1] == vn_name] + self.assertEquals(len(test_vn_list), 1) + + test_vn = vnc_read_obj(self.admin.vnc_lib, 'virtual-network', name = vn_fq_name) + set_perms(test_vn, global_access = PERMS_RWX) + admin.vnc_lib.virtual_network_update(test_vn) + + z = self.admin.vnc_lib.resource_list('virtual-network') + test_vn_list = [vn for vn in z['virtual-networks'] if vn['fq_name'][-1] == vn_name] + self.assertEquals(len(test_vn_list), 1) + def tearDown(self): super(TestPermissions, self).tearDown() # end tearDown diff --git a/src/config/api-server/vnc_cfg_api_server.py b/src/config/api-server/vnc_cfg_api_server.py index 1b4f66ad7fc..8641f7adbce 100644 --- a/src/config/api-server/vnc_cfg_api_server.py +++ b/src/config/api-server/vnc_cfg_api_server.py @@ -2868,7 +2868,11 @@ def _list_collection(self, obj_type, parent_uuids=None, shares = self._db_conn.get_shared_objects(obj_type, tenant_uuid) except NoIdError: shares = [] + owned_objs = set([obj_uuid for (fq_name, obj_uuid) in result]) for (obj_uuid, obj_perm) in shares: + # skip owned objects already included in results + if obj_uuid in owned_objs: + continue try: fq_name = self._db_conn.uuid_to_fq_name(obj_uuid) result.append((fq_name, obj_uuid))