diff --git a/designate/storage/impl_sqlalchemy/__init__.py b/designate/storage/impl_sqlalchemy/__init__.py index 260bfd500..6e08b22ca 100644 --- a/designate/storage/impl_sqlalchemy/__init__.py +++ b/designate/storage/impl_sqlalchemy/__init__.py @@ -223,7 +223,8 @@ class SQLAlchemyStorage(sqlalchemy_base.SQLAlchemy, storage_base.Storage): literal_column('False')), else_=literal_column('True')).label('shared') query = select( - [tables.zones, shared_case]).outerjoin(tables.shared_zones) + [tables.zones, + shared_case]).outerjoin(tables.shared_zones).distinct() zones = self._find( context, tables.zones, objects.Zone, objects.ZoneList, diff --git a/designate/tests/test_storage/__init__.py b/designate/tests/test_storage/__init__.py index 58948c76d..2733dd311 100644 --- a/designate/tests/test_storage/__init__.py +++ b/designate/tests/test_storage/__init__.py @@ -706,6 +706,23 @@ class StorageTestCase(object): results = self.storage.find_zones(two_context) self.assertEqual(1, len(results)) + def test_find_zones_shared(self): + # Create an admin context + admin_context = self.get_admin_context() + + # Create a zone in the admin context + zone = self.create_zone(context=admin_context) + + # Share the zone with two other projects + self.share_zone( + zone_id=zone['id'], target_project_id=1, context=admin_context) + self.share_zone( + zone_id=zone['id'], target_project_id=2, context=admin_context) + + # Ensure that one zone record is returned from find_zones (LP 2025295) + results = self.storage.find_zones(admin_context) + self.assertEqual(1, len(results)) + def test_get_zone(self): # Create a zone expected = self.create_zone() diff --git a/releasenotes/notes/Fix-zone-list-when-zone-shared-more-than-once-288b57cafeba82df.yaml b/releasenotes/notes/Fix-zone-list-when-zone-shared-more-than-once-288b57cafeba82df.yaml new file mode 100644 index 000000000..45a4bee29 --- /dev/null +++ b/releasenotes/notes/Fix-zone-list-when-zone-shared-more-than-once-288b57cafeba82df.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Fixed issues with list zones and recordsets when a zone is shared with more + than one project.