在 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'