From 684bd9e38fdd648e64a462ff1c89febff45578e0 Mon Sep 17 00:00:00 2001 From: rabi Date: Fri, 23 Jun 2017 17:43:19 +0530 Subject: [PATCH] Filter out resources not in template when listing It's possibile for resource listing of a legacy stack with an update in progress to have resources in db but not in template. Probably it would not hurt to filter those out. Change-Id: I84e56ba88270079acbfcdc6227c4263b39956fe6 Closes-Bug: #1653990 (cherry picked from commit 3967a93f5de2e147a6d9c3f4fef9fd1a8f5d3498) --- heat/engine/stack.py | 13 ++++++++----- heat/tests/test_stack.py | 7 ++++++- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/heat/engine/stack.py b/heat/engine/stack.py index 7e93a75849..e224762199 100644 --- a/heat/engine/stack.py +++ b/heat/engine/stack.py @@ -321,7 +321,9 @@ class Stack(collections.Mapping): else: resources = self._db_resources_get() for rsc in six.itervalues(resources): - yield self._resource_from_db_resource(rsc, rsrc_def_cache) + defn = self._rsrc_def_for_db_resource(rsc, rsrc_def_cache) + if defn: + yield resource.Resource(rsc.name, defn, self) def iter_resources(self, nested_depth=0, filters=None): """Iterates over all the resources in a stack. @@ -364,7 +366,7 @@ class Stack(collections.Mapping): self._db_resources = _db_resources return self._db_resources - def _resource_from_db_resource(self, db_res, rsrc_def_cache=None): + def _rsrc_def_for_db_resource(self, db_res, rsrc_def_cache=None): tid = db_res.current_template_id if tid is None: tid = self.t.id @@ -380,8 +382,7 @@ class Stack(collections.Mapping): rsrc_def = t.resource_definitions(self) if rsrc_def_cache: rsrc_def_cache[tid] = rsrc_def - - return resource.Resource(db_res.name, rsrc_def[db_res.name], self) + return rsrc_def.get(db_res.name) def resource_get(self, name): """Return a stack resource, even if not in the current template.""" @@ -392,7 +393,9 @@ class Stack(collections.Mapping): # fall back to getting the resource from the database db_res = self.db_resource_get(name) if db_res: - return self._resource_from_db_resource(db_res) + defn = self._rsrc_def_for_db_resource(db_res) + if defn: + return resource.Resource(db_res.name, defn, self) return None diff --git a/heat/tests/test_stack.py b/heat/tests/test_stack.py index b0f2cac8b0..640b629921 100644 --- a/heat/tests/test_stack.py +++ b/heat/tests/test_stack.py @@ -272,15 +272,20 @@ class StackTest(common.HeatTestCase): db_resources = { 'A': mock.MagicMock(), - 'B': mock.MagicMock(current_template_id=t2.id) + 'B': mock.MagicMock(current_template_id=t2.id), + 'C': mock.MagicMock(current_template_id=t2.id) } db_resources['A'].name = 'A' db_resources['B'].name = 'B' + db_resources['C'].name = 'C' gabs.return_value = db_resources self.assertEqual('A', self.stack.resource_get('A').name) self.assertEqual('B', self.stack.resource_get('B').name) + + # Ignore the resource if only in db self.assertIsNone(self.stack.resource_get('C')) + self.assertIsNone(self.stack.resource_get('D')) @mock.patch.object(resource_objects.Resource, 'get_all_by_stack') def test_iter_resources(self, mock_db_call):