From 3362bf4b54f51e6d8b4aa1b4e96a773bd5c36abe Mon Sep 17 00:00:00 2001 From: =?utf8?q?C=C3=A9dric=20Ollivier?= Date: Thu, 26 Sep 2019 17:29:32 +0200 Subject: [PATCH] Allow getting service via any endpoint MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit It overrides the default implementation provided by Shade. Change-Id: I3ad2f8ba543be4483f108c4bd7765018dddc5b19 Signed-off-by: Cédric Ollivier (cherry picked from commit 44d577770f19136483b3d48aa627b035513e27b5) --- functest/core/tenantnetwork.py | 3 +- .../opnfv_tests/openstack/api/connection_check.py | 10 ++--- functest/utils/env.py | 3 +- functest/utils/functest_utils.py | 47 ++++++++++++++++++++++ 4 files changed, 53 insertions(+), 10 deletions(-) diff --git a/functest/core/tenantnetwork.py b/functest/core/tenantnetwork.py index 7a3911e9d..2c85aaa52 100644 --- a/functest/core/tenantnetwork.py +++ b/functest/core/tenantnetwork.py @@ -31,6 +31,7 @@ from xtesting.core import testcase from functest.utils import config from functest.utils import env +from functest.utils import functest_utils class NewProject(object): @@ -205,7 +206,7 @@ class TenantNetwork1(testcase.TestCase): @staticmethod def get_public_auth_url(cloud): """Get Keystone public endpoint""" - keystone_id = cloud.search_services('keystone')[0].id + keystone_id = functest_utils.search_services(cloud, 'keystone')[0].id endpoint = cloud.search_endpoints( filters={'interface': 'public', 'service_id': keystone_id})[0].url diff --git a/functest/opnfv_tests/openstack/api/connection_check.py b/functest/opnfv_tests/openstack/api/connection_check.py index cebb63108..927b73bfa 100644 --- a/functest/opnfv_tests/openstack/api/connection_check.py +++ b/functest/opnfv_tests/openstack/api/connection_check.py @@ -16,7 +16,6 @@ import os_client_config import shade from xtesting.core import testcase -from functest.utils import env from functest.utils import functest_utils @@ -29,7 +28,7 @@ class ConnectionCheck(testcase.TestCase): "list_endpoints", "list_floating_ip_pools", "list_floating_ips", "list_hypervisors", "list_keypairs", "list_networks", "list_ports", "list_role_assignments", "list_roles", "list_routers", "list_servers", - "list_services", "list_subnets"] + "list_subnets"] def __init__(self, **kwargs): if "case_name" not in kwargs: @@ -48,11 +47,8 @@ class ConnectionCheck(testcase.TestCase): try: assert self.cloud self.start_time = time.time() - if env.get('PUBLIC_ENDPOINT_ONLY').lower() == 'true': - self.__logger.warning( - "Listing services is skipped " - "because the admin endpoints are unreachable") - self.func_list.remove("list_services") + self.__logger.debug( + "list_services: %s", functest_utils.list_services(self.cloud)) for func in self.func_list: self.__logger.debug( "%s: %s", func, getattr(self.cloud, func)()) diff --git a/functest/utils/env.py b/functest/utils/env.py index ba8d6ce55..892d1749d 100644 --- a/functest/utils/env.py +++ b/functest/utils/env.py @@ -39,8 +39,7 @@ INPUTS = { 'NEW_USER_ROLE': 'Member', 'USE_DYNAMIC_CREDENTIALS': 'True', 'BLOCK_MIGRATION': 'True', - 'CLEAN_ORPHAN_SECURITY_GROUPS': 'True', - 'PUBLIC_ENDPOINT_ONLY': 'False' + 'CLEAN_ORPHAN_SECURITY_GROUPS': 'True' } diff --git a/functest/utils/functest_utils.py b/functest/utils/functest_utils.py index c953dca81..daea3561c 100644 --- a/functest/utils/functest_utils.py +++ b/functest/utils/functest_utils.py @@ -11,10 +11,12 @@ from __future__ import print_function import logging +import os import subprocess import sys import yaml +from openstack.cloud import _utils import six LOGGER = logging.getLogger(__name__) @@ -138,6 +140,51 @@ def get_openstack_version(cloud): return "Unknown" +def list_services(cloud): + # pylint: disable=protected-access + """Search Keystone services via $OS_INTERFACE. + + It mainly conforms with `Shade + `_ but allows testing vs + public endpoints. It's worth mentioning that it doesn't support keystone + v2. + + :returns: a list of ``munch.Munch`` containing the services description + + :raises: ``OpenStackCloudException`` if something goes wrong during the + openstack API call. + """ + url, key = '/services', 'services' + data = cloud._identity_client.get( + url, endpoint_filter={ + 'interface': os.environ.get('OS_INTERFACE', 'public')}, + error_message="Failed to list services") + services = cloud._get_and_munchify(key, data) + return _utils.normalize_keystone_services(services) + + +def search_services(cloud, name_or_id=None, filters=None): + # pylint: disable=protected-access + """Search Keystone services ia $OS_INTERFACE. + + It mainly conforms with `Shade + `_ but allows testing vs + public endpoints. It's worth mentioning that it doesn't support keystone + v2. + + :param name_or_id: Name or id of the desired service. + :param filters: a dict containing additional filters to use. e.g. + {'type': 'network'}. + + :returns: a list of ``munch.Munch`` containing the services description + + :raises: ``OpenStackCloudException`` if something goes wrong during the + openstack API call. + """ + services = list_services(cloud) + return _utils._filter_list(services, name_or_id, filters) + + def convert_dict_to_ini(value): "Convert dict to oslo.conf input" assert isinstance(value, dict) -- 2.16.6