Skip to content

Commit

Permalink
Use ids when removing ptr records
Browse files Browse the repository at this point in the history
If the record status changes during the removal process,
the current implementation will fail.

Change-Id: I02b5d7499440154160c89ed63a2f70652fe72145
(cherry picked from commit b3161ec)
  • Loading branch information
eandersson committed Apr 13, 2023
1 parent be77580 commit eb67571
Showing 1 changed file with 17 additions and 9 deletions.
26 changes: 17 additions & 9 deletions designate/central/service.py
Expand Up @@ -1591,7 +1591,8 @@ def _invalidate_floatingips(self, context, records):
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):
Expand Down Expand Up @@ -1765,7 +1766,8 @@ def _unset_floatingip_reverse(self, context, region, floatingip_id):
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,
Expand Down Expand Up @@ -1845,24 +1847,30 @@ def _create_floating_ip_list(self, context, data):
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

Expand Down

0 comments on commit eb67571

Please sign in to comment.