使用 ‘in’ 操作符添加过滤器

https://blueprints.launchpad.net/glance/+spec/in-filtering-operator

本规范为 Glance v2 API 引入一项新功能,用于基于 idnamestatuscontainer_formatdisk_format 列表过滤镜像,使用 ‘in’ 操作符。此功能非常重要,因为它允许 Horizon 向 Glance 发送单个请求,而不是多个单个请求,从而提高系统性能并降低负载。

问题描述

Horizon 会发送单独的请求来获取实例 ID 形式呈现的镜像名称。 最好发送一个请求,而不是大量的单独请求。

提议的变更

我建议添加使用 ‘in’ 操作符在 idnamestatus、``container_format``、disk_format 属性上过滤镜像的能力。

备选方案

另一种方法是将此类型的查询实现到 Searchlight 服务中。 但 Searchlight 是一个可选服务,而 Horizon 始终需要列出正在运行的实例。

此外,出于以下原因,仍然应该添加此特定功能,“in” 操作符:* 与 Glare 的一致性,Glare 已经实现了“in”操作符;* 应该允许用于有效服务间通信的最小过滤器集。

因此,虽然应该将搜索 UI 的工作卸载到 Searchlight,但此特定功能基本且有用,值得包含在 API 中。

数据模型影响

REST API 影响

遵循现有过滤器的模式,新的过滤器可以作为查询参数指定,使用要过滤的字段作为键,并将过滤条件作为参数中的值。

基于完全符合模板的原则进行过滤,例如 ‘name = in:deb’ 不匹配 ‘debian’。

更改仅适用于 API v2 镜像实体列表

GET /v2/images/{image\_id}

通过添加可选查询参数进行过滤

id, name, status, disk_format, container_format

使用 ‘in’ 操作符进行名称过滤的验收标准示例

?name=in:name1,name2,name3

这些过滤器将使用符合 OpenStack API 工作组最新指南以及任何适用的草案指南的语法添加 [1]

示例

GET /v2/images?name=in:name1,name2
{
    "first": "/v2/images?name=in:name1,name2",
    "images": [
        {
            "checksum": null,
            "container_format": "bare",
            "created_at": "2015-12-18T12:02:09Z",
            "disk_format": "raw",
            "file": "/v2/images/381b6dfb-48c2-4fcd-860d-9c7b10876730/file",
            "id": "381b6dfb-48c2-4fcd-860d-9c7b10876730",
            "min_disk": 0,
            "min_ram": 0,
            "name": "name1",
            "owner": "a03febe481094927a96fe367c15c347b",
            "protected": false,
            "schema": "/v2/schemas/image",
            "self": "/v2/images/381b6dfb-48c2-4fcd-860d-9c7b10876730",
            "size": null,
            "status": "queued",
            "tags": [],
            "updated_at": "2015-12-18T12:02:09Z",
            "virtual_size": null,
            "visibility": "private"
        },
        {
            "checksum": null,
            "container_format": "bare",
            "created_at": "2015-12-18T12:02:15Z",
            "disk_format": "raw",
            "file": "/v2/images/a3b9db48-5b6f-40e5-9cc1-d586f01281cc/file",
            "id": "a3b9db48-5b6f-40e5-9cc1-d586f01281cc",
            "min_disk": 0,
            "min_ram": 0,
            "name": "name2",
            "owner": "a03febe481094927a96fe367c15c347b",
            "protected": false,
            "schema": "/v2/schemas/image",
            "self": "/v2/images/a3b9db48-5b6f-40e5-9cc1-d586f01281cc",
            "size": null,
            "status": "queued",
            "tags": [],
            "updated_at": "2015-12-18T12:02:15Z",
            "virtual_size": null,
            "visibility": "private"
        }
    ],
    "schema": "/v2/schemas/images"
}

仍然会强制执行最大页面大小。 例如,如果最大页面大小为 3,并且我执行请求 ‘id=in:1,2,3,4’ - 我只获取 3 个镜像和一个链接来获取第四个。

安全影响

通知影响

其他最终用户影响

性能影响

进行了性能测试。 我们确定了在获取镜像列表、过滤和重复 image-get 查询上花费的时间。 结果在 [2] 中呈现。

  • 蓝线 - 使用重复请求。

  • 红线 - 使用过滤器。

测试代码在 [3] 中呈现。

其他部署者影响

开发人员影响

实现

负责人

主要负责人

dshakhray

其他贡献者

评审人员

mfedosin jokke

工作项

依赖项

测试

将根据需要添加单元和功能测试。

文档影响

文档应使用新 API 过滤器和用法的描述进行更新,以及额外的策略选项。

参考资料