diff --git a/designate_tempest_plugin/services/dns/v2/json/zone_imports_client.py b/designate_tempest_plugin/services/dns/v2/json/zone_imports_client.py index 4fbba2a1..236e7376 100644 --- a/designate_tempest_plugin/services/dns/v2/json/zone_imports_client.py +++ b/designate_tempest_plugin/services/dns/v2/json/zone_imports_client.py @@ -21,15 +21,16 @@ class ZoneImportsClient(base.DnsClientV2Base): @base.handle_errors def create_zone_import(self, zonefile_data=None, - params=None, wait_until=None): + wait_until=None, headers=None): """Create a zone import. :param zonefile_data: A tuple that represents zone data. - :param params: A Python dict that represents the query paramaters to - include in the request URI. + :param wait_until: If not None, a waiter for appropriate status + will be activated. + :param headers (dict): The headers to use for the request. :return: Serialized imported zone as a dictionary. """ - - headers = {'Content-Type': 'text/dns'} + if not headers: + headers = {'Content-Type': 'text/dns'} zone_data = zonefile_data or dns_data_utils.rand_zonefile_data() resp, body = self._create_request( 'zones/tasks/imports', zone_data, headers=headers) diff --git a/designate_tempest_plugin/tests/api/v2/test_zones_imports.py b/designate_tempest_plugin/tests/api/v2/test_zones_imports.py index 34f25381..8e038452 100644 --- a/designate_tempest_plugin/tests/api/v2/test_zones_imports.py +++ b/designate_tempest_plugin/tests/api/v2/test_zones_imports.py @@ -373,3 +373,83 @@ class ZonesImportTest(BaseZonesImportTest): self.check_list_IDs_RBAC_enforcement( 'ZoneImportsClient', 'list_zone_imports', expected_allowed, [zone_import['id']], headers=self.all_projects_header) + + +class ZonesImportTestNegative(BaseZonesImportTest): + credentials = ["primary", "admin", "system_admin"] + + @classmethod + def setup_credentials(cls): + # Do not create network resources for these test. + cls.set_network_resources() + super(ZonesImportTestNegative, cls).setup_credentials() + + @classmethod + def setup_clients(cls): + super(ZonesImportTestNegative, cls).setup_clients() + cls.zone_client = cls.os_primary.dns_v2.ZonesClient() + cls.client = cls.os_primary.dns_v2.ZoneImportsClient() + + def _clean_up_resources(self, zone_import_id): + zone_import = self.client.show_zone_import(zone_import_id)[1] + if zone_import['zone_id']: # A zone was actually created. + waiters.wait_for_zone_import_status( + self.client, zone_import_id, const.COMPLETE) + self.client.delete_zone_import(zone_import['id']) + self.wait_zone_delete(self.zone_client, zone_import['zone_id']) + else: # Import has failed and zone wasn't created. + self.client.delete_zone_import(zone_import['id']) + + @decorators.idempotent_id('31eaf25a-9532-11eb-a55d-74e5f9e2a801') + def test_create_zone_import_invalid_ttl(self): + LOG.info('Try to create a zone import using invalid TTL value') + zone_name = dns_data_utils.rand_zone_name( + name="create_zone_import_invalid_ttl", suffix=self.tld_name) + zone_data = dns_data_utils.rand_zonefile_data(name=zone_name, + ttl='zahlabut') + zone_import = self.client.create_zone_import( + zonefile_data=zone_data, wait_until=const.ERROR)[1] + self.addCleanup(self._clean_up_resources, zone_import['id']) + + @decorators.idempotent_id('31eaf25a-9532-11eb-a55d-74e5f9e2a801') + def test_create_zone_import_invalid_name(self): + LOG.info('Try to create a zone import using invalid name') + zone_import = self.client.create_zone_import( + zonefile_data=dns_data_utils.rand_zonefile_data( + name='@@@'), wait_until=const.ERROR)[1] + self.addCleanup(self._clean_up_resources, zone_import['id']) + + @decorators.idempotent_id('8fd744d2-9dff-11ec-9fb6-201e8823901f') + def test_create_zone_import_invalid_file_data(self): + LOG.info('Try to create a zone import using random generated' + ' import file data') + zone_file_data = dns_data_utils.rand_string(size=100) + zone_import = self.client.create_zone_import(zone_file_data)[1] + self.addCleanup(self.client.delete_zone_import, zone_import['id']) + waiters.wait_for_zone_import_status( + self.client, zone_import['id'], const.ERROR) + + @decorators.idempotent_id('4fb9494e-9e23-11ec-8378-201e8823901f') + def test_zone_cannot_be_update_by_import(self): + LOG.info('Create a Zone named: "...zone_to_update..."') + zone_name = dns_data_utils.rand_zone_name( + name='zone_to_update', suffix=self.tld_name) + zone = self.zone_client.create_zone( + name=zone_name, wait_until=const.ACTIVE)[1] + self.addCleanup(self.wait_zone_delete, self.zone_client, zone['id']) + LOG.info('Use zone import to update an existing zone, expected: zone' + ' import gets into the ERROR status ') + zone_import_data = dns_data_utils.rand_zonefile_data(name=zone_name) + zone_import = self.client.create_zone_import(zone_import_data)[1] + waiters.wait_for_zone_import_status( + self.client, zone_import['id'], const.ERROR) + self.addCleanup(self._clean_up_resources, zone_import['id']) + + @decorators.idempotent_id('5fa8016e-6ed1-11ec-9bd7-201e8823901f') + def test_create_zone_import_invalid_content_type(self): + LOG.info('Try to create a zone import using: "Content-Type:Zahlabut"' + ' HTTP header in POST request') + with self.assertRaisesDns( + lib_exc.InvalidContentType, 'unsupported_content_type', 415): + self.client.create_zone_import( + headers={'Content-Type': 'Zahlabut'}) diff --git a/designate_tempest_plugin/tests/scenario/v2/test_zones_import.py b/designate_tempest_plugin/tests/scenario/v2/test_zones_import.py index 29db2392..7286f23d 100644 --- a/designate_tempest_plugin/tests/scenario/v2/test_zones_import.py +++ b/designate_tempest_plugin/tests/scenario/v2/test_zones_import.py @@ -14,6 +14,7 @@ from oslo_log import log as logging from tempest.lib import decorators +from designate_tempest_plugin.common import constants as const from designate_tempest_plugin.common import waiters from designate_tempest_plugin import data_utils as dns_data_utils from designate_tempest_plugin.tests.api.v2.test_zones_imports import \ @@ -41,29 +42,26 @@ class ZonesImportTest(BaseZonesImportTest): zonefile = dns_data_utils.rand_zonefile_data(name=zone_name) LOG.info('Import zone %r', zone_name) - _, zone_import = self.client.create_zone_import(zonefile) + zone_import = self.client.create_zone_import( + zonefile, wait_until=const.COMPLETE)[1] self.addCleanup(self.client.delete_zone_import, zone_import['id']) - LOG.info('Wait for the zone import to COMPLETE') - waiters.wait_for_zone_import_status(self.client, zone_import['id'], - "COMPLETE") - LOG.info('Check the zone import looks good') - _, zone_import = self.client.show_zone_import(zone_import['id']) + zone_import = self.client.show_zone_import(zone_import['id'])[1] self.addCleanup(self.wait_zone_delete, self.zones_client, zone_import['zone_id']) - self.assertEqual('COMPLETE', zone_import['status']) + self.assertEqual(const.COMPLETE, zone_import['status']) self.assertIsNotNone(zone_import['zone_id']) self.assertIsNotNone(zone_import['links'].get('zone')) LOG.info('Wait for the imported zone to go to ACTIVE') - waiters.wait_for_zone_status(self.zones_client, zone_import['zone_id'], - "ACTIVE") + waiters.wait_for_zone_status( + self.zones_client, zone_import['zone_id'], const.ACTIVE) LOG.info('Check the imported zone looks good') - _, zone = self.zones_client.show_zone(zone_import['zone_id']) - self.assertEqual('NONE', zone['action']) - self.assertEqual('ACTIVE', zone['status']) + zone = self.zones_client.show_zone(zone_import['zone_id'])[1] + self.assertEqual(const.NONE, zone['action']) + self.assertEqual(const.ACTIVE, zone['status']) self.assertEqual(zone_name, zone['name'])