diff --git a/mistral/context.py b/mistral/context.py index 42a778e7..19d15454 100644 --- a/mistral/context.py +++ b/mistral/context.py @@ -77,6 +77,7 @@ class MistralContext(BaseContext): "auth_token", "service_catalog", "user_name", + "region_name", "project_name", "roles", "is_admin", @@ -113,6 +114,7 @@ def context_from_headers_and_env(headers, env): auth_token = params['auth_token'] auth_uri = params['auth_uri'] project_id = params['project_id'] + region_name = params['region_name'] user_id = params['user_id'] user_name = params['user_name'] is_target = params['is_target'] @@ -131,6 +133,7 @@ def context_from_headers_and_env(headers, env): is_target=is_target, service_catalog=service_catalog, user_name=user_name, + region_name=region_name, project_name=headers.get('X-Project-Name'), roles=headers.get('X-Roles', "").split(","), is_trust_scoped=False, @@ -150,6 +153,7 @@ def _extract_auth_params_from_headers(headers): 'project_id': headers.get('X-Target-Project-Id'), 'user_id': headers.get('X-Target-User-Id'), 'user_name': headers.get('X-Target-User-Name'), + 'region_name': headers.get('X-Target-Region-Name'), 'is_target': True } if not params['auth_token']: @@ -171,6 +175,7 @@ def _extract_auth_params_from_headers(headers): 'project_id': headers.get('X-Project-Id'), 'user_id': headers.get('X-User-Id'), 'user_name': headers.get('X-User-Name'), + 'region_name': headers.get('X-Region-Name'), 'is_target': False } diff --git a/mistral/utils/openstack/keystone.py b/mistral/utils/openstack/keystone.py index c8bf3ac6..7baaf866 100644 --- a/mistral/utils/openstack/keystone.py +++ b/mistral/utils/openstack/keystone.py @@ -70,7 +70,7 @@ def client_for_trusts(trust_id): def get_endpoint_for_project(service_name=None, service_type=None): if service_name is None and service_type is None: - raise Exception( + raise exceptions.MistralException( "Either 'service_name' or 'service_type' must be provided." ) @@ -80,7 +80,8 @@ def get_endpoint_for_project(service_name=None, service_type=None): service_endpoints = service_catalog.get_endpoints( service_name=service_name, - service_type=service_type + service_type=service_type, + region_name=ctx.region_name ) endpoint = None @@ -110,14 +111,12 @@ def get_endpoint_for_project(service_name=None, service_type=None): break if not endpoint: - raise Exception( - "No endpoints found [service_name=%s, service_type=%s]" - % (service_name, service_type) + raise exceptions.MistralException( + "No endpoints found [service_name=%s, service_type=%s," + " region_name=%s]" + % (service_name, service_type, ctx.region_name) ) else: - # TODO(rakhmerov): We may have more than one endpoint because - # TODO(rakhmerov): of regions and ideally we need a config option - # TODO(rakhmerov): for region return endpoint diff --git a/releasenotes/notes/region-name-support-9e4b4ccd963ace88.yaml b/releasenotes/notes/region-name-support-9e4b4ccd963ace88.yaml new file mode 100644 index 00000000..4695df3f --- /dev/null +++ b/releasenotes/notes/region-name-support-9e4b4ccd963ace88.yaml @@ -0,0 +1,8 @@ +--- +fixes: + - | + [`bug 1633345 `_] + + User now could define the target region for the openstack actions. + It could be done via API in X-Region-Name and X-Target-Region-Name + in case of multi-vim feature is used.