diff options
-rw-r--r-- | openstack/common/scheduler/filters/extra_specs_ops.py | 6 | ||||
-rw-r--r-- | tests/unit/scheduler/test_host_filters.py | 30 |
2 files changed, 35 insertions, 1 deletions
diff --git a/openstack/common/scheduler/filters/extra_specs_ops.py b/openstack/common/scheduler/filters/extra_specs_ops.py index f4d4ff4..9537e28 100644 --- a/openstack/common/scheduler/filters/extra_specs_ops.py +++ b/openstack/common/scheduler/filters/extra_specs_ops.py @@ -15,13 +15,17 @@ import operator +from openstack.common import strutils + # 1. The following operations are supported: -# =, s==, s!=, s>=, s>, s<=, s<, <in>, <or>, ==, !=, >=, <= +# =, s==, s!=, s>=, s>, s<=, s<, <in>, <is>, <or>, ==, !=, >=, <= # 2. Note that <or> is handled in a different way below. # 3. If the first word in the extra_specs is not one of the operators, # it is ignored. _op_methods = {'=': lambda x, y: float(x) >= float(y), '<in>': lambda x, y: y in x, + '<is>': lambda x, y: (strutils.bool_from_string(x) is + strutils.bool_from_string(y)), '==': lambda x, y: float(x) == float(y), '!=': lambda x, y: float(x) != float(y), '>=': lambda x, y: float(x) >= float(y), diff --git a/tests/unit/scheduler/test_host_filters.py b/tests/unit/scheduler/test_host_filters.py index 7d3a0e4..566a9fb 100644 --- a/tests/unit/scheduler/test_host_filters.py +++ b/tests/unit/scheduler/test_host_filters.py @@ -169,6 +169,36 @@ class ExtraSpecsOpsTestCase(utils.BaseTestCase): req='<in> 11 <in>', matches=False) + def test_extra_specs_matches_with_op_is(self): + self._do_extra_specs_ops_test( + value=True, + req='<is> True', + matches=True) + + def test_extra_specs_matches_with_op_is2(self): + self._do_extra_specs_ops_test( + value=False, + req='<is> False', + matches=True) + + def test_extra_specs_matches_with_op_is3(self): + self._do_extra_specs_ops_test( + value=False, + req='<is> Nonsense', + matches=True) + + def test_extra_specs_fails_with_op_is(self): + self._do_extra_specs_ops_test( + value=True, + req='<is> False', + matches=False) + + def test_extra_specs_fails_with_op_is2(self): + self._do_extra_specs_ops_test( + value=False, + req='<is> True', + matches=False) + def test_extra_specs_matches_with_op_or(self): self._do_extra_specs_ops_test( value='12', |