From 00ffdef3d549e331ed99e2db40629e62fefede3b Mon Sep 17 00:00:00 2001 From: Andrey Kurilin Date: Mon, 3 Jul 2017 13:26:27 +0300 Subject: [PATCH] [ci] Use pseudo-random names for new resources Random names of resources makes the task impossible to find a test which doesn't clean resources after a launch. This patch changes name_generate method to generate names including a name of the test, which can be really helpful. Also, the simple script that prints resources after test run is added. Change-Id: Id3a743afb624dd4bf8ed3523a1916455fd93655a --- novaclient/tests/functional/base.py | 27 ++++++++++------- .../tests/functional/hooks/check_resources.py | 30 +++++++++++++++++++ .../v2/legacy/test_flavor_access.py | 6 ++-- .../functional/v2/legacy/test_instances.py | 2 +- .../functional/v2/legacy/test_keypairs.py | 3 +- .../v2/legacy/test_server_groups.py | 4 +-- .../functional/v2/legacy/test_servers.py | 20 ++++++------- .../tests/functional/v2/legacy/test_usage.py | 8 ++--- .../tests/functional/v2/test_aggregates.py | 6 ++-- .../functional/v2/test_device_tagging.py | 9 +++--- .../tests/functional/v2/test_flavor_access.py | 2 +- .../tests/functional/v2/test_keypairs.py | 6 ++-- novaclient/tests/functional/v2/test_resize.py | 16 ++++------ .../tests/functional/v2/test_servers.py | 4 +-- .../functional/v2/test_trigger_crash_dump.py | 2 +- tox.ini | 8 +++-- 16 files changed, 91 insertions(+), 62 deletions(-) create mode 100644 novaclient/tests/functional/hooks/check_resources.py diff --git a/novaclient/tests/functional/base.py b/novaclient/tests/functional/base.py index 6b95f40d4..2c83f3027 100644 --- a/novaclient/tests/functional/base.py +++ b/novaclient/tests/functional/base.py @@ -373,13 +373,20 @@ class ClientTestBase(testtools.TestCase): else: self.fail("The resource '%s' still exists." % resource.id) - def name_generate(self, prefix='Entity'): - """Generate randomized name for some entity. - - :param prefix: string prefix - """ - name = "%s-%s" % (prefix, uuidutils.generate_uuid()) - return name + def name_generate(self): + """Generate randomized name for some entity.""" + # NOTE(andreykurilin): name_generator method is used for various + # resources (servers, flavors, volumes, keystone users, etc). + # Since the length of name has limits we cannot use the whole UUID, + # so the first 8 chars is taken from it. + # Based on the fact that the new name includes class and method + # names, 8 chars of uuid should be enough to prevent any conflicts, + # even if the single test will be launched in parallel thousand times + return "%(prefix)s-%(test_cls)s-%(test_name)s" % { + "prefix": uuidutils.generate_uuid()[:8], + "test_cls": self.__class__.__name__, + "test_name": self.id().rsplit(".", 1)[-1] + } def _get_value_from_the_table(self, table, key): """Parses table to get desired value. @@ -470,7 +477,7 @@ class ClientTestBase(testtools.TestCase): def _create_server(self, name=None, flavor=None, with_network=True, add_cleanup=True, **kwargs): - name = name or self.name_generate(prefix='server') + name = name or self.name_generate() if with_network: nics = [{"net-id": self.network.id}] else: @@ -521,8 +528,8 @@ class TenantTestBase(ClientTestBase): def setUp(self): super(TenantTestBase, self).setUp() - user_name = self.name_generate('v' + self.COMPUTE_API_VERSION) - project_name = self.name_generate('v' + self.COMPUTE_API_VERSION) + user_name = uuidutils.generate_uuid() + project_name = uuidutils.generate_uuid() password = 'password' if self.keystone.version == "v3": diff --git a/novaclient/tests/functional/hooks/check_resources.py b/novaclient/tests/functional/hooks/check_resources.py new file mode 100644 index 000000000..1d2d1bdba --- /dev/null +++ b/novaclient/tests/functional/hooks/check_resources.py @@ -0,0 +1,30 @@ +# 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 novaclient.tests.functional import base + + +class ResourceChecker(base.ClientTestBase): + + def runTest(self): + pass + + def check(self): + self.setUp() + + print("$ nova list --all-tenants") + print(self.nova("list", params="--all-tenants")) + print("\n") + + +if __name__ == "__main__": + ResourceChecker().check() diff --git a/novaclient/tests/functional/v2/legacy/test_flavor_access.py b/novaclient/tests/functional/v2/legacy/test_flavor_access.py index 54671b286..964e3d610 100644 --- a/novaclient/tests/functional/v2/legacy/test_flavor_access.py +++ b/novaclient/tests/functional/v2/legacy/test_flavor_access.py @@ -29,7 +29,7 @@ class TestFlvAccessNovaClient(base.TenantTestBase): # Check that non-public flavor appears in flavor list # only for admin tenant and only with --all attribute # and doesn't appear for non-admin tenant - flv_name = self.name_generate(prefix='flv') + flv_name = self.name_generate() self.nova('flavor-create --is-public false %s auto 512 1 1' % flv_name) self.addCleanup(self.nova, 'flavor-delete %s' % flv_name) flavor_list1 = self.nova('flavor-list') @@ -42,7 +42,7 @@ class TestFlvAccessNovaClient(base.TenantTestBase): def test_add_access_non_public_flavor(self): # Check that it's allowed to grant an access to non-public flavor for # the given tenant - flv_name = self.name_generate(prefix='flv') + flv_name = self.name_generate() self.nova('flavor-create --is-public false %s auto 512 1 1' % flv_name) self.addCleanup(self.nova, 'flavor-delete %s' % flv_name) self.nova('flavor-access-add', params="%s %s" % @@ -55,7 +55,7 @@ class TestFlvAccessNovaClient(base.TenantTestBase): # successfully for public flavor, but the next operation, # 'flavor-access-list --flavor %(name_of_public_flavor)' returns # a CommandError - flv_name = self.name_generate(prefix='flv') + flv_name = self.name_generate() self.nova('flavor-create %s auto 512 1 1' % flv_name) self.addCleanup(self.nova, 'flavor-delete %s' % flv_name) self.nova('flavor-access-add %s %s' % (flv_name, self.project_id)) diff --git a/novaclient/tests/functional/v2/legacy/test_instances.py b/novaclient/tests/functional/v2/legacy/test_instances.py index 3ff07b44b..131407a77 100644 --- a/novaclient/tests/functional/v2/legacy/test_instances.py +++ b/novaclient/tests/functional/v2/legacy/test_instances.py @@ -37,7 +37,7 @@ class TestInstanceCLI(base.ClientTestBase): destroy. """ - name = self.name_generate('Instance') + name = self.name_generate() # Boot via the cli, as we're primarily testing the cli in this test self.nova('boot', diff --git a/novaclient/tests/functional/v2/legacy/test_keypairs.py b/novaclient/tests/functional/v2/legacy/test_keypairs.py index 73e77b9cf..1e04781df 100644 --- a/novaclient/tests/functional/v2/legacy/test_keypairs.py +++ b/novaclient/tests/functional/v2/legacy/test_keypairs.py @@ -12,7 +12,6 @@ import tempfile -from oslo_utils import uuidutils from tempest.lib import exceptions from novaclient.tests.functional import base @@ -36,7 +35,7 @@ class TestKeypairsNovaClient(base.ClientTestBase): return key_name def _raw_create_keypair(self, **kwargs): - key_name = 'keypair-' + uuidutils.generate_uuid() + key_name = self.name_generate() kwargs_str = self._serialize_kwargs(kwargs) self.nova('keypair-add %s %s' % (kwargs_str, key_name)) return key_name diff --git a/novaclient/tests/functional/v2/legacy/test_server_groups.py b/novaclient/tests/functional/v2/legacy/test_server_groups.py index 5518ea979..a1ab151b4 100644 --- a/novaclient/tests/functional/v2/legacy/test_server_groups.py +++ b/novaclient/tests/functional/v2/legacy/test_server_groups.py @@ -11,8 +11,6 @@ # License for the specific language governing permissions and limitations # under the License. -from oslo_utils import uuidutils - from novaclient.tests.functional import base @@ -22,7 +20,7 @@ class TestServerGroupClient(base.ClientTestBase): COMPUTE_API_VERSION = "2.1" def _create_sg(self, policy): - sg_name = 'server_group-' + uuidutils.generate_uuid() + sg_name = self.name_generate() output = self.nova('server-group-create %s %s' % (sg_name, policy)) sg_id = self._get_column_value_from_single_row_table(output, "Id") return sg_id diff --git a/novaclient/tests/functional/v2/legacy/test_servers.py b/novaclient/tests/functional/v2/legacy/test_servers.py index c0852a1bf..5980e94f5 100644 --- a/novaclient/tests/functional/v2/legacy/test_servers.py +++ b/novaclient/tests/functional/v2/legacy/test_servers.py @@ -13,7 +13,6 @@ import datetime from oslo_utils import timeutils -from oslo_utils import uuidutils from novaclient.tests.functional import base @@ -25,7 +24,7 @@ class TestServersBootNovaClient(base.ClientTestBase): def _boot_server_with_legacy_bdm(self, bdm_params=()): volume_size = 1 - volume_name = uuidutils.generate_uuid() + volume_name = self.name_generate() volume = self.cinder.volumes.create(size=volume_size, name=volume_name, imageRef=self.image.id) @@ -43,7 +42,7 @@ class TestServersBootNovaClient(base.ClientTestBase): params = ( "%(name)s --flavor %(flavor)s --poll " "--block-device-mapping vda=%(volume_id)s%(bdm_params)s" % { - "name": uuidutils.generate_uuid(), "flavor": + "name": self.name_generate(), "flavor": self.flavor.id, "volume_id": volume.id, "bdm_params": bdm_params}) @@ -73,7 +72,7 @@ class TestServersBootNovaClient(base.ClientTestBase): def test_boot_server_with_net_name(self): server_info = self.nova("boot", params=( "%(name)s --flavor %(flavor)s --image %(image)s --poll " - "--nic net-name=%(net-name)s" % {"name": uuidutils.generate_uuid(), + "--nic net-name=%(net-name)s" % {"name": self.name_generate(), "image": self.image.id, "flavor": self.flavor.id, "net-name": self.network.name})) @@ -133,7 +132,7 @@ class TestServersListNovaClient(base.ClientTestBase): return [self._create_server(name) for i in range(number)] def test_list_with_limit(self): - name = uuidutils.generate_uuid() + name = self.name_generate() self._create_servers(name, 2) output = self.nova("list", params="--limit 1 --name %s" % name) # Cut header and footer of the table @@ -142,7 +141,7 @@ class TestServersListNovaClient(base.ClientTestBase): def test_list_with_changes_since(self): now = datetime.datetime.isoformat(timeutils.utcnow()) - name = uuidutils.generate_uuid() + name = self.name_generate() self._create_servers(name, 1) output = self.nova("list", params="--changes-since %s" % now) self.assertIn(name, output, output) @@ -151,7 +150,7 @@ class TestServersListNovaClient(base.ClientTestBase): self.assertNotIn(name, output, output) def test_list_all_servers(self): - name = uuidutils.generate_uuid() + name = self.name_generate() precreated_servers = self._create_servers(name, 3) # there are no possibility to exceed the limit on API side, so just # check that "-1" limit processes by novaclient side @@ -161,13 +160,12 @@ class TestServersListNovaClient(base.ClientTestBase): self.assertIn(server.id, output) def test_list_minimal(self): - name = uuidutils.generate_uuid() - uuid = self._create_server(name).id + server = self._create_server() server_output = self.nova("list --minimal") # The only fields output are "ID" and "Name" output_uuid = self._get_column_value_from_single_row_table( server_output, 'ID') output_name = self._get_column_value_from_single_row_table( server_output, 'Name') - self.assertEqual(output_uuid, uuid) - self.assertEqual(output_name, name) + self.assertEqual(output_uuid, server.id) + self.assertEqual(output_name, server.name) diff --git a/novaclient/tests/functional/v2/legacy/test_usage.py b/novaclient/tests/functional/v2/legacy/test_usage.py index e37693d1b..11080c135 100644 --- a/novaclient/tests/functional/v2/legacy/test_usage.py +++ b/novaclient/tests/functional/v2/legacy/test_usage.py @@ -34,13 +34,13 @@ class TestUsageCLI(base.ClientTestBase): def test_usage(self): before = self._get_num_servers_from_usage_output() - self._create_server('some-server') + self._create_server() after = self._get_num_servers_from_usage_output() self.assertGreater(after, before) def test_usage_tenant(self): before = self._get_num_servers_by_tenant_from_usage_output() - self._create_server('some-server') + self._create_server() after = self._get_num_servers_by_tenant_from_usage_output() self.assertGreater(after, before) @@ -51,8 +51,8 @@ class TestUsageClient(base.ClientTestBase): def _create_servers_in_time_window(self): start = datetime.datetime.now() - self._create_server('some-server') - self._create_server('another-server') + self._create_server() + self._create_server() end = datetime.datetime.now() return start, end diff --git a/novaclient/tests/functional/v2/test_aggregates.py b/novaclient/tests/functional/v2/test_aggregates.py index b89e35664..f3f5f032f 100644 --- a/novaclient/tests/functional/v2/test_aggregates.py +++ b/novaclient/tests/functional/v2/test_aggregates.py @@ -11,8 +11,6 @@ # License for the specific language governing permissions and limitations # under the License. -from oslo_utils import uuidutils - from novaclient.tests.functional import base @@ -21,8 +19,8 @@ class TestAggregatesNovaClient(base.ClientTestBase): def setUp(self): super(TestAggregatesNovaClient, self).setUp() - self.agg1 = 'agg-%s' % uuidutils.generate_uuid() - self.agg2 = 'agg-%s' % uuidutils.generate_uuid() + self.agg1 = self.name_generate() + self.agg2 = self.name_generate() self.addCleanup(self._clean_aggregates) def _clean_aggregates(self): diff --git a/novaclient/tests/functional/v2/test_device_tagging.py b/novaclient/tests/functional/v2/test_device_tagging.py index c19c42403..5bb900e74 100644 --- a/novaclient/tests/functional/v2/test_device_tagging.py +++ b/novaclient/tests/functional/v2/test_device_tagging.py @@ -12,7 +12,6 @@ # License for the specific language governing permissions and limitations # under the License. -from oslo_utils import uuidutils import six from tempest.lib import exceptions @@ -33,7 +32,7 @@ class TestBlockDeviceTaggingCLIError(base.ClientTestBase): '--nic net-id=%(net-uuid)s ' '--block-device ' 'source=image,dest=volume,id=%(image)s,size=1,bootindex=0,' - 'shutdown=remove,tag=bar' % {'name': uuidutils.generate_uuid(), + 'shutdown=remove,tag=bar' % {'name': self.name_generate(), 'flavor': self.flavor.id, 'net-uuid': self.network.id, 'image': self.image.id})) @@ -63,7 +62,7 @@ class TestNICDeviceTaggingCLIError(base.ClientTestBase): '--nic net-id=%(net-uuid)s,tag=foo ' '--block-device ' 'source=image,dest=volume,id=%(image)s,size=1,bootindex=0,' - 'shutdown=remove' % {'name': uuidutils.generate_uuid(), + 'shutdown=remove' % {'name': self.name_generate(), 'flavor': self.flavor.id, 'net-uuid': self.network.id, 'image': self.image.id})) @@ -90,7 +89,7 @@ class TestBlockDeviceTaggingCLI(base.ClientTestBase): '--nic net-id=%(net-uuid)s ' '--block-device ' 'source=image,dest=volume,id=%(image)s,size=1,bootindex=0,' - 'shutdown=remove,tag=bar' % {'name': uuidutils.generate_uuid(), + 'shutdown=remove,tag=bar' % {'name': self.name_generate(), 'flavor': self.flavor.id, 'net-uuid': self.network.id, 'image': self.image.id})) @@ -112,7 +111,7 @@ class TestNICDeviceTaggingCLI(base.ClientTestBase): '--nic net-id=%(net-uuid)s,tag=foo ' '--block-device ' 'source=image,dest=volume,id=%(image)s,size=1,bootindex=0,' - 'shutdown=remove' % {'name': uuidutils.generate_uuid(), + 'shutdown=remove' % {'name': self.name_generate(), 'flavor': self.flavor.id, 'net-uuid': self.network.id, 'image': self.image.id})) diff --git a/novaclient/tests/functional/v2/test_flavor_access.py b/novaclient/tests/functional/v2/test_flavor_access.py index 229aa3fc4..23ef030ec 100644 --- a/novaclient/tests/functional/v2/test_flavor_access.py +++ b/novaclient/tests/functional/v2/test_flavor_access.py @@ -22,7 +22,7 @@ class TestFlvAccessNovaClientV27(test_flavor_access.TestFlvAccessNovaClient): COMPUTE_API_VERSION = "2.7" def test_add_access_public_flavor(self): - flv_name = self.name_generate('v' + self.COMPUTE_API_VERSION) + flv_name = self.name_generate() self.nova('flavor-create %s auto 512 1 1' % flv_name) self.addCleanup(self.nova, 'flavor-delete %s' % flv_name) output = self.nova('flavor-access-add %s %s' % diff --git a/novaclient/tests/functional/v2/test_keypairs.py b/novaclient/tests/functional/v2/test_keypairs.py index dba132c51..4f2df58a7 100644 --- a/novaclient/tests/functional/v2/test_keypairs.py +++ b/novaclient/tests/functional/v2/test_keypairs.py @@ -50,7 +50,7 @@ class TestKeypairsNovaClientV210(base.TenantTestBase): COMPUTE_API_VERSION = "2.10" def test_create_and_list_keypair(self): - name = self.name_generate("v2_10") + name = self.name_generate() self.nova("keypair-add %s --user %s" % (name, self.user_id)) self.addCleanup(self.another_nova, "keypair-delete %s" % name) output = self.nova("keypair-list") @@ -71,7 +71,7 @@ class TestKeypairsNovaClientV210(base.TenantTestBase): self._get_value_from_the_table(output_1, "user_id")) def test_create_and_delete(self): - name = self.name_generate("v2_10") + name = self.name_generate() def cleanup(): # We should check keypair existence and remove it from correct user @@ -101,7 +101,7 @@ class TestKeypairsNovaClientV235(base.TenantTestBase): def test_create_and_list_keypair_with_marker_and_limit(self): names = [] for i in range(3): - names.append(self.name_generate("v2_35")) + names.append(self.name_generate()) self.nova("keypair-add %s --user %s" % (names[i], self.user_id)) self.addCleanup(self.another_nova, "keypair-delete %s" % names[i]) diff --git a/novaclient/tests/functional/v2/test_resize.py b/novaclient/tests/functional/v2/test_resize.py index 2c14c19f9..0354610fd 100644 --- a/novaclient/tests/functional/v2/test_resize.py +++ b/novaclient/tests/functional/v2/test_resize.py @@ -66,8 +66,7 @@ class TestServersResize(base.ClientTestBase): """Tests creating a server and resizes up and confirms the resize. Compares quota before, during and after the resize. """ - server_id = self._create_server('resize-up-confirm', - flavor=self.flavor.id).id + server_id = self._create_server(flavor=self.flavor.id).id # get the starting quota now that we've created a server starting_usage = self._get_absolute_limits() # now resize up @@ -95,16 +94,14 @@ class TestServersResize(base.ClientTestBase): smaller flavor. """ output = self.nova('flavor-create', - params='resize-larger-flavor auto 128 0 1') + params='%s auto 128 0 1' % self.name_generate()) larger_id = self._get_column_value_from_single_row_table(output, "ID") - self.addCleanup( - self.nova, 'flavor-delete', params='resize-larger-flavor') + self.addCleanup(self.nova, 'flavor-delete', params=larger_id) output = self.nova('flavor-create', - params='resize-smaller-flavor auto 64 0 1') + params='%s auto 64 0 1' % self.name_generate()) smaller_id = self._get_column_value_from_single_row_table(output, "ID") - self.addCleanup( - self.nova, 'flavor-delete', params='resize-smaller-flavor') + self.addCleanup(self.nova, 'flavor-delete', params=smaller_id) return larger_id, smaller_id @@ -117,8 +114,7 @@ class TestServersResize(base.ClientTestBase): # create our own flavors. larger_flavor, smaller_flavor = self._create_resize_down_flavors() # Now create the server with the larger flavor. - server_id = self._create_server('resize-down-revert', - flavor=larger_flavor).id + server_id = self._create_server(flavor=larger_flavor).id # get the starting quota now that we've created a server starting_usage = self._get_absolute_limits() # now resize down diff --git a/novaclient/tests/functional/v2/test_servers.py b/novaclient/tests/functional/v2/test_servers.py index c2290eb22..8d5fd02c9 100644 --- a/novaclient/tests/functional/v2/test_servers.py +++ b/novaclient/tests/functional/v2/test_servers.py @@ -231,7 +231,7 @@ class TestServersAutoAllocateNetworkCLI(base.ClientTestBase): self.skipTest('multiple networks available') server_info = self.nova('boot', params=( '%(name)s --flavor %(flavor)s --poll ' - '--image %(image)s ' % {'name': self.name_generate('server'), + '--image %(image)s ' % {'name': self.name_generate(), 'flavor': self.flavor.id, 'image': self.image.id})) server_id = self._get_value_from_the_table(server_info, 'id') @@ -251,7 +251,7 @@ class TestServersAutoAllocateNetworkCLI(base.ClientTestBase): server_info = self.nova('boot', params=( '%(name)s --flavor %(flavor)s --poll ' '--image %(image)s --nic none' % - {'name': self.name_generate('server'), + {'name': self.name_generate(), 'flavor': self.flavor.id, 'image': self.image.id})) server_id = self._get_value_from_the_table(server_info, 'id') diff --git a/novaclient/tests/functional/v2/test_trigger_crash_dump.py b/novaclient/tests/functional/v2/test_trigger_crash_dump.py index bf556eec8..b7df75140 100644 --- a/novaclient/tests/functional/v2/test_trigger_crash_dump.py +++ b/novaclient/tests/functional/v2/test_trigger_crash_dump.py @@ -119,7 +119,7 @@ class TestTriggerCrashDumpNovaClientV217(base.TenantTestBase): self._assert_nmi(server.id) def test_trigger_crash_dump_in_locked_state_nonadmin(self): - name = self.name_generate(prefix='server') + name = self.name_generate() server = self.another_nova('boot --flavor %s --image %s --poll %s' % (self.flavor.name, self.image.name, name)) self.addCleanup(self.another_nova, 'delete', params=name) diff --git a/tox.ini b/tox.ini index 48351b605..c8910f5f6 100644 --- a/tox.ini +++ b/tox.ini @@ -46,7 +46,9 @@ passenv = OS_NOVACLIENT_TEST_NETWORK setenv = {[testenv]setenv} OS_TEST_PATH = ./novaclient/tests/functional -commands = bash tools/pretty_tox.sh '--concurrency=1 {posargs}' +commands = + bash tools/pretty_tox.sh '--concurrency=1 {posargs}' + python novaclient/tests/functional/hooks/check_resources.py [testenv:functional-py35] basepython = python3.5 @@ -54,7 +56,9 @@ passenv = OS_NOVACLIENT_TEST_NETWORK setenv = {[testenv]setenv} OS_TEST_PATH = ./novaclient/tests/functional -commands = bash tools/pretty_tox.sh '--concurrency=1 {posargs}' +commands = + bash tools/pretty_tox.sh '--concurrency=1 {posargs}' + python novaclient/tests/functional/hooks/check_resources.py [testenv:cover] commands =