分层项目¶
OpenStack 将增加对对象分层所有权的支持。
这使得以更适合私有云的方式管理项目和配额成为可能,因为在私有云中,您可以更好地组织部门划分,它们可以作为“子项目”运作。
简而言之,该提案是修改 OpenStack 的组织结构,在 Keystone 中创建嵌套项目。
问题描述¶
用例 1
大型企业的部门在 OpenStack 安装中由域表示,并且包含开发和测试团队。
部门管理团队希望能够为所有项目中的每个子团队分配配额。
部门管理团队在公司 LDAP 中创建开发和测试的所有用户,该 LDAP 域引用用于身份验证。
域管理团队为开发和测试团队中的每个团队创建一个顶级项目,并为每个团队的管理员分配相应的顶级项目上的
project_admin角色。域管理团队为每个团队在其各自的顶级项目上创建一个配额。每个团队然后可以在其顶级项目下方创建项目,并在顶级项目级别比较使用情况与配额。
提议的变更¶
创建层级结构
新的项目层级结构的示例
+-------------------------------------+ | 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 | +-------------------------------------+
之后,您必须创建域,项目层级结构将放置在这些域下。您可以创建任意数量的域和每个域下的任意数量的层级结构。
最大深度树
在首次发布时,我们应该有一个配置选项,允许限制树的深度,并提供合理的默认值 5。
更新项目
在首次发布中,将无法更新层级结构。因此,我们无法更改任何项目的父项目。
删除项目
可以删除叶子项目。
第一版将支持非递归删除功能,如果待删除的项目具有子项目,则将失败并显示“正在使用”或类似信息。
获取项目
清晰的标识符,指示我们正在查找层级结构详细信息。
角色
继承的角色分配:如果用户在项目中具有标记为继承的角色分配,例如“project_member”,则该用户将自动在任何子项目上拥有此角色。当前,继承的角色分配仅适用于从域到项目,该提案将扩展此继承以在项目层级结构中工作。
此更改将在扩展 OS-INHERIT 中实现,就像当前适用于域一样。
示例
域管理团队创建开发和测试项目,并将
project_admin角色分配给 project_admin_user。由于他们的角色是可继承的,因此他们将拥有对其子项目的访问权限。由于 Joe 在开发项目中有
project_admin角色分配,因此他可以在此项目中创建实例,并且可以创建子项目并控制其子项目的配额。Sam 在测试中也会发生同样的情况。user_project_admin 可以在其项目及其子项目中授予/撤销用户角色。具有成员角色的用户无法授予/撤销角色。
令牌
令牌必须限定到执行操作的目标项目。
如果项目的角色分配是可继承的,则授予子项目的令牌也将包含此角色分配,否则将无法访问。
用户
该提案不会更改用户/组管理 - 这仍然在域级别处理。
注意事项
不可用在 Keystone V2 API 中。
备选方案¶
无
数据模型影响¶
在“项目”表中创建一个新列“parent_project_id”,当该列为 null 时,表示该项目是树的根。
REST API 影响¶
API 中的更改在单独的审查中定义。 https://review.openstack.org/#/c/111355/
安全影响¶
用户只有在直接分配的角色或从父项目继承的角色时才能访问项目。
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
raildo
- 其他贡献者
schwicke
sajeesh
tellesnobrega
rodrigodsousa
afaranha
henrique-4
thiagop
gabriel-bezerra
samuel-z
工作项¶
Keystone 中的项目将获得一个新字段 parent_project_id,以创建项目的树。 (此更改将在 Keystone 核心中进行)
角色分配将向下继承项目层级结构树,但当前,继承的角色分配仅受域到项目支持。因此,我们需要为项目创建继承角色的 API,我们需要实现以下功能: (此更改将在扩展 OS-INHERIT 中进行)
为项目 A 定义的角色分配必须由项目 A 的所有子项目继承;
为组 X 定义的角色分配必须由该组 X 的所有子项目继承;
对于项目 A,列出 A 的所有继承的角色分配,这些分配也将由项目 A 的子项目继承;
对于组 X,列出 ABC 项目的所有继承的角色分配,这些分配也将由组 X 在子项目中的用户继承;
检查用户是否在项目上具有继承的角色分配;
检查组是否在项目上具有继承的角色分配;
撤销项目上用户继承的项目角色分配;
撤销组在项目上继承的项目角色分配。
当前,GET /role_assignments 通过 OS-INHERIT 扩展以返回从域到项目继承的角色分配。该提案将进一步扩展此功能,以包含从项目到项目继承的角色分配。 (此更改将在 Keystone 核心和 OS-INHERIT 扩展中进行)
更新令牌内容,以包含向下继承项目层级结构的角色。 (此更改将在 Keystone 核心中进行)
我们将创建 API 和 python-keystoneclient 中的一个调用,以使用以下选项返回层级结构: (此更改将在 Keystone 核心中进行)
父项目
子项目
完整层级结构
依赖项¶
无
测试¶
添加与其他服务的集成单元测试。(Tempest Tests)
文档影响¶
操作分层项目的新方法必须在 API 中记录。