From e9b7c64802dc10906b1a056f764d8328a69ef3ee Mon Sep 17 00:00:00 2001 From: Jens Harbott Date: Wed, 19 Aug 2020 14:39:35 +0200 Subject: [PATCH] designate: allow PTR zone creation to fail When multiple PTR records are created at the same time, Neutron may try to create the same zone multiple times, resulting in a conflict. Ignore the resulting error instead and try to create the record anyway. Change-Id: I59b0f99463ab00743f19016a890561916df900ed Closes-Bug: 1891309 (cherry picked from commit ca1c6fd69bda5f392712a8a966bf4f9b85ecb57a) --- .../externaldns/drivers/designate/driver.py | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/neutron/services/externaldns/drivers/designate/driver.py b/neutron/services/externaldns/drivers/designate/driver.py index 66ae88d91bd..a0f051efd5c 100644 --- a/neutron/services/externaldns/drivers/designate/driver.py +++ b/neutron/services/externaldns/drivers/designate/driver.py @@ -23,6 +23,7 @@ from keystoneauth1 import token_endpoint from neutron_lib import constants from neutron_lib.exceptions import dns as dns_exc from oslo_config import cfg +from oslo_log import log from neutron.conf.services import extdns_designate_driver from neutron.services.externaldns import driver @@ -37,6 +38,8 @@ _SESSION = None CONF = cfg.CONF extdns_designate_driver.register_designate_opts() +LOG = log.getLogger(__name__) + def get_clients(context): global _SESSION @@ -117,9 +120,20 @@ class Designate(driver.ExternalDNSService): in_addr_name, 'PTR', [recordset_name]) except d_exc.NotFound: - designate_admin.zones.create( - in_addr_zone_name, email=ptr_zone_email, - description=in_addr_zone_description) + # Note(jh): If multiple PTRs get created at the same time, + # the creation of the zone may fail with a conflict because + # it has already been created by a parallel job. So we + # ignore that error and try to create the recordset + # anyway. That call will still fail in the end if something + # is really broken. See bug 1891309. + try: + designate_admin.zones.create( + in_addr_zone_name, email=ptr_zone_email, + description=in_addr_zone_description) + except d_exc.Conflict: + LOG.debug('Conflict when trying to create PTR zone %s,' + ' assuming it exists.', + in_addr_zone_name) designate_admin.recordsets.create(in_addr_zone_name, in_addr_name, 'PTR', [recordset_name])