From: Angus Salkeld Date: Fri, 25 May 2012 01:53:57 +0000 (+1000) Subject: Add instance restarter X-Git-Tag: 2014.1~1779 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=bd281338493ea3612c65602b60a578276be5db89;p=openstack-build%2Fheat-build.git Add instance restarter Change-Id: I8ef28efc7d86a1a3a44f4784cb496c415a14f95c Signed-off-by: Angus Salkeld --- diff --git a/heat/engine/instance.py b/heat/engine/instance.py index d4b75c33..f0aa58fe 100644 --- a/heat/engine/instance.py +++ b/heat/engine/instance.py @@ -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', diff --git a/heat/engine/parser.py b/heat/engine/parser.py index 9dc420b6..46a821b2 100644 --- a/heat/engine/parser.py +++ b/heat/engine/parser.py @@ -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: diff --git a/templates/WordPress_Single_Instance_With_HA.template b/templates/WordPress_Single_Instance_With_HA.template index 653668db..4a43cd45 100644 --- a/templates/WordPress_Single_Instance_With_HA.template +++ b/templates/WordPress_Single_Instance_With_HA.template @@ -98,9 +98,9 @@ "Resources" : { "WebServerRestartPolicy" : { - "Type" : "HEAT::Recovery::EscalationPolicy", + "Type" : "HEAT::HA::Restarter", "Properties" : { - "Instance" : { "Ref" : "WikiDatabase" } + "InstanceId" : { "Ref" : "WikiDatabase" } } }, "HttpFailureAlarm": {