在 Nova 中,aggregate_instance_extra_spec filter的一般的使用方法都是在host的metadata中写好需要用的键值对,并且也在flavor中写好相应的键值对。再使用aggregate_instance_extra_spec filter
进行匹配,当这两个值匹配时,就认为是合适的主机。但其实还有这样一种需求,我们可能会要求在创建虚拟机时让其不创建在某些主机上。其实aggregate_instance_extra_spec filter 已经提供了这种功能。在进行匹配的过程中,会调用extra_spec_ops的match方法:
for aggregate_val in aggregate_vals:
if extra_specs_ops.match(aggregate_val, req):
break
在extra_spec_ops中,预先定义好了一系列可使用的操作符:
op_methods = { '=': lambda x, y: float(x) >= float(y),以及 '<or>' 操作符
'<in>': lambda x, y: y in x,
'<all-in>': lambda x, y: all(val in x for val in y),
'==': lambda x, y: float(x) == float(y),
'!=': lambda x, y: float(x) != float(y),
'>=': lambda x, y: float(x) >= float(y),
'<=': lambda x, y: float(x) <= float(y),
's==': operator.eq,
's!=': operator.ne,
's<': operator.lt,
's<=': operator.le,
's>': operator.gt,
's>=': operator.ge}
这些操作符的使用方式是这样的:
除 '<or>' 之外, 在flavor 中定义extra spec时这样定义: 'key': '操作符' '字段',
如定义不选择在aggragate1上创建 'key1': 's!=' 'aggragate1'
'<or>' 操作符的使用方法是:
在flavor中定义 extra spec 时这样定义:
'key' : '<or>'
'value1' '<or>' 'value2' '<or>' 'value3' 只要其中有一个value匹配就能匹配。
1. 根据extra_spec_ops的代码逻辑,不指定任何操作符和指定 's=='('=='for非string)的作用是相同的。
使用的时候,先使用aggregate-set-metadata(CLI)或 os-aggregates API (REST) 对某个aggregate 的 metadata 进行编辑,比如增加这样一组键值对:
"reserved_for": "GPU" 用来表示这个aggregate是期望只保留给有GPU要求的虚拟机所使用的。