分层项目

bp hierarchical-multitenancy

OpenStack 将增加对对象分层所有权的支持。

这使得以更适合私有云的方式管理项目和配额成为可能,因为在私有云中,您可以更好地组织部门划分,它们可以作为“子项目”运作。

简而言之,该提案是修改 OpenStack 的组织结构,在 Keystone 中创建嵌套项目。

问题描述

用例 1

  • 大型企业的部门在 OpenStack 安装中由域表示,并且包含开发和测试团队。

  • 部门管理团队希望能够为所有项目中的每个子团队分配配额。

  • 部门管理团队在公司 LDAP 中创建开发和测试的所有用户,该 LDAP 域引用用于身份验证。

  • 域管理团队为开发和测试团队中的每个团队创建一个顶级项目,并为每个团队的管理员分配相应的顶级项目上的 project_admin 角色。域管理团队为每个团队在其各自的顶级项目上创建一个配额。

  • 每个团队然后可以在其顶级项目下方创建项目,并在顶级项目级别比较使用情况与配额。

提议的变更

  1. 创建层级结构

  • 新的项目层级结构的示例

    +-------------------------------------+
    |               Division A            |
    |                                     |
    |        +-------------------------+  |
    |        | User: domain_admin_team |  |
    |        | Role: domain_admin      |  |
    |        +-------------------------+  |
    |                                     |
    |                 /\                  |
    |                                     |
    |                /  \                 |
    |                                     |
    |               /    \                |
    |                                     |
    |              /      \               |
    |                                     |
    |             /        \              |
    |                                     |
    |            /          \             |
    |                                     |
    | +--------------+ +--------------+   |
    | |   Dev        | |     Test     |   |
    | +--------------+ +--------------+   |
    | +--------------+ +--------------+   |
    | | User: Joe    | | User: Sam    |   |
    | | Role: p_admin| | Role: p_admin|   |
    | +--------------+ +--------------+   |
    |                                     |
    |       /                  \          |
    |                                     |
    |     /                      \        |
    |                                     |
    | +---------------+ +----------------+|
    | | Dev.subproject| | Test.subproject||
    | +---------------+ +----------------+|
    |                                     |
    | p_admin= role project_admin         |
    +-------------------------------------+
    
    • 之后,您必须创建域,项目层级结构将放置在这些域下。您可以创建任意数量的域和每个域下的任意数量的层级结构。

  1. 最大深度树

    • 在首次发布时,我们应该有一个配置选项,允许限制树的深度,并提供合理的默认值 5。

  2. 更新项目

    • 在首次发布中,将无法更新层级结构。因此,我们无法更改任何项目的父项目。

  3. 删除项目

    • 可以删除叶子项目。

    • 第一版将支持非递归删除功能,如果待删除的项目具有子项目,则将失败并显示“正在使用”或类似信息。

  4. 获取项目

    • 清晰的标识符,指示我们正在查找层级结构详细信息。

  5. 角色

    • 继承的角色分配:如果用户在项目中具有标记为继承的角色分配,例如“project_member”,则该用户将自动在任何子项目上拥有此角色。当前,继承的角色分配仅适用于从域到项目,该提案将扩展此继承以在项目层级结构中工作。

    • 此更改将在扩展 OS-INHERIT 中实现,就像当前适用于域一样。

    • 示例

      • 域管理团队创建开发和测试项目,并将 project_admin 角色分配给 project_admin_user。由于他们的角色是可继承的,因此他们将拥有对其子项目的访问权限。

      • 由于 Joe 在开发项目中有 project_admin 角色分配,因此他可以在此项目中创建实例,并且可以创建子项目并控制其子项目的配额。Sam 在测试中也会发生同样的情况。

      • user_project_admin 可以在其项目及其子项目中授予/撤销用户角色。具有成员角色的用户无法授予/撤销角色。

  6. 令牌

    • 令牌必须限定到执行操作的目标项目。

    • 如果项目的角色分配是可继承的,则授予子项目的令牌也将包含此角色分配,否则将无法访问。

  7. 用户

    • 该提案不会更改用户/组管理 - 这仍然在域级别处理。

注意事项

  • 不可用在 Keystone V2 API 中。

备选方案

数据模型影响

在“项目”表中创建一个新列“parent_project_id”,当该列为 null 时,表示该项目是树的根。

REST API 影响

安全影响

用户只有在直接分配的角色或从父项目继承的角色时才能访问项目。

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人
  • raildo

其他贡献者
  • schwicke

  • sajeesh

  • tellesnobrega

  • rodrigodsousa

  • afaranha

  • henrique-4

  • thiagop

  • gabriel-bezerra

  • samuel-z

工作项

  1. Keystone 中的项目将获得一个新字段 parent_project_id,以创建项目的树。 (此更改将在 Keystone 核心中进行)

  2. 角色分配将向下继承项目层级结构树,但当前,继承的角色分配仅受域到项目支持。因此,我们需要为项目创建继承角色的 API,我们需要实现以下功能: (此更改将在扩展 OS-INHERIT 中进行)

  • 为项目 A 定义的角色分配必须由项目 A 的所有子项目继承;

  • 为组 X 定义的角色分配必须由该组 X 的所有子项目继承;

  • 对于项目 A,列出 A 的所有继承的角色分配,这些分配也将由项目 A 的子项目继承;

  • 对于组 X,列出 ABC 项目的所有继承的角色分配,这些分配也将由组 X 在子项目中的用户继承;

  • 检查用户是否在项目上具有继承的角色分配;

  • 检查组是否在项目上具有继承的角色分配;

  • 撤销项目上用户继承的项目角色分配;

  • 撤销组在项目上继承的项目角色分配。

  1. 当前,GET /role_assignments 通过 OS-INHERIT 扩展以返回从域到项目继承的角色分配。该提案将进一步扩展此功能,以包含从项目到项目继承的角色分配。 (此更改将在 Keystone 核心和 OS-INHERIT 扩展中进行)

  2. 更新令牌内容,以包含向下继承项目层级结构的角色。 (此更改将在 Keystone 核心中进行)

  3. 我们将创建 API 和 python-keystoneclient 中的一个调用,以使用以下选项返回层级结构: (此更改将在 Keystone 核心中进行)

  • 父项目

  • 子项目

  • 完整层级结构

依赖项

测试

  • 添加与其他服务的集成单元测试。(Tempest Tests)

文档影响

操作分层项目的新方法必须在 API 中记录。

参考资料