Merge "Add knowledge of storage network to scenario tests"
diff --git a/manila_tempest_tests/tests/api/admin/test_export_locations.py b/manila_tempest_tests/tests/api/admin/test_export_locations.py
index 67c200e..96a0d9d 100644
--- a/manila_tempest_tests/tests/api/admin/test_export_locations.py
+++ b/manila_tempest_tests/tests/api/admin/test_export_locations.py
@@ -39,7 +39,7 @@
def resource_setup(cls):
super(ExportLocationsTest, cls).resource_setup()
cls.admin_client = cls.admin_shares_v2_client
- cls.member_client = cls.shares_v2_client
+ cls.member_client = cls.admin_project_member_client.shares_v2_client
# create share type
cls.share_type = cls._create_share_type()
cls.share_type_id = cls.share_type['id']
diff --git a/manila_tempest_tests/tests/api/base.py b/manila_tempest_tests/tests/api/base.py
index 232b15a..89f2e92 100644
--- a/manila_tempest_tests/tests/api/base.py
+++ b/manila_tempest_tests/tests/api/base.py
@@ -24,6 +24,7 @@
from tempest.common import credentials_factory as common_creds
from tempest import config
+from tempest.lib.common import cred_client
from tempest.lib.common import dynamic_creds
from tempest.lib.common.utils import data_utils
from tempest.lib import exceptions
@@ -1258,6 +1259,21 @@
"""Base test case class for all Shares API tests with all user roles."""
credentials = ('primary', 'alt', 'admin')
+ # Will be cleaned up in resource_cleanup if the class
+ class_project_users_created = []
+
+ @classmethod
+ def resource_cleanup(cls):
+ cls.clear_project_users(cls.class_project_users_created)
+ super(BaseSharesMixedTest, cls).resource_cleanup()
+
+ @classmethod
+ def clear_project_users(cls, users=None):
+ users = users or cls.class_project_users_created
+ for user in users:
+ with handle_cleanup_exceptions():
+ cls.os_admin.creds_client.delete_user(user['id'])
+
@classmethod
def setup_clients(cls):
super(BaseSharesMixedTest, cls).setup_clients()
@@ -1269,6 +1285,18 @@
# Initialise network clients
cls.os_admin.networks_client = cls.os_admin.network.NetworksClient()
cls.os_alt.networks_client = cls.os_alt.network.NetworksClient()
+ # Initialise identity clients
+ cls.admin_project = cls.os_admin.auth_provider.auth_data[1]['project']
+ identity_clients = getattr(
+ cls.os_admin, 'identity_%s' % CONF.identity.auth_version)
+ cls.os_admin.identity_client = identity_clients.IdentityClient()
+ cls.os_admin.projects_client = identity_clients.ProjectsClient()
+ cls.os_admin.users_client = identity_clients.UsersClient()
+ cls.os_admin.roles_client = identity_clients.RolesClient()
+ cls.os_admin.domains_client = (
+ cls.os_admin.identity_v3.DomainsClient() if
+ CONF.identity.auth_version == 'v3' else None)
+ cls.admin_project_member_client = cls.create_user_and_get_client()
if CONF.share.multitenancy_enabled:
admin_share_network_id = cls.provide_share_network(
@@ -1289,6 +1317,43 @@
cls.class_resources.insert(0, resource)
@classmethod
+ def create_user_and_get_client(cls, project=None):
+ """Create a user in specified project & set share clients for user
+
+ The user will have all roles specified in tempest.conf
+ :param: project: a dictionary with project ID and name, if not
+ specified, the value will be cls.admin_project
+ """
+ project_domain_name = (
+ cls.os_admin.identity_client.auth_provider.credentials.get(
+ 'project_domain_name', 'Default'))
+ cls.os_admin.creds_client = cred_client.get_creds_client(
+ cls.os_admin.identity_client, cls.os_admin.projects_client,
+ cls.os_admin.users_client, cls.os_admin.roles_client,
+ cls.os_admin.domains_client, project_domain_name)
+
+ # User info
+ project = project or cls.admin_project
+ username = data_utils.rand_name('manila_%s' % project['id'])
+ password = data_utils.rand_password()
+ email = '%s@example.org' % username
+
+ user = cls.os_admin.creds_client.create_user(
+ username, password, project, email)
+ cls.class_project_users_created.append(user)
+
+ for conf_role in CONF.auth.tempest_roles:
+ cls.os_admin.creds_client.assign_user_role(
+ user, project, conf_role)
+
+ user_creds = cls.os_admin.creds_client.get_credentials(
+ user, project, password)
+ os = clients.Clients(user_creds)
+ os.shares_v1_client = os.share_v1.SharesClient()
+ os.shares_v2_client = os.share_v2.SharesV2Client()
+ return os
+
+ @classmethod
def _create_share_type(cls, specs=None):
name = data_utils.rand_name("unique_st_name")
extra_specs = cls.add_extra_specs_to_dict(specs)