灵活的 API 过滤器¶
https://blueprints.launchpad.net/manila/+spec/like-filter
本规范建议更改 API 过滤器行为,以实现过滤器值的非精确匹配。
问题描述¶
目前,我们只能通过精确匹配来过滤 manila 资源。这不够灵活,因为客户需要记住完整的共享名称,并且无法通过关键词快速获取共享。然而,对于客户来说,如果支持部分相似的过滤器来通过用户输入检索共享,这将有助于用户灵活地按名称过滤共享,特别是对于管理大量由 manila 管理的共享的用户。
顺便说一下,它已经在许多其他项目中引入,我们可以利用这些现有的机制,nova [1] 和 ironic [2]。在 nova 中,它更改为 sqlalchemy 中的正则表达式过滤器匹配。在 ironic 中,它增加了一种通过名称(正则表达式和通配符)在 API 中过滤节点的方式。
用例¶
用户拥有大量的共享。他们根据自己的需求使用不同的模板命名它们。并且他们可能希望根据共享名称的一部分过滤共享。 “描述”的情况也一样。
提议的变更¶
值得一提的是,此功能也已在 cinder [4] 中提出,并且依赖于通用的资源过滤器 [5],但在 manila 中,使 API 行为可配置仍然是一个问题,因此我们将只选择我们想要的部分,同时保持与 cinder 的 API 一致性。
使用 ‘~’ 运算符在过滤器键之后触发类似过滤操作,这也是我们的 API 将呈现的样子
GET /v2/<tenant_id>/shares?name~=test
仅对指定的资源支持类似过滤器(cinder 让管理员通过配置文件做出此决定)
列出共享 (名称, 描述)
列出快照 (名称, 描述)
列出共享网络 (名称, 描述)
列出共享组 (名称, 描述)
Manila 客户端将在 ‘list’ API 中添加新的命令行参数 ‘–name~’ 和 ‘–description~’,以通过非精确匹配过滤 manila 资源。
我们可以提供基于正则表达式过滤器的资源过滤,但我们有可能遇到 ReDos [3] 攻击。考虑到过滤器在这种情况下足够灵活和安全。我们可以引入 ‘LIKE’ 运算符。并且我们可以轻松地将此过滤器应用于现有的 sqlalchemy 过滤函数,并使用 ‘LIKE’ 运算符来过滤资源。
备选方案¶
另一种选择是我们可以部署 searchlight,它主要关注各种云资源查询,这是一个更广泛的话题。但我们也应该考虑不包含 searchlight 的云环境。
还有另一种选择是用户可以收集所有原始数据并自行进行过滤,但显然这是我们试图避免的,因为它会造成大量的资源浪费。
数据模型影响¶
无
REST API 影响¶
此更改需要 Microversion 升级。
在 list API 接口中添加
name~和description~参数。这意味着我们可以使用这个新参数进行非精确过滤List shares with share name GET /v2/<tenant_id>/shares?name~=test Accept: application/json JSON Response { "shares": [ { "status": "available", "export_location": %ip%:/opt/stack/data/manila/mnt/share-%share_id%, "name": "test_1", ... }, { "status": "available", "export_location": null, "name": "2_test", ... } ] } List snapshot with share snapshot name GET /v2/<tenant_id>/snapshots?name~=snap_test Accept: application/json JSON Response { "shares": [ { "status": "available", "name": "snap_test_1", ... }, { "status": "available", "name": "snap_test_xxxxx", ... } ] }
客户端影响¶
Manila 客户端将在 ‘list’ 中添加新的命令行参数 ‘–name~’ 和 ‘–description~’,以通过非精确匹配过滤 manila 资源
manila list [--name~ <name~>] [--description~ <description~>]
我们假设我们有两个名称为’test_1’、’2_test’的共享,通常如果我们输入此命令,将无法获得任何一个。
manila list --name test
但是,合并此功能后,如果我们输入此命令,我们将获得两者,并且命令相同
manila list --name~ test
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
开发人员应更新过滤函数,以支持精确/非精确过滤(在 DB API 中使用 ‘LIKE’ 运算符过滤资源),每当 list/show API 更改时。
实现¶
负责人¶
- 主要负责人
tommylikehu(tommylikehu@gmail.com) jun.zhongjun(jun.zhongjun2@gmail.com)
工作项¶
功能测试
实现核心功能
添加相关的单元测试
更新 python-manilaclient
依赖项¶
无
测试¶
添加单元测试和功能测试,以涵盖过滤过程的更改。
文档影响¶
更新 API 文档。
参考资料¶
它实际上提出了与 cinder [5] 相同的规范。
[1]: https://review.openstack.org/#/c/45026/ [2]: https://review.openstack.org/#/c/266688/ [3]: https://en.wikipedia.org/wiki/ReDoS [4]: https://review.openstack.org/#/c/442982/ [5]: https://review.openstack.org/#/c/441516/