]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Save the parsed_template so user parameters are available.
authorAngus Salkeld <asalkeld@redhat.com>
Wed, 18 Apr 2012 04:43:18 +0000 (14:43 +1000)
committerAngus Salkeld <asalkeld@redhat.com>
Wed, 18 Apr 2012 04:43:18 +0000 (14:43 +1000)
This caused parsing errors when deleting, as required
references were not available.

Signed-off-by: Angus Salkeld <asalkeld@redhat.com>
heat/engine/manager.py
heat/engine/parser.py
heat/engine/resources.py

index 135554fe4f6778a99739a53dc25180f7c0c3b09d..e4472df9413c7b1cb23b597b01317816dea0dd86 100644 (file)
@@ -58,7 +58,7 @@ class EngineManager(manager.Manager):
         if stacks == None:
             return res
         for s in stacks:
-            ps = parser.Stack(s.name, s.raw_template.template, params)
+            ps = parser.Stack(s.name, s.raw_template.parsed_template.template, s.id, params)
             mem = {}
             mem['stack_id'] = s.id
             mem['stack_name'] = s.name
@@ -80,7 +80,7 @@ class EngineManager(manager.Manager):
         res = {'stacks': []}
         s = db_api.stack_get(None, stack_name)
         if s:
-            ps = parser.Stack(s.name, s.raw_template.template, params)
+            ps = parser.Stack(s.name, s.raw_template.parsed_template.template, s.id, params)
             mem = {}
             mem['stack_id'] = s.id
             mem['stack_name'] = s.name
@@ -113,17 +113,28 @@ class EngineManager(manager.Manager):
         if db_api.stack_get(None, stack_name):
             return {'Error': 'Stack already exists with that name.'}
 
-        stack = parser.Stack(stack_name, template, params)
+        stack = parser.Stack(stack_name, template, 0, params)
         rt = {}
         rt['template'] = template
         rt['stack_name'] = stack_name
         new_rt = db_api.raw_template_create(None, rt)
+
         s = {}
         s['name'] = stack_name
         s['raw_template_id'] = new_rt.id
         new_s = db_api.stack_create(None, s)
         stack.id = new_s.id
+
+        pt = {}
+        pt['template'] = stack.t
+        pt['raw_template_id'] = new_rt.id
+        new_pt = db_api.parsed_template_create(None, pt)
+
+        new_s.parsed_template_id = new_pt.id
+
+        stack.parsed_template_id = new_pt.id
         stack.create()
+
         return {'stack': {'id': new_s.id, 'name': new_s.name,\
                 'created_at': str(new_s.created_at)}}
 
@@ -141,7 +152,7 @@ class EngineManager(manager.Manager):
             msg = _("No Template provided.")
             return webob.exc.HTTPBadRequest(explanation=msg)
 
-        s = parser.Stack('validate', body, req.params)
+        s = parser.Stack('validate', body, 0, req.params)
         res = s.validate()
 
         return res
@@ -159,8 +170,7 @@ class EngineManager(manager.Manager):
 
         logger.info('deleting stack %s' % stack_name)
 
-        rt = db_api.raw_template_get(None, st.raw_template_id)
-        ps = parser.Stack(st.name, rt.template, params)
+        ps = parser.Stack(st.name, st.raw_template.parsed_template.template, st.id, params)
         ps.delete()
         return None
 
index 6da62079a97b07b43bf396dc6bc0ef722c827325..f3e3a5f3a7410865b38f428cacde314966f09742 100644 (file)
@@ -25,8 +25,8 @@ logger = logging.getLogger('heat.engine.parser')
 
 
 class Stack(object):
-    def __init__(self, stack_name, template, parms=None):
-        self.id = 0
+    def __init__(self, stack_name, template, stack_id=0, parms=None):
+        self.id = stack_id
         self.t = template
         self.parms = self.t.get('Parameters', {})
         self.maps = self.t.get('Mappings', {})
@@ -50,10 +50,6 @@ class Stack(object):
         else:
             self.creds = parms['KeyStoneCreds']
 
-        stack = db_api.stack_get(None, stack_name)
-        if stack:
-            self.id = stack.id
-
         self.resources = {}
         for r in self.t['Resources']:
             type = self.t['Resources'][r]['Type']
@@ -130,6 +126,25 @@ class Stack(object):
 
         return order
 
+    def update_parsed_template(self):
+        '''
+        Update the parsed template after each resource has been
+        created, so commands like describe will work.
+        '''
+        if self.parsed_template_id == 0:
+            stack = db_api.stack_get(None, self.name)
+            if stack:
+                self.parsed_template_id = stack.parsed_template_id
+            else:
+                return
+
+        pt = db_api.parsed_template_get(None, self.parsed_template_id)
+        if pt:
+            pt.template = self.t
+        else:
+            print 'cant find parsed template to update %d' % self.parsed_template_id
+
+
     def create_blocking(self):
         '''
         create all the resources in the order specified by get_create_order
@@ -145,6 +160,12 @@ class Stack(object):
                     logger.exception('create')
                     failed = True
                     self.resources[r].state_set(failed_str, str(ex))
+
+                try:
+                    self.update_parsed_template()
+                except Exception as ex:
+                    logger.exception('update_parsed_template')
+
             else:
                 self.resources[r].state_set(self.resources[r].CREATE_FAILED)
 
index 42a521a160d681e2c01e7e4f7712e6d59024835f..9f4505fb943cd66caf66bbae288ae506b27b4f2a 100644 (file)
@@ -122,6 +122,7 @@ class Resource(object):
                 rs = {}
                 rs['state'] = new_state
                 rs['stack_id'] = self.stack.id
+                rs['parsed_template_id'] = self.stack.parsed_template_id
                 rs['nova_instance'] = self.instance_id
                 rs['name'] = self.name
                 rs['stack_name'] = self.stack.name