]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Try and keep track of the stack status.
authorAngus Salkeld <asalkeld@redhat.com>
Mon, 23 Apr 2012 12:59:27 +0000 (22:59 +1000)
committerAngus Salkeld <asalkeld@redhat.com>
Mon, 23 Apr 2012 12:59:27 +0000 (22:59 +1000)
Ref: #93

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

index fce55751293b519d111b33ac3bc6129a0b59926a..c0b5665a386377b6b5aa9abe2440ba2187a8b713 100644 (file)
@@ -24,6 +24,7 @@ from sqlalchemy import types as types
 from json import dumps, loads
 from heat.openstack.common import utils
 from heat.db.sqlalchemy.session import get_session
+from sqlalchemy.orm.session import Session
 
 BASE = declarative_base()
 
@@ -48,7 +49,9 @@ class HeatBase(object):
     def save(self, session=None):
         """Save this object."""
         if not session:
-            session = get_session()
+            session = Session.object_session(self)
+            if not session:
+                session = get_session()
         session.add(self)
         try:
             session.flush()
index 13f8f08a04d9565a619b7d335c44ba7ae6236548..2bd4f95c6daad6382ce97e3b4dc8a80b8c02e302 100644 (file)
@@ -66,7 +66,7 @@ class EngineManager(manager.Manager):
             mem['created_at'] = str(s.created_at)
             mem['template_description'] = ps.t.get('Description',
                                                    'No description')
-            mem['stack_status'] = ps.t.get('StackStatus', 'unknown')
+            mem['StackStatus'] = ps.t.get('stack_status', 'unknown')
             res['stacks'].append(mem)
 
         return res
@@ -95,7 +95,7 @@ class EngineManager(manager.Manager):
             mem['TimeoutInMinutes'] = 'TODO'
             mem['TemplateDescription'] = ps.t.get('Description',
                                                   'No description')
-            mem['StackStatus'] = ps.t.get('StackStatus', 'unknown')
+            mem['StackStatus'] = ps.t.get('stack_status', 'unknown')
             res['stacks'].append(mem)
 
         return res
@@ -132,8 +132,6 @@ class EngineManager(manager.Manager):
         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()
 
index 1aa59f5ae4ee7213711ec44e094c8e0835889f34..a4a698e77f0c71d673ca0b67b5911a9c40427d7a 100644 (file)
@@ -25,6 +25,13 @@ logger = logging.getLogger('heat.engine.parser')
 
 
 class Stack(object):
+    IN_PROGRESS = 'IN_PROGRESS'
+    CREATE_FAILED = 'CREATE_FAILED'
+    CREATE_COMPLETE = 'CREATE_COMPLETE'
+    DELETE_IN_PROGRESS = 'DELETE_IN_PROGRESS'
+    DELETE_FAILED = 'DELETE_FAILED'
+    DELETE_COMPLETE = 'DELETE_COMPLETE'
+
     def __init__(self, stack_name, template, stack_id=0, parms=None):
         self.id = stack_id
         self.t = template
@@ -34,6 +41,7 @@ class Stack(object):
         self.res = {}
         self.doc = None
         self.name = stack_name
+        self.parsed_template_id = 0
 
         self.parms['AWS::Region'] = {"Description": "AWS Regions",
             "Type": "String",
@@ -134,23 +142,32 @@ class Stack(object):
         if self.parsed_template_id == 0:
             stack = db_api.stack_get(None, self.name)
             if stack:
-                self.parsed_template_id = stack.parsed_template_id
+                self.parsed_template_id = stack.raw_template.parsed_template.id
             else:
                 return
 
         pt = db_api.parsed_template_get(None, self.parsed_template_id)
         if pt:
             pt.template = self.t
+            pt.save()
         else:
             logger.warn('Cant find parsed template to update %d' % \
                         self.parsed_template_id)
 
+    def status_set(self, new_status, reason='change in resource state'):
+
+        self.t['stack_status'] = new_status
+        self.update_parsed_template()
+
+
     def create_blocking(self):
         '''
         create all the resources in the order specified by get_create_order
         '''
         order = self.get_create_order()
         failed = False
+        self.status_set(self.IN_PROGRESS)
+
         for r in order:
             failed_str = self.resources[r].CREATE_FAILED
             if not failed:
@@ -167,7 +184,13 @@ class Stack(object):
                     logger.exception('update_parsed_template')
 
             else:
-                self.resources[r].state_set(self.resources[r].CREATE_FAILED)
+                self.resources[r].state_set(failed_str)
+        if failed:
+            self.status_set(self.CREATE_FAILED)
+        else:
+            self.status_set(self.CREATE_COMPLETE)
+
+        self.update_parsed_template()
 
     def create(self):
 
@@ -179,6 +202,8 @@ class Stack(object):
         delete all the resources in the reverse order specified by
         get_create_order().
         '''
+        self.status_set(self.DELETE_IN_PROGRESS)
+
         order = self.get_create_order()
         order.reverse()
         for r in order: