diff options
author | Zuul <zuul@review.opendev.org> | 2022-06-03 19:47:12 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2022-06-03 19:47:12 +0000 |
commit | 38d98ed2b69f74bdf26db2446f5f88e3107641ec (patch) | |
tree | 9c0cdffc36ea2f7b0693a5c4d81aede5702953e0 | |
parent | be7f48dd36ba9d4f6adffd23abe7363480abfff8 (diff) | |
parent | 34976032887c53429a961a88a325dd5c33a1f372 (diff) | |
download | designate-38d98ed2b69f74bdf26db2446f5f88e3107641ec.tar.gz |
Merge "Clarifies the zone import error message" into stable/yoga
-rw-r--r-- | designate/central/service.py | 1 | ||||
-rw-r--r-- | designate/tests/test_central/test_service.py | 111 |
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, |