为 os-instance-actions API 添加分页和 changes-since 过滤器支持

https://blueprints.launchpad.net/nova/+spec/pagination-add-changes -since-for-instance-action-list

此蓝图为 GET /os-instance-actions 请求添加可选参数 limitmarker 以支持分页。

此蓝图还为 GET /os-instance-actions 请求添加可选参数 changes-since 以支持按更新时间过滤响应数据。

问题描述

目前,os-instance-actions API 不支持分页。 在生产部署中,实例操作记录的数量可能非常大,查询所有记录可能导致性能瓶颈,因此支持分页将非常有用。

此外,os-instance-actions API 不支持按上次更新时间过滤迁移记录。 对于生产部署,一个实例可能运行很长时间,迁移记录的数量也会非常多。 支持按上次更新时间过滤将非常有用。

用例

对于大规模生产部署,管理员可以使用分页和最新的更新时间过滤器来获得更高效的数据库查询。

提议的变更

添加一个 API 微版本,允许使用通用的分页机制,通过向 GET /os-instance-actions 请求添加可选参数 limit 来获取多个迁移。 并通过向 GET /os-instance-actions 请求添加可选参数 changes-since 来添加过滤器。

  • limit:要显示的实例操作的最大数量。 如果 limit == -1,将显示所有迁移。 如果 limit 大于 Nova API 的 osapi_max_limit 选项,则将使用 osapi_max_limit 代替。

  • marker:上一页的最后一个实例操作的时间戳。 显示“marker”之后的迁移列表。

备选方案

数据模型影响

REST API 影响

该提案将添加 API 微版本,用于使用通用分页机制获取多个迁移。 新的可选参数 limitmarkerchanges-since 将添加到 GET /os-instance-actions 请求中。

通用请求格式

GET /os-instance-actions?limit={limit}&marker={kp_name}
  1. 获取所有实例操作

    GET /os-instance-actions
    

    响应

    {
      "instanceActions": [
        {
          "instance_uuid": "ccc6afd4-2484-4c32-bd42-70cacf571a0e",
          "user_id": "7b2ddda599f74f9aabfe554a978aeca2",
          "start_time": "2015-10-30T03:20:13.000000",
          "request_id": "req-11ac94e9-8a6e-41bc-81ac-507fc38a7e50",
          "action": "reboot",
          "message": null,
          "project_id": "0721e55af7904e3b83f1276cd7ef769d"
        },
        {
          "instance_uuid": "ccc6afd4-2484-4c32-bd42-70cacf571a0e",
          "user_id": "7b2ddda599f74f9aabfe554a978aeca2",
          "start_time": "2015-10-30T03:16:34.000000",
          "request_id": "req-c3053bed-f1f0-4cb3-bde0-21cca81f0543",
          "action": "start",
          "message": null,
          "project_id": "0721e55af7904e3b83f1276cd7ef769d"
        },
        {
          "instance_uuid": "ccc6afd4-2484-4c32-bd42-70cacf571a0e",
          "user_id": "7b2ddda599f74f9aabfe554a978aeca2",
          "start_time": "2015-10-30T03:16:10.000000",
          "request_id": "req-aef8b118-a8b6-4d53-bfff-c81f035cda2b",
          "action": "stop",
          "message": null,
          "project_id": "0721e55af7904e3b83f1276cd7ef769d"
        },
        {
          "instance_uuid": "ccc6afd4-2484-4c32-bd42-70cacf571a0e",
          "user_id": "7b2ddda599f74f9aabfe554a978aeca2",
          "start_time": "2015-10-30T02:10:14.000000",
          "request_id": "req-79fa95a3-ce44-4554-bf66-b6731353866d",
          "action": "create",
          "message": null,
          "project_id": "0721e55af7904e3b83f1276cd7ef769d"
        }
      ]
    }
    
  2. 获取最多 2 个实例操作

    GET /os-instance-actions?limit=2
    
    Response ::
    
    {
      "instanceActions": [
        {
          "instance_uuid": "ccc6afd4-2484-4c32-bd42-70cacf571a0e",
          "user_id": "7b2ddda599f74f9aabfe554a978aeca2",
          "start_time": "2015-10-30T03:20:13.000000",
          "request_id": "req-11ac94e9-8a6e-41bc-81ac-507fc38a7e50",
          "action": "reboot",
          "message": null,
          "project_id": "0721e55af7904e3b83f1276cd7ef769d"
        },
        {
          "instance_uuid": "ccc6afd4-2484-4c32-bd42-70cacf571a0e",
          "user_id": "7b2ddda599f74f9aabfe554a978aeca2",
          "start_time": "2015-10-30T03:16:34.000000",
          "request_id": "req-c3053bed-f1f0-4cb3-bde0-21cca81f0543",
          "action": "start",
          "message": null,
          "project_id": "0721e55af7904e3b83f1276cd7ef769d"
        }
      ]
    }
    

请求格式

GET /os-instance-actions?changes-since=2015-10-30T03:16:10.000000"

响应

{
  "instanceActions": [
    {
      "instance_uuid": "ccc6afd4-2484-4c32-bd42-70cacf571a0e",
      "user_id": "7b2ddda599f74f9aabfe554a978aeca2",
      "start_time": "2015-10-30T03:20:13.000000",
      "request_id": "req-11ac94e9-8a6e-41bc-81ac-507fc38a7e50",
      "action": "reboot",
      "message": null,
      "project_id": "0721e55af7904e3b83f1276cd7ef769d"
    },
    {
      "instance_uuid": "ccc6afd4-2484-4c32-bd42-70cacf571a0e",
      "user_id": "7b2ddda599f74f9aabfe554a978aeca2",
      "start_time": "2015-10-30T03:16:34.000000",
      "request_id": "req-c3053bed-f1f0-4cb3-bde0-21cca81f0543",
      "action": "start",
      "message": null,
      "project_id": "0721e55af7904e3b83f1276cd7ef769d"
    },
    {
      "instance_uuid": "ccc6afd4-2484-4c32-bd42-70cacf571a0e",
      "user_id": "7b2ddda599f74f9aabfe554a978aeca2",
      "start_time": "2015-10-30T03:16:10.000000",
      "request_id": "req-aef8b118-a8b6-4d53-bfff-c81f035cda2b",
      "action": "stop",
      "message": null,
      "project_id": "0721e55af7904e3b83f1276cd7ef769d"
    }
  ]
}

安全影响

通知影响

其他最终用户影响

性能影响

通过分页和从 Nova 端检索迁移的时间过滤来减轻 Horizon 的负载。

其他部署者影响

开发人员影响

实现

负责人

主要负责人

郑振宇

工作项

创建一个新的 API 微版本,用于使用通用分页机制和时间戳过滤来获取多个迁移。

依赖项

测试

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

文档影响

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

参考资料