# OpenStack Workflow (Mistral)

This document explains how to get started using OpenStack Workflow (Mistral) with Fog. It assumes you have read the [Getting Started with Fog and the OpenStack](getting_started.md) document.

Fog uses the [OpenStack Mistral API](http://docs.openstack.org/mistral/latest/user/rest_api_v2.html).

## Workflow Service

Get a handle for the Workflow service:

```ruby
service = Fog::OpenStack::Workflow.new({
  :openstack_auth_url  => 'http://KEYSTONE_HOST:KEYSTONE_PORT/v2.0/tokens', # OpenStack Keystone endpoint
  :openstack_username  => OPEN_STACK_USER,                                  # Your OpenStack Username
  :openstack_tenant    => OPEN_STACK_TENANT,                                # Your tenant id
  :openstack_api_key   => OPEN_STACK_PASSWORD,                              # Your OpenStack Password
  :connection_options  => {}                                                # Optional
})
```

Read more about the [Optional Connection Parameters](common/connection_params.md)

## Executions

A Workflow is a composition of one or more actions.

To execute a workflow, we create an execution:

```ruby
workflow = "tripleo.plan_management.v1.create_default_deployment_plan"
input = { :container => 'default' }
response = service.create_execution(workflow, input)
```

Execution status and result can be checked by:

```ruby
workflow_execution_id = response.body["id"]
response = mistral.get_execution(workflow_execution_id)
state = response.body["state"]
```

To execute an individual action, we create an action execution:

```ruby
input = { :container => 'default' }
service.create_action_execution("tripleo.get_capabilities", input)
```

For actions, the result is returned when create_action_execution completes.

## Workflows

### Create a workflow

```ruby
workflow_def = {
  :version => "2.0",
  :myworkflow => {
    :type        => "direct",
    :description => "description1",
    :tasks => {
      :create_vm => {
        :description => "create vm"
      }
    }
  }
}
response = service.create_workflow(workflow_def)
workflow_id = response.body["workflows"][0]["id"]
```

### Validate a workflow before creating it

```ruby
service.validate_workflow(workflow_def)
```

### Update a workflow

```ruby
workflow_def_new = {
  :version => "2.0",
  :myworkflow => {
    :type        => "direct",
    :description => "description2",
    :tasks => {
      :create_vm => {
        :description => "create vm"
      }
    }
  }
}
service.update_workflow(workflow_def_new)
```

### List workflow

```ruby
service.list_workflows
```

### Delete workflow

```ruby
service.delete_workflow(workflow_id)
```

## Other Mistral resources

In addition to workflows, the following Mistral resources are also supported:

* Workbooks
* Actions
* Executions
* Tasks
* Action Executions
* Cron Triggers
* Environments
* Validations

For examples on how to interact with these resources, please refer to
https://github.com/fog/fog-openstack/tree/master/examples/workflow/workflow-examples.rb

## Additional Resources

* [Mistral Wiki](https://wiki.openstack.org/wiki/Mistral)
* [Mistral DSL v2](http://docs.openstack.org/mistral/ocata/dsl/dsl_v2.html)
* [Mistral API v2](http://docs.openstack.org/mistral/latest/user/rest_api_v2.html)
* [Mistral python client](https://github.com/openstack/python-mistralclient) Can be useful to see how to interact with the API.
* [more resources and feedback](common/resources.md)
