Reseller Use Case¶
OpenStack 需要增加对对象分层所有权的支持。这使得以更舒适的方式管理私有云中的用户和项目子集,同时为公共云提供商提供转售其云一部分资源的选项。
问题描述¶
用例 1
转售商
参与者
Alex - 云拥有者
Martha - ProductionIT 的拥有者
Joe - WidgetMaster 的开发经理
Sam - SuperDevShop 的开发经理
Alex 是一个云的拥有者,Martha 使用从 Alex 处购买的资源为多个企业客户提供 IT 服务。她希望向 WidgetMaster 的 Joe 和 SuperDevShop 的 Sam 提供云服务。Joe 和 Sam 有许多 QA 和开发团队,拥有大量用户。他们需要能够创建用户、组、项目和配额,以及列出和删除其企业中的资源的能力。Martha 需要能够为 WidgetMaster 和 SuperDevShop 设置配额。她还需要确保 Joe 和 Sam 无法看到或操作彼此拥有的任何内容。
提议的变更¶
实现支持,允许用户/组由不仅仅是顶级域名拥有。为了实现这一点,域的结构将与项目的结构合并,因为我们已经有了项目的层次结构,这种合并将允许也拥有域层次结构来分发用户和组,而不仅仅是在全局实体中。通过这种实现,我们将覆盖转售商用例,即能够转售项目,以及表现为域的项目,在该项目中可以创建用户和组。
我们将采取以下步骤来启用此功能
将在项目表中添加一个新字段,以表示该项目是否具有域功能(
is_domain标志)。SQL 迁移将采取以下步骤
- ** 为域表中的每个条目,在项目表中创建一个条目
其中域的 ID 成为项目表中的 project_id,并将
is_domain标志设置为 true- ** 将 parent_id 初始化为任何其他项目,不设置
parent_id 设置为与其 domain_id 匹配
- ** 为每个
现有 USER-DOMAIN/GROUP-DOMAIN 创建 USER-PROJECT 和 GROUP-PROJECT 角色分配
** 删除所有域分配。
** 删除域表
我们将为 GET v3/domains 和 v3/projects API 添加
parent_id查询参数。如果未指定,这些请求应仅返回根域或项目的列表。
重要的是要注意以下规则/限制
将“is_domain”标志设置为“true”的项目只能是根项目或属于也具有“is_domain”标志设置为“true”的项目子项目。此外,“is_domain”标志是不可变的。
关于角色分配管理,可以使用继承的角色分配来管理用户/组与项目层次结构之间的授权。例如,遵循之前会话中描述的用例:默认情况下,Martha 或 Alex 无法看到或操作 Sam 和 Joe 拥有的资源,除非她明确地在他们的域中具有角色分配,或者在 ProductionIT 中具有继承的角色分配。同样,Joe 和 Sam 除非 Martha 在她的域中赋予他们角色,否则无法看到 Martha 拥有的任何内容。
请注意,今天我们可以使用当前的角色分配机制来在层次结构中为用户和组授予角色,为了更好地可用性来管理用户和组的访问控制,我们建议使用继承的角色分配实现,以便您可以将角色授予项目/域中的用户/组,并沿子树继承此分配。此外,还有一个 spec 与域角色相关,可以改进分层多租户中的角色管理。重要的是要注意,继承的角色分配的当前实现仅考虑项目,角色分配不会在域层次结构中继承。
可以通过域和项目 API 创建新的非根域:POST v3/domains(创建域,传递来自现有域的 parent_id)和 POST v3/projects,启用
is_domain标志并传递来自现有域的 parent_id。在本版本中,我们不允许将项目更新为表现为域。
备选方案¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
Python-keystoneclient 必须支持创建表现为域的项目。
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
当用户请求域范围的令牌时,Keystone 将发送域和项目的双范围令牌。
实现¶
负责人¶
主要负责人
Raildo Mascena <raildo>
其他贡献者
Andrey Brito <abrito>
Henrique Truta <henriquetruta>
Rodrigo Duarte Sousa <rodrigodsousa>
工作项¶
“域是一个项目”:在项目表中创建一个
is_domain标志来表示域;为列出域和列出项目 v3 API 调用实现
parent_id查询参数;将当前域结构迁移到项目表;
当请求具有激活
is_domain标志的项目域范围令牌时,将提供双范围令牌,引用持有该域的项目 - 我们将在角色分配表中有一个 USER_PROJECT 或 GROUP_PROJECT 类型的单个条目。
请注意,我们可以拥有具有相同 名称 的多个域或项目,因此如果有人想通过传递实体名称来请求令牌,则需要传递该实体的完整命名空间,例如考虑以下层次结构
A / \ B C / \ A B
要请求 B 的令牌,它是 C 的子项(不是 A 的子项),令牌请求需要包含完整的层次结构信息。
字符“/”不允许成为域或项目名称的一部分,如果某个实体已经在其名称中包含此字符,则该特定实体将不允许成为层次结构的一部分。需要更新名称以删除“/”。
创建一个约束,以确保域的父项始终是另一个域(换句话说:确保我们不会在项目下创建域);
一旦启用,使
is_domain属性不可变。
依赖项¶
依赖于分层多租户改进规范:https://review.openstack.org/#/c/135309/
文档影响¶
必须根据这些更改更新 Identity API v3 文档。