为访问规则添加新的优先级属性

https://blueprints.launchpad.net/manila/+spec/add-priority-for-access-rule

目前,访问规则 API 仅支持访问级别,有效值为“ro”和“rw”。当用户希望为单个访问规则指定优先级时,这不够用。

问题描述

用户无法重新排序他们的访问规则,并且不同的驱动程序具有不同的访问规则排序方式。查看当前共享驱动程序的行为,我们可以为了理解将其大致分为三类

  • “最后规则”驱动程序逐个添加访问规则,最新的访问规则始终具有更高的优先级。

  • “第一规则”驱动程序始终让先前的访问规则具有更高的优先级。

  • “最具体规则”驱动程序确保单个地址始终比它们所属的子网排序更高,并且较小的子网始终排序高于较大的子网。

  • 有时,在驱动程序中更新访问规则后,访问规则的顺序并不总是与上次更新规则时相同。

目前 Manila API 的共享访问不允许指定访问规则的额外属性,例如“优先级”。

只有可能重叠的访问规则才有意义。这包括任何使用基于 IP 的访问的规则。也许基于用户的访问不需要优先级。虽然使用组时,也可以想象与基于用户的访问重叠。因此,如果用户规则不需要它,则在用户创建访问规则时无需使用优先级参数。

用例

用户希望设置哪些访问具有更高的优先级来写入或读取共享的数据,哪些访问具有较低的优先级来写入或读取共享的数据。例如:如果 192.168.1.10 RW 规则具有更高的优先级,则 192.168.1.10 RW 规则将对 192.168.1.0/24 RO 规则生效。然后,如果用户想隐藏 192.168.1.10 RW 规则,他们只需将其设置为较低的优先级即可。

提议的变更

以下是需要进行的更改

  • 将向访问允许 API 参数添加一个新的参数“priority”。

  • “priority”值支持 1-200 范围内的整数值,其中较小的数字表示更高的优先级。这意味着数字“1”是最高优先级。 “priority”的最大值设置为 200。我们永远不需要比基于 IP 的规则的网掩码中的位数更多的优先级。因为 2 个具有相同网掩码的规则要么针对相同的地址范围,要么不冲突,并且前缀长度可以一直到 128 在 manila 访问规则允许 API 中,它可以添加 129 个不同的冲突访问规则。由于我们不将 10.1.0.1/32 和 10.1.0.1 视为冲突,因此可能还有更多不同的冲突访问规则。对于非基于 IP 的规则,例如基于用户的访问,冲突的数量与用户可以所属的组的数量有关,并且用户不太可能成为超过 200 个组的成员,所有这些组都对同一个共享具有不同的访问级别。该范围不适用于不同的访问规则,仅适用于重叠的规则。如果我们不限制它,人们会想知道负数和可能高于 42 亿的数字,因此验证很重要,并且数字 200 将带来更好的可用性。

  • 访问规则将在发送到驱动程序之前,在共享管理器中通过“priority”值进行排序。具有最高优先级的规则将存储在发送到驱动程序的访问规则列表的前面。

    • 如果两个或多个规则冲突且具有相同的优先级,则行为未定义。在可能的情况下,在这种情况下,行为应保持与以前的 manila 版本相同,在这种情况下,行为也未定义。

  • 添加新的 API 以支持修改访问规则的“priority”。修改规则优先级会导致管理器调用驱动程序中的更新访问方法。

  • Manila API 术语将“deny”访问规则视为规则删除,而不是经典的 ACL deny(其中一些 IP/用户可以访问资源,而另一些则被拒绝访问/不允许访问)。因此,优先化“deny”意味着优先化规则删除,因此没有任何意义。拒绝访问规则 API 和命令不会更改。

备选方案

  • 与其添加一个单独的参数,我们可以重载“access_to”参数,以使用“#”作为分隔符来允许指定优先级。我们将解析驱动程序中的“access_to”值。例如:“manila access-allow test_share_id user#priority=1”。

  • 优先级仅对客户端可以重叠的规则起作用。这最重要的用例是与 NFS 规则到客户端 IP 地址的规则。因此,与其允许用户定义的优先级,我们可以采用 manila 中的行为,即访问规则始终在共享管理器中按以下顺序排序:针对单个 IP 地址的规则的排序高于包含它们的子网的规则,并且较小的子网的排序高于包含这些较小子网的较大子网。例如:如果用户以以下方式允许访问

    1. 允许 ‘ro’ 访问 192.168.17.16

    2. 允许 ‘rw’ 访问 192.168.17.0/22

    3. 允许 ‘ro’ 访问 192.168.17.0/24

    4. 允许 ‘rw’ 访问 192.160.16.15

    manila 确保的优先级将如下所示

    +----------+-----------------+--------------+
    | Priority |    Access To    | Access Level |
    +----------+-----------------+--------------+
    |        1 | 192.168.17.16   | ro           |
    |        2 | 192.160.16.15   | rw           |
    |        3 | 192.168.17.0/24 | rw           |
    |        4 | 192.168.17.0/22 | ro           |
    +----------+-----------------+--------------+
    
    • 这样,如果我们想禁用单个 IP 地址规则或较小子网访问规则,我们必须删除这些访问规则。例如,如果我想强制我的所有共享在短时间内仅允许读取,同时修复一些问题,但我不想删除 manila 中的所有规则来实现它。

    • 这种方式也会使升级在向后兼容性方面变得更加困难。因为访问规则在升级到新版本后将具有不同的顺序。

