将 ALL-IN 操作符添加到额外的规格操作¶
https://blueprints.launchpad.net/nova/+spec/add-all-in-list-operator-to-extra-spec-ops
允许额外的规格匹配列表中的所有值,通过添加 ALL-IN 操作符。
问题描述¶
此蓝图旨在允许查询给定值是否全部存在于列表中。
目前支持 IN 操作符,如果给定元素存在于列表中则返回 True。 还有 OR 操作符,但它仅适用于单个值。
用例¶
假设操作员或用户想要一个 flavor,它会将虚拟机放置在具有 cpu 标志 ‘aes’ 和 ‘vmx’ 的主机上。 如今,这是不可能的,因为唯一的可能性是使用 <in> 操作符。 但是,由于额外的规格是一个字典,flavor extra-spec 键将是相同的
capabilities:cpu_info:features : <in> aes capabilities:cpu_info:features : <in> vmx
只会保存其中一个。
需要类似这样的东西
capabilities:cpu_info:features : <all-in> aes vmx
项目优先级¶
此蓝图不符合 Kilo 的调度器优先级。 它已被接受用于 Juno。
提议的变更¶
我们需要在 extra_specs_ops.py 中的 _op_methods 字典中添加新的 <all-in> 操作符及其 lambda 函数。
… ‘<all-in>’: lambda x, y: all(val in x for val in y), …
然后,如果查询中存在多个元素,则使用列表调用此函数,而不是使用字符串。
备选方案¶
与其添加 ‘<all-in>’ 操作符,不如扩展/重载 ‘<in>’ 操作符以处理列表。
capabilities:cpu_info:features : <in> aes vmx
这似乎很容易理解,但可能会产生混淆,因为 <in> 操作符目前旨在用于匹配子字符串。
另一种可能性是添加 <any> 和 <all> 操作符。 通过这样做,我们使用 <in> 和 <or> 处理单个值,并使用新的操作符集处理集合值。 但是,这种方法缺少一些东西,<all> 或 <any> 什么? 列表中的所有元素,所有元素都为 True,还是所有元素都等于给定值。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
无
实现¶
将新的 lambda 函数添加到 nova/scheduler/filter/extra_specs_ops.py _ops_method 字典
‘<all-in>’: lambda x, y: all(val in x for val in y)
负责人¶
- 主要负责人
artur-malinowski
- 其他贡献者
pawel-koniszewski facundo-n-maldonado
工作项¶
该更改很简单,可以用一个 Gerrit patch 完成。 实现实际上已经完成。
依赖项¶
无
测试¶
应该为新的操作符添加单元测试。
文档影响¶
应该使用新的操作符更新过滤器调度器文档。