Merge "Allow lazy load of raw_template but log warning"

This commit is contained in:
Zuul 2018-07-04 15:36:08 +00:00 committed by Gerrit Code Review
commit 37336c0faf
2 changed files with 45 additions and 3 deletions

View File

@ -15,6 +15,7 @@
"""Stack object."""
from oslo_log import log as logging
from oslo_versionedobjects import base
from oslo_versionedobjects import fields
import six
@ -28,6 +29,8 @@ from heat.objects import fields as heat_fields
from heat.objects import raw_template
from heat.objects import stack_tag
LOG = logging.getLogger(__name__)
class Stack(
heat_base.HeatObject,
@ -53,7 +56,7 @@ class Stack(
'action': fields.StringField(nullable=True),
'status': fields.StringField(nullable=True),
'status_reason': fields.StringField(nullable=True),
'raw_template': fields.ObjectField('RawTemplate'),
'raw_template_obj': fields.ObjectField('RawTemplate'),
'convergence': fields.BooleanField(),
'current_traversal': fields.StringField(),
'current_deps': heat_fields.JsonField(),
@ -65,7 +68,7 @@ class Stack(
@staticmethod
def _from_db_object(context, stack, db_stack):
for field in stack.fields:
if field == 'raw_template':
if field == 'raw_template_obj':
raw_template_obj = db_stack.__dict__.get('raw_template')
if raw_template_obj is not None:
# Object is already lazy loaded
@ -74,13 +77,30 @@ class Stack(
context,
raw_template.RawTemplate(),
raw_template_obj))
stack['raw_template'] = raw_template_obj
stack._raw_template = raw_template_obj
else:
stack[field] = db_stack.__dict__.get(field)
stack._context = context
stack.obj_reset_changes()
return stack
@property
def raw_template(self):
if hasattr(self, '_raw_template'):
return self._raw_template
LOG.warning('Loading a raw_template that should have been '
'eagerly loaded for stack id %s' % self.id)
self._raw_template = raw_template.RawTemplate.get_by_id(
self._context,
self['raw_template_id'])
return self._raw_template
@raw_template.setter
def raw_template(self, value):
self['raw_template_obj'] = value
self._raw_template = value
@classmethod
def get_root_id(cls, context, stack_id):
return db_api.stack_get_root_id(context, stack_id)

View File

@ -1697,6 +1697,28 @@ class StackTest(common.HeatTestCase):
self.assertEqual((stack.Stack.DELETE, stack.Stack.COMPLETE),
self.stack.state)
def test_stack_eager_or_lazy_load_templ(self):
self.stack = stack.Stack(self.ctx, 'test_stack_eager_or_lazy_tmpl',
self.tmpl)
self.stack.store()
ctx1 = utils.dummy_context()
s1_db_result = db_api.stack_get(ctx1, self.stack.id, eager_load=True)
s1_obj = stack_object.Stack._from_db_object(ctx1, stack_object.Stack(),
s1_db_result)
self.assertIsNotNone(s1_obj._raw_template)
self.assertIsNotNone(s1_obj.raw_template)
ctx2 = utils.dummy_context()
s2_db_result = db_api.stack_get(ctx2, self.stack.id, eager_load=False)
s2_obj = stack_object.Stack._from_db_object(ctx2, stack_object.Stack(),
s2_db_result)
# _raw_template has not been set since it not eagerly loaded
self.assertFalse(hasattr(s2_obj, "_raw_template"))
# accessing raw_template lazy loads it
self.assertIsNotNone(s2_obj.raw_template)
self.assertIsNotNone(s2_obj._raw_template)
def test_preview_resources_returns_list_of_resource_previews(self):
tmpl = {'HeatTemplateFormatVersion': '2012-12-12',
'Resources': {'AResource': {'Type': 'GenericResourceType'}}}