Browse Source

Allow for manual setting of default service region in config

In case DEFAULT_SERVICE_REGIONS setting in Horizon config is specified
(on a per-endpoint basis), use it instead of a value stored in
cookies. This value is still checked for sanity, i.e. it should be
present in Keystone service catalog.

Change-Id: Ia4787b56db7ce7787bd8aac21b5c0ec8a95a6f09
Related-Bug: #1506825
Closes-Bug: #1703390
Timur Sufiev 3 years ago
parent
commit
3227365bc6
3 changed files with 29 additions and 4 deletions
  1. 22
    0
      doc/source/configuration/index.rst
  2. 4
    1
      openstack_auth/user.py
  3. 3
    3
      openstack_auth/utils.py

+ 22
- 0
doc/source/configuration/index.rst View File

@@ -37,6 +37,28 @@ the site header when logged in.
37 37
 You should also define ``OPENSTACK_KEYSTONE_URL`` to indicate which of
38 38
 the regions is the default one.
39 39
 
40
+
41
+``DEFAULT_SERVICE_REGIONS``
42
+---------------------------
43
+
44
+Default: ``{}``
45
+
46
+The default service region is set on a per-endpoint basis, meaning that once
47
+the user logs into some Keystone endpoint, if a default service region is
48
+defined for it in this setting and exists within Keystone catalog, it will be
49
+set as the initial service region in this endpoint. By default it is an empty
50
+dictionary because upstream can neither predict service region names in a
51
+specific deployment, nor tell whether this behavior is desired. The key of the
52
+dictionary is a full url of a Keystone endpoint with version suffix, the value
53
+is a region name.
54
+
55
+Example::
56
+
57
+    DEFAULT_SERVICE_REGIONS = {
58
+        OPENSTACK_KEYSTONE_URL: 'RegionOne'
59
+    }
60
+
61
+
40 62
 ``OPENSTACK_API_VERSIONS``
41 63
 --------------------------
42 64
 

+ 4
- 1
openstack_auth/user.py View File

@@ -43,8 +43,11 @@ def set_session_from_user(request, user):
43 43
 
44 44
 def create_user_from_token(request, token, endpoint, services_region=None):
45 45
     # if the region is provided, use that, otherwise use the preferred region
46
+    default_service_regions = getattr(settings, 'DEFAULT_SERVICE_REGIONS', {})
47
+    default_service_region = default_service_regions.get(endpoint)
46 48
     svc_region = services_region or \
47
-        utils.default_services_region(token.serviceCatalog, request)
49
+        utils.default_services_region(token.serviceCatalog, request,
50
+                                      selected_region=default_service_region)
48 51
     return User(id=token.user['id'],
49 52
                 token=token,
50 53
                 user=token.user['name'],

+ 3
- 3
openstack_auth/utils.py View File

@@ -372,7 +372,8 @@ def get_project_list(*args, **kwargs):
372 372
     return projects
373 373
 
374 374
 
375
-def default_services_region(service_catalog, request=None):
375
+def default_services_region(service_catalog, request=None,
376
+                            selected_region=None):
376 377
     """Returns the first endpoint region for first non-identity service.
377 378
 
378 379
     Extracted from the service catalog.
@@ -396,8 +397,7 @@ def default_services_region(service_catalog, request=None):
396 397
                 LOG.error('No regions can be found in the service catalog.')
397 398
                 return None
398 399
 
399
-        selected_region = None
400
-        if request:
400
+        if request and selected_region is None:
401 401
             selected_region = request.COOKIES.get('services_region',
402 402
                                                   available_regions[0])
403 403
         if selected_region not in available_regions:

Loading…
Cancel
Save