]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Add instance restarter
authorAngus Salkeld <asalkeld@redhat.com>
Fri, 25 May 2012 01:53:57 +0000 (11:53 +1000)
committerAngus Salkeld <asalkeld@redhat.com>
Wed, 30 May 2012 13:32:07 +0000 (23:32 +1000)
Change-Id: I8ef28efc7d86a1a3a44f4784cb496c415a14f95c
Signed-off-by: Angus Salkeld <asalkeld@redhat.com>
heat/engine/instance.py
heat/engine/parser.py
templates/WordPress_Single_Instance_With_HA.template

index d4b75c33a13851bab3c399cf2977aa9193d328b7..f0aa58fe8ae0783a9845c92edcf9d5e8107368b4 100644 (file)
@@ -46,6 +46,34 @@ else:
             break
 
 
+class Restarter(Resource):
+    properties_schema = {'InstanceId': {'Type': 'String',
+                                        'Required': True}}
+
+    def __init__(self, name, json_snippet, stack):
+        super(Restarter, self).__init__(name, json_snippet, stack)
+
+    def create(self):
+        if self.state != None:
+            return
+        self.state_set(self.CREATE_IN_PROGRESS)
+        Resource.create(self)
+        self.state_set(self.CREATE_COMPLETE)
+
+    def delete(self):
+        if self.state == self.DELETE_IN_PROGRESS or \
+           self.state == self.DELETE_COMPLETE:
+            return
+        self.state_set(self.DELETE_IN_PROGRESS)
+        Resource.delete(self)
+        self.state_set(self.DELETE_COMPLETE)
+
+    def alarm(self):
+        logger.notice('%s Alarm, restarting resource: %s' % \
+                      (self.name, self.properties['InstanceId']))
+        self.stack.restart_resource(self.properties['InstanceId'])
+
+
 class Instance(Resource):
     # AWS does not require KeyName and InstanceType but we seem to
     properties_schema = {'ImageId': {'Type': 'String',
index 9dc420b6f14618e75eae4b9d052af011c463bd27..46a821b2038a4201d2d163e2dd71ec9cb826c561 100644 (file)
@@ -47,6 +47,7 @@ logger = logging.getLogger(__file__)
     'AWS::CloudFormation::WaitCondition': wait_condition.WaitCondition,
     'AWS::IAM::User': user.User,
     'AWS::IAM::AccessKey': user.AccessKey,
+    'HEAT::HA::Restarter': instance.Restarter,
 },)
 
 
@@ -278,6 +279,48 @@ class Stack(object):
 
         return outs
 
+    def restart_resource_blocking(self, resource_name):
+        '''
+        stop resource_name and all that depend on it
+        start resource_name and all that depend on it
+        '''
+        order = []
+        self.resource_append_deps(self.resources[resource_name], order)
+
+        for r in reversed(order):
+            res = self.resources[r]
+            try:
+                res.delete()
+                #db_api.resource_get(None, self.resources[r].id).delete()
+            except Exception as ex:
+                failed = True
+                res.state_set(res.DELETE_FAILED)
+                logger.error('delete: %s' % str(ex))
+
+        for r in order:
+            res = self.resources[r]
+            if not failed:
+                try:
+                    res.create()
+                except Exception as ex:
+                    logger.exception('create')
+                    failed = True
+                    res.state_set(res.CREATE_FAILED, str(ex))
+
+                try:
+                    self.update_parsed_template()
+                except Exception as ex:
+                    logger.exception('update_parsed_template')
+
+            else:
+                res.state_set(res.CREATE_FAILED)
+        # TODO(asalkeld) if any of this fails we Should
+        # restart the whole stack
+
+    def restart_resource(self, resource_name):
+        pool = eventlet.GreenPool()
+        pool.spawn_n(self.restart_resource_blocking)
+
     def calulate_dependencies(self, s, r):
         if isinstance(s, dict):
             for i in s:
index 653668dbb2ec5ee9a2079b49f83375898c365248..4a43cd45c786bd792988862841e23e4a9f513ea1 100644 (file)
@@ -98,9 +98,9 @@
 
   "Resources" : {
     "WebServerRestartPolicy" : {
-      "Type" : "HEAT::Recovery::EscalationPolicy",
+      "Type" : "HEAT::HA::Restarter",
       "Properties" : {
-        "Instance" : { "Ref" : "WikiDatabase" }
+        "InstanceId" : { "Ref" : "WikiDatabase" }
       }
     },
     "HttpFailureAlarm": {