diff --git a/heat/engine/function.py b/heat/engine/function.py index 2ceaf95e2a..dfac156b3c 100644 --- a/heat/engine/function.py +++ b/heat/engine/function.py @@ -14,6 +14,7 @@ import abc import collections import itertools +import weakref import six @@ -33,10 +34,20 @@ class Function(object): { : } """ super(Function, self).__init__() - self.stack = stack + self._stackref = weakref.ref(stack) if stack is not None else None self.fn_name = fn_name self.args = args + @property + def stack(self): + ref = self._stackref + if ref is None: + return None + + stack = ref() + assert stack is not None, "Need a reference to the Stack object" + return stack + def validate(self): """ Validate arguments without resolving the function. diff --git a/heat/engine/resource.py b/heat/engine/resource.py index 10489b1fec..b8a74d77c5 100644 --- a/heat/engine/resource.py +++ b/heat/engine/resource.py @@ -15,6 +15,7 @@ import base64 import contextlib import datetime as dt import warnings +import weakref from oslo_config import cfg from oslo_log import log as logging @@ -218,6 +219,16 @@ class Resource(object): self.replaced_by = resource.replaced_by self.current_template_id = resource.current_template_id + @property + def stack(self): + stack = self._stackref() + assert stack is not None, "Need a reference to the Stack object" + return stack + + @stack.setter + def stack(self, stack): + self._stackref = weakref.ref(stack) + def reparse(self): self.properties = self.t.properties(self.properties_schema, self.context)