项目树删除

bp project-tree-deletion

问题描述

在分层多租户的第一个版本(kilo-1)中,只有层次结构中的叶子项目才允许删除。 这种限制意味着,为了删除整个层次结构分支,必须逐个删除项目(从叶子开始)。

例如,考虑以下层次结构

+------------------------+
|           A            |
|                        |
|        /      \        |
|                        |
|       /        \       |
|                        |
|      B          C      |
|                        |
|    /   \       /  \    |
|                        |
|   /     \     /    \   |
|                        |
|  D       E   F      G  |
+------------------------+

要删除项目 B 及其子树,用户首先需要删除项目 D 和 E。

此外,子树删除/禁用需要作为原子操作执行。

提议的变更

本规范提出实现一个 API 来执行整个树的删除,这将允许用户指定层次结构中非叶子项目进行删除。 这样,项目本身及其整个子树将被删除。

为了删除一个项目,必须先禁用它。 目前,这与项目删除遵循相同的行为:用户必须手动禁用项目的子项目才能禁用层次结构中较高级别的项目(项目层次结构的行为与删除域不同,域默认具有级联效果)。 因此,本规范还提出了更改,以允许在单个操作中禁用整个层次结构分支

  • 项目的级联启用/禁用:一旦层次结构中较高级别的项目被禁用/启用,其子树中的所有项目都会被禁用/启用。 这种方法遵循项目层次结构中当前的规则,即我们不能拥有具有启用子项目的禁用项目。 这种方法的一个缺点是在数据库中触发多次写入。

这两个特性导致访问权限问题:用户可能对层次结构中较高级别的项目具有删除和更新权限,但对子树中的某些项目没有。 虽然我们可以坚持要求递归操作的调用者对每个项目都具有 delete_project 和 update_project 权限,但实际上云提供商更有可能将此类操作保留给非常有限的一组用户/角色。 因此,需要在 keystone policy.json 文件中添加新的规则,因此,需要新的 API 端点来表示这些操作。

删除和更新请求的新 API 可以采用以下格式

  • 删除:DELETE projects/<project_id>/cascade

  • 更新:PATCH projects/<project_id>/cascade

指定 cascade 表示该请求也应应用于层次结构中的所有子项目。 请注意,对于更新请求,enabled 字段是必需的,并且是唯一接受的属性。 包含其他属性将引发错误 - 这导致需要在 keystone 的控制器层中创建额外的调用,以受到新规则的保护。

有了 Reseller 规范,域是项目,因此我们具有以下行为

  • 我们将能够拥有一个行为类似于域的项目层次结构。 由于充当域的项目只能作为常规项目层次结构的根出现(并且永远不会出现在中间),因此层次结构上的更新和删除选项现在将像其域 API 等效项一样运行;

  • 默认情况下,我们将只允许递归行为影响“纯”项目(is_domain = false)。 如果我们触发对“纯”项目的递归操作,我们可以确定它永远不会命中域,这是基于上述要点的结果。 可以通过更新 keystone 策略文件中的规则来更改此行为。

对于 叶子 域,cascade API 的效果与常规更新和删除域操作相同,但它们将由策略文件中的 不同 规则强制执行。

备选方案

使用不同的方法进行启用/禁用

  • 认为一旦层次结构中较高级别的项目被禁用,整个分支就被 有效地 禁用。 通过使用这种方法,我们避免了在数据库中执行多次写入,但我们依赖于撤销事件将携带有关整个分支的信息以进行令牌验证。 此外,在提供令牌时,我们需要检查目标在其层次结构中是否有任何禁用的父项目。

不在策略文件中添加新规则

  • 拥有一个配置,可以选择删除和更新行为(递归或不递归)。 这会导致访问权限问题,另一种选择是在触发操作之前检查执行请求的用户是否具有对该层次结构分支中所有项目的访问权限。

安全影响

在 policy.json 文件中添加新规则以控制对项目/域的递归删除和禁用的访问权限。

通知影响

应为每个被删除或 有效地 禁用/启用的项目触发 pycadf 通知 - 它们将从子项目到父项目触发,这样其他服务中的配额驱动程序可以正确处理通知,以将其配额释放给其父项目。

其他最终用户影响

项目/域删除/禁用的新行为以及 policy.json 文件中的新规则。

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人
  • Rodrigo Duarte rodrigodsousa

其他贡献者
  • Raildo Mascena raildo

  • Henrique Truta henriquetruta

工作项

  • 更新 API 规范文档;

  • 在 policy.json 文件中添加新规则;

  • 添加新的端点以镜像新功能;

  • 实现项目层次结构的新删除/禁用行为。

依赖项

文档影响

API 文档(Identity API v3)

参考资料