Use tempest-plugin service client registration
Tempest is going to expose a new optional interface in the plugin
class, to automatically register service clients implemented in
a plugin. Along with this the former client manager, renamed to
ServiceClients, is going to move to a stable interface in
tempest.lib.
Co-Authored-By: Raissa Sarmento <rdearauj@redhat.com>
Change-Id: I4cc9e2b9cd5cb09dff04ee16edcf85e59aec554f
diff --git a/manila_tempest_tests/clients.py b/manila_tempest_tests/clients.py
new file mode 100644
index 0000000..c49b7e8
--- /dev/null
+++ b/manila_tempest_tests/clients.py
@@ -0,0 +1,32 @@
+# Copyright (c) 2016 Hewlett-Packard Enterprise Development Company, L.P.
+#
+# 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 tempest import config
+from tempest.lib.services import clients
+
+
+CONF = config.CONF
+
+
+class Clients(clients.ServiceClients):
+ """Tempest stable service clients and loaded plugins service clients"""
+
+ def __init__(self, credentials, service=None):
+ """Emulate the interface of Tempest's clients.Manager"""
+ # Identity settings
+ if CONF.identity.auth_version == 'v2':
+ identity_uri = CONF.identity.uri
+ else:
+ identity_uri = CONF.identity.uri_v3
+ super(Clients, self).__init__(credentials, identity_uri)
diff --git a/manila_tempest_tests/plugin.py b/manila_tempest_tests/plugin.py
index dfec0b1..0c32ce1 100644
--- a/manila_tempest_tests/plugin.py
+++ b/manila_tempest_tests/plugin.py
@@ -16,6 +16,7 @@
import os
+from tempest import config
from tempest.test_discover import plugins
from manila_tempest_tests import config as config_share
@@ -54,3 +55,21 @@
def get_opt_lists(self):
return [(config_share.share_group.name, config_share.ShareGroup),
('service_available', [config_share.service_option])]
+
+ def get_service_clients(self):
+ shares_config = config.service_client_config('share')
+ v1_params = {
+ 'name': 'share_v1',
+ 'service_version': 'share.v1',
+ 'module_path': 'manila_tempest_tests.services.share.json',
+ 'client_names': ['SharesClient'],
+ }
+ v2_params = {
+ 'name': 'share_v2',
+ 'service_version': 'share.v2',
+ 'module_path': 'manila_tempest_tests.services.share.v2',
+ 'client_names': ['SharesV2Client'],
+ }
+ v1_params.update(shares_config)
+ v2_params.update(shares_config)
+ return [v1_params, v2_params]
diff --git a/manila_tempest_tests/services/share/__init__.py b/manila_tempest_tests/services/share/__init__.py
index e69de29..8e9e9df 100644
--- a/manila_tempest_tests/services/share/__init__.py
+++ b/manila_tempest_tests/services/share/__init__.py
@@ -0,0 +1,18 @@
+# Copyright (c) 2016 Hewlett-Packard Enterprise Development Company, L.P.
+#
+# 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 manila_tempest_tests.services.share import json as v1
+from manila_tempest_tests.services.share.v2 import json as v2
+
+__all__ = ['v1', 'v2']
diff --git a/manila_tempest_tests/services/share/json/__init__.py b/manila_tempest_tests/services/share/json/__init__.py
index e69de29..c92c80b 100644
--- a/manila_tempest_tests/services/share/json/__init__.py
+++ b/manila_tempest_tests/services/share/json/__init__.py
@@ -0,0 +1,17 @@
+# Copyright (c) 2016 Hewlett-Packard Enterprise Development Company, L.P.
+#
+# 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 manila_tempest_tests.services.share.json.shares_client import SharesClient
+
+__all__ = ['SharesClient']
diff --git a/manila_tempest_tests/services/share/json/shares_client.py b/manila_tempest_tests/services/share/json/shares_client.py
index cd462ae..69aeba8 100644
--- a/manila_tempest_tests/services/share/json/shares_client.py
+++ b/manila_tempest_tests/services/share/json/shares_client.py
@@ -35,18 +35,12 @@
It handles shares and access to it in OpenStack.
"""
- def __init__(self, auth_provider):
- super(SharesClient, self).__init__(
- auth_provider,
- CONF.share.catalog_type,
- CONF.share.region or CONF.identity.region,
- endpoint_type=CONF.share.endpoint_type)
+ def __init__(self, auth_provider, **kwargs):
+ super(SharesClient, self).__init__(auth_provider, **kwargs)
self.share_protocol = None
if CONF.share.enable_protocols:
self.share_protocol = CONF.share.enable_protocols[0]
self.share_network_id = CONF.share.share_network_id
- self.build_interval = CONF.share.build_interval
- self.build_timeout = CONF.share.build_timeout
self.share_size = CONF.share.share_size
def create_share(self, share_protocol=None, size=None,
diff --git a/manila_tempest_tests/services/share/v2/__init__.py b/manila_tempest_tests/services/share/v2/__init__.py
index e69de29..301a8fd 100644
--- a/manila_tempest_tests/services/share/v2/__init__.py
+++ b/manila_tempest_tests/services/share/v2/__init__.py
@@ -0,0 +1,18 @@
+# Copyright (c) 2016 Hewlett-Packard Enterprise Development Company, L.P.
+#
+# 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 manila_tempest_tests.services.share.v2.json.shares_client import \
+ SharesV2Client
+
+__all__ = ['SharesV2Client']
diff --git a/manila_tempest_tests/services/share/v2/json/shares_client.py b/manila_tempest_tests/services/share/v2/json/shares_client.py
index 94e1ac6..89a948e 100644
--- a/manila_tempest_tests/services/share/v2/json/shares_client.py
+++ b/manila_tempest_tests/services/share/v2/json/shares_client.py
@@ -39,8 +39,8 @@
"""
api_version = 'v2'
- def __init__(self, auth_provider):
- super(SharesV2Client, self).__init__(auth_provider)
+ def __init__(self, auth_provider, **kwargs):
+ super(SharesV2Client, self).__init__(auth_provider, **kwargs)
self.API_MICROVERSIONS_HEADER = 'x-openstack-manila-api-version'
def inject_microversion_header(self, headers, version,
diff --git a/manila_tempest_tests/tests/api/admin/test_migration.py b/manila_tempest_tests/tests/api/admin/test_migration.py
index bdc6248..b324904 100644
--- a/manila_tempest_tests/tests/api/admin/test_migration.py
+++ b/manila_tempest_tests/tests/api/admin/test_migration.py
@@ -430,7 +430,7 @@
# then we need it for DHSS=True
new_share_network_id = self.provide_share_network(
self.shares_v2_client,
- self.os_admin.networks_client,
+ self.networks_client,
isolated_creds_client=None,
ignore_multitenancy_config=True,
)
diff --git a/manila_tempest_tests/tests/api/base.py b/manila_tempest_tests/tests/api/base.py
index 65f1b30..1f173fb 100644
--- a/manila_tempest_tests/tests/api/base.py
+++ b/manila_tempest_tests/tests/api/base.py
@@ -21,7 +21,6 @@
from oslo_concurrency import lockutils
from oslo_log import log
import six
-from tempest import clients
from tempest.common import credentials_factory as common_creds
from tempest import config
@@ -30,10 +29,8 @@
from tempest.lib import exceptions
from tempest import test
+from manila_tempest_tests import clients
from manila_tempest_tests.common import constants
-from manila_tempest_tests.services.share.json import shares_client
-from manila_tempest_tests.services.share.v2.json import (
- shares_client as shares_v2_client)
from manila_tempest_tests import share_exceptions
from manila_tempest_tests import utils
@@ -138,6 +135,10 @@
# Will be cleaned up in tearDown method
method_isolated_creds = []
+ # NOTE(andreaf) Override the client manager class to be used, so that
+ # a stable class is used, which includes plugin registered services as well
+ client_manager = clients.Clients
+
def skip_if_microversion_not_supported(self, microversion):
if not utils.is_microversion_supported(microversion):
raise self.skipException(
@@ -212,11 +213,11 @@
ic.type_of_creds = type_of_creds
# create client with isolated creds
- os = clients.Manager(credentials=creds)
+ os = clients.Clients(creds)
if client_version == '1':
- client = shares_client.SharesClient(os.auth_provider)
+ client = os.share_v1.SharesClient()
elif client_version == '2':
- client = shares_v2_client.SharesV2Client(os.auth_provider)
+ client = os.share_v2.SharesV2Client()
# Set place where will be deleted isolated creds
ic_res = {
@@ -233,7 +234,7 @@
if (not CONF.service_available.neutron and
CONF.share.create_networks_when_multitenancy_enabled):
raise cls.skipException("Neutron support is required")
- nc = os.networks_client
+ nc = os.network.NetworksClient()
share_network_id = cls.provide_share_network(client, nc, ic)
client.share_network_id = share_network_id
resource = {
@@ -263,7 +264,16 @@
def setup_clients(cls):
super(BaseSharesTest, cls).setup_clients()
os = getattr(cls, 'os_%s' % cls.credentials[0])
- os.shares_client = shares_client.SharesClient(os.auth_provider)
+ # Initialise share clients for test credentials
+ cls.shares_client = os.share_v1.SharesClient()
+ cls.shares_v2_client = os.share_v2.SharesV2Client()
+ # Initialise network clients for test credentials
+ if CONF.service_available.neutron:
+ cls.networks_client = os.network.NetworksClient()
+ cls.subnets_client = os.network.SubnetsClient()
+ else:
+ cls.networks_client = None
+ cls.subnets_client = None
if CONF.identity.auth_version == 'v3':
project_id = os.auth_provider.auth_data[1]['project']['id']
@@ -272,16 +282,12 @@
cls.tenant_id = project_id
cls.user_id = os.auth_provider.auth_data[1]['user']['id']
- cls.shares_client = os.shares_client
- os.shares_v2_client = shares_v2_client.SharesV2Client(
- os.auth_provider)
- cls.shares_v2_client = os.shares_v2_client
if CONF.share.multitenancy_enabled:
if (not CONF.service_available.neutron and
CONF.share.create_networks_when_multitenancy_enabled):
raise cls.skipException("Neutron support is required")
share_network_id = cls.provide_share_network(
- cls.shares_v2_client, os.networks_client)
+ cls.shares_v2_client, cls.networks_client)
cls.shares_client.share_network_id = share_network_id
cls.shares_v2_client.share_network_id = share_network_id
@@ -1046,14 +1052,14 @@
@classmethod
def setup_clients(cls):
super(BaseSharesMixedTest, cls).setup_clients()
- cls.admin_shares_client = shares_client.SharesClient(
- cls.os_admin.auth_provider)
- cls.admin_shares_v2_client = shares_v2_client.SharesV2Client(
- cls.os_admin.auth_provider)
- cls.alt_shares_client = shares_client.SharesClient(
- cls.os_alt.auth_provider)
- cls.alt_shares_v2_client = shares_v2_client.SharesV2Client(
- cls.os_alt.auth_provider)
+ # Initialise share clients
+ cls.admin_shares_client = cls.os_admin.share_v1.SharesClient()
+ cls.admin_shares_v2_client = cls.os_admin.share_v2.SharesV2Client()
+ cls.alt_shares_client = cls.os_alt.share_v1.SharesClient()
+ cls.alt_shares_v2_client = cls.os_alt.share_v2.SharesV2Client()
+ # Initialise network clients
+ cls.os_admin.networks_client = cls.os_admin.network.NetworksClient()
+ cls.os_alt.networks_client = cls.os_alt.network.NetworksClient()
if CONF.share.multitenancy_enabled:
admin_share_network_id = cls.provide_share_network(
diff --git a/manila_tempest_tests/tests/api/test_security_services_mapping_negative.py b/manila_tempest_tests/tests/api/test_security_services_mapping_negative.py
index d60b458..e8f034c 100644
--- a/manila_tempest_tests/tests/api/test_security_services_mapping_negative.py
+++ b/manila_tempest_tests/tests/api/test_security_services_mapping_negative.py
@@ -95,7 +95,7 @@
not CONF.share.multitenancy_enabled, "Only for multitenancy.")
def test_delete_ss_from_sn_used_by_share_server(self):
sn = self.shares_client.get_share_network(
- self.os_primary.shares_client.share_network_id)
+ self.shares_client.share_network_id)
fresh_sn = self.create_share_network(
neutron_net_id=sn["neutron_net_id"],
neutron_subnet_id=sn["neutron_subnet_id"])
diff --git a/manila_tempest_tests/tests/api/test_security_services_negative.py b/manila_tempest_tests/tests/api/test_security_services_negative.py
index eb871a6..7537865 100644
--- a/manila_tempest_tests/tests/api/test_security_services_negative.py
+++ b/manila_tempest_tests/tests/api/test_security_services_negative.py
@@ -81,7 +81,7 @@
ss = self.create_security_service(**ss_data)
sn = self.shares_client.get_share_network(
- self.os_primary.shares_client.share_network_id)
+ self.shares_client.share_network_id)
fresh_sn = self.create_share_network(
neutron_net_id=sn["neutron_net_id"],
neutron_subnet_id=sn["neutron_subnet_id"])
diff --git a/manila_tempest_tests/tests/api/test_share_networks.py b/manila_tempest_tests/tests/api/test_share_networks.py
index bcedd5e..3484264 100644
--- a/manila_tempest_tests/tests/api/test_share_networks.py
+++ b/manila_tempest_tests/tests/api/test_share_networks.py
@@ -247,8 +247,7 @@
@base.skip_if_microversion_lt("2.18")
@tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
def test_gateway_with_neutron(self):
- os = getattr(self, 'os_%s' % self.credentials[0])
- subnet_client = os.subnets_client
+ subnet_client = self.subnets_client
self.create_share(cleanup_in_class=False)
share_net_details = self.shares_v2_client.get_share_network(
@@ -267,8 +266,7 @@
@base.skip_if_microversion_lt("2.20")
@tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
def test_mtu_with_neutron(self):
- os = getattr(self, 'os_%s' % self.credentials[0])
- network_client = os.networks_client
+ network_client = self.networks_client
self.create_share(cleanup_in_class=False)
share_net_details = self.shares_v2_client.get_share_network(
diff --git a/manila_tempest_tests/tests/scenario/manager_share.py b/manila_tempest_tests/tests/scenario/manager_share.py
index 6c25785..e9b51ca 100644
--- a/manila_tempest_tests/tests/scenario/manager_share.py
+++ b/manila_tempest_tests/tests/scenario/manager_share.py
@@ -21,9 +21,6 @@
from manila_tempest_tests.common import constants
from manila_tempest_tests.common import remote_client
-from manila_tempest_tests.services.share.json import shares_client
-from manila_tempest_tests.services.share.v2.json import (
- shares_client as shares_v2_client)
from manila_tempest_tests.tests.scenario import manager
CONF = config.CONF
@@ -41,14 +38,10 @@
super(ShareScenarioTest, cls).resource_setup()
# Manila clients
- cls.shares_client = shares_client.SharesClient(
- cls.os_primary.auth_provider)
- cls.shares_v2_client = shares_v2_client.SharesV2Client(
- cls.os_primary.auth_provider)
- cls.shares_admin_client = shares_client.SharesClient(
- cls.os_admin.auth_provider)
- cls.shares_admin_v2_client = shares_v2_client.SharesV2Client(
- cls.os_admin.auth_provider)
+ cls.shares_client = cls.os_primary.share_v1.SharesClient()
+ cls.shares_v2_client = cls.os_primary.share_v2.SharesV2Client()
+ cls.shares_admin_client = cls.os_admin.share_v1.SharesClient()
+ cls.shares_admin_v2_client = cls.os_admin.share_v2.SharesV2Client()
@classmethod
def skip_checks(cls):