检索项目层级的新查询参数

bp hierarchical-multitenancy-improvements

现在我们已经实现了分层多租户的基本实现,我们需要通过添加新功能来提高其健壮性和可用性。

问题描述

在第一个版本中,我们实现了分层多租户的基本功能,包括以下内容:

  • 通过在项目表中添加 parent_id 字段来创建项目层级;

  • 获取项目父级、子树和完整层级;

  • 删除没有子项目的项目(叶子项目);

  • 授予/检查/撤销沿项目层级向下继承的角色分配。

充分支持分层多租户需要以下改进:

  • 添加一种新的返回项目层级格式,以更好地反映层级结构(例如,字典的层级结构)。

提议的变更

当前实现的 GET /projects/{project_id}?subtree_as_list 和 GET /projects/{project_id}?parents_as_list 调用返回一个非结构化列表,其中包含调用者有权访问的层级中的项目。在某些用例中,例如分层配额检查(https://review.openstack.org/#/c/129420/),需要完整的层级结构,但只需要项目 ID 而不需要完整的项目信息。由于 ID 不包含任何关于项目的敏感信息,因此可以在没有任何限制的情况下返回它。

为了改进当前实现,我们需要执行两个主要步骤:新的 GET /projects/{project_id}?subtree_ids 和 GET /projects/{project_id}?parents_ids 调用。

  • 新的 GET /projects/{project_id}?subtree_ids 调用,将以嵌套字典的形式返回子树,其中每个节点将包含其直接子节点的条目。考虑以下层级结构:

    +------------------------+
    |           A            |
    |                        |
    |        /      \        |
    |                        |
    |       /        \       |
    |                        |
    |      B          C      |
    |                        |
    |    /   \       /  \    |
    |                        |
    |   /     \     /    \   |
    |                        |
    |  D       E   F      G  |
    +------------------------+
    
  • 对于这个层级结构,当用户请求项目 A 的 subtree_ids 时,将返回以下信息:

    {
        "subtree": {
            "B": {
                "D": null,
                "E": null
            },
            "C": {
                "F": null,
                "G": null
            }
        }
    }
    
  • GET /projects/{project_id}?parents_ids 调用也将执行相同的操作。因此,如果用户请求项目 D 的 parents_ids,将返回以下信息:

    {
        "parents": {
            "B": {
                "A": null
            }
        }
    }
    
  • 将有一个约束,防止用户同时传递“subtree_as_list”和“subtree_ids”过滤器,以及“parents_as_list”和“parents_ids”。

备选方案

安全影响

通知影响

其他最终用户影响

新的 API 调用必须在 python-keystoneclient 中反映。

  • GET subtree_ids

  • GET parents_ids

性能影响

其他部署者影响

开发人员影响

新的 API 调用将可用

  • GET /projects/{project_id}?subtree_ids

  • GET /projects/{project_id}?parents_ids

实现

负责人

主要负责人
  • Raildo Mascena raildo

其他贡献者
  • Rodrigo Duarte rodrigodsousa

  • Henrique Truta henrique-4

  • Samuel Medeiros samuelmdq

  • Adam Young ayoung

工作项

  • 实现获取层级的新选项:使用嵌套字典返回层级结构。

依赖项

文档影响

我们必须根据这些更改更新 API 文档(Identity API v3)。

参考资料