Do not assume ksv2 in multi-region deploys

Remove hardcoded keystone v2 from identity urls when in a multi-
region deploy. The api version is passed by the keystone charm
so use that.

Change-Id: I8e52e63e17836260b87899a059e0bbc77827dc54
Closes-Bug: #1925669
This commit is contained in:
Liam Young 2021-04-26 12:52:50 +00:00
parent c5c8196566
commit e07c27fc35
2 changed files with 50 additions and 7 deletions

View File

@ -141,9 +141,12 @@ class IdentityServiceContext(OSContextGenerator):
# If using keystone v3 the context is incomplete without the
# admin domain id
if local_ctxt['api_version'] == '3':
local_ctxt['ks_endpoint_path'] = 'v3'
if not config('default_domain'):
local_ctxt['admin_domain_id'] = rdata.get(
'admin_domain_id')
else:
local_ctxt['ks_endpoint_path'] = 'v2.0'
if not context_complete(local_ctxt):
continue
@ -176,12 +179,15 @@ class IdentityServiceContext(OSContextGenerator):
# region in order to support multi-region deployments
if region is not None:
if config("use-internal-endpoints") and internal_host:
endpoint = ("%(internal_protocol)s://%(internal_host)s"
":%(internal_port)s/v2.0") % local_ctxt
endpoint = (
"{internal_protocol}://{internal_host}"
":{internal_port}/{ks_endpoint_path}").format(
**local_ctxt)
else:
endpoint = ("%(service_protocol)s://%(service_host)s"
":%(service_port)s/v2.0") % local_ctxt
endpoint = (
"{service_protocol}://{service_host}"
":{service_port}/{ks_endpoint_path}").format(
**local_ctxt)
for reg in region.split():
regions.add((endpoint, reg))

View File

@ -698,6 +698,7 @@ class TestHorizonContexts(CharmTestCase):
'internal_protocol': 'http',
'ks_host': 'foo', 'ks_port': 5000,
'ks_protocol': 'http',
'ks_endpoint_path': 'v2.0',
'default_role': 'member',
'api_version': '2', 'service_protocol': 'http'})
@ -716,6 +717,7 @@ class TestHorizonContexts(CharmTestCase):
'internal_host': 'bar', 'internal_port': 5001,
'internal_protocol': 'http',
'ks_host': 'foo', 'ks_port': 5000,
'ks_endpoint_path': 'v2.0',
'ks_protocol': 'http',
'default_role': 'member',
'api_version': '2', 'service_protocol': 'http'})
@ -737,12 +739,41 @@ class TestHorizonContexts(CharmTestCase):
'internal_protocol': 'http',
'ks_host': 'foo', 'ks_port': 5000,
'ks_protocol': 'http',
'ks_endpoint_path': 'v2.0',
'default_role': 'member',
'regions': [{'endpoint': 'http://foo:5000/v2.0',
'title': 'regionOne'},
{'endpoint': 'http://foo:5000/v2.0',
'title': 'regionTwo'}]})
@patch("hooks.horizon_contexts.format_ipv6_addr")
def test_IdentityServiceContext_multi_region_v3(self,
mock_format_ipv6_addr):
mock_format_ipv6_addr.side_effect = lambda x: x
self.relation_ids.return_value = ['foo']
self.related_units.return_value = ['bar', 'baz']
self.relation_get.side_effect = self.test_relation.get
self.test_relation.set({'service_host': 'foo', 'service_port': 5000,
'internal_host': 'bar', 'internal_port': 5001,
'region': 'regionOne regionTwo',
'api_version': '3',
'admin_domain_id': 'admindomainid'})
self.context_complete.return_value = True
self.assertEqual(horizon_contexts.IdentityServiceContext()(),
{'admin_domain_id': 'admindomainid',
'service_host': 'foo', 'service_port': 5000,
'service_protocol': 'http', 'api_version': '3',
'internal_host': 'bar', 'internal_port': 5001,
'internal_protocol': 'http',
'ks_host': 'foo', 'ks_port': 5000,
'ks_protocol': 'http',
'ks_endpoint_path': 'v3',
'default_role': 'member',
'regions': [{'endpoint': 'http://foo:5000/v3',
'title': 'regionOne'},
{'endpoint': 'http://foo:5000/v3',
'title': 'regionTwo'}]})
@patch("hooks.horizon_contexts.format_ipv6_addr")
def test_IdentityServiceContext_api3(self, mock_format_ipv6_addr):
mock_format_ipv6_addr.side_effect = lambda x: x
@ -767,6 +798,7 @@ class TestHorizonContexts(CharmTestCase):
'ks_host': 'foo',
'ks_port': 5000,
'ks_protocol': 'http',
'ks_endpoint_path': 'v3',
'api_version': '3',
'default_role': 'member',
'admin_domain_id': 'admindomainid',
@ -829,6 +861,7 @@ class TestHorizonContexts(CharmTestCase):
'ks_host': 'foo',
'ks_port': 5000,
'ks_protocol': 'http',
'ks_endpoint_path': 'v3',
'api_version': '3',
'default_role': 'Member',
'admin_domain_id': 'admindomainid',
@ -855,6 +888,7 @@ class TestHorizonContexts(CharmTestCase):
'internal_protocol': 'http',
'ks_host': 'foo', 'ks_port': 5000,
'ks_protocol': 'http',
'ks_endpoint_path': 'v3',
'api_version': '3',
'default_role': 'member',
'admin_domain_id': 'admindomainid',
@ -869,7 +903,7 @@ class TestHorizonContexts(CharmTestCase):
self.relation_get.side_effect = self.test_relation.get
self.test_relation.set({'service_host': 'foo', 'service_port': 5000,
'internal_host': 'bar', 'internal_port': 5001,
'region': 'regionOne'})
'region': 'regionOne', 'api_version': '2'})
self.test_config.set('use-internal-endpoints', True)
self.context_complete.return_value = True
self.maxDiff = None
@ -879,6 +913,7 @@ class TestHorizonContexts(CharmTestCase):
'internal_host': 'bar', 'internal_port': 5001,
'internal_protocol': 'http',
'ks_host': 'bar', 'ks_port': 5001,
'ks_endpoint_path': 'v2.0',
'ks_protocol': 'http',
'api_version': '2',
'default_role': 'member'})
@ -891,7 +926,8 @@ class TestHorizonContexts(CharmTestCase):
self.related_units.return_value = ['bar', 'baz']
self.relation_get.side_effect = self.test_relation.get
self.test_relation.set({'service_host': 'foo', 'service_port': 5000,
'region': 'regionOne regionTwo'})
'region': 'regionOne regionTwo',
'api_version': '2'})
self.test_config.set('use-internal-endpoints', True)
self.context_complete.return_value = True
self.maxDiff = None
@ -901,6 +937,7 @@ class TestHorizonContexts(CharmTestCase):
'internal_host': None, 'internal_port': None,
'internal_protocol': 'http',
'ks_host': 'foo', 'ks_port': 5000,
'ks_endpoint_path': 'v2.0',
'ks_protocol': 'http',
'api_version': '2',
'default_role': 'member',