From 53c40cfc18fe5c57ca724e5d7902e18fe09cc09f Mon Sep 17 00:00:00 2001 From: Mark McLoughlin Date: Thu, 16 Aug 2012 12:02:34 +0100 Subject: 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 --- .../filters/compute_capabilities_filter.py | 38 +++++++++++-------- nova/tests/scheduler/test_host_filters.py | 44 +++++++++++++++++----- 2 files changed, 57 insertions(+), 25 deletions(-) (limited to 'nova') 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 method): - cap = capabilities.get(key, None) - if cap is None: - return False - if op == '': # Ex: v1 v2 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 != '' and not method: + if cap != req: + return False + continue + + if cap is None: + return False + + if op == '': # Ex: v1 v2 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( -- cgit