New query params to retrieve the project hierarchy¶
bp hierarchical-multitenancy-improvements
Now that we have the base implementation of hierarchical multitenancy in place, we need to improve its robustness and usability by adding new features.
Problem Description¶
In the first version, we implemented the basic features for Hierarchical Multitenancy, which included the following:
Create a project hierarchy, through the addition of the parent_id field in the project table;
Get the project parents, subtree and full hierarchy;
Delete projects without children (leaf projects);
Grant/check/revoke role assignments that are inherited down the project hierarchy.
Adequate support to hierarchical multitenancy requires improvements such as the following:
Add a new format of a returned project hierarchy to better reflect the hierarchy (e.g., a hierarchy of dictionaries).
Proposed Change¶
The currently implemented GET /projects/{project_id}?subtree_as_list and GET /projects/{project_id}?parents_as_list calls return a nonstructured list containing the projects in the hierarchy for which the caller has access to. There are some use cases, for example, hierarchical quotas checking (https://review.openstack.org/#/c/129420/), where the full hierarchy is needed, but only the projects IDs are necessary and not the complete project information. As the ID does not contain any sensitive information about the project, it could be returned without any constraints.
There are two major steps we need to do in order to improve the current implementation: the new GET /projects/{project_id}?subtree_ids and GET /projects/{project_id}?parents_ids calls.
The new GET /projects/{project_id}?subtree_ids call, which will return the subtree in the format of nested dictionaries, where every node will have the entries for its immediate children. Consider the following hierarchy:
+------------------------+ | A | | | | / \ | | | | / \ | | | | B C | | | | / \ / \ | | | | / \ / \ | | | | D E F G | +------------------------+
For this hierarchy, when a user requests the subtree_ids from the project A, the following information will be returned:
{ "subtree": { "B": { "D": null, "E": null }, "C": { "F": null, "G": null } } }
The same will be done for the GET /projects/{project_id}?parents_ids call. So if the user requests the parents_ids for project D, the following would be returned:
{ "parents": { "B": { "A": null } } }
There will be a constraint that prevents the user from passing “subtree_as_list” and “subtree_ids” filters simultaneously, as well as “parents_as_list” and “parents_ids”.
Alternatives¶
None
Security Impact¶
None
Notifications Impact¶
None
Other End User Impact¶
New API calls must be reflected on python-keystoneclient:
GET subtree_ids
GET parents_ids
Performance Impact¶
None
Other Deployer Impact¶
None
Developer Impact¶
New API calls will be available:
GET /projects/{project_id}?subtree_ids
GET /projects/{project_id}?parents_ids
Implementation¶
Assignee(s)¶
- Primary assignee:
Raildo Mascena raildo
- Other contributors:
Rodrigo Duarte rodrigodsousa
Henrique Truta henrique-4
Samuel Medeiros samuelmdq
Adam Young ayoung
Work Items¶
Implement the new options to get the hierarchy: return the hierarchy using nested dictionaries.
Dependencies¶
None
Documentation Impact¶
We must update the API Documentation (Identity API v3) according to these changes.