StackResource add force_reload to nested() accessor method

Adds a force_reload switch to override the local Stack object caching
so you can force retrieval of the latest data from the DB, which is
required in scenarios where polling for state which may be changed by
a different engine is required.

Co-Authored-By: Angus Salkeld <asalkeld@mirantis.com>
Change-Id: I9b34fcfdcde8d314add2f53b86ec1f0e4b6075e8
blueprint: decouple-nested
This commit is contained in:
Steven Hardy 2014-09-03 09:23:08 +10:00
parent f939762fad
commit 2a5ec237e3
3 changed files with 36 additions and 6 deletions

View File

@ -247,7 +247,7 @@ class Stack(collections.Mapping):
@classmethod
def load(cls, context, stack_id=None, stack=None, parent_resource=None,
show_deleted=True, use_stored_context=False):
show_deleted=True, use_stored_context=False, force_reload=False):
'''Retrieve a Stack from the database.'''
if stack is None:
stack = db_api.stack_get(context, stack_id,
@ -257,6 +257,9 @@ class Stack(collections.Mapping):
message = _('No stack exists with id "%s"') % str(stack_id)
raise exception.NotFound(message)
if force_reload:
stack.refresh()
return cls._from_db(context, stack, parent_resource=parent_resource,
use_stored_context=use_stored_context)

View File

@ -53,15 +53,21 @@ class StackResource(resource.Resource):
self.attributes_schema,
self._resolve_attribute)
def nested(self):
def nested(self, force_reload=False):
'''
Return a Stack object representing the nested (child) stack.
:param force_reload: Forces reloading from the DB instead of returning
the locally cached Stack object
'''
if force_reload:
self._nested = None
if self._nested is None and self.resource_id is not None:
self._nested = parser.Stack.load(self.context,
self.resource_id,
parent_resource=self,
show_deleted=False)
show_deleted=False,
force_reload=force_reload)
if self._nested is None:
raise exception.NotFound(_("Nested stack not found in DB"))

View File

@ -477,12 +477,31 @@ class StackResourceTest(common.HeatTestCase):
parser.Stack.load(self.parent_resource.context,
self.parent_resource.resource_id,
parent_resource=self.parent_resource,
show_deleted=False).AndReturn('s')
show_deleted=False,
force_reload=False).AndReturn('s')
self.m.ReplayAll()
self.parent_resource.nested()
self.m.VerifyAll()
def test_load_nested_force_reload(self):
create_creator = self.parent_resource.create_with_template(
self.templ, {"KeyName": "key"})
create_creator.run_to_completion()
expected_state = (parser.Stack.CREATE, parser.Stack.COMPLETE)
self.assertEqual(expected_state, self.parent_resource.nested().state)
stack = parser.Stack.load(
self.parent_resource.context,
self.parent_resource.resource_id,
parent_resource=self.parent_resource,
show_deleted=False)
stack.state_set(parser.Stack.CREATE, parser.Stack.FAILED, "foo")
self.assertEqual(expected_state, self.parent_resource.nested().state)
expected_state = (parser.Stack.CREATE, parser.Stack.FAILED)
self.assertEqual(expected_state,
self.parent_resource.nested(force_reload=True).state)
def test_load_nested_non_exist(self):
self.parent_resource.create_with_template(self.templ,
{"KeyName": "key"})
@ -493,7 +512,8 @@ class StackResourceTest(common.HeatTestCase):
parser.Stack.load(self.parent_resource.context,
self.parent_resource.resource_id,
parent_resource=self.parent_resource,
show_deleted=False)
show_deleted=False,
force_reload=False)
self.m.ReplayAll()
self.assertRaises(exception.NotFound, self.parent_resource.nested)
@ -520,7 +540,8 @@ class StackResourceTest(common.HeatTestCase):
self.parent_resource.context,
self.parent_resource.resource_id,
parent_resource=self.parent_resource,
show_deleted=False).AndRaise(exception.NotFound(''))
show_deleted=False, force_reload=False
).AndRaise(exception.NotFound(''))
self.m.ReplayAll()
self.assertIsNone(self.parent_resource.delete_nested())