diff --git a/hooks/horizon_contexts.py b/hooks/horizon_contexts.py index 8b0eb4c6..b6f86b32 100644 --- a/hooks/horizon_contexts.py +++ b/hooks/horizon_contexts.py @@ -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)) diff --git a/unit_tests/test_horizon_contexts.py b/unit_tests/test_horizon_contexts.py index bb5f54ad..8089093f 100644 --- a/unit_tests/test_horizon_contexts.py +++ b/unit_tests/test_horizon_contexts.py @@ -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',