summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2022-06-03 19:47:12 +0000
committerGerrit Code Review <review@openstack.org>2022-06-03 19:47:12 +0000
commit38d98ed2b69f74bdf26db2446f5f88e3107641ec (patch)
tree9c0cdffc36ea2f7b0693a5c4d81aede5702953e0
parentbe7f48dd36ba9d4f6adffd23abe7363480abfff8 (diff)
parent34976032887c53429a961a88a325dd5c33a1f372 (diff)
downloaddesignate-38d98ed2b69f74bdf26db2446f5f88e3107641ec.tar.gz
Merge "Clarifies the zone import error message" into stable/yoga
-rw-r--r--designate/central/service.py1
-rw-r--r--designate/tests/test_central/test_service.py111
2 files changed, 112 insertions, 0 deletions
diff --git a/designate/central/service.py b/designate/central/service.py
index eda8a955..69af869a 100644
--- a/designate/central/service.py
+++ b/designate/central/service.py
@@ -2747,6 +2747,7 @@ class Service(service.RPCService):
return created_zone_import
+ @rpc.expected_exceptions()
def _import_zone(self, context, zone_import, request_body):
zone = None
try:
diff --git a/designate/tests/test_central/test_service.py b/designate/tests/test_central/test_service.py
index 7649856a..22ac3db4 100644
--- a/designate/tests/test_central/test_service.py
+++ b/designate/tests/test_central/test_service.py
@@ -3409,6 +3409,117 @@ class CentralServiceTest(CentralTestCase):
self.wait_for_import(zone_import.id)
+ def test_create_zone_import_duplicate_threading(self):
+ context = self.get_context(project_id=utils.generate_uuid())
+ request_body = self.get_zonefile_fixture()
+ zone_import = self.central_service.create_zone_import(context,
+ request_body)
+ self.wait_for_import(zone_import.id)
+
+ def create_zone_import():
+ context = self.get_context(project_id=utils.generate_uuid())
+ request_body = self.get_zonefile_fixture()
+ zone_import = self.central_service.create_zone_import(context,
+ request_body)
+ return self.wait_for_import(zone_import.id, error_is_ok=True)
+
+ with futurist.GreenThreadPoolExecutor() as executor:
+ results = []
+ for fixture in [0, 2, 3, 4, 5]:
+ results.append(executor.submit(create_zone_import,))
+ for future in futures.as_completed(results):
+ result = future.result()
+ self.assertEqual('Duplicate zone.', result.message)
+
+ @mock.patch('dns.zone.from_text')
+ @mock.patch('designate.central.service.Service.update_zone_import')
+ def test_create_zone_import_from_text_exceptions(
+ self, mock_update_zone_import, mock_dnszone_from_text):
+
+ # the second set of exceptions for the create_zone
+ context = self.get_context(project_id=utils.generate_uuid())
+ request_body = self.get_zonefile_fixture()
+ values = {
+ 'status': 'PENDING',
+ 'message': None,
+ 'zone_id': None,
+ 'tenant_id': context.project_id,
+ 'task_type': 'IMPORT'
+ }
+ zone_import = objects.ZoneImport(**values)
+
+ mock_dnszone_from_text.side_effect = [exceptions.BadRequest(),
+ Exception('boom')]
+
+ LOG.debug("Testing zone import exceptions: BadRequest")
+ zone_import = objects.ZoneImport(**values)
+ self.central_service._import_zone(context, zone_import, request_body)
+ self.assertEqual('ERROR', zone_import.status)
+ self.assertIsNotNone(zone_import.message)
+ self.assertEqual('An SOA record is required.', zone_import.message)
+
+ LOG.debug("Testing zone import exceptions: Undefined")
+ zone_import = objects.ZoneImport(**values)
+ self.central_service._import_zone(context, zone_import, request_body)
+ self.assertEqual('ERROR', zone_import.status)
+ self.assertIsNotNone(zone_import.message)
+ self.assertEqual('An undefined error occurred. boom',
+ zone_import.message)
+
+ @mock.patch('designate.central.service.Service.create_zone')
+ @mock.patch('designate.central.service.Service.update_zone_import')
+ def test_create_zone_import_create_import_exceptions(
+ self, mock_update_zone_import, mock_create_zone):
+
+ # setup to test the create_zone exceptions from _import_zone method
+ context = self.get_context(project_id=utils.generate_uuid())
+ request_body = self.get_zonefile_fixture()
+ values = {
+ 'status': 'PENDING',
+ 'message': None,
+ 'zone_id': None,
+ 'tenant_id': context.project_id,
+ 'task_type': 'IMPORT'
+ }
+ zone_import = objects.ZoneImport(**values)
+
+ mock_create_zone.side_effect = [mock.DEFAULT,
+ exceptions.DuplicateZone(),
+ exceptions.InvalidTTL(),
+ exceptions.OverQuota(),
+ Exception('boom')]
+
+ LOG.debug("Testing zone import exceptions: No exception case")
+ self.central_service._import_zone(context, zone_import, request_body)
+ self.assertEqual('COMPLETE', zone_import.status)
+ self.assertIn('imported', zone_import.message)
+
+ LOG.debug("Testing zone import exceptions: DuplicateZone")
+ zone_import = objects.ZoneImport(**values)
+ self.central_service._import_zone(context, zone_import, request_body)
+ self.assertEqual('ERROR', zone_import.status)
+ self.assertEqual('Duplicate zone.', zone_import.message)
+
+ LOG.debug("Testing zone import exceptions: InvalidTTL")
+ zone_import = objects.ZoneImport(**values)
+ self.central_service._import_zone(context, zone_import, request_body)
+ self.assertEqual('ERROR', zone_import.status)
+ self.assertIsNotNone(zone_import.message)
+
+ LOG.debug("Testing zone import exceptions: OverQuota")
+ zone_import = objects.ZoneImport(**values)
+ self.central_service._import_zone(context, zone_import, request_body)
+ self.assertEqual('ERROR', zone_import.status)
+ self.assertEqual('Quota exceeded during zone import.',
+ zone_import.message)
+
+ LOG.debug("Testing zone import exceptions: Undefined")
+ zone_import = objects.ZoneImport(**values)
+ self.central_service._import_zone(context, zone_import, request_body)
+ self.assertEqual('ERROR', zone_import.status)
+ self.assertEqual('An undefined error occurred. boom',
+ zone_import.message)
+
def test_create_zone_import_overquota(self):
self.config(
quota_zone_records=5,