summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Goddard <mark@stackhpc.com>2020-09-30 17:48:25 +0100
committerMichael Johnson <johnsomor@gmail.com>2021-11-23 00:22:20 +0000
commita9ab61bc1d98248af108d895ce2cb7696818dcda (patch)
treeb79f1d56ca8ce67bb4400df88febf46282278f40
parent92c0d3f201207be84f138c35b82b601cef829a26 (diff)
downloaddesignate-a9ab61bc1d98248af108d895ce2cb7696818dcda.tar.gz
Fix pool update with duplicate mastersussuri-em10.0.2
If any zones exist that belong to a pool that has any duplicate masters among all targets, currently updating the pool will fail. This change fixes the issue by ensuring the pool target master list does not contain duplicates. Change-Id: I72bae79b4f8e0bab739875d6f783abdb4868950b Closes-Bug: #1897936 (cherry picked from commit 4e86bc2a58f00371a2f22217cb8a79e5ac33677c)
-rw-r--r--designate/manage/pool.py9
-rw-r--r--designate/tests/test_manage/test_update_pool.py41
2 files changed, 45 insertions, 5 deletions
diff --git a/designate/manage/pool.py b/designate/manage/pool.py
index 063fa1e8..5d845659 100644
--- a/designate/manage/pool.py
+++ b/designate/manage/pool.py
@@ -51,8 +51,13 @@ class PoolCommands(base.Commands):
masters = []
for target in pool.targets:
for master in target.get("masters", []):
- masters.append({'host': master['host'],
- 'port': master['port']})
+ master = {'host': master['host'], 'port': master['port']}
+ found = False
+ for existing_master in masters:
+ if master == existing_master:
+ found = True
+ if not found:
+ masters.append(master)
return masters
policy.init()
diff --git a/designate/tests/test_manage/test_update_pool.py b/designate/tests/test_manage/test_update_pool.py
index d5b21fbc..1e9320be 100644
--- a/designate/tests/test_manage/test_update_pool.py
+++ b/designate/tests/test_manage/test_update_pool.py
@@ -26,11 +26,11 @@ class UpdatePoolTestCase(DesignateManageTestCase):
self.stdlog = fixtures.StandardLogging()
self.useFixture(self.stdlog)
- def hydrate_pool_targets(self, targets):
+ def hydrate_pool_targets(self, target_masters):
pool_targets = objects.PoolTargetList()
masters = objects.PoolTargetMasterList()
- for target in targets:
- masters.append(target)
+ for target_master in target_masters:
+ masters.append(target_master)
target = objects.PoolTarget(masters=masters)
target.masters = masters
pool_targets.append(target)
@@ -63,3 +63,38 @@ class UpdatePoolTestCase(DesignateManageTestCase):
"update_zone") as mock_update_zone:
command._update_zones(pool)
mock_update_zone.assert_called_once()
+
+ def test_update_pools_zones_multiple_masters(self):
+ values = dict(
+ name='example.com.',
+ email='info@example.com',
+ type='PRIMARY'
+ )
+
+ zone = self.central_service.create_zone(
+ self.admin_context, zone=objects.Zone.from_dict(values))
+
+ # Ensure the correct NS Records are in place
+ pool = self.central_service.get_pool(
+ self.admin_context, zone.pool_id)
+
+ targets1 = self.hydrate_pool_targets([
+ objects.PoolTargetMaster(
+ pool_target_id=pool.id,
+ host="127.0.0.1",
+ port="53")
+ ])
+ targets2 = self.hydrate_pool_targets([
+ objects.PoolTargetMaster(
+ pool_target_id=pool.id,
+ host="127.0.0.1",
+ port="53")
+ ])
+ pool.targets = objects.PoolTargetList()
+ pool.targets.extend(targets1.objects + targets2.objects)
+
+ command = PoolCommands()
+ command.context = self.admin_context
+ command.central_api = self.central_service
+
+ command._update_zones(pool)