From 3c33de8b9fe02532e0db4f224998f329e2c4fb48 Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Tue, 5 Jun 2012 12:07:37 +0200 Subject: [PATCH] Fix parsing of metadata I broke metadata in bece6593f00f8e096f045982673f85c67863b932 by no longer updating the parsed template in the database. We need to resolve references runtime data before storing the parsed template, because the metadata code uses this directly. Change-Id: I753fe199779ae1b0046366abadca0111a81463c6 Signed-off-by: Zane Bitter --- heat/engine/cloud_watch.py | 2 +- heat/engine/instance.py | 3 ++- heat/engine/parser.py | 5 ++++- heat/engine/resources.py | 7 ++++--- heat/engine/wait_condition.py | 7 ++++--- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/heat/engine/cloud_watch.py b/heat/engine/cloud_watch.py index 5262f1a0..df7051dc 100644 --- a/heat/engine/cloud_watch.py +++ b/heat/engine/cloud_watch.py @@ -70,7 +70,7 @@ class CloudWatchAlarm(Resource): wr_values = { 'name': self.name, - 'rule': self.t['Properties'], + 'rule': self.parsed_template()['Properties'], 'state': 'NORMAL', 'stack_name': self.stack.name } diff --git a/heat/engine/instance.py b/heat/engine/instance.py index e5da25a7..1342e9d6 100644 --- a/heat/engine/instance.py +++ b/heat/engine/instance.py @@ -190,7 +190,8 @@ class Instance(Resource): mime_blob.attach(msg) if 'Metadata' in self.t: - msg = MIMEText(json.dumps(self.t['Metadata']), + metadata = self.parsed_template()['Metadata'] + msg = MIMEText(json.dumps(metadata), _subtype='x-cfninitdata') msg.add_header('Content-Disposition', 'attachment', filename='cfn-init-data') diff --git a/heat/engine/parser.py b/heat/engine/parser.py index 6d6ec4d5..a31e7cff 100644 --- a/heat/engine/parser.py +++ b/heat/engine/parser.py @@ -163,7 +163,10 @@ class Stack(object): pt = db_api.parsed_template_get(self.context, self.parsed_template_id) if pt: - pt.update_and_save({'template': self.t.copy()}) + template = self.t.copy() + template['Resources'] = dict((k, r.parsed_template()) + for (k, r) in self.resources.items()) + pt.update_and_save({'template': template}) else: logger.warn('Cant find parsed template to update %d' % self.parsed_template_id) diff --git a/heat/engine/resources.py b/heat/engine/resources.py index bc57cea3..cac26d45 100644 --- a/heat/engine/resources.py +++ b/heat/engine/resources.py @@ -76,6 +76,9 @@ class Resource(object): self.id = None self._nova = {} + def parsed_template(self): + return self.stack.resolve_runtime_data(self.t) + def nova(self, service_type='compute'): if service_type in self._nova: return self._nova[service_type] @@ -97,9 +100,7 @@ class Resource(object): return self._nova[service_type] def calculate_properties(self): - template = self.stack.resolve_runtime_data(self.t) - - for p, v in template['Properties'].items(): + for p, v in self.parsed_template()['Properties'].items(): self.properties[p] = v def create(self): diff --git a/heat/engine/wait_condition.py b/heat/engine/wait_condition.py index 49b2824e..6a0bdd33 100644 --- a/heat/engine/wait_condition.py +++ b/heat/engine/wait_condition.py @@ -78,9 +78,10 @@ class WaitCondition(Resource): def _get_handle_resource_id(self): if self.resource_id is None: - self.handle_url = self.properties['Handle'] - self.resource_id = self.handle_url.split('/')[-1] - return self.resource_id + self.calculate_properties() + handle_url = self.properties['Handle'] + self.resource_id = handle_url.split('/')[-1] + return self.resource_id def create(self): if self.state is not None: -- 2.45.2