支持按时间比较运算符查询 cinder 资源

https://blueprints.launchpad.net/cinder/+spec/support-to-query-cinder-resources-filter-by-time-comparison-operators

支持用户通过指定时间比较运算符以及 created_at 或 updated_at 来查询资源,cinder 将返回所有匹配时间条件的结果。

问题描述

Cinder(以及其他项目,如 heat 和 neutron)API 仅支持按离散值过滤资源,即使 cinder 资源具有时间戳字段,用户也只能查询在给定时间操作的资源,而不能在给定期间内查询。用户可能对在特定时间段内操作的资源感兴趣,用于监控或统计目的,但目前他们必须自行检索和过滤资源。此更改可以为用户带来便利,并提高基于时间戳的查询效率。

用例

在大型环境中,系统中创建了大量资源,为了追踪资源的变更,用户或管理系统只需要获取从某个时间点创建或更改的资源,而不是每次查询所有资源来查看哪些已更改。

提议的变更

  • 引入六种时间比较运算符,与 created_at 或 updated_at 字段一起使用,以更灵活地检索资源。用户需要先指定运算符,冒号 (:) 作为分隔符,然后指定时间。更进一步,我们还将支持一次查询多个运算符,逗号 (,) 作为分隔符。

  • 运算符 ‘gt’:返回比指定时间更新的结果。

  • 运算符 ‘gte’:返回匹配指定时间以及任何更新的结果。

  • 运算符 ‘eq’:返回完全匹配指定时间的结果。

  • 运算符 ‘neq’:返回不匹配指定时间的结果。

  • 运算符 ‘lt’:返回比指定时间旧的结果。

  • 运算符 ‘lte’:返回匹配指定时间以及任何旧的结果。

备选方案

如‘问题描述’部分所述,用户可以检索然后自行过滤资源,但这种方法既不方便也不高效。将过滤工作交给数据库可以利用数据库引擎的优化,并减少从服务器到客户端传输的数据。

数据模型影响

REST API 影响

List API 将接受新的查询字符串参数。用户可以将运算符和时间传递给 List API url,以检索在特定时间之前或之后创建或更新的资源。此更改还需要提升 API 的微版本,以保持向前兼容性。

  • GET /v3/{project_id}/volumes/{detail}?updated_at=gt:2016-01-01T01:00:00,lt:2016-12-01T01:00:00

安全影响

通知影响

无。

其他最终用户影响

Python 客户端可以添加帮助信息,告知用户此新过滤器。Python 客户端支持动态分配搜索字段,因此很容易支持此新过滤器。

性能影响

如‘替代方案’部分所述,可以通过利用数据库引擎来提高基于时间戳的查询性能。此外,还可以添加索引以提高查询性能。

其他部署者影响

开发人员影响

实现

负责人

主要负责人

wanghao<sxmatch1986@gmail.com>

工作项

  • 添加 API 过滤器

  • 在 sql 中添加查询支持

  • 添加相关测试

依赖项

测试

  1. 单元测试,以测试是否可以正确应用这些过滤器。

  2. Tempest 测试,以从 API 角度验证更改过滤器是否正常工作。

文档影响

  1. Cinder API 文档需要更新以反映 REST API 的更改。

参考资料

[1]: https://developer.openstack.org/api-ref/image/v2/?expanded=list-images-detail#v2-comparison-ops