Spec - 添加结果过滤支持¶
蓝图
Sahara 服务:https://blueprints.launchpad.net/sahara/+spec/enable-result-filtering
客户端库:https://blueprints.launchpad.net/python-saharaclient/+spec/enable-result-filtering
Horizon UI:https://blueprints.launchpad.net/horizon/+spec/data-processing-table-filtering
由于在处理非平凡的 OpenStack 环境时,结果集可能非常大,因此能够通过某些字段约束来过滤这些结果集是可取的。本规范概述了 Sahara 如何支持此类查询。API、客户端库和 Horizon UI 都需要进行更改。
问题描述¶
最初的需求来自于我们希望提供一种过滤 UI 中某些表格的方法。为了使这种过滤成为可能,要么 UI 必须执行过滤(效率低下,因为 API 仍然会返回大型结果集),要么 API/客户端库需要提供对此类过滤的支持。在审查了其他 API/客户端库后,看起来大多数(如果不是全部)都提供了过滤功能。Sahara 也应该实现过滤功能。
提议的变更¶
为了实现过滤功能,客户端库中的每个“list()”方法都应扩展为接受一个可选(默认值为 None)参数“search_opts”。“search_opts”应该是一个字典,其中包含一个或多个 {field:query} 条目。分页也可以通过允许设置 page/page_size/max results 来通过 search_opts 处理。
此外,REST API 需要扩展 list() 操作以支持查询语法。这将需要更改 Sahara 当前执行数据库查询的方式,以包含查询选项。目前,它们设置为仅为每次调用返回所有条目。
替代方案¶
过滤可以在 UI 中完全完成,但这是一种浪费的方式,因为每次库/API 调用仍然会返回完整的结果集。此外,REST API 或客户端库的用户将无法从该功能中受益。
也可以只在客户端库级别实现过滤,但出于与在 UI 中执行过滤相同的理由,这种方法也是次优的。
数据模型影响¶
不需要对模型本身进行更改。只需要更改我们查询数据库的方式。
REST API 影响¶
list 操作的 REST API 方法需要更改以支持查询风格的参数。基础数据库访问方法需要从基本“获取全部”功能更改为支持 **kwargs 参数(这已经在 cluster_get_all() 中完成,但需要对其他方法进行完成)。
对于作业执行表进行过滤时,需要考虑一对特殊情况。“job”和“cluster”列实际上包含 job 执行对象本身不包含的信息。对于这些字段的过滤器,应传递一个字段值“job.name”或“cluster.name”。这将触发数据库查询,以连接到作业或集群表上名称属性的过滤器。
此外,搜索作业执行状态字段需要特殊处理。这是因为状态不是作业执行本身的正确字段,而是“info”字段的一部分。为了处理这种情况,将对 info.status 字段进行手动过滤。
其他最终用户影响¶
REST API、客户端库和 Horizon UI 的用户将能够通过简单的查询来过滤他们的结果集。
部署者影响¶
这些更改不应影响 Sahara 服务的部署。
开发者影响¶
对开发人员没有影响。
Sahara-image-elements impact¶
对 sahara-image-elements 没有影响。
Sahara-dashboard / Horizon 影响¶
一旦 REST API 和客户端库的更改到位,Horizon UI 将被修改以允许对以下表格进行过滤:集群、集群模板、节点组模板、作业执行、作业。将来,我们也可以在不进行其他 API/客户端库更改的情况下过滤任何表格。
实现¶
负责人¶
- 主要负责人
croberts (Horizon UI)
- 其他贡献者
tmckay (REST API/sahara.db.api) croberts (客户端库)
工作项¶
这些可以并行进行,但必须按照以下给定的顺序发布。
REST API 实现
客户端库实现
Horizon UI 实现
依赖项¶
无
测试¶
应针对 REST 接口、客户端库和 Horizon UI 添加测试,以测试正在添加的过滤功能。
文档影响¶
需要更新 REST API 的文档以反映查询功能。
需要更新客户端库的文档以反映查询功能。
应更新仪表板用户指南,以说明将添加的表格过滤功能。
参考资料¶
Sahara 服务:https://blueprints.launchpad.net/sahara/+spec/enable-result-filtering
客户端库:https://blueprints.launchpad.net/python-saharaclient/+spec/enable-result-filtering
Horizon UI:https://blueprints.launchpad.net/horizon/+spec/data-processing-table-filtering