数据模型影响

manila.db.sqlalchemy.models.ShareInstanceAccessMapping 模型将具有一个名为 priority 的新字段。

升级 manila 后,所有现有规则的优先级都将设置为 100

REST API 影响

将在访问 API 中添加新的参数。我们将增加微版本以公开“priority”参数

添加访问规则

POST /v2/{tenant-id}/shares/{share-id}/action BODY

{
    'allow_access': {
            "access_level": "rw",
            "access_type": "ip",
            "access_to": "0.0.0.0/0",
            "priority": "1"
    }
}

“priority”是一个可选参数。如果用户未输入它,则将其设置为 1

更新访问规则

PATCH /v2/{tenant-id}/share-access-rules/{access-id} BODY

{
    "priority": "1"
}

列出访问规则

GET /v2/{project_id}/share-access-rules?share_id={share-id}&sort_dir=desc&sort_key=priority Response

{
    "accesses": [
        {
                "access_level": "rw",
                "state": "active",
                "id": "507bf114-36f2-4f56-8cf4-857985ca87c1",
                "access_type": "cert",
                "access_to": "example.com",
                "access_key": null,
                "priority": "1",
        },
        {
                "access_level": "rw",
                "state": "error",
                "id": "329bf795-2cd5-69s2-cs8d-857985ca3652",
                "access_type": "ip",
                "access_to": "10.0.0.2",
                "access_key": null,
                "priority": "3",
        },
    ]
}

将此新 API 添加到微版本更改中。“share_id”是一个必需的查询键,如果未提供“share_id”,API 将响应 HTTP 400。在列表 API 中添加“sort_dir”和“sort_key”过滤器。“sort_dir”表示排序方向,并且“sort_dir”的值应为“desc”或“asc”。

注意

  • 当前的 访问规则列表 API 接受 HTTP POST 请求。为了确保围绕幂等和安全信息检索的正确 HTTP 语义,我们将引入一个新的 API,该 API 接受 GET 请求。旧的 API 将被限制为最大微版本,即它将不可用在引入此新 API 的微版本中。

安全影响

通知影响

在创建访问规则或更新访问规则时,在用户错误通知中添加“priority”字段。

其他最终用户影响

Manila 客户端、CLI 将扩展以支持访问规则优先级。

  • 支持访问优先级的 access-allow 命令如下所示

    manila access-allow [--priority <priority>]
                        [--access-level <access_level>]
                        <share> <access_type> <access_to>
    
    Optional arguments:
    
    --priority  The 'priority' value supports an integer value in the
                range 1-200, where a lower number means a higher priority.
                The default value is set to '100'.
    
  • 支持优先级的新的 access-update 命令如下所示

    manila access-update <access> [--priority <priority>]
    
    Optional arguments:
    
    --priority  The 'priority' value supports an integer value in the
                range 1-200, where a lower number means a higher priority.
                OPTIONAL: Default=None.
    
  • 支持访问优先级排序的 access-list 命令如下所示

    manila access-list [--columns <columns>] [--sort-key <sort_key>]
                       [--sort-dir <sort_dir>]
                       <share>
    
    Optional arguments:
    --sort-dir <sort_dir>, --sort_dir <sort_dir>
                        Sort direction, available values are ('asc', 'desc').
                        OPTIONAL: Default=None.
    --sort-key <sort_key>, --sort_key <sort_key>
                        Key to be sorted, available keys are (priority).
                        OPTIONAL: Default=None.
    
  • 我们还将对“priority”值的范围进行客户端验证,限制范围在 1 到 200 之间。

性能影响

排序访问规则会对服务性能产生负面影响。

其他部署者影响

开发人员影响

驱动程序影响

访问规则将在发送到驱动程序的 update_access 函数之前在共享管理器中排序,因此驱动程序不需要看到优先级字段,也不需要更改其当前行为。如果某些驱动程序已经重新排序规则,我们将审核重新排序规则的驱动程序并立即报告错误。它们必须更新以符合共享管理器确定的顺序。如果您的后端无法正确实现广义规则覆盖更窄规则(当广义规则在列表前面时),则驱动程序必须放弃更窄的规则,并且不要将其发送到后端。

实现

负责人

主要负责人
zhongjun

工作项

  • 将优先级属性添加到访问规则对象并增加 API 微版本。

  • 在“access_rules”表中添加一个新的参数并添加 db 升级脚本。

  • 添加一个新的 update-access API。

  • 添加新的单元和 tempest 测试,用于访问规则优先级。

  • 更新 python-manilaclient 和 UI,允许最终用户在列表中移动规则并确定优先级,就像其他公共云一样 [1]

依赖项

测试

  • 添加单元测试

  • 添加 tempest 测试

文档影响

以下 OpenStack 文档将更新以反映此更改

  • OpenStack 用户指南

  • OpenStack API 参考

  • Manila 开发人员参考

  • 管理员指南

参考资料