diff options
| author | Mark McLoughlin <markmc@redhat.com> | 2012-08-16 12:02:34 +0100 |
|---|---|---|
| committer | Mark McLoughlin <markmc@redhat.com> | 2012-08-17 11:48:22 +0100 |
| commit | 53c40cfc18fe5c57ca724e5d7902e18fe09cc09f (patch) | |
| tree | f1d35890932e2451381a90bafa7d00ea9d655932 | |
| parent | 612b778be088cff2d47054dbb555de028d0a4346 (diff) | |
| download | nova-53c40cfc18fe5c57ca724e5d7902e18fe09cc09f.tar.gz nova-53c40cfc18fe5c57ca724e5d7902e18fe09cc09f.tar.xz nova-53c40cfc18fe5c57ca724e5d7902e18fe09cc09f.zip | |
Fix regression in compute_capabilities filter
Fixes bug #1037503
Restore the previous behaviour of matching simple strings in extra
specs against compute node capabilities.
Change-Id: I485e9e63f860a83f7c9c0c41d09919eabe9e66ae
| -rw-r--r-- | nova/scheduler/filters/compute_capabilities_filter.py | 38 | ||||
| -rw-r--r-- | nova/tests/scheduler/test_host_filters.py | 44 |
2 files changed, 57 insertions, 25 deletions
diff --git a/nova/scheduler/filters/compute_capabilities_filter.py b/nova/scheduler/filters/compute_capabilities_filter.py index 3d67ccf54..2826af170 100644 --- a/nova/scheduler/filters/compute_capabilities_filter.py +++ b/nova/scheduler/filters/compute_capabilities_filter.py @@ -49,26 +49,34 @@ class ComputeCapabilitiesFilter(filters.BaseHostFilter): 's>=': operator.ge} for key, req in instance_type['extra_specs'].iteritems(): + cap = capabilities.get(key, None) words = req.split() + + op = method = None if words: op = words[0] method = op_methods.get(op) - if (op == '<or>' or method): - cap = capabilities.get(key, None) - if cap is None: - return False - if op == '<or>': # Ex: <or> v1 <or> v2 <or> v3 - for idx in range(1, len(words), 2): - if words[idx] == cap: - break - else: - return False - else: # method - if len(words) == 1: - return False - if not method(cap, words[1]): - return False + if op != '<or>' and not method: + if cap != req: + return False + continue + + if cap is None: + return False + + if op == '<or>': # Ex: <or> v1 <or> v2 <or> v3 + for idx in range(1, len(words), 2): + if words[idx] == cap: + break + else: + return False + else: # method + if len(words) == 1: + return False + if not method(cap, words[1]): + return False + return True def host_passes(self, host_state, filter_properties): diff --git a/nova/tests/scheduler/test_host_filters.py b/nova/tests/scheduler/test_host_filters.py index 890c31bac..d6f083576 100644 --- a/nova/tests/scheduler/test_host_filters.py +++ b/nova/tests/scheduler/test_host_filters.py @@ -508,29 +508,53 @@ class HostFiltersTestCase(test.TestCase): assertion = self.assertTrue if passes else self.assertFalse assertion(filt_cls.host_passes(host, filter_properties)) - def test_compute_filter_passes_extra_specs_noop(self): + def test_compute_filter_passes_extra_specs_simple1(self): self._do_test_compute_filter_extra_specs( ecaps={'opt1': '1', 'opt2': '2'}, - especs={'opt1': '1111', 'opt2': '222'}, + especs={'opt1': '1'}, passes=True) - def test_compute_filter_passes_extra_specs_noop2(self): + def test_compute_filter_passes_extra_specs_simple2(self): self._do_test_compute_filter_extra_specs( - ecaps={'opt3': '1', 'opt4': '2'}, - especs={'opt1': '1111', 'opt2': '222'}, + ecaps={'opt1': '1', 'opt2': '2'}, + especs={'opt1': '1', 'opt2': '2'}, passes=True) - def test_compute_filter_passes_extra_specs_noop3(self): + def test_compute_filter_fails_extra_specs_simple1(self): self._do_test_compute_filter_extra_specs( ecaps={'opt1': '1', 'opt2': '2'}, - especs={'opt1': '', 'opt2': ''}, - passes=True) + especs={'opt1': '1111'}, + passes=False) + + def test_compute_filter_fails_extra_specs_simple2(self): + self._do_test_compute_filter_extra_specs( + ecaps={'opt1': '1', 'opt2': '2'}, + especs={'opt1': ''}, + passes=False) + + def test_compute_filter_fails_extra_specs_simple3(self): + self._do_test_compute_filter_extra_specs( + ecaps={'opt1': '1', 'opt2': '2'}, + especs={'opt3': '3'}, + passes=False) + + def test_compute_filter_fails_extra_specs_simple4(self): + self._do_test_compute_filter_extra_specs( + ecaps={'opt1': '1', 'opt2': '2'}, + especs={'opt1': '1', 'opt2': '222'}, + passes=False) + + def test_compute_filter_fails_extra_specs_simple5(self): + self._do_test_compute_filter_extra_specs( + ecaps={'opt1': '1', 'opt2': '2'}, + especs={'opt1': '1111', 'opt2': '222'}, + passes=False) - def test_compute_filter_passes_extra_specs_noop4(self): + def test_compute_filter_fails_extra_specs_with_bogus_ops(self): self._do_test_compute_filter_extra_specs( ecaps={'opt1': '2', 'opt2': '5'}, especs={'opt1': '> 4', 'opt2': '< 3'}, - passes=True) + passes=False) def test_compute_filter_passes_extra_specs_with_op_eq(self): self._do_test_compute_filter_extra_specs( |
