增强列表操作的分页键

https://blueprints.launchpad.net/cinder/+spec/extend-limit-implementations

目前,分页键(如 limit、marker、排序键和排序方向)以及 next 链接生成,已经针对卷列表操作实现,但其他列表操作中不可用。此蓝图为快照、卷迁移、一致性组、一致性组快照和备份等其他条目实现分页键和 next 链接生成。

问题描述

上述部分中提到的分页键已经在卷的列表操作中实现。此功能可以扩展到其他 cinder 概念。之所以选择快照、卷迁移、一致性组、一致性组快照和备份作为目标,是因为这些实体查询频率相对较高,并且与类型、可用区等其他实体相比,更有可能达到大量数据。

next 链接生成已经在卷列表中可用,因此将其实现于其他 cinder 概念中非常简单。请参考 cinder.api.common.ViewBuilder 类中的 _get_collection_links 函数。

用例

假设最大页面大小为 1000,并且存在超过 1000 个卷快照。如果未为快照实现分页键 marker,则用户可以通过 API 查询的最大快照数量为 1000。查询超过 1000 个快照的唯一方法是增加默认的最大页面大小,这限制了 cinder 列表操作。如果未生成 next 链接,则无法检索超过最大页面大小的项目。即使在这种情况下生成了 next 链接,它仍然会返回与先前请求相同的结果,而没有考虑 key marker。总之,对于 cinder 实体,分页键和 next 链接生成都是必要的。

提议的变更

该更改依赖于一些工作项,这些工作项已放在“Dependencies”(依赖项)部分中。

快照、卷迁移、一致性组、一致性组快照和备份的列表 API 将支持以下参数

  • limit:用于确定响应中返回的项目数量的键

  • marker:用于确定查询开始的项目键

  • sort:这是一个逗号分隔的排序键列表。排序方向可以可选地附加到每个排序键,并用“:”字符分隔

多个排序键和排序方向将像卷在补丁“GET volumes API sorting REST/volume/DB updates”(GET 卷 API 排序 REST/volume/DB 更新)中所做的那样实现,https://review.openstack.org/#/c/141915/

该更改符合补丁“CLI Sorting Argument Guidelines”(CLI 排序参数指南)中定义的客户端排序参数语法,https://review.openstack.org/#/c/145544/

调用者可以在请求中指定这些参数来查询项目的列表,例如 /snapshots?limit=5&marker=snapshot_id&sort=key1:asc,key2:desc,key3:asc

如果有更多项目可用于在后续请求中查询,则应为快照、卷迁移、一致性组、一致性组快照和备份正确生成 next 链接。

备选方案

我们有可能定义不同的分页键,而不是 limit、marker、排序信息来实现 Cinder 中的其他项目的分页。

但是,为了保持代码更改的一致性,最好遵循卷列表所采用的模式。

另一种选择是 cinder 坚持不为除卷之外的其他实体提供分页。但是,默认的最大页面大小 1000 可能会被某些实体(如快照)在生产环境中超过。这将导致其他实体将来出现问题。

数据模型影响

REST API 影响

以下现有的 v2 GET API 将支持新的排序参数

  • /v2/{tenant_id}/{items}

  • /v2/{tenant_id}/{items}/detail

{items} 将被替换为以下适当的实体

  • 对于快照

    • /v2/{tenant_id}/snapshots

    • /v2/{tenant_id}/snapshots/detail

  • 对于卷迁移

    • /v2/{tenant_id}/os-volume-transfer

    • /v2/{tenant_id}/os-volume-transfer/detail

  • 对于一致性组

    • /v2/{tenant_id}/consistencygroups

    • /v2/{tenant_id}/consistencygroups/detail

  • 对于一致性组快照

    • /v2/{tenant_id}/cgsnapshots

    • /v2/{tenant_id}/cgsnapshots/detail

  • 对于备份

    • /v2/{tenant_id}/backups

    • /v2/{tenant_id}/backups/detail

现有的 API 需要支持上述 cinder 概念的以下新请求参数

参数

风格

类型

描述

limit

query

integer

用于确定响应中返回的项目数量的键

marker

query

string

用于确定查询开始的项目键

sort

query

list

一个逗号分隔的排序键列表,排序方向可以可选地附加到每个排序键

如果指定了无效的分页键,则将返回“badRequest”错误响应(代码 400)。

  • 对于 limit 键,它返回消息,如“Invalid input received: Invalid limit key”(接收到无效输入:无效的 limit 键)。

  • 对于 marker 键,它返回消息,如“Invalid input received: Invalid marker key”(接收到无效输入:无效的 marker 键)。

  • 对于排序信息,它返回消息,如“Invalid input received: Invalid sort key”(接收到无效输入:无效的排序键)或“Invalid input received: Invalid sort direction”(接收到无效输入:无效的排序方向),具体取决于不同的情况。

如果需要,next 链接将放在从 cinder 返回的响应中。

  • 对于快照,它回复

    {
        "snapshots": [<List of snapshots>],
        "snapshots_links": [{'href': '<next_link>', 'rel': 'next'}]
    }
    
  • 对于卷迁移,它回复

    {
        "transfers": [<List of transfers>],
        "transfers_links": [{'href': '<next_link>', 'rel': 'next'}]
    }
    
  • 对于一致性组,它回复

    {
        "consistencygroups": [<List of consistencygroups>],
        "consistencygroups_links": [{'href': '<next_link>', 'rel': 'next'}]
    }
    
  • 对于一致性组快照,它回复

    {
        "cgsnapshots": [<List of cgsnapshots>],
        "cgsnapshots_links": [{'href': '<next_link>', 'rel': 'next'}]
    }
    
  • 对于备份,它回复

    {
      "backups": [<List of backups>],
      "backups_links": [{'href': '<next_link>', 'rel': 'next'}]
    }
    

安全影响

通知影响

其他最终用户影响

应更新 cinderclient 以接受 limit、marker、排序信息,用于快照、卷迁移、一致性组、一致性组快照和备份。

用户将能够指定分页键,如 limit、marker、排序信息来列出快照、卷迁移、一致性组、一致性组快照和备份。

性能影响

其他部署者影响

部署者应注意,标志 osapi_max_limit 可以设置集合资源在单个响应中返回的最大项目数量,但它将不再限制 cinderclient 请求返回的项目数量。

在为 cinder 实体实现分页键和 next 链接生成后,cinderclient 请求可以检索的项目数量超过标志 osapi_max_limit 设置的数量,因为它可以通过带有 marker 键的 next 链接多次获取项目,直到返回所有项目(如果没有设置 limit 键)或项目数量等于 limit(如果设置了 limit 键)。

开发人员影响

实现

负责人

主要负责人

Vincent Hou (sbhou@cn.ibm.com)

其他贡献者

工作项

由于 next 链接生成的逻辑代码在一个公共类中完成。我们不再需要重复这项工作。

因此,我看到以下工作项目

  • 添加代码以调用公共函数来处理快照、卷迁移、一致性组、一致性组快照和备份的 limit、marker 和 sort 参数。

  • 添加代码以使用分页键对快照、卷迁移、一致性组、一致性组快照和备份执行数据库查询。

  • 在 cinderclient 中添加对快照、卷迁移、一致性组、一致性组快照和备份的分页键的支持。

  • 修改现有的 API 以支持将 limit、marker 和 sort 信息从 API 层传递到数据库层。

  • 单元测试以确保快照、卷迁移、一致性组、一致性组快照和备份支持分页键 limit、marker 和 sort 信息,并在必要时提供 next 链接生成。

依赖项

测试

需要创建单元测试和 Tempest 测试,以确保快照、卷迁移、一致性组、一致性组快照和备份支持分页键 limit、marker 和 sort 信息,并在必要时提供 next 链接生成。

文档影响

需要更新 API 文档,以接受 limit、marker、排序键和排序方向,用于快照、卷迁移、一致性组、一致性组快照和备份,就像卷一样。

参考资料