diff options
author | Mitya_Eremeev <mitossvyaz@mail.ru> | 2022-11-09 20:09:12 +0300 |
---|---|---|
committer | Erik Olof Gunnar Andersson <eandersson@blizzard.com> | 2023-04-07 05:55:53 +0000 |
commit | 964562cc65ccf5619fe53c7b60898edec3b0605b (patch) | |
tree | fac29e41ad2efacc8ec32eae9606acbb62ee5e5b | |
parent | f4ce71c8f80778b555eb1c0a29b67b8c32ed5f97 (diff) | |
download | designate-964562cc65ccf5619fe53c7b60898edec3b0605b.tar.gz |
Secondary zone loops AXFR transfer during zone creation
When we create a secondary zone, AXFR transfer loops indefinitely.
Normally, only one xfr should be performed.
Due to AXFR loop the zone changes status from active to pending all the time.
Co-Authored-By: ZhouHeng <zhouhenglc@inspur.com>
Closes-Bug: 1856442
Change-Id: I0e0d138049e6d4c31dea3cc6768cc15e59a5942c
-rw-r--r-- | designate/central/service.py | 4 | ||||
-rw-r--r-- | designate/objects/base.py | 2 | ||||
-rw-r--r-- | designate/tests/unit/test_central/test_basic.py | 36 |
3 files changed, 40 insertions, 2 deletions
diff --git a/designate/central/service.py b/designate/central/service.py index 37f39baa..a9fae866 100644 --- a/designate/central/service.py +++ b/designate/central/service.py @@ -821,7 +821,9 @@ class Service(service.RPCService): self.worker_api.create_zone(context, zone) if zone.type == 'SECONDARY': - self.worker_api.perform_zone_xfr(context, zone) + xfr_zone = copy.deepcopy(zone) + xfr_zone.obj_reset_changes(recursive=True) + self.worker_api.perform_zone_xfr(context, xfr_zone) # If zone is a superzone, update subzones # with new parent IDs diff --git a/designate/objects/base.py b/designate/objects/base.py index 77d1c596..bc28474b 100644 --- a/designate/objects/base.py +++ b/designate/objects/base.py @@ -136,7 +136,7 @@ class DesignateObject(base.VersionedObject): name == 'VERSION' or name == 'fields'): raise AttributeError( - "Designate object '%(type)s' has no" + "Designate object '%(type)s' has no " "attribute '%(name)s'" % { 'type': self.obj_name(), 'name': name, diff --git a/designate/tests/unit/test_central/test_basic.py b/designate/tests/unit/test_central/test_basic.py index 3726406d..5e3fba49 100644 --- a/designate/tests/unit/test_central/test_basic.py +++ b/designate/tests/unit/test_central/test_basic.py @@ -1609,6 +1609,42 @@ class CentralZoneTestCase(CentralBasic): refresh_time = central_service._generate_soa_refresh_interval() self.assertEqual(3563, refresh_time) + @patch.object(objects.Zone, 'obj_reset_changes') + def test_create_secondary_zone(self, mock_obj_reset_changes): + self.service._enforce_zone_quota = mock.Mock() + self.service._create_zone_in_storage = mock.Mock( + return_value=objects.Zone(name='example.com.', type='SECONDARY')) + self.service._is_valid_zone_name = mock.Mock() + self.service._is_valid_ttl = mock.Mock() + self.service._is_subzone = mock.Mock(return_value=False) + self.service._is_superzone = mock.Mock(return_value=[]) + self.service.storage.get_pool.return_value = RoObject( + ns_records=[RoObject()]) + self.useFixture( + fixtures.MockPatchObject( + self.service.storage, + 'find_pools', + return_value=objects.PoolList.from_list( + [ + {'id': '94ccc2c1-d751-44fe-b57f-8894c9f5c842'} + ] + ) + ) + ) + output = self.service.create_zone( + self.context, + objects.Zone( + tenant_id='1', + name='example.com.', + ttl=60, + pool_id=CentralZoneTestCase.pool__id, + refresh=0, + type='SECONDARY' + ) + ) + self.assertEqual('example.com.', output.name) + mock_obj_reset_changes.assert_called_once_with(recursive=True) + class IsSubzoneTestCase(CentralBasic): def setUp(self): |