Fix state mutation in cells image filter

Stop set pop() operations in the cells ImagePropertiesFilter from
mutating capability state.  This causes a race that can break the
filter between requests.

Closes-Bug #1325705

Change-Id: I901e39046a38ab60c23ddc8762ef5d19a297935b
This commit is contained in:
Brian Elliott 2014-05-29 21:04:20 +00:00
parent 338c3551ab
commit 9b45d7e294
2 changed files with 16 additions and 5 deletions

View File

@ -54,7 +54,10 @@ class ImagePropertiesFilter(filters.BaseCellFilter):
filtered_cells = []
for cell in cells:
version = cell.capabilities.get('prominent_hypervisor_version')
version = version and str(version.pop())
if version:
l = list(version)
version = str(l[0])
if version is None or self._matches_version(version,
hypervisor_version_requires):
filtered_cells.append(cell)

View File

@ -75,7 +75,7 @@ class ImagePropertiesFilter(_FilterTestClass):
def test_missing_hypervisor_version_requires(self):
self.filter_props['request_spec'] = {'image': {'properties': {}}}
for cell in self.cells:
cell.capabilities = {"prominent_hypervisor_version": [u"6.2"]}
cell.capabilities = {"prominent_hypervisor_version": set([u"6.2"])}
self.assertEqual(self.cells,
self._filter_cells(self.cells, self.filter_props))
@ -89,13 +89,21 @@ class ImagePropertiesFilter(_FilterTestClass):
image = {'properties': {'hypervisor_version_requires': '>6.0, <=6.3'}}
self.filter_props['request_spec'] = {'image': image}
self.cell1.capabilities = {"prominent_hypervisor_version": [u"6.2"]}
self.cell2.capabilities = {"prominent_hypervisor_version": [u"6.3"]}
self.cell3.capabilities = {"prominent_hypervisor_version": [u"6.0"]}
self.cell1.capabilities = {"prominent_hypervisor_version":
set([u"6.2"])}
self.cell2.capabilities = {"prominent_hypervisor_version":
set([u"6.3"])}
self.cell3.capabilities = {"prominent_hypervisor_version":
set([u"6.0"])}
self.assertEqual([self.cell1, self.cell2],
self._filter_cells(self.cells, self.filter_props))
# assert again to verify filter doesn't mutate state
# LP bug #1325705
self.assertEqual([self.cell1, self.cell2],
self._filter_cells(self.cells, self.filter_props))
class TestTargetCellFilter(_FilterTestClass):
filter_cls_name = 'nova.cells.filters.target_cell.TargetCellFilter'