diff options
author | Zuul <zuul@review.opendev.org> | 2022-06-03 17:13:02 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2022-06-03 17:13:02 +0000 |
commit | 8446c84e710fe66d6bd5799d188bcba520c83a8b (patch) | |
tree | 3af58020ec644f60502aa9ad0b0cd46db84e9cba | |
parent | 566e8d45346c3944362034a1cbcf55ad0263ef70 (diff) | |
parent | e6dbc1fb281dbfa8497c13232044138126bd95cb (diff) | |
download | designate-8446c84e710fe66d6bd5799d188bcba520c83a8b.tar.gz |
Merge "Simplify create zone import implementation" into stable/wallaby
-rw-r--r-- | designate/central/service.py | 108 |
1 files changed, 48 insertions, 60 deletions
diff --git a/designate/central/service.py b/designate/central/service.py index cd551a94..135bb341 100644 --- a/designate/central/service.py +++ b/designate/central/service.py @@ -27,9 +27,8 @@ from random import SystemRandom import time import six -from eventlet import tpool -from dns import zone as dnszone from dns import exception as dnsexception +from dns import zone as dnszone from oslo_config import cfg import oslo_messaging as messaging from oslo_log import log as logging @@ -3034,7 +3033,6 @@ class Service(service.RPCService): @rpc.expected_exceptions() @notification('dns.zone_import.create') def create_zone_import(self, context, request_body): - if policy.enforce_new_defaults(): target = {constants.RBAC_PROJECT_ID: context.project_id} else: @@ -3054,61 +3052,49 @@ class Service(service.RPCService): zone_import = objects.ZoneImport(**values) created_zone_import = self.storage.create_zone_import(context, - zone_import) + zone_import) self.tg.add_thread(self._import_zone, context, created_zone_import, - request_body) + request_body) return created_zone_import def _import_zone(self, context, zone_import, request_body): - - def _import(self, context, zone_import, request_body): - # Dnspython needs a str instead of a unicode object - if six.PY2: - request_body = str(request_body) - zone = None - try: - dnspython_zone = dnszone.from_text( - request_body, - # Don't relativize, or we end up with '@' record names. - relativize=False, - # Don't check origin, we allow missing NS records - # (missing SOA records are taken care of in _create_zone). - check_origin=False) - zone = dnsutils.from_dnspython_zone(dnspython_zone) - zone.type = 'PRIMARY' - - for rrset in list(zone.recordsets): - if rrset.type == 'SOA': - zone.recordsets.remove(rrset) - # subdomain NS records should be kept - elif rrset.type == 'NS' and rrset.name == zone.name: - zone.recordsets.remove(rrset) - - except dnszone.UnknownOrigin: - zone_import.message = ('The $ORIGIN statement is required and' - ' must be the first statement in the' - ' zonefile.') - zone_import.status = 'ERROR' - except dnsexception.SyntaxError: - zone_import.message = 'Malformed zonefile.' - zone_import.status = 'ERROR' - except exceptions.BadRequest: - zone_import.message = 'An SOA record is required.' - zone_import.status = 'ERROR' - except Exception as e: - LOG.exception('An undefined error occurred during zone import') - msg = 'An undefined error occurred. %s'\ - % six.text_type(e)[:130] - zone_import.message = msg - zone_import.status = 'ERROR' - - return zone, zone_import - - # Execute the import in a real Python thread - zone, zone_import = tpool.execute(_import, self, context, - zone_import, request_body) + zone = None + try: + dnspython_zone = dnszone.from_text( + request_body, + # Don't relativize, or we end up with '@' record names. + relativize=False, + # Don't check origin, we allow missing NS records + # (missing SOA records are taken care of in _create_zone). + check_origin=False) + zone = dnsutils.from_dnspython_zone(dnspython_zone) + zone.type = 'PRIMARY' + for rrset in list(zone.recordsets): + if rrset.type == 'SOA': + zone.recordsets.remove(rrset) + # subdomain NS records should be kept + elif rrset.type == 'NS' and rrset.name == zone.name: + zone.recordsets.remove(rrset) + except dnszone.UnknownOrigin: + zone_import.message = ( + 'The $ORIGIN statement is required and must be the first ' + 'statement in the zonefile.' + ) + zone_import.status = 'ERROR' + except dnsexception.SyntaxError: + zone_import.message = 'Malformed zonefile.' + zone_import.status = 'ERROR' + except exceptions.BadRequest: + zone_import.message = 'An SOA record is required.' + zone_import.status = 'ERROR' + except Exception as e: + LOG.exception('An undefined error occurred during zone import') + zone_import.message = ( + 'An undefined error occurred. %s' % str(e)[:130] + ) + zone_import.status = 'ERROR' # If the zone import was valid, create the zone if zone_import.status != 'ERROR': @@ -3116,8 +3102,9 @@ class Service(service.RPCService): zone = self.create_zone(context, zone) zone_import.status = 'COMPLETE' zone_import.zone_id = zone.id - zone_import.message = '%(name)s imported' % {'name': - zone.name} + zone_import.message = ( + '%(name)s imported' % {'name': zone.name} + ) except exceptions.DuplicateZone: zone_import.status = 'ERROR' zone_import.message = 'Duplicate zone.' @@ -3125,18 +3112,19 @@ class Service(service.RPCService): zone_import.status = 'ERROR' zone_import.message = six.text_type(e) except Exception as e: - LOG.exception('An undefined error occurred during zone ' - 'import creation') - msg = 'An undefined error occurred. %s'\ - % six.text_type(e)[:130] - zone_import.message = msg + LOG.exception( + 'An undefined error occurred during zone import creation' + ) + zone_import.message = ( + 'An undefined error occurred. %s' % str(e)[:130] + ) zone_import.status = 'ERROR' self.update_zone_import(context, zone_import) @rpc.expected_exceptions() def find_zone_imports(self, context, criterion=None, marker=None, - limit=None, sort_key=None, sort_dir=None): + limit=None, sort_key=None, sort_dir=None): if policy.enforce_new_defaults(): target = {constants.RBAC_PROJECT_ID: context.project_id} |