Enforce endpoint override for services without discovery
Services without version discovery implemented are tricky. When user is not using endpoint_override for those there are sporadic and often attempts to perform version discovery on every request sent [1]. It could be prevented as much as possible on SDK side during proxy initialization, but when a request is sent to the proxy this is still happening inside the keystonauth library. Forcing endpoint_override for those help avoiding that. Touching cloud_region triggers mypy complain, so change urllib import to keep it happy. [1] https://lists.openstack.org/archives/list/openstack-discuss@lists.openstack.org/thread/GBBHV2LN5S3HEUQHUQGZZ3UFEVRHQBOS/ Change-Id: I1956dfaac9ba8e3f9234cc98a36b20a330dc88f6
This commit is contained in:
parent
911cf7ddb1
commit
7fa802ca7f
openstack
@ -15,7 +15,7 @@
|
|||||||
import copy
|
import copy
|
||||||
import os.path
|
import os.path
|
||||||
import typing as ty
|
import typing as ty
|
||||||
import urllib
|
from urllib import parse
|
||||||
import warnings
|
import warnings
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -344,7 +344,7 @@ class CloudRegion:
|
|||||||
def name(self):
|
def name(self):
|
||||||
if self._name is None:
|
if self._name is None:
|
||||||
try:
|
try:
|
||||||
self._name = urllib.parse.urlparse(
|
self._name = parse.urlparse(
|
||||||
self.get_session().auth.auth_url
|
self.get_session().auth.auth_url
|
||||||
).hostname
|
).hostname
|
||||||
except Exception:
|
except Exception:
|
||||||
@ -598,7 +598,7 @@ class CloudRegion:
|
|||||||
interface=interface,
|
interface=interface,
|
||||||
region_name=region_name,
|
region_name=region_name,
|
||||||
)
|
)
|
||||||
except keystoneauth1.exceptions.catalog.EndpointNotFound:
|
except (keystoneauth1.exceptions.catalog.EndpointNotFound, ValueError):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def get_connect_retries(self, service_type):
|
def get_connect_retries(self, service_type):
|
||||||
@ -813,7 +813,7 @@ class CloudRegion:
|
|||||||
if not endpoint.rstrip().rsplit('/')[-1] == 'v2.0':
|
if not endpoint.rstrip().rsplit('/')[-1] == 'v2.0':
|
||||||
if not endpoint.endswith('/'):
|
if not endpoint.endswith('/'):
|
||||||
endpoint += '/'
|
endpoint += '/'
|
||||||
endpoint = urllib.parse.urljoin(endpoint, 'v2.0')
|
endpoint = parse.urljoin(endpoint, 'v2.0')
|
||||||
return endpoint
|
return endpoint
|
||||||
|
|
||||||
def get_session_client(
|
def get_session_client(
|
||||||
|
@ -248,12 +248,36 @@ class ServiceDescription:
|
|||||||
|
|
||||||
# Make an adapter to let discovery take over
|
# Make an adapter to let discovery take over
|
||||||
version_kwargs = {}
|
version_kwargs = {}
|
||||||
|
supported_versions = sorted([int(f) for f in self.supported_versions])
|
||||||
if version_string:
|
if version_string:
|
||||||
version_kwargs['version'] = version_string
|
version_kwargs['version'] = version_string
|
||||||
else:
|
if getattr(
|
||||||
supported_versions = sorted(
|
self.supported_versions[str(supported_versions[0])],
|
||||||
[int(f) for f in self.supported_versions]
|
'skip_discovery',
|
||||||
|
False,
|
||||||
|
):
|
||||||
|
# Requested service does not support version discovery
|
||||||
|
# In this case it is more efficient to set the
|
||||||
|
# endpoint_override to the current catalog endpoint value,
|
||||||
|
# otherwise next request will try to perform discovery.
|
||||||
|
|
||||||
|
temp_adapter = config.get_session_client(self.service_type)
|
||||||
|
ep_override = temp_adapter.get_endpoint(skip_discovery=True)
|
||||||
|
|
||||||
|
ep_key = '{service_type}_endpoint_override'.format(
|
||||||
|
service_type=self.service_type.replace('-', '_')
|
||||||
)
|
)
|
||||||
|
config.config[ep_key] = ep_override
|
||||||
|
|
||||||
|
return config.get_session_client(
|
||||||
|
self.service_type,
|
||||||
|
allow_version_hack=True,
|
||||||
|
constructor=self.supported_versions[
|
||||||
|
str(supported_versions[0])
|
||||||
|
],
|
||||||
|
version=version_string,
|
||||||
|
)
|
||||||
|
else:
|
||||||
version_kwargs['min_version'] = str(supported_versions[0])
|
version_kwargs['min_version'] = str(supported_versions[0])
|
||||||
version_kwargs['max_version'] = '{version}.latest'.format(
|
version_kwargs['max_version'] = '{version}.latest'.format(
|
||||||
version=str(supported_versions[-1])
|
version=str(supported_versions[-1])
|
||||||
|
Loading…
x
Reference in New Issue
Block a user