From bb20c86e6e4c66079bbb8d6562be068c70d7dd01 Mon Sep 17 00:00:00 2001 From: Oleksii Chuprykov Date: Thu, 8 Oct 2015 16:49:52 +0300 Subject: [PATCH] Add heat template for restarting a stack Use mistral workflow for checking status of the given stack and recreate stack, if VM that belongs to the stack in ERROR state or doesn't exist. Note that it is needed to allow trusts delegation in heat for successfull creation of a trust context. Change-Id: I0b61177539c332db0833114e29eee7c74f2ff673 --- hot/mistral/templates/stack_restarter.yaml | 71 ++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 hot/mistral/templates/stack_restarter.yaml diff --git a/hot/mistral/templates/stack_restarter.yaml b/hot/mistral/templates/stack_restarter.yaml new file mode 100644 index 00000000..755e66a4 --- /dev/null +++ b/hot/mistral/templates/stack_restarter.yaml @@ -0,0 +1,71 @@ +heat_template_version: 2015-04-30 + +description: > + This template creates a stack that will observe the status of some VM + in the given stack. If VM has ERROR status or doesn't exist, the stack with + VM will be recreated. VM id status of which is needed to check obtained from + observed stack outputs. + Run "heat resource-signal " for staring execution, + where resource name is tne name of workflow in the created stack. + + +parameters: + stack_name: + type: string + description: Name of the stack with VM status of which is needed to check. + + output_name: + type: string + description: Name of output that contains id of VM status of which is needed to check. + default: vm_id + + pause: + type: number + description: Number of seconds to wait before status checks. + default: 30 + +resources: + workflow: + type: OS::Mistral::Workflow + properties: + type: direct + tasks: + - name: get_template + action: heat.stacks_template stack_id=<% $.stack_name %> + publish: + template: <% $.get_template %> + on_success: + - get_vm_id + - name: get_vm_id + action: heat.stacks_get stack_id=<% $.stack_name %> + publish: + vm_id: {list_join: ["", ['<% $.get_vm_id.outputs.where($.output_key="', {get_param: output_name}, '").first().output_value %>']]} + on_success: + - get_vm_status + - name: get_vm_status + action: nova.servers_get server=<% $.vm_id %> + on_error: + - delete_stack + on_success: + - delete_stack: <% $.get_vm_status.status = ERROR %> + - get_vm_status: <% $.get_vm_status.status != ERROR %> + wait_before: { get_param: pause } + - name: delete_stack + action: heat.stacks_delete stack_id=<% $.stack_name %> + on_success: + - recreate_stack + - name: recreate_stack + action: heat.stacks_create stack_name=<% $.stack_name %> template=<% $.template %> + retry: + delay: 5 + count: 10 + on_success: + - wait_stack_complete + - name: wait_stack_complete + action: heat.stacks_get stack_id=<% $.stack_name %> + wait_before: 5 + on_success: + - wait_stack_complete: <% $.wait_stack_complete.stack_status=CREATE_IN_PROGRESS %> + - get_vm_id: <% $.wait_stack_complete.stack_status=CREATE_COMPLETE %> + input: + stack_name: {get_param: stack_name}