From e5e0fddad9ac208087f4e5b5c644575ad6d5c796 Mon Sep 17 00:00:00 2001 From: jiataotj Date: Mon, 3 Jun 2013 16:36:05 +0800 Subject: Fix flavor extra_specs filter doesn't work for number In extra_specs_ops.match(value, req) function, req are always string,but value of host capabilities may be number. When filter host by comparing number with string,even right os-extra_specs can't pass filter. We should convert value to string to make the filter work correctly. Fixes: bug #1186881 Change-Id: I3e1ab60109673450caae3a7f0bc4a3610ae619ef --- nova/scheduler/filters/compute_capabilities_filter.py | 2 +- nova/tests/scheduler/test_host_filters.py | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/nova/scheduler/filters/compute_capabilities_filter.py b/nova/scheduler/filters/compute_capabilities_filter.py index 7fb5725b6..36629435c 100644 --- a/nova/scheduler/filters/compute_capabilities_filter.py +++ b/nova/scheduler/filters/compute_capabilities_filter.py @@ -46,7 +46,7 @@ class ComputeCapabilitiesFilter(filters.BaseHostFilter): return False if cap is None: return False - if not extra_specs_ops.match(cap, req): + if not extra_specs_ops.match(str(cap), req): return False return True diff --git a/nova/tests/scheduler/test_host_filters.py b/nova/tests/scheduler/test_host_filters.py index b09e23f1d..9306615ed 100644 --- a/nova/tests/scheduler/test_host_filters.py +++ b/nova/tests/scheduler/test_host_filters.py @@ -708,6 +708,9 @@ class HostFiltersTestCase(test.NoDBTestCase): self.assertFalse(filt_cls.host_passes(host, filter_properties)) def _do_test_compute_filter_extra_specs(self, ecaps, especs, passes): + """In real Openstack runtime environment,compute capabilities + value may be number, so we should use number to do unit test. + """ self._stub_service_is_up(True) filt_cls = self.class_map['ComputeCapabilitiesFilter']() capabilities = {'enabled': True} @@ -723,33 +726,33 @@ class HostFiltersTestCase(test.NoDBTestCase): def test_compute_filter_passes_extra_specs_simple(self): self._do_test_compute_filter_extra_specs( - ecaps={'opt1': '1', 'opt2': '2'}, + ecaps={'opt1': 1, 'opt2': 2}, especs={'opt1': '1', 'opt2': '2', 'trust:trusted_host': 'true'}, passes=True) def test_compute_filter_fails_extra_specs_simple(self): self._do_test_compute_filter_extra_specs( - ecaps={'opt1': '1', 'opt2': '2'}, + ecaps={'opt1': 1, 'opt2': 2}, especs={'opt1': '1', 'opt2': '222', 'trust:trusted_host': 'true'}, passes=False) def test_compute_filter_pass_extra_specs_simple_with_scope(self): self._do_test_compute_filter_extra_specs( - ecaps={'opt1': '1', 'opt2': '2'}, + ecaps={'opt1': 1, 'opt2': 2}, especs={'capabilities:opt1': '1', 'trust:trusted_host': 'true'}, passes=True) def test_compute_filter_extra_specs_simple_with_wrong_scope(self): self._do_test_compute_filter_extra_specs( - ecaps={'opt1': '1', 'opt2': '2'}, + ecaps={'opt1': 1, 'opt2': 2}, especs={'wrong_scope:opt1': '1', 'trust:trusted_host': 'true'}, passes=True) def test_compute_filter_extra_specs_pass_multi_level_with_scope(self): self._do_test_compute_filter_extra_specs( - ecaps={'opt1': {'a': '1', 'b': {'aa': '2'}}, 'opt2': '2'}, + ecaps={'opt1': {'a': 1, 'b': {'aa': 2}}, 'opt2': 2}, especs={'opt1:a': '1', 'capabilities:opt1:b:aa': '2', 'trust:trusted_host': 'true'}, passes=True) -- cgit