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:
parent
f939762fad
commit
2a5ec237e3
|
@ -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)
|
||||
|
||||
|
|
|
@ -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"))
|
||||
|
|
|
@ -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())
|
||||
|
|
Loading…
Reference in New Issue