summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorMark McLoughlin <markmc@redhat.com>2012-08-16 12:02:34 +0100
committerMark McLoughlin <markmc@redhat.com>2012-08-17 11:48:22 +0100
commit53c40cfc18fe5c57ca724e5d7902e18fe09cc09f (patch)
treef1d35890932e2451381a90bafa7d00ea9d655932 /nova
parent612b778be088cff2d47054dbb555de028d0a4346 (diff)
downloadnova-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
Diffstat (limited to 'nova')
-rw-r--r--nova/scheduler/filters/compute_capabilities_filter.py38
-rw-r--r--nova/tests/scheduler/test_host_filters.py44
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(