---
version: '2.0'
name: tripleo.stack.v1
description: TripleO Stack Workflows

workflows:

  _heat_stacks_list:
    tags:
      - tripleo-common-managed

    input:
      - queue_name: null

    tasks:
      heat_stacks_list:
        action: heat.stacks_list
        publish:
          stacks: <% task().result %>
        on-success:
          - send_message: <% bool($.queue_name) %>
      send_message:
        workflow: tripleo.messaging.v1.send
        input:
          queue_name: <% $.queue_name %>
          type: <% execution().name %>
          status: "RUNNING"  # This should never be the end of a workflow
          execution: <% execution() %>
          payload:
            stacks: <% $.stacks %>

  wait_for_stack_complete_or_failed:
    input:
      - stack
      - timeout: 14400 # 4 hours. Default timeout of stack deployment
      - queue_name: null

    tags:
      - tripleo-common-managed

    tasks:

      wait_for_stack_status:
        workflow: _heat_stacks_list
        input:
          queue_name: <% $.queue_name %>
        timeout: <% $.timeout %>
        publish:
          stack_status: <% let(stack => $.stack) -> task().result.stacks.where($.stack_name = $stack).first().stack_status %>
        retry:
          delay: 15
          count: <% $.timeout / 15 %>
          continue-on: <% $.stack_status in ['CREATE_IN_PROGRESS', 'UPDATE_IN_PROGRESS', 'DELETE_IN_PROGRESS'] %>

  wait_for_stack_in_progress:
    input:
      - stack
      - timeout: 600 # 10 minutes. Should not take much longer for a stack to transition to IN_PROGRESS
      - queue_name: null

    tags:
      - tripleo-common-managed

    tasks:

      wait_for_stack_status:
        workflow: _heat_stacks_list
        input:
          stack: <% $.stack %>
          queue_name: <% $.queue_name %>
        timeout: <% $.timeout %>
        publish:
          stack_status: <% let(stack => $.stack) -> task().result.stacks.where($.stack_name = $stack).first().stack_status %>
        retry:
          delay: 15
          count: <% $.timeout / 15 %>
          continue-on: <% $.stack_status in ['CREATE_COMPLETE', 'CREATE_FAILED', 'UPDATE_COMPLETE', 'UPDATE_FAILED', 'DELETE_FAILED'] %>

  wait_for_stack_does_not_exist:
    input:
      - stack
      - timeout: 3600
      - queue_name: null

    tags:
      - tripleo-common-managed

    tasks:
      wait_for_stack_status:
        workflow: _heat_stacks_list
        input:
          queue_name: <% $.queue_name %>
        timeout: <% $.timeout %>
        retry:
          delay: 15
          count: <% $.timeout / 15 %>
          continue-on: <% $.stack in task().result.stacks.select([$.stack_name, $.id]).flatten() %>

  delete_stack:
    input:
      - stack
      - queue_name: tripleo

    tags:
      - tripleo-common-managed

    tasks:
      delete_the_stack:
        action: heat.stacks_delete stack_id=<% $.stack %>
        on-success: wait_for_stack_does_not_exist
        on-error: delete_the_stack_failed

      delete_the_stack_failed:
        on-success: send_message
        publish:
          status: FAILED
          message: <% task(delete_the_stack).result %>

      wait_for_stack_does_not_exist:
        workflow: tripleo.stack.v1.wait_for_stack_does_not_exist
        input:
          stack: <% $.stack %>
          queue_name: <% $.queue_name %>
        on-success: send_message
        on-error: wait_for_stack_does_not_exist_failed

      wait_for_stack_does_not_exist_failed:
        on-success: send_message
        publish:
          status: FAILED
          message: <% task(wait_for_stack_does_not_exist).result %>

      send_message:
        workflow: tripleo.messaging.v1.send
        input:
          queue_name: <% $.queue_name %>
          type: <% execution().name %>
          status: <% $.get('status', 'SUCCESS') %>
          execution: <% execution() %>
          message: <% $.get('message', '') %>
