密钥对分页支持

https://blueprints.launchpad.net/nova/+spec/keypairs-pagination

该蓝图旨在向 GET /os-keypairs 请求添加可选参数 limitmarker

问题描述

目前用户只能获取所有未删除的密钥对,这可能会太慢。计算 API 用户希望能够使用分页机制获取所有租户密钥对的子集。

用例

Horizon 的规模测试面临多个问题,原因是 Nova 侧接收到大量数据。此更改对于在 Horizon 中将密钥对显示在多个页面上而不是一个通用列表中很有用。

提议的变更

添加一个 API 微版本,允许使用通用的分页机制,通过在 GET /os-keypairs 请求中添加可选参数 limitmarker 来获取多个密钥对。此外,更新 ‘key_pair_get_all_by_user’ DP API 函数,按 user_id 对密钥对进行排序,以便服务器端排序可以用于分页。

  • marker:前一页的最后一个密钥对名称。显示 “marker” 之后的密钥对列表。

  • limit:要显示的密钥对的最大数量。如果 limit 为 None,将显示所有密钥对。如果 limit 大于 Nova API 的 osapi_max_limit 选项,则将使用 osapi_max_limit 代替。

注意

这不会添加管理员用户列出所有租户密钥对的支持。

备选方案

数据模型影响

REST API 影响

该提案将添加 API 微版本,用于使用通用分页机制获取多个密钥对。新的可选参数 limitmarker 将添加到 GET /os-keypairs 请求中。如果未找到 marker,API 将返回 HTTP 404。

通用请求格式

GET /os-keypairs?limit={limit}&marker={kp_name}
  1. 获取所有密钥对

    GET /os-keypairs
    

    响应

    {
        "keypairs": [
            {
                "keypair": {
                    "public_key": <ssh-key1>,
                    "name":"kp1",
                    "fingerprint": "cc:cc:cc:cc"
                }
            },
            {
                "keypair": {
                    "public_key": <ssh-key2>,
                    "name":"kp2",
                    "fingerprint": "aa:aa:aa:aa"
                }
            },
            {
                "keypair": {
                    "public_key": <ssh-key3>,
                    "name":"kp3",
                    "fingerprint": "bb:bb:bb:bb"
                }
            }
        ]
    }
    
  2. 获取最多 2 个密钥对

    GET /os-keypairs?limit=2
    

    响应

    {
        "keypairs": [
            {
                "keypair": {
                    "public_key": <ssh-key1>,
                    "name":"kp1",
                    "fingerprint": "cc:cc:cc:cc"
                }
            },
            {
                "keypair": {
                    "public_key": <ssh-key2>,
                    "name":"kp2",
                    "fingerprint": "aa:aa:aa:aa"
                }
            }
        ]
    }
    
  3. 获取 kp2 之后的全部密钥对

    GET /os-keypairs?marker=kp2
    

    响应

    {
        "keypairs": [
            {
                "keypair": {
                    "public_key": <ssh-key3>,
                    "name":"kp3",
                    "fingerprint": "bb:bb:bb:bb"
                }
            }
        ]
    }
    
  4. 从 kp1 获取最多 1 个密钥对

    GET /os-keypairs?marker=kp1&limit=1
    

    响应

    {
        "keypairs": [
            {
                "keypair": {
                    "public_key": <ssh-key2>,
                    "name":"kp2",
                    "fingerprint": "aa:aa:aa:aa"
                }
            }
        ]
    }
    

安全影响

通知影响

其他最终用户影响

性能影响

通过分页从 Nova 侧检索密钥对来减轻 Horizon 的负载。

其他部署者影响

开发人员影响

实现

负责人

主要负责人

pkholkin

工作项

创建一个新的 API 微版本,用于使用通用分页机制获取多个密钥对。

依赖项

测试

需要新的 Tempest、功能和单元测试。

文档影响

需要新的 API 微版本和用量文档。

参考资料

Nova bug 描述了该问题

[1] https://bugs.launchpad.net/nova/+bug/1510504

历史

修订版

发布名称

描述

Mitaka

引入

Newton

重新提出