summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitya_Eremeev <mitossvyaz@mail.ru>2022-11-09 20:09:12 +0300
committerErik Olof Gunnar Andersson <eandersson@blizzard.com>2023-04-07 05:55:53 +0000
commit964562cc65ccf5619fe53c7b60898edec3b0605b (patch)
treefac29e41ad2efacc8ec32eae9606acbb62ee5e5b
parentf4ce71c8f80778b555eb1c0a29b67b8c32ed5f97 (diff)
downloaddesignate-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.py4
-rw-r--r--designate/objects/base.py2
-rw-r--r--designate/tests/unit/test_central/test_basic.py36
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):