diff --git a/heat/engine/resource.py b/heat/engine/resource.py index e077fd60c8..f10c13926d 100644 --- a/heat/engine/resource.py +++ b/heat/engine/resource.py @@ -871,10 +871,17 @@ class Resource(status.ResourceStatus): def get_attrs(attrs): for attr in attrs: path = (attr,) if isinstance(attr, six.string_types) else attr - try: - yield attr, self.get_attribute(*path) - except exception.InvalidTemplateAttribute as ita: - LOG.info('%s', ita) + if self.action == self.INIT: + if (type(self).get_attribute != Resource.get_attribute or + type(self).FnGetAtt != Resource.FnGetAtt or + path[0] in self.attributes): + # TODO(ricolin) make better placeholder values here + yield path, None + else: + try: + yield attr, self.get_attribute(*path) + except exception.InvalidTemplateAttribute as ita: + LOG.info('%s', ita) dep_attrs = set(self.stack.get_dep_attrs( six.itervalues(self.stack.resources), diff --git a/heat/engine/stack.py b/heat/engine/stack.py index f89cfc9f43..a07cea7e5a 100644 --- a/heat/engine/stack.py +++ b/heat/engine/stack.py @@ -839,10 +839,11 @@ class Stack(collections.Mapping): raise exception.StackValidationFailed( message=_("Duplicate names %s") % dup_names) - if validate_by_deps: - iter_rsc = self.dependencies - else: - iter_rsc = six.itervalues(resources) + iter_rsc = (self.dependencies if validate_by_deps + else six.itervalues(resources)) + + for name, res in six.iteritems(resources): + stk_defn.update_resource_data(self.defn, name, res.node_data()) unique_defns = set(res.t for res in six.itervalues(resources)) unique_defn_names = set(defn.name for defn in unique_defns) diff --git a/heat/tests/engine/test_check_resource.py b/heat/tests/engine/test_check_resource.py index 09d59bf600..ea92152073 100644 --- a/heat/tests/engine/test_check_resource.py +++ b/heat/tests/engine/test_check_resource.py @@ -604,6 +604,7 @@ class MiscMethodsTest(common.HeatTestCase): self.resource = self.stack['A'] def test_node_data_ok(self): + self.resource.action = self.resource.CREATE expected_input_data = {'attrs': {(u'flat_dict', u'key2'): 'val2', (u'flat_dict', u'key3'): 'val3', (u'nested_dict', u'dict', u'a'): 1, @@ -618,6 +619,7 @@ class MiscMethodsTest(common.HeatTestCase): self.assertEqual(expected_input_data, actual_input_data.as_dict()) def test_node_data_exception(self): + self.resource.action = self.resource.CREATE expected_input_data = {'attrs': {}, 'id': mock.ANY, 'reference_id': 'A',