Hardcode v2.0 onto end of neutron endpoints

neutron makes life sad for version discovery because older clouds had
hidden the discovery document. Work around it with terrible hacks.

The shade layer already does this, incidentally.

Change-Id: I8217796ec36140a851177583c75f95cee02c7a43
This commit is contained in:
Monty Taylor 2018-06-28 16:11:25 -05:00
parent 34ea72ce5b
commit b6020dae7e
No known key found for this signature in database
GPG Key ID: 7BAE94BC7141A594
4 changed files with 49 additions and 8 deletions

View File

@ -581,8 +581,7 @@ class OpenStackCloud(_normalize.Normalizer):
def _network_client(self):
if 'network' not in self._raw_clients:
client = self._get_raw_client('network')
# TODO(mordred) I don't care if this is what neutronclient does,
# fix this.
# TODO(mordred) Replace this with self.network
# Don't bother with version discovery - there is only one version
# of neutron. This is what neutronclient does, fwiw.
endpoint = client.get_endpoint()

View File

@ -421,6 +421,31 @@ class CloudRegion(object):
self.get_connect_retries(service_type))
kwargs.setdefault('status_code_retries',
self.get_status_code_retries(service_type))
endpoint_override = self.get_endpoint(service_type)
version = version_request.version
min_api_version = version_request.min_api_version
max_api_version = version_request.max_api_version
# Older neutron has inaccessible discovery document. Nobody noticed
# because neutronclient hard-codes an append of v2.0. YAY!
if service_type == 'network':
version = None
min_api_version = None
max_api_version = None
if endpoint_override is None:
network_adapter = constructor(
session=self.get_session(),
service_type=self.get_service_type(service_type),
service_name=self.get_service_name(service_type),
interface=self.get_interface(service_type),
region_name=self.region_name,
)
network_endpoint = network_adapter.get_endpoint()
if not network_endpoint.rstrip().rsplit('/')[1] == 'v2.0':
if not network_endpoint.endswith('/'):
network_endpoint += '/'
network_endpoint = urllib.parse.urljoin(
network_endpoint, 'v2.0')
endpoint_override = network_endpoint
client = constructor(
session=self.get_session(),
@ -428,10 +453,10 @@ class CloudRegion(object):
service_name=self.get_service_name(service_type),
interface=self.get_interface(service_type),
region_name=self.region_name,
version=version_request.version,
min_version=version_request.min_api_version,
max_version=version_request.max_api_version,
endpoint_override=self.get_endpoint(service_type),
version=version,
min_version=min_api_version,
max_version=max_api_version,
endpoint_override=endpoint_override,
default_microversion=version_request.default_microversion,
**kwargs)
if version_request.default_microversion:

View File

@ -98,8 +98,6 @@ class TestConnection(base.TestCase):
conn.identity.__class__.__module__)
self.assertEqual('openstack.image.v2._proxy',
conn.image.__class__.__module__)
self.assertEqual('openstack.network.v2._proxy',
conn.network.__class__.__module__)
self.assertEqual('openstack.object_store.v1._proxy',
conn.object_store.__class__.__module__)
self.assertEqual('openstack.load_balancer.v2._proxy',
@ -222,6 +220,20 @@ class TestConnection(base.TestCase):
profile=prof)
class TestNetworkConnection(base.TestCase):
# We need to do the neutron adapter test differently because it needs
# to actually get a catalog.
def test_network_proxy(self):
self.assertEqual(
'openstack.network.v2._proxy',
self.conn.network.__class__.__module__)
self.assert_calls()
self.assertEqual(
"https://network.example.com/v2.0",
self.conn.network.get_endpoint())
class TestAuthorize(base.TestCase):
def test_authorize_works(self):

View File

@ -0,0 +1,5 @@
---
fixes:
- |
Added workaround for using neutron on older clouds where the version
discovery document requires auth.