From 6d6b27d53764e885dd030dc5b6296043808508e6 Mon Sep 17 00:00:00 2001 From: Arkady Shtempler Date: Mon, 18 Apr 2022 15:25:00 +0300 Subject: [PATCH] New scenario test case for TLD + re-factoring 1) Moving "test_create_zone_for_not_existing_tld" from API to scenario: "test_create_zone_using_not_existing_tld" Create a Zone using not existing TLD is supposed to FAIL 2) New test case: "test_create_zone_using_existing_tld" Create a Zone using existing TLD is supposed to PASS 3) Using indexes instead of underscores variables 4) Adding "tld_suffix" parameter into configuration (default is: 'com') to avoid (Non existing TLD) issues. All tests will be using the same(common) TLD suffix. Change-Id: Ie9fca2598a3eab66f9cbd718e52e575744def160 --- designate_tempest_plugin/config.py | 6 +- designate_tempest_plugin/data_utils.py | 16 ++-- .../tests/api/v2/test_recordset.py | 70 ++++++++-------- .../tests/api/v2/test_tld.py | 39 +++------ designate_tempest_plugin/tests/base.py | 1 + .../tests/scenario/v2/test_tld.py | 80 +++++++++++++++++++ 6 files changed, 139 insertions(+), 73 deletions(-) create mode 100644 designate_tempest_plugin/tests/scenario/v2/test_tld.py diff --git a/designate_tempest_plugin/config.py b/designate_tempest_plugin/config.py index 99c9a041..759903ef 100644 --- a/designate_tempest_plugin/config.py +++ b/designate_tempest_plugin/config.py @@ -51,8 +51,10 @@ DnsGroup = [ help="The timeout on a single dns query to a nameserver"), cfg.StrOpt('zone_id', help="The target zone to test the dns recordsets " - "If it is not specified, a new zone will be created ") - + "If it is not specified, a new zone will be created "), + cfg.StrOpt('tld_suffix', + default='com', + help="TLD suffix that used in all tests (if not overridden)") ] dns_feature_group = cfg.OptGroup(name='dns_feature_enabled', diff --git a/designate_tempest_plugin/data_utils.py b/designate_tempest_plugin/data_utils.py index 4b5d24dd..86eca9df 100644 --- a/designate_tempest_plugin/data_utils.py +++ b/designate_tempest_plugin/data_utils.py @@ -35,7 +35,7 @@ def rand_ipv6(): return an.format(netaddr.ipv6_compact) -def rand_zone_name(name='', prefix='rand', suffix='.com.'): +def rand_zone_name(name='', prefix='rand', suffix=None): """Generate a random zone name :param str name: The name that you want to include :param prefix: the exact text to start the string. Defaults to "rand" @@ -43,6 +43,8 @@ def rand_zone_name(name='', prefix='rand', suffix='.com.'): :return: a random zone name e.g. example.org. :rtype: string """ + if suffix is None: + suffix = '.{}.'.format(CONF.dns.tld_suffix) name = data_utils.rand_name(name=name, prefix=prefix) return name + suffix @@ -67,7 +69,6 @@ def rand_ttl(start=1, end=86400): def rand_zonefile_data(name=None, ttl=None): """Generate random zone data, with optional overrides - :return: A ZoneModel """ zone_base = ('$ORIGIN &\n& # IN SOA ns.& nsadmin.& # # # # #\n' @@ -105,11 +106,11 @@ def rand_quotas(zones=None, zone_records=None, zone_recordsets=None, def rand_zone_data(name=None, email=None, ttl=None, description=None): """Generate random zone data, with optional overrides - :return: A ZoneModel """ if name is None: - name = rand_zone_name(prefix='testdomain', suffix='.com.') + name = rand_zone_name( + prefix='testdomain', suffix='.{}.'.format(CONF.dns.tld_suffix)) if email is None: email = ("admin@" + name).strip('.') if description is None: @@ -126,7 +127,6 @@ def rand_zone_data(name=None, email=None, ttl=None, description=None): def rand_recordset_data(record_type, zone_name, name=None, records=None, ttl=None): """Generate random recordset data, with optional overrides - :return: A RecordsetModel """ if name is None: @@ -202,7 +202,7 @@ def rand_txt_recordset(zone_name, data=None, **kwargs): def wildcard_ns_recordset(zone_name): name = "*.{0}".format(zone_name) - records = ["ns.example.com."] + records = ["ns.example.{}.".format(CONF.dns.tld_suffix)] return rand_recordset_data('NS', zone_name, name, records) @@ -225,7 +225,6 @@ def rand_tld(): def rand_transfer_request_data(description=None, target_project_id=None): """Generate random transfer request data, with optional overrides - :return: A TransferRequest data """ @@ -255,7 +254,6 @@ def make_rand_recordset(zone_name, record_type): """Create a rand recordset by type This essentially just dispatches to the relevant random recordset creation functions. - :param str zone_name: The zone name the recordset applies to :param str record_type: The type of recordset (ie A, MX, NS, etc...) """ @@ -266,7 +264,6 @@ def make_rand_recordset(zone_name, record_type): def rand_string(size): """Create random string of ASCII chars by size - :param int size - length os the string to be create :return - random creates string of ASCII lover characters """ @@ -275,7 +272,6 @@ def rand_string(size): def rand_domain_name(tld=None): """Create random valid domain name - :param tld (optional) - TLD that will be used to random domain name :return - valid domain name, for example: paka.zbabun.iuh """ diff --git a/designate_tempest_plugin/tests/api/v2/test_recordset.py b/designate_tempest_plugin/tests/api/v2/test_recordset.py index 38a2dfdf..e22de4c3 100644 --- a/designate_tempest_plugin/tests/api/v2/test_recordset.py +++ b/designate_tempest_plugin/tests/api/v2/test_recordset.py @@ -38,7 +38,7 @@ class BaseRecordsetsTest(base.BaseDnsV2Test): # All the recordset tests need a zone, create one to share LOG.info('Create a zone') - _, cls.zone = cls.zone_client.create_zone() + cls.zone = cls.zone_client.create_zone()[1] @classmethod def resource_cleanup(cls): @@ -127,16 +127,18 @@ class RecordsetsTest(BaseRecordsetsTest): @decorators.idempotent_id('6c22a3f9-3f4d-4b32-bdf2-5237851ed25e') def test_create_recordset_type_SRV_TCP(self): self._test_create_recordset_type( - "_sip._tcp", "SRV", ["10 60 5060 server1.example.com.", - "20 60 5060 server2.example.com.", - "20 30 5060 server3.example.com."]) + "_sip._tcp", "SRV", [ + "10 60 5060 server1.example.{}.".format(self.tld_suffix), + "20 60 5060 server2.example.{}.".format(self.tld_suffix), + "20 30 5060 server3.example.{}.".format(self.tld_suffix)]) @decorators.idempotent_id('59c1aa42-278e-4f7b-a6a1-4320d5daf1fd') def test_create_recordset_type_SRV_UDP(self): self._test_create_recordset_type( - "_sip._udp", "SRV", ["10 60 5060 server1.example.com.", - "10 60 5060 server2.example.com.", - "20 30 5060 server3.example.com."]) + "_sip._udp", "SRV", [ + "10 60 5060 server1.example.{}.".format(self.tld_suffix), + "10 60 5060 server2.example.{}.".format(self.tld_suffix), + "20 30 5060 server3.example.{}.".format(self.tld_suffix)]) @decorators.idempotent_id('1ac46f94-f03a-4f85-b84f-826a2660b927') def test_create_recordset_type_CNAME(self): @@ -201,7 +203,7 @@ class RecordsetsTest(BaseRecordsetsTest): self.zone['id'], body['id']) LOG.info('List zone recordsets') - _, body = self.client.list_recordset(self.zone['id']) + body = self.client.list_recordset(self.zone['id'])[1] self.assertGreater(len(body), 0) @@ -218,7 +220,7 @@ class RecordsetsTest(BaseRecordsetsTest): self.zone['id'], body['id']) LOG.info('Re-Fetch the Recordset') - _, record = self.client.show_recordset(self.zone['id'], body['id']) + record = self.client.show_recordset(self.zone['id'], body['id'])[1] LOG.info('Ensure the fetched response matches the expected one') self.assertExpected(body, record, self.excluded_keys) @@ -229,14 +231,14 @@ class RecordsetsTest(BaseRecordsetsTest): record_type='A', zone_name=self.zone['name']) LOG.info('Create a Recordset') - _, record = self.client.create_recordset( - self.zone['id'], recordset_data) + record = self.client.create_recordset( + self.zone['id'], recordset_data)[1] self.addCleanup( self.wait_recordset_delete, self.client, self.zone['id'], record['id']) LOG.info('Delete a Recordset') - _, body = self.client.delete_recordset(self.zone['id'], record['id']) + self.client.delete_recordset(self.zone['id'], record['id']) LOG.info('Ensure successful deletion of Recordset') self.assertRaises(lib_exc.NotFound, @@ -248,8 +250,8 @@ class RecordsetsTest(BaseRecordsetsTest): record_type='A', zone_name=self.zone['name']) LOG.info('Create a recordset') - _, record = self.client.create_recordset( - self.zone['id'], recordset_data) + record = self.client.create_recordset( + self.zone['id'], recordset_data)[1] self.addCleanup( self.wait_recordset_delete, self.client, self.zone['id'], record['id']) @@ -258,8 +260,8 @@ class RecordsetsTest(BaseRecordsetsTest): record_type='A', zone_name=self.zone['name'], name=record['name']) LOG.info('Update the recordset') - _, update = self.client.update_recordset(self.zone['id'], - record['id'], recordset_data) + update = self.client.update_recordset(self.zone['id'], + record['id'], recordset_data)[1] self.assertEqual(record['name'], update['name']) self.assertNotEqual(record['records'], update['records']) @@ -270,8 +272,8 @@ class RecordsetsTest(BaseRecordsetsTest): record_type='A', zone_name=self.zone['name']) LOG.info('Create a recordset') - _, record = self.client.create_recordset( - self.zone['id'], recordset_data) + record = self.client.create_recordset( + self.zone['id'], recordset_data)[1] self.addCleanup( self.wait_recordset_delete, self.client, self.zone['id'], record['id']) @@ -281,8 +283,8 @@ class RecordsetsTest(BaseRecordsetsTest): } LOG.info('Update the recordset') - _, update = self.client.update_recordset(self.zone['id'], - record['id'], recordset_data) + update = self.client.update_recordset(self.zone['id'], + record['id'], recordset_data)[1] self.assertEqual(record['name'], update['name']) self.assertEqual(record['records'], update['records']) @@ -442,7 +444,7 @@ class RecordsetsNegativeTest(BaseRecordsetsTest): @decorators.idempotent_id('b6dad57e-5ce9-4fa5-8d66-aebbcd23b4ad') def test_get_nonexistent_recordset(self): LOG.info('Create a zone') - _, zone = self.zone_client.create_zone() + zone = self.zone_client.create_zone()[1] self.addCleanup(self.wait_zone_delete, self.zone_client, zone['id']) LOG.info('Attempt to get an invalid Recordset') @@ -453,7 +455,7 @@ class RecordsetsNegativeTest(BaseRecordsetsTest): @decorators.idempotent_id('93d744a8-0dfd-4650-bcef-1e6ad632ad72') def test_get_nonexistent_recordset_invalid_id(self): LOG.info('Create a zone') - _, zone = self.zone_client.create_zone() + zone = self.zone_client.create_zone()[1] self.addCleanup(self.wait_zone_delete, self.zone_client, zone['id']) LOG.info('Attempt to get an invalid Recordset') @@ -463,7 +465,7 @@ class RecordsetsNegativeTest(BaseRecordsetsTest): @decorators.idempotent_id('da08f19a-7f10-47cc-8b41-994507190812') def test_update_nonexistent_recordset(self): LOG.info('Create a zone') - _, zone = self.zone_client.create_zone() + zone = self.zone_client.create_zone()[1] self.addCleanup(self.wait_zone_delete, self.zone_client, zone['id']) recordset_data = data_utils.rand_recordset_data('A', zone['name']) @@ -477,7 +479,7 @@ class RecordsetsNegativeTest(BaseRecordsetsTest): @decorators.idempotent_id('158340a1-3f69-4aaa-9968-956190563768') def test_update_nonexistent_recordset_invalid_id(self): LOG.info('Create a zone') - _, zone = self.zone_client.create_zone() + zone = self.zone_client.create_zone()[1] self.addCleanup(self.wait_zone_delete, self.zone_client, zone['id']) recordset_data = data_utils.rand_recordset_data('A', zone['name']) @@ -490,7 +492,7 @@ class RecordsetsNegativeTest(BaseRecordsetsTest): @decorators.idempotent_id('64bd94d4-54bd-4bee-b6fd-92ede063234e') def test_delete_nonexistent_recordset(self): LOG.info('Create a zone') - _, zone = self.zone_client.create_zone() + zone = self.zone_client.create_zone()[1] self.addCleanup(self.wait_zone_delete, self.zone_client, zone['id']) LOG.info('Attempt to delete an invalid Recordset') @@ -502,7 +504,7 @@ class RecordsetsNegativeTest(BaseRecordsetsTest): @decorators.idempotent_id('5948b599-a332-4dcb-840b-afc825075ba3') def test_delete_nonexistent_recordset_invalid_id(self): LOG.info('Create a zone') - _, zone = self.zone_client.create_zone() + zone = self.zone_client.create_zone()[1] self.addCleanup(self.wait_zone_delete, self.zone_client, zone['id']) LOG.info('Attempt to get an invalid Recordset') @@ -578,7 +580,7 @@ class RootRecordsetsTests(BaseRecordsetsTest): @decorators.idempotent_id('48a081b9-4474-4da0-9b1a-6359a80456ce') def test_list_zones_recordsets(self): LOG.info('List recordsets') - _, body = self.client.list_zones_recordsets() + body = self.client.list_zones_recordsets()[1] self.assertGreater(len(body['recordsets']), 0) @@ -609,7 +611,7 @@ class RootRecordsetsTests(BaseRecordsetsTest): self.zone['id'], zone_recordset['id']) LOG.info('Create another zone') - _, zone2 = self.zone_client.create_zone() + zone2 = self.zone_client.create_zone()[1] self.addCleanup(self.wait_zone_delete, self.zone_client, zone2['id']) LOG.info('Create another Recordset') @@ -623,7 +625,7 @@ class RootRecordsetsTests(BaseRecordsetsTest): self.zone['id'], zone_recordset2['id']) LOG.info('List recordsets') - _, body = self.client.list_zones_recordsets(params={"data": "10.0.*"}) + body = self.client.list_zones_recordsets(params={"data": "10.0.*"})[1] recordsets = body['recordsets'] @@ -641,11 +643,11 @@ class RootRecordsetsTests(BaseRecordsetsTest): @decorators.idempotent_id('7f4970bf-9aeb-4a3c-9afd-02f5a7178d35') def test_list_zones_recordsets_zone_names(self): LOG.info('Create another zone') - _, zone2 = self.zone_client.create_zone() + zone2 = self.zone_client.create_zone()[1] self.addCleanup(self.wait_zone_delete, self.zone_client, zone2['id']) LOG.info('List recordsets') - _, body = self.client.list_zones_recordsets() + body = self.client.list_zones_recordsets()[1] recordsets = body['recordsets'] zone_names = set() @@ -763,7 +765,7 @@ class RecordsetOwnershipTest(BaseRecordsetsTest): zone_name = data_utils.rand_zone_name() LOG.info('Create a zone as a default user') - _, zone = self.zone_client.create_zone(name='a.b.' + zone_name) + zone = self.zone_client.create_zone(name='a.b.' + zone_name)[1] self.addCleanup(self.wait_zone_delete, self.zone_client, zone['id']) rrset_data = data_utils.rand_recordset_data( @@ -777,8 +779,8 @@ class RecordsetOwnershipTest(BaseRecordsetsTest): @decorators.idempotent_id('3dbe244d-fa85-4afc-869b-0306388d8746') def test_no_create_recordset_via_alt_domain(self): - _, zone = self.zone_client.create_zone() - _, alt_zone = self.alt_zone_client.create_zone() + zone = self.zone_client.create_zone()[1] + alt_zone = self.alt_zone_client.create_zone()[1] self.addCleanup(self.wait_zone_delete, self.zone_client, zone['id']) diff --git a/designate_tempest_plugin/tests/api/v2/test_tld.py b/designate_tempest_plugin/tests/api/v2/test_tld.py index 831c13ca..11882a33 100644 --- a/designate_tempest_plugin/tests/api/v2/test_tld.py +++ b/designate_tempest_plugin/tests/api/v2/test_tld.py @@ -51,7 +51,7 @@ class TldAdminTest(BaseTldTest): def resource_setup(cls): super(TldAdminTest, cls).resource_setup() cls.tld = cls.admin_client.create_tld( - tld_name='com', ignore_errors=lib_exc.Conflict + tld_name=cls.tld_suffix, ignore_errors=lib_exc.Conflict ) @classmethod @@ -66,8 +66,8 @@ class TldAdminTest(BaseTldTest): "description": "sample tld"} LOG.info('Create a tld') - _, tld = self.admin_client.create_tld(tld_data['name'], - tld_data['description']) + tld = self.admin_client.create_tld(tld_data['name'], + tld_data['description'])[1] self.addCleanup(self.admin_client.delete_tld, tld['id']) self.assertEqual(tld_data["name"], tld['name']) @@ -116,21 +116,6 @@ class TldAdminTest(BaseTldTest): lib_exc.BadRequest, self.admin_client.create_tld, tld_name='org', description='test_create_invalid_tld' * 1000) - @decorators.idempotent_id('06deced8-d4de-11eb-b8ee-74e5f9e2a801') - def test_create_zone_for_not_existing_tld(self): - LOG.info('Create an "org" TLD') - tld_data = {"name": "org", - "description": "test_create_zone_for_not_existing_tld"} - tld = self.admin_client.create_tld( - tld_data['name'], tld_data['description'])[1] - self.addCleanup(self.admin_client.delete_tld, tld['id']) - self.assertEqual(tld_data["name"], tld['name']) - - LOG.info('Try to create a Primary zone with "zzz" (not existing) TLD.') - self.assertRaises( - lib_exc.BadRequest, self.primary_zone_client.create_zone, - name='example.zzz.') - @decorators.idempotent_id('757019c0-d4e2-11eb-b8ee-74e5f9e2a801') def test_create_tld_as_primary_user(self): tld_data = { @@ -147,12 +132,12 @@ class TldAdminTest(BaseTldTest): "description": "sample tld"} LOG.info('Create a tld') - _, tld = self.admin_client.create_tld(tld_data['name'], - tld_data['description']) + tld = self.admin_client.create_tld(tld_data['name'], + tld_data['description'])[1] self.addCleanup(self.admin_client.delete_tld, tld['id']) LOG.info('Fetch the tld') - _, body = self.admin_client.show_tld(tld['id']) + body = self.admin_client.show_tld(tld['id'])[1] LOG.info('Ensure the fetched response matches the created tld') self.assertExpected(tld, body, self.excluded_keys) @@ -160,12 +145,12 @@ class TldAdminTest(BaseTldTest): @decorators.idempotent_id('26708cb8-7126-48a7-9424-1c225e56e609') def test_delete_tld(self): LOG.info('Create a tld') - _, tld = self.admin_client.create_tld() + tld = self.admin_client.create_tld()[1] self.addCleanup(self.admin_client.delete_tld, tld['id'], ignore_errors=lib_exc.NotFound) LOG.info('Delete the tld') - _, body = self.admin_client.delete_tld(tld['id']) + self.admin_client.delete_tld(tld['id']) self.assertRaises(lib_exc.NotFound, lambda: self.admin_client.show_tld(tld['id'])) @@ -173,13 +158,13 @@ class TldAdminTest(BaseTldTest): @decorators.idempotent_id('95b13759-c85c-4791-829b-9591ca15779d') def test_list_tlds(self): LOG.info('List tlds') - _, body = self.admin_client.list_tlds() + body = self.admin_client.list_tlds()[1] self.assertGreater(len(body['tlds']), 0) @decorators.idempotent_id('1a233812-48d9-4d15-af5e-9961744286ff') def test_update_tld(self): - _, tld = self.admin_client.create_tld() + tld = self.admin_client.create_tld()[1] self.addCleanup(self.admin_client.delete_tld, tld['id']) tld_data = { @@ -188,8 +173,8 @@ class TldAdminTest(BaseTldTest): } LOG.info('Update the tld') - _, patch_tld = self.admin_client.update_tld(tld['id'], - tld_data['name'], tld_data['description']) + patch_tld = self.admin_client.update_tld(tld['id'], + tld_data['name'], tld_data['description'])[1] self.assertEqual(tld_data["name"], patch_tld["name"]) self.assertEqual(tld_data["description"], patch_tld["description"]) diff --git a/designate_tempest_plugin/tests/base.py b/designate_tempest_plugin/tests/base.py index 2e02a8c0..326fbf2d 100644 --- a/designate_tempest_plugin/tests/base.py +++ b/designate_tempest_plugin/tests/base.py @@ -159,6 +159,7 @@ class BaseDnsV2Test(BaseDnsTest): """Base class for DNS V2 API tests.""" all_projects_header = {'X-Auth-All-Projects': True} + tld_suffix = CONF.dns.tld_suffix @classmethod def skip_checks(cls): diff --git a/designate_tempest_plugin/tests/scenario/v2/test_tld.py b/designate_tempest_plugin/tests/scenario/v2/test_tld.py new file mode 100644 index 00000000..9c048a17 --- /dev/null +++ b/designate_tempest_plugin/tests/scenario/v2/test_tld.py @@ -0,0 +1,80 @@ +# Copyright 2021 Red Hat. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from oslo_log import log as logging +from tempest import config +from tempest.lib import decorators +from tempest.lib import exceptions as lib_exc + +from designate_tempest_plugin.common import constants as const +from designate_tempest_plugin.tests import base +from designate_tempest_plugin import data_utils as dns_data_utils + +CONF = config.CONF +LOG = logging.getLogger(__name__) + + +class TldZoneTest(base.BaseDnsV2Test): + credentials = ["admin", "system_admin", "primary"] + + @classmethod + def setup_credentials(cls): + # Do not create network resources for these test. + cls.set_network_resources() + super(TldZoneTest, cls).setup_credentials() + + @classmethod + def setup_clients(cls): + super(TldZoneTest, cls).setup_clients() + if CONF.enforce_scope.designate: + cls.admin_tld_client = cls.os_system_admin.dns_v2.TldClient() + else: + cls.admin_tld_client = cls.os_admin.dns_v2.TldClient() + cls.primary_tld_client = cls.os_primary.dns_v2.TldClient() + cls.primary_zone_client = cls.os_primary.dns_v2.ZonesClient() + + @classmethod + def resource_setup(cls): + super(TldZoneTest, cls).resource_setup() + cls.tld = cls.admin_tld_client.create_tld( + tld_name=cls.tld_suffix, ignore_errors=lib_exc.Conflict + ) + + @classmethod + def resource_cleanup(cls): + cls.admin_tld_client.delete_tld(cls.tld[1]['id']) + super(TldZoneTest, cls).resource_cleanup() + + @decorators.idempotent_id('68b3e7cc-bf0e-11ec-b803-201e8823901f') + def test_create_zone_using_existing_tld(self): + LOG.info('Creates a zone using existing TLD:"{}"'.format( + self.tld_suffix)) + zone_name = dns_data_utils.rand_zone_name( + name='existing_tld_zone', prefix='rand', + suffix='.{}.'.format(self.tld_suffix)) + zone = self.primary_zone_client.create_zone( + name=zone_name, wait_until=const.ACTIVE)[1] + self.addCleanup( + self.wait_zone_delete, self.primary_zone_client, zone['id']) + + @decorators.idempotent_id('06deced8-d4de-11eb-b8ee-74e5f9e2a801') + def test_create_zone_using_not_existing_tld(self): + LOG.info('Try to create a Zone using not existing TLD:"{}"'.format( + self.tld_suffix[::-1])) + zone_name = dns_data_utils.rand_zone_name( + name='not_existing_tld_zone', prefix='rand', + suffix='.{}.'.format(self.tld_suffix)[::-1]) + self.assertRaises( + lib_exc.BadRequest, self.primary_zone_client.create_zone, + name=zone_name)