使用 ‘in’ 操作符添加过滤器¶
https://blueprints.launchpad.net/glance/+spec/in-filtering-operator
本规范为 Glance v2 API 引入一项新功能,用于基于 id、name、status、container_format 或 disk_format 列表过滤镜像,使用 ‘in’ 操作符。此功能非常重要,因为它允许 Horizon 向 Glance 发送单个请求,而不是多个单个请求,从而提高系统性能并降低负载。
问题描述¶
Horizon 会发送单独的请求来获取实例 ID 形式呈现的镜像名称。 最好发送一个请求,而不是大量的单独请求。
提议的变更¶
我建议添加使用 ‘in’ 操作符在 id、name、status、``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 过滤器和用法的描述进行更新,以及额外的策略选项。