Initial class creds creation in test base class
Each test class may now define at class level which credentials
are needed, and they will be allocated automatically by the base
class. To start using this a test class that requires network
resources must implement the setup_credentials method and
define the required resources before super is invoked.
In this patch this only affects the creation of credentials
as defined in the various base classes. Other tests will be
migrated as part of the resource-cleanup bp. Note that this
changes baremetal, identity and orchestration tests to
honour the tenant isolation settings.
Partially-implements: bp resource-cleanup
Change-Id: Id36a6ebddb618a78cee7025c9537cd1e2746190e
diff --git a/tempest/api/baremetal/admin/base.py b/tempest/api/baremetal/admin/base.py
index 9aeea0a..0b5d7d9 100644
--- a/tempest/api/baremetal/admin/base.py
+++ b/tempest/api/baremetal/admin/base.py
@@ -15,8 +15,6 @@
from tempest_lib.common.utils import data_utils
from tempest_lib import exceptions as lib_exc
-from tempest import clients
-from tempest.common import credentials
from tempest import config
from tempest import test
@@ -54,6 +52,8 @@
class BaseBaremetalTest(test.BaseTestCase):
"""Base class for Baremetal API tests."""
+ credentials = ['admin']
+
@classmethod
def skip_checks(cls):
super(BaseBaremetalTest, cls).skip_checks()
@@ -68,18 +68,9 @@
raise cls.skipException(skip_msg)
@classmethod
- def setup_credentials(cls):
- super(BaseBaremetalTest, cls).setup_credentials()
- if (not hasattr(cls, 'isolated_creds') or
- not cls.isolated_creds.name == cls.__name__):
- cls.isolated_creds = credentials.get_isolated_credentials(
- name=cls.__name__, network_resources=cls.network_resources)
- cls.mgr = clients.Manager(cls.isolated_creds.get_admin_creds())
-
- @classmethod
def setup_clients(cls):
super(BaseBaremetalTest, cls).setup_clients()
- cls.client = cls.mgr.baremetal_client
+ cls.client = cls.os_admin.baremetal_client
@classmethod
def resource_setup(cls):
diff --git a/tempest/api/compute/base.py b/tempest/api/compute/base.py
index 9f1a548..eca634d 100644
--- a/tempest/api/compute/base.py
+++ b/tempest/api/compute/base.py
@@ -20,8 +20,6 @@
from tempest_lib.common.utils import data_utils
from tempest_lib import exceptions as lib_exc
-from tempest import clients
-from tempest.common import credentials
from tempest.common import fixed_network
from tempest import config
from tempest import exceptions
@@ -38,6 +36,10 @@
_api_version = 2
force_tenant_isolation = False
+ # TODO(andreaf) We should care also for the alt_manager here
+ # but only once client lazy load in the manager is done
+ credentials = ['primary']
+
@classmethod
def skip_checks(cls):
super(BaseComputeTest, cls).skip_checks()
@@ -50,12 +52,6 @@
def setup_credentials(cls):
cls.set_network_resources()
super(BaseComputeTest, cls).setup_credentials()
- # TODO(andreaf) WE should care also for the alt_manager here
- # but only once client lazy load in the manager is done
- cls.os = cls.get_client_manager()
- # Note that we put this here and not in skip_checks because in
- # the case of preprovisioned users we won't know if we can get
- # two distinct users until we go and lock them
cls.multi_user = cls.check_multi_user()
@classmethod
@@ -350,18 +346,7 @@
class BaseComputeAdminTest(BaseComputeTest):
"""Base test case class for Compute Admin API tests."""
- @classmethod
- def skip_checks(cls):
- super(BaseComputeAdminTest, cls).skip_checks()
- if not credentials.is_admin_available():
- msg = ("Missing Identity Admin API credentials in configuration.")
- raise cls.skipException(msg)
-
- @classmethod
- def setup_credentials(cls):
- super(BaseComputeAdminTest, cls).setup_credentials()
- creds = cls.isolated_creds.get_admin_creds()
- cls.os_adm = clients.Manager(credentials=creds)
+ credentials = ['primary', 'admin']
@classmethod
def setup_clients(cls):
diff --git a/tempest/api/compute/servers/test_servers_negative.py b/tempest/api/compute/servers/test_servers_negative.py
index 853e262..46b1886 100644
--- a/tempest/api/compute/servers/test_servers_negative.py
+++ b/tempest/api/compute/servers/test_servers_negative.py
@@ -20,7 +20,6 @@
import testtools
from tempest.api.compute import base
-from tempest import clients
from tempest import config
from tempest import test
@@ -29,6 +28,8 @@
class ServersNegativeTestJSON(base.BaseV2ComputeTest):
+ credentials = ['primary', 'alt']
+
def setUp(self):
super(ServersNegativeTestJSON, self).setUp()
try:
@@ -41,15 +42,10 @@
super(ServersNegativeTestJSON, self).tearDown()
@classmethod
- def setup_credentials(cls):
- super(ServersNegativeTestJSON, cls).setup_credentials()
- cls.alt_os = clients.Manager(cls.isolated_creds.get_alt_creds())
-
- @classmethod
def setup_clients(cls):
super(ServersNegativeTestJSON, cls).setup_clients()
cls.client = cls.servers_client
- cls.alt_client = cls.alt_os.servers_client
+ cls.alt_client = cls.os_alt.servers_client
@classmethod
def resource_setup(cls):
diff --git a/tempest/api/compute/test_authorization.py b/tempest/api/compute/test_authorization.py
index 2baf608..435c113 100644
--- a/tempest/api/compute/test_authorization.py
+++ b/tempest/api/compute/test_authorization.py
@@ -20,7 +20,6 @@
from tempest_lib import exceptions as lib_exc
from tempest.api.compute import base
-from tempest import clients
from tempest import config
from tempest import test
@@ -31,6 +30,8 @@
class AuthorizationTestJSON(base.BaseV2ComputeTest):
+ credentials = ['primary', 'alt']
+
@classmethod
def skip_checks(cls):
super(AuthorizationTestJSON, cls).skip_checks()
@@ -42,12 +43,6 @@
# No network resources required for this test
cls.set_network_resources()
super(AuthorizationTestJSON, cls).setup_credentials()
- if not cls.multi_user:
- msg = "Need >1 user"
- raise cls.skipException(msg)
-
- creds = cls.isolated_creds.get_alt_creds()
- cls.alt_manager = clients.Manager(credentials=creds)
@classmethod
def setup_clients(cls):
diff --git a/tempest/api/data_processing/base.py b/tempest/api/data_processing/base.py
index 5a903b7..904cbb6 100644
--- a/tempest/api/data_processing/base.py
+++ b/tempest/api/data_processing/base.py
@@ -225,6 +225,8 @@
class BaseDataProcessingTest(tempest.test.BaseTestCase):
+ credentials = ['primary']
+
@classmethod
def skip_checks(cls):
super(BaseDataProcessingTest, cls).skip_checks()
@@ -233,11 +235,6 @@
cls.default_plugin = cls._get_default_plugin()
@classmethod
- def setup_credentials(cls):
- super(BaseDataProcessingTest, cls).setup_credentials()
- cls.os = cls.get_client_manager()
-
- @classmethod
def setup_clients(cls):
super(BaseDataProcessingTest, cls).setup_clients()
cls.client = cls.os.data_processing_client
diff --git a/tempest/api/database/base.py b/tempest/api/database/base.py
index 1868f23..f4c1881 100644
--- a/tempest/api/database/base.py
+++ b/tempest/api/database/base.py
@@ -25,6 +25,8 @@
class BaseDatabaseTest(tempest.test.BaseTestCase):
"""Base test case class for all Database API tests."""
+ credentials = ['primary']
+
@classmethod
def skip_checks(cls):
super(BaseDatabaseTest, cls).skip_checks()
@@ -33,11 +35,6 @@
raise cls.skipException(skip_msg)
@classmethod
- def setup_credentials(cls):
- super(BaseDatabaseTest, cls).setup_credentials()
- cls.os = cls.get_client_manager()
-
- @classmethod
def setup_clients(cls):
super(BaseDatabaseTest, cls).setup_clients()
cls.database_flavors_client = cls.os.database_flavors_client
diff --git a/tempest/api/identity/base.py b/tempest/api/identity/base.py
index b83da3e..5d66b9c 100644
--- a/tempest/api/identity/base.py
+++ b/tempest/api/identity/base.py
@@ -17,9 +17,7 @@
from tempest_lib.common.utils import data_utils
from tempest_lib import exceptions as lib_exc
-from tempest import clients
from tempest.common import cred_provider
-from tempest.common import credentials
from tempest import config
import tempest.test
@@ -66,6 +64,8 @@
class BaseIdentityV2Test(BaseIdentityTest):
+ credentials = ['primary']
+
@classmethod
def setup_credentials(cls):
super(BaseIdentityV2Test, cls).setup_credentials()
@@ -94,24 +94,13 @@
class BaseIdentityV2AdminTest(BaseIdentityV2Test):
- @classmethod
- def setup_credentials(cls):
- super(BaseIdentityV2AdminTest, cls).setup_credentials()
- cls.os_adm = clients.Manager(cls.isolated_creds.get_admin_creds())
-
- @classmethod
- def skip_checks(cls):
- if not credentials.is_admin_available():
- raise cls.skipException('v2 Admin auth disabled')
- super(BaseIdentityV2AdminTest, cls).skip_checks()
+ credentials = ['admin']
@classmethod
def setup_clients(cls):
super(BaseIdentityV2AdminTest, cls).setup_clients()
cls.client = cls.os_adm.identity_client
cls.token_client = cls.os_adm.token_client
- if not cls.client.has_admin_extensions():
- raise cls.skipException("Admin extensions disabled")
@classmethod
def resource_setup(cls):
@@ -126,6 +115,8 @@
class BaseIdentityV3Test(BaseIdentityTest):
+ credentials = ['primary']
+
@classmethod
def setup_credentials(cls):
super(BaseIdentityV3Test, cls).setup_credentials()
@@ -155,16 +146,7 @@
class BaseIdentityV3AdminTest(BaseIdentityV3Test):
- @classmethod
- def setup_credentials(cls):
- super(BaseIdentityV3AdminTest, cls).setup_credentials()
- cls.os_adm = clients.Manager(cls.isolated_creds.get_admin_creds())
-
- @classmethod
- def skip_checks(cls):
- if not credentials.is_admin_available():
- raise cls.skipException('v3 Admin auth disabled')
- super(BaseIdentityV3AdminTest, cls).skip_checks()
+ credentials = ['admin']
@classmethod
def setup_clients(cls):
diff --git a/tempest/api/image/base.py b/tempest/api/image/base.py
index 74044dc..acf8272 100644
--- a/tempest/api/image/base.py
+++ b/tempest/api/image/base.py
@@ -17,8 +17,6 @@
from tempest_lib.common.utils import data_utils
from tempest_lib import exceptions as lib_exc
-from tempest import clients
-from tempest.common import credentials
from tempest import config
import tempest.test
@@ -30,6 +28,8 @@
class BaseImageTest(tempest.test.BaseTestCase):
"""Base test class for Image API tests."""
+ credentials = ['primary']
+
@classmethod
def skip_checks(cls):
super(BaseImageTest, cls).skip_checks()
@@ -39,14 +39,11 @@
@classmethod
def setup_credentials(cls):
+ cls.set_network_resources()
super(BaseImageTest, cls).setup_credentials()
- cls.isolated_creds = credentials.get_isolated_credentials(
- cls.__name__, network_resources=cls.network_resources)
- cls.os = clients.Manager(cls.isolated_creds.get_primary_creds())
@classmethod
def resource_setup(cls):
- cls.set_network_resources()
super(BaseImageTest, cls).resource_setup()
cls.created_images = []
@@ -96,10 +93,7 @@
class BaseV1ImageMembersTest(BaseV1ImageTest):
- @classmethod
- def setup_credentials(cls):
- super(BaseV1ImageMembersTest, cls).setup_credentials()
- cls.os_alt = clients.Manager(cls.isolated_creds.get_alt_creds())
+ credentials = ['primary', 'alt']
@classmethod
def setup_clients(cls):
@@ -138,11 +132,7 @@
class BaseV2MemberImageTest(BaseV2ImageTest):
- @classmethod
- def setup_credentials(cls):
- super(BaseV2MemberImageTest, cls).setup_credentials()
- creds = cls.isolated_creds.get_alt_creds()
- cls.os_alt = clients.Manager(creds)
+ credentials = ['primary', 'alt']
@classmethod
def setup_clients(cls):
diff --git a/tempest/api/messaging/base.py b/tempest/api/messaging/base.py
index c4214f2..2ddc3fc 100644
--- a/tempest/api/messaging/base.py
+++ b/tempest/api/messaging/base.py
@@ -35,6 +35,8 @@
messaging as True
"""
+ credentials = ['primary']
+
@classmethod
def skip_checks(cls):
super(BaseMessagingTest, cls).skip_checks()
@@ -42,11 +44,6 @@
raise cls.skipException("Zaqar support is required")
@classmethod
- def setup_credentials(cls):
- super(BaseMessagingTest, cls).setup_credentials()
- cls.os = cls.get_client_manager()
-
- @classmethod
def setup_clients(cls):
super(BaseMessagingTest, cls).setup_clients()
cls.client = cls.os.messaging_client
diff --git a/tempest/api/network/admin/test_floating_ips_admin_actions.py b/tempest/api/network/admin/test_floating_ips_admin_actions.py
index ce3e319..afc32da 100644
--- a/tempest/api/network/admin/test_floating_ips_admin_actions.py
+++ b/tempest/api/network/admin/test_floating_ips_admin_actions.py
@@ -16,7 +16,6 @@
from tempest_lib.common.utils import data_utils
from tempest.api.network import base
-from tempest import clients
from tempest import config
from tempest import test
@@ -25,11 +24,7 @@
class FloatingIPAdminTestJSON(base.BaseAdminNetworkTest):
force_tenant_isolation = True
-
- @classmethod
- def setup_credentials(cls):
- super(FloatingIPAdminTestJSON, cls).setup_credentials()
- cls.alt_manager = clients.Manager(cls.isolated_creds.get_alt_creds())
+ credentials = ['primary', 'alt', 'admin']
@classmethod
def setup_clients(cls):
diff --git a/tempest/api/network/admin/test_load_balancer_admin_actions.py b/tempest/api/network/admin/test_load_balancer_admin_actions.py
index 5a32119..41f5caa 100644
--- a/tempest/api/network/admin/test_load_balancer_admin_actions.py
+++ b/tempest/api/network/admin/test_load_balancer_admin_actions.py
@@ -27,6 +27,8 @@
Create health monitor for another tenant
"""
+ force_tenant_isolation = True
+
@classmethod
def skip_checks(cls):
super(LoadBalancerAdminTestJSON, cls).skip_checks()
@@ -35,12 +37,6 @@
raise cls.skipException(msg)
@classmethod
- def setup_credentials(cls):
- super(LoadBalancerAdminTestJSON, cls).setup_credentials()
- cls.manager = cls.get_client_manager()
- cls.primary_creds = cls.isolated_creds.get_primary_creds()
-
- @classmethod
def setup_clients(cls):
super(LoadBalancerAdminTestJSON, cls).setup_clients()
cls.client = cls.manager.network_client
@@ -48,8 +44,7 @@
@classmethod
def resource_setup(cls):
super(LoadBalancerAdminTestJSON, cls).resource_setup()
- cls.force_tenant_isolation = True
- cls.tenant_id = cls.primary_creds.tenant_id
+ cls.tenant_id = cls.os.credentials.tenant_id
cls.network = cls.create_network()
cls.subnet = cls.create_subnet(cls.network)
cls.pool = cls.create_pool(data_utils.rand_name('pool-'),
diff --git a/tempest/api/network/base.py b/tempest/api/network/base.py
index 26a31cb..1cd1386 100644
--- a/tempest/api/network/base.py
+++ b/tempest/api/network/base.py
@@ -18,8 +18,6 @@
from tempest_lib.common.utils import data_utils
from tempest_lib import exceptions as lib_exc
-from tempest import clients
-from tempest.common import credentials
from tempest import config
from tempest import exceptions
import tempest.test
@@ -52,6 +50,7 @@
"""
force_tenant_isolation = False
+ credentials = ['primary']
# Default to ipv4.
_ip_version = 4
@@ -69,7 +68,6 @@
# Create no network resources for these test.
cls.set_network_resources()
super(BaseNetworkTest, cls).setup_credentials()
- cls.os = cls.get_client_manager()
@classmethod
def setup_clients(cls):
@@ -79,7 +77,6 @@
@classmethod
def resource_setup(cls):
super(BaseNetworkTest, cls).resource_setup()
-
cls.network_cfg = CONF.network
cls.networks = []
cls.subnets = []
@@ -426,19 +423,7 @@
class BaseAdminNetworkTest(BaseNetworkTest):
- @classmethod
- def skip_checks(cls):
- super(BaseAdminNetworkTest, cls).skip_checks()
- if not credentials.is_admin_available():
- msg = ("Missing Administrative Network API credentials "
- "in configuration.")
- raise cls.skipException(msg)
-
- @classmethod
- def setup_credentials(cls):
- super(BaseAdminNetworkTest, cls).setup_credentials()
- creds = cls.isolated_creds.get_admin_creds()
- cls.os_adm = clients.Manager(credentials=creds)
+ credentials = ['primary', 'admin']
@classmethod
def setup_clients(cls):
diff --git a/tempest/api/object_storage/base.py b/tempest/api/object_storage/base.py
index c8697e1..8bc9b12 100644
--- a/tempest/api/object_storage/base.py
+++ b/tempest/api/object_storage/base.py
@@ -37,9 +37,11 @@
def setup_credentials(cls):
cls.set_network_resources()
super(BaseObjectTest, cls).setup_credentials()
+ operator_role = CONF.object_storage.operator_role
+ # There are no credentials by type used by object storage tests so
+ # isolated_creds must still be initialized
cls.isolated_creds = credentials.get_isolated_credentials(
cls.__name__, network_resources=cls.network_resources)
- operator_role = CONF.object_storage.operator_role
if not cls.isolated_creds.is_role_available(operator_role):
skip_msg = ("%s skipped because the configured credential provider"
" is not able to provide credentials with the %s role "
diff --git a/tempest/api/orchestration/base.py b/tempest/api/orchestration/base.py
index d4b107e..beb4ac8 100644
--- a/tempest/api/orchestration/base.py
+++ b/tempest/api/orchestration/base.py
@@ -18,7 +18,6 @@
import yaml
from tempest import clients
-from tempest.common import credentials
from tempest import config
import tempest.test
@@ -30,6 +29,8 @@
class BaseOrchestrationTest(tempest.test.BaseTestCase):
"""Base test case class for all Orchestration API tests."""
+ credentials = ['primary']
+
@classmethod
def skip_checks(cls):
super(BaseOrchestrationTest, cls).skip_checks()
@@ -39,10 +40,6 @@
@classmethod
def setup_credentials(cls):
super(BaseOrchestrationTest, cls).setup_credentials()
- if (not hasattr(cls, 'isolated_creds') or
- not cls.isolated_creds.name == cls.__name__):
- cls.isolated_creds = credentials.get_isolated_credentials(
- name=cls.__name__, network_resources=cls.network_resources)
stack_owner_role = CONF.orchestration.stack_owner_role
if not cls.isolated_creds.is_role_available(stack_owner_role):
skip_msg = ("%s skipped because the configured credential provider"
diff --git a/tempest/api/orchestration/stacks/test_swift_resources.py b/tempest/api/orchestration/stacks/test_swift_resources.py
index 6884c6b..d4fd3f9 100644
--- a/tempest/api/orchestration/stacks/test_swift_resources.py
+++ b/tempest/api/orchestration/stacks/test_swift_resources.py
@@ -16,7 +16,6 @@
from tempest_lib.common.utils import data_utils
from tempest.api.orchestration import base
-from tempest import clients
from tempest import config
from tempest import test
@@ -32,11 +31,6 @@
raise cls.skipException("Swift support is required")
@classmethod
- def setup_credentials(cls):
- super(SwiftResourcesTestJSON, cls).setup_credentials()
- cls.os = clients.Manager()
-
- @classmethod
def setup_clients(cls):
super(SwiftResourcesTestJSON, cls).setup_clients()
cls.account_client = cls.os.account_client
diff --git a/tempest/api/telemetry/base.py b/tempest/api/telemetry/base.py
index ed719c2..43180e5 100644
--- a/tempest/api/telemetry/base.py
+++ b/tempest/api/telemetry/base.py
@@ -27,6 +27,8 @@
"""Base test case class for all Telemetry API tests."""
+ credentials = ['primary']
+
@classmethod
def skip_checks(cls):
super(BaseTelemetryTest, cls).skip_checks()
@@ -37,7 +39,6 @@
def setup_credentials(cls):
cls.set_network_resources()
super(BaseTelemetryTest, cls).setup_credentials()
- cls.os = cls.get_client_manager()
@classmethod
def setup_clients(cls):
diff --git a/tempest/api/volume/admin/test_volume_quotas.py b/tempest/api/volume/admin/test_volume_quotas.py
index 3ec3219..f69f0e3 100644
--- a/tempest/api/volume/admin/test_volume_quotas.py
+++ b/tempest/api/volume/admin/test_volume_quotas.py
@@ -27,7 +27,7 @@
@classmethod
def setup_credentials(cls):
super(BaseVolumeQuotasAdminV2TestJSON, cls).setup_credentials()
- cls.demo_tenant_id = cls.isolated_creds.get_primary_creds().tenant_id
+ cls.demo_tenant_id = cls.os.credentials.tenant_id
@test.attr(type='gate')
@test.idempotent_id('59eada70-403c-4cef-a2a3-a8ce2f1b07a0')
diff --git a/tempest/api/volume/admin/test_volume_quotas_negative.py b/tempest/api/volume/admin/test_volume_quotas_negative.py
index d7287f0..d1a6db0 100644
--- a/tempest/api/volume/admin/test_volume_quotas_negative.py
+++ b/tempest/api/volume/admin/test_volume_quotas_negative.py
@@ -25,8 +25,7 @@
@classmethod
def setup_credentials(cls):
super(BaseVolumeQuotasNegativeV2TestJSON, cls).setup_credentials()
- cls.demo_user = cls.isolated_creds.get_primary_creds()
- cls.demo_tenant_id = cls.demo_user.tenant_id
+ cls.demo_tenant_id = cls.os.credentials.tenant_id
@classmethod
def resource_setup(cls):
diff --git a/tempest/api/volume/base.py b/tempest/api/volume/base.py
index 28676b0..7f56b18 100644
--- a/tempest/api/volume/base.py
+++ b/tempest/api/volume/base.py
@@ -17,8 +17,6 @@
from tempest_lib.common.utils import data_utils
from tempest_lib import exceptions as lib_exc
-from tempest import clients
-from tempest.common import credentials
from tempest.common import fixed_network
from tempest import config
from tempest import exceptions
@@ -33,6 +31,7 @@
"""Base test case class for all Cinder API tests."""
_api_version = 2
+ credentials = ['primary']
@classmethod
def skip_checks(cls):
@@ -57,12 +56,10 @@
def setup_credentials(cls):
cls.set_network_resources()
super(BaseVolumeTest, cls).setup_credentials()
- cls.os = cls.get_client_manager()
@classmethod
def setup_clients(cls):
super(BaseVolumeTest, cls).setup_clients()
-
cls.servers_client = cls.os.servers_client
cls.networks_client = cls.os.networks_client
@@ -175,18 +172,7 @@
class BaseVolumeAdminTest(BaseVolumeTest):
"""Base test case class for all Volume Admin API tests."""
- @classmethod
- def skip_checks(cls):
- super(BaseVolumeAdminTest, cls).skip_checks()
- if not credentials.is_admin_available():
- msg = ("Missing Identity Admin API credentials in configuration.")
- raise cls.skipException(msg)
-
- @classmethod
- def setup_credentials(cls):
- super(BaseVolumeAdminTest, cls).setup_credentials()
- cls.adm_creds = cls.isolated_creds.get_admin_creds()
- cls.os_adm = clients.Manager(credentials=cls.adm_creds)
+ credentials = ['primary', 'admin']
@classmethod
def setup_clients(cls):
diff --git a/tempest/api/volume/test_volume_transfers.py b/tempest/api/volume/test_volume_transfers.py
index 4acab39..bcd3fa9 100644
--- a/tempest/api/volume/test_volume_transfers.py
+++ b/tempest/api/volume/test_volume_transfers.py
@@ -16,8 +16,6 @@
from testtools import matchers
from tempest.api.volume import base
-from tempest import clients
-from tempest.common import credentials
from tempest import config
from tempest import test
@@ -26,21 +24,7 @@
class VolumesV2TransfersTest(base.BaseVolumeTest):
- @classmethod
- def skip_checks(cls):
- super(VolumesV2TransfersTest, cls).skip_checks()
- if not credentials.is_admin_available():
- msg = "Missing Volume Admin API credentials in configuration."
- raise cls.skipException(msg)
-
- @classmethod
- def setup_credentials(cls):
- super(VolumesV2TransfersTest, cls).setup_credentials()
- # Add another tenant to test volume-transfer
- cls.os_alt = clients.Manager(cls.isolated_creds.get_alt_creds())
- # Add admin tenant to cleanup resources
- creds = cls.isolated_creds.get_admin_creds()
- cls.os_adm = clients.Manager(credentials=creds)
+ credentials = ['primary', 'alt', 'admin']
@classmethod
def setup_clients(cls):
diff --git a/tempest/common/credentials.py b/tempest/common/credentials.py
index c34df48..71d905f 100644
--- a/tempest/common/credentials.py
+++ b/tempest/common/credentials.py
@@ -69,3 +69,25 @@
except exceptions.InvalidConfiguration:
is_admin = False
return is_admin
+
+
+# We want a helper function here to check and see if alt credentials
+# are available so we can do a single call from skip_checks if alt
+# creds area vailable.
+def is_alt_available():
+ # If tenant isolation is enabled admin will be available
+ if CONF.auth.allow_tenant_isolation:
+ return True
+ # Check whether test accounts file has the admin specified or not
+ if (CONF.auth.test_accounts_file and
+ os.path.isfile(CONF.auth.test_accounts_file)):
+ check_accounts = accounts.Accounts(name='check_alt')
+ else:
+ check_accounts = accounts.NotLockingAccounts(name='check_alt')
+ try:
+ if not check_accounts.is_multi_user():
+ return False
+ else:
+ return True
+ except exceptions.InvalidConfiguration:
+ return False
diff --git a/tempest/scenario/manager.py b/tempest/scenario/manager.py
index cc152d2..c7272fe 100644
--- a/tempest/scenario/manager.py
+++ b/tempest/scenario/manager.py
@@ -23,7 +23,6 @@
from tempest_lib import exceptions as lib_exc
from tempest import clients
-from tempest.common import credentials
from tempest.common import fixed_network
from tempest.common.utils.linux import remote_client
from tempest import config
@@ -39,16 +38,7 @@
class ScenarioTest(tempest.test.BaseTestCase):
"""Base class for scenario tests. Uses tempest own clients. """
- @classmethod
- def setup_credentials(cls):
- super(ScenarioTest, cls).setup_credentials()
- # TODO(andreaf) Some of the code from this resource_setup could be
- # moved into `BaseTestCase`
- cls.isolated_creds = credentials.get_isolated_credentials(
- cls.__name__, network_resources=cls.network_resources)
- cls.manager = clients.Manager(
- credentials=cls.credentials()
- )
+ credentials = ['primary']
@classmethod
def setup_clients(cls):
@@ -72,21 +62,6 @@
# Heat client
cls.orchestration_client = cls.manager.orchestration_client
- @classmethod
- def credentials(cls):
- return cls.isolated_creds.get_primary_creds()
-
- @classmethod
- def alt_credentials(cls):
- return cls.isolated_creds.get_alt_creds()
-
- @classmethod
- def admin_credentials(cls):
- try:
- return cls.isolated_creds.get_admin_creds()
- except NotImplementedError:
- raise cls.skipException('Admin Credentials are not available')
-
# ## Methods to handle sync and async deletes
def setUp(self):
@@ -550,19 +525,13 @@
"""
+ credentials = ['primary', 'admin']
+
@classmethod
def skip_checks(cls):
super(NetworkScenarioTest, cls).skip_checks()
if not CONF.service_available.neutron:
raise cls.skipException('Neutron not available')
- if not credentials.is_admin_available():
- msg = ("Missing Identity Admin API credentials in configuration.")
- raise cls.skipException(msg)
-
- @classmethod
- def setup_credentials(cls):
- super(NetworkScenarioTest, cls).setup_credentials()
- cls.admin_manager = clients.Manager(cls.admin_credentials())
@classmethod
def resource_setup(cls):
@@ -1170,6 +1139,9 @@
class BaremetalScenarioTest(ScenarioTest):
+
+ credentials = ['primary', 'admin']
+
@classmethod
def skip_checks(cls):
super(BaremetalScenarioTest, cls).skip_checks()
@@ -1179,14 +1151,10 @@
raise cls.skipException(msg)
@classmethod
- def setup_credentials(cls):
- super(BaremetalScenarioTest, cls).setup_credentials()
+ def setup_clients(cls):
+ super(BaremetalScenarioTest, cls).setup_clients()
- # use an admin client manager for baremetal client
- manager = clients.Manager(
- credentials=cls.admin_credentials()
- )
- cls.baremetal_client = manager.baremetal_client
+ cls.baremetal_client = cls.admin_manager.baremetal_client
@classmethod
def resource_setup(cls):
@@ -1308,18 +1276,12 @@
Base class for encryption scenario tests
"""
- @classmethod
- def skip_checks(cls):
- super(EncryptionScenarioTest, cls).skip_checks()
- if not credentials.is_admin_available():
- msg = ("Missing Identity Admin API credentials in configuration.")
- raise cls.skipException(msg)
+ credentials = ['primary', 'admin']
@classmethod
def setup_clients(cls):
super(EncryptionScenarioTest, cls).setup_clients()
- admin_manager = clients.Manager(cls.admin_credentials())
- cls.admin_volume_types_client = admin_manager.volume_types_client
+ cls.admin_volume_types_client = cls.os_adm.volume_types_client
def _wait_for_volume_status(self, status):
self.status_timeout(
diff --git a/tempest/scenario/test_aggregates_basic_ops.py b/tempest/scenario/test_aggregates_basic_ops.py
index b1d3418..0e158ed 100644
--- a/tempest/scenario/test_aggregates_basic_ops.py
+++ b/tempest/scenario/test_aggregates_basic_ops.py
@@ -16,7 +16,6 @@
from oslo_log import log as logging
from tempest_lib.common.utils import data_utils
-from tempest.common import credentials
from tempest.common import tempest_fixtures as fixtures
from tempest.scenario import manager
from tempest import test
@@ -34,23 +33,18 @@
Removes host from aggregate
Deletes aggregate
"""
- @classmethod
- def skip_checks(cls):
- super(TestAggregatesBasicOps, cls).skip_checks()
- if not credentials.is_admin_available():
- msg = ("Missing Identity Admin API credentials in configuration.")
- raise cls.skipException(msg)
+
+ credentials = ['primary', 'admin']
@classmethod
def setup_clients(cls):
super(TestAggregatesBasicOps, cls).setup_clients()
+ # Use admin client by default
+ cls.manager = cls.admin_manager
+ super(TestAggregatesBasicOps, cls).resource_setup()
cls.aggregates_client = cls.manager.aggregates_client
cls.hosts_client = cls.manager.hosts_client
- @classmethod
- def credentials(cls):
- return cls.admin_credentials()
-
def _create_aggregate(self, **kwargs):
aggregate = self.aggregates_client.create_aggregate(**kwargs)
self.addCleanup(self._delete_aggregate, aggregate)
diff --git a/tempest/scenario/test_dashboard_basic_ops.py b/tempest/scenario/test_dashboard_basic_ops.py
index dd7376a..5aec01f 100644
--- a/tempest/scenario/test_dashboard_basic_ops.py
+++ b/tempest/scenario/test_dashboard_basic_ops.py
@@ -96,7 +96,7 @@
@test.idempotent_id('4f8851b1-0e69-482b-b63b-84c6e76f6c80')
@test.services('dashboard')
def test_basic_scenario(self):
- creds = self.credentials()
+ creds = self.os.credentials
self.check_login_page()
self.user_login(creds.username, creds.password)
self.check_home_page()
diff --git a/tempest/scenario/test_security_groups_basic_ops.py b/tempest/scenario/test_security_groups_basic_ops.py
index 1ecc212..03d338b 100644
--- a/tempest/scenario/test_security_groups_basic_ops.py
+++ b/tempest/scenario/test_security_groups_basic_ops.py
@@ -92,6 +92,8 @@
its own router connected to the public network
"""
+ credentials = ['primary', 'alt', 'admin']
+
class TenantProperties(object):
"""
helper class to save tenant details
@@ -143,9 +145,6 @@
# TODO(mnewby) Consider looking up entities as needed instead
# of storing them as collections on the class.
- # get credentials for secondary tenant
- cls.alt_creds = cls.isolated_creds.get_alt_creds()
- cls.alt_manager = clients.Manager(cls.alt_creds)
# Credentials from the manager are filled with both IDs and Names
cls.alt_creds = cls.alt_manager.credentials
@@ -154,7 +153,7 @@
super(TestSecurityGroupsBasicOps, cls).resource_setup()
cls.floating_ips = {}
cls.tenants = {}
- creds = cls.credentials()
+ creds = cls.manager.credentials
cls.primary_tenant = cls.TenantProperties(creds)
cls.alt_tenant = cls.TenantProperties(cls.alt_creds)
for tenant in [cls.primary_tenant, cls.alt_tenant]:
diff --git a/tempest/test.py b/tempest/test.py
index d57b1d8..80eba94 100644
--- a/tempest/test.py
+++ b/tempest/test.py
@@ -232,6 +232,9 @@
setUpClassCalled = False
_service = None
+ # NOTE(andreaf) credentials holds a list of the credentials to be allocated
+ # at class setup time. Credential types can be 'primary', 'alt' or 'admin'
+ credentials = []
network_resources = {}
# NOTE(sdague): log_format is defined inline here instead of using the oslo
@@ -317,15 +320,37 @@
If one is really needed it may be implemented either in the
resource_setup or at test level.
"""
- pass
+ if 'admin' in cls.credentials and not credentials.is_admin_available():
+ msg = "Missing Identity Admin API credentials in configuration."
+ raise cls.skipException(msg)
+ if 'alt' is cls.credentials and not credentials.is_alt_available():
+ msg = "Missing a 2nd set of API credentials in configuration."
+ raise cls.skipException(msg)
@classmethod
def setup_credentials(cls):
- """Allocate credentials and the client managers from them."""
- # TODO(andreaf) There is a fair amount of code that could me moved from
- # base / test classes in here. Ideally tests should be able to only
- # specify a list of (additional) credentials the need to use.
- pass
+ """Allocate credentials and the client managers from them.
+ A test class that requires network resources must override
+ setup_credentials and defined the required resources before super
+ is invoked.
+ """
+ for credentials_type in cls.credentials:
+ # This may raise an exception in case credentials are not available
+ # In that case we want to let the exception through and the test
+ # fail accordingly
+ manager = cls.get_client_manager(
+ credential_type=credentials_type)
+ setattr(cls, 'os_%s' % credentials_type, manager)
+ # Setup some common aliases
+ # TODO(andreaf) The aliases below are a temporary hack
+ # to avoid changing too much code in one patch. They should
+ # be removed eventually
+ if credentials_type == 'primary':
+ cls.os = cls.manager = cls.os_primary
+ if credentials_type == 'admin':
+ cls.os_adm = cls.admin_manager = cls.os_admin
+ if credentials_type == 'alt':
+ cls.alt_manager = cls.os_alt
@classmethod
def setup_clients(cls):
@@ -379,7 +404,8 @@
level=None))
@classmethod
- def get_client_manager(cls, identity_version=None):
+ def get_client_manager(cls, identity_version=None,
+ credential_type='primary'):
"""
Returns an OpenStack client manager
"""
@@ -394,7 +420,12 @@
identity_version=identity_version
)
- creds = cls.isolated_creds.get_primary_creds()
+ credentials_method = 'get_%s_creds' % credential_type
+ if hasattr(cls.isolated_creds, credentials_method):
+ creds = getattr(cls.isolated_creds, credentials_method)()
+ else:
+ raise exceptions.InvalidCredentials(
+ "Invalid credentials type %s" % credential_type)
os = clients.Manager(credentials=creds, service=cls._service)
return os
@@ -470,7 +501,7 @@
@classmethod
def setUpClass(cls):
super(NegativeAutoTest, cls).setUpClass()
- os = cls.get_client_manager()
+ os = cls.get_client_manager(credential_type='primary')
cls.client = os.negative_client
@staticmethod
diff --git a/tempest/thirdparty/boto/test.py b/tempest/thirdparty/boto/test.py
index cd35e7f..2aef910 100644
--- a/tempest/thirdparty/boto/test.py
+++ b/tempest/thirdparty/boto/test.py
@@ -197,6 +197,8 @@
class BotoTestCase(tempest.test.BaseTestCase):
"""Recommended to use as base class for boto related test."""
+ credentials = ['primary']
+
@classmethod
def skip_checks(cls):
super(BotoTestCase, cls).skip_checks()
@@ -207,11 +209,6 @@
raise cls.skipException("Identity v2 is not available")
@classmethod
- def setup_credentials(cls):
- super(BotoTestCase, cls).setup_credentials()
- cls.os = cls.get_client_manager()
-
- @classmethod
def resource_setup(cls):
super(BotoTestCase, cls).resource_setup()
cls.conclusion = decision_maker()