summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Olof Gunnar Andersson <eandersson@blizzard.com>2023-04-09 11:38:46 -0700
committerErik Olof Gunnar Andersson <eandersson@blizzard.com>2023-04-13 20:18:43 +0000
commit1c7344d71160ee0d2c55ad51ba9a2024c8e98b1d (patch)
tree632a7bbbe09b998255fc2fcb7d6b80b295a594f4
parent4c08082bea6793334d3a215cdc0c3f051cdf6785 (diff)
downloaddesignate-1c7344d71160ee0d2c55ad51ba9a2024c8e98b1d.tar.gz
Use ids when removing ptr records
If the record status changes during the removal process, the current implementation will fail. Change-Id: I02b5d7499440154160c89ed63a2f70652fe72145 (cherry picked from commit b3161ece234b5e2ee7658060aaa936af625bef38)
-rw-r--r--designate/central/service.py26
1 files changed, 17 insertions, 9 deletions
diff --git a/designate/central/service.py b/designate/central/service.py
index 1a87db73..323070f1 100644
--- a/designate/central/service.py
+++ b/designate/central/service.py
@@ -1844,7 +1844,8 @@ class Service(service.RPCService):
LOG.debug('Deleting record %s for FIP %s',
record['id'], record['managed_resource_id'])
self._delete_ptr_record(
- elevated_context, record
+ elevated_context, record.zone_id, record.recordset_id,
+ record['id']
)
def _list_floatingips(self, context, region=None):
@@ -2018,7 +2019,8 @@ class Service(service.RPCService):
raise exceptions.NotFound(msg)
self._delete_ptr_record(
- elevated_context, record
+ elevated_context, record.zone_id, record.recordset_id,
+ record['id']
)
def _create_floating_ip(self, context, fip, record,
@@ -2098,24 +2100,30 @@ class Service(service.RPCService):
return fips
@transaction
- def _delete_ptr_record(self, context, record):
+ def _delete_ptr_record(self, context, zone_id, recordset_id,
+ record_to_delete_id):
try:
- recordset = self.get_recordset(
- context, record.zone_id, record.recordset_id
+ recordset = self.storage.find_recordset(
+ context, {'id': recordset_id, 'zone_id': zone_id}
)
+ record_ids = [record['id'] for record in recordset.records]
- if record not in recordset.records:
+ if record_to_delete_id not in record_ids:
LOG.debug(
'PTR Record %s not found in recordset %s',
- record.id, record.recordset_id
+ record_to_delete_id, recordset_id
)
return
- recordset.records.remove(record)
+ for record in list(recordset.records):
+ if record['id'] != record_to_delete_id:
+ continue
+ recordset.records.remove(record)
+ break
if not recordset.records:
self.delete_recordset(
- context, record.zone_id, record.recordset_id
+ context, zone_id, recordset_id
)
return