将 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 完成。 实现实际上已经完成。

依赖项

测试

应该为新的操作符添加单元测试。

文档影响

应该使用新的操作符更新过滤器调度器文档。

参考资料