Skip most service_description for unknown services

When we don't know anything about a service, we can know early
in the process that we're never going to match a supported version.
That means we can just directly and without malice or warnings
return a REST adapter and be done with it.

Change-Id: Ifd4f2fce59c76148807fb7390f68eaae179694c4
This commit is contained in:
Monty Taylor 2019-08-07 11:08:53 -04:00
parent 1ddca04a52
commit a7423f720f
2 changed files with 36 additions and 4 deletions

View File

@ -100,7 +100,19 @@ class ServiceDescription(object):
self.service_type,
config.get_disabled_reason(self.service_type))
# First, check to see if we've got config that matches what we
# We don't know anything about this service, so the user is
# explicitly just using us for a passthrough REST adapter.
# Skip all the lower logic.
if not self.supported_versions:
temp_client = config.get_session_client(
self.service_type,
allow_version_hack=True,
)
# trigger EndpointNotFound exception if this is bogus
temp_client.get_endpoint()
return temp_client
# Check to see if we've got config that matches what we
# understand in the SDK.
version_string = config.get_api_version(self.service_type)
endpoint_override = config.get_endpoint(self.service_type)
@ -111,7 +123,7 @@ class ServiceDescription(object):
version_string = list(self.supported_versions)[0]
proxy_obj = None
if endpoint_override and version_string and self.supported_versions:
if endpoint_override and version_string:
# Both endpoint override and version_string are set, we don't
# need to do discovery - just trust the user.
proxy_class = self.supported_versions.get(version_string[0])
@ -129,7 +141,7 @@ class ServiceDescription(object):
version=version_string,
service_type=self.service_type),
category=exceptions.UnsupportedServiceVersion)
elif endpoint_override and self.supported_versions:
elif endpoint_override:
temp_adapter = config.get_session_client(
self.service_type
)
@ -181,7 +193,7 @@ class ServiceDescription(object):
version_kwargs = {}
if version_string:
version_kwargs['version'] = version_string
elif self.supported_versions:
else:
supported_versions = sorted([
int(f) for f in self.supported_versions])
version_kwargs['min_version'] = str(supported_versions[0])

View File

@ -15,8 +15,10 @@ import os
import fixtures
from keystoneauth1 import session
import mock
from testtools import matchers
from openstack import connection
from openstack import proxy
import openstack.config
from openstack.tests.unit import base
from openstack.tests.unit.fake import fake_service
@ -145,6 +147,24 @@ class TestConnection(base.TestCase):
# self.assertEqual('openstack.workflow.v2._proxy',
# conn.workflow.__class__.__module__)
def test_create_unknown_proxy(self):
self.register_uris([
self.get_placement_discovery_mock_dict(),
])
def closure():
return self.cloud.placement
self.assertThat(
closure,
matchers.Warnings(matchers.HasLength(0)))
self.assertIsInstance(
self.cloud.placement,
proxy.Proxy)
self.assert_calls()
def test_create_connection_version_param_default(self):
c1 = connection.Connection(cloud='sample-cloud')
conn = connection.Connection(session=c1.session)