Namespaces:
Nova:
# Nova actions for creating VM, retrieving IP and VM deleting.
class: std.http
actions:
createVM:
base-parameters:
url: '{$.nova_url}/{$.project_id}/servers'
method: POST
headers:
X-Auth-Token: $.auth_token
Content-Type: application/json
body:
server:
name: $.server_name
imageRef: $.image_id
flavorRef: $.flavor_id
output:
vm_id: $.content.server.id
getIP:
base-parameters:
url: '{$.nova_url}/{$.project_id}/servers/{$.vm_id}'
method: GET
headers:
X-Auth-Token: $.auth_token
output:
vm_ip: "$.content.server.addresses.novanetwork.where($.'OS-EXT-IPS:type' = 'floating')[0].addr"
deleteVM:
base-parameters:
url: '{$.nova_url}/{$.project_id}/servers/{$.vm_id}'
method: DELETE
headers:
X-Auth-Token: $.auth_token
output:
status: $.status
Server:
actions:
# HTTP request to the server.
calcSumm:
class: std.http
base-parameters:
url: '`http:// <
http://>`__
{$.vm_ip}:5000/summ'
method: POST
body:
arguments: $.arguments
output:
summ_result: $.content.result
Ssh:
class: std.ssh
base-parameters:
host: $.vm_ip
username: $.username
password: $.password
actions:
# Simple SSH command.
waitSSH:
base-parameters:
cmd: 'ls -l'
# SSH command to run the server.
runServer:
base-parameters:
cmd: 'nohup python ~/web_app.py > web_app.log &'
Workflow:
tasks:
# Create a VM (request to Nova).
createVM:
action: Nova.createVM
parameters:
server_name: $.server_name
image_id: $.image_id
flavor_id: $.flavor_id
nova_url: $.nova_url
project_id: $.project_id
auth_token: $.auth_token
publish:
vm_id: vm_id
on-success: waitForIP
on-error: sendCreateVMError
# Wait till the VM is assigned with IP address (request to Nova).
waitForIP:
action: Nova.getIP
retry:
count: 10
delay: 10
publish:
vm_ip: vm_ip
parameters:
nova_url: $.nova_url
project_id: $.project_id
auth_token: $.auth_token
vm_id: $.vm_id
on-success: waitSSH
on-error: sendCreateVMError
# Wait till operating system on the VM is up (SSH command).
waitSSH:
action: Ssh.waitSSH
retry:
count: 10
delay: 10
parameters:
username: $.ssh_username
password: $.ssh_password
vm_ip: $.vm_ip
on-success: runServer
on-error: sendCreateVMError
# When SSH is up, we are able to run the server on VM (SSH command).
runServer:
action: Ssh.runServer
parameters:
vm_ip: $.vm_ip
username: $.ssh_username
password: $.ssh_password
on-success: calcSumm
on-error: sendCreateVMError
# Send HTTP request on server and calc the result.
calcSumm:
action: Server.calcSumm
retry:
count: 10
delay: 1
parameters:
arguments:
- 32
- 45
- 23
vm_ip: $.vm_ip
publish:
result: summ_result
on-finish: sendResultEmail
# In case of createVM error send e-mail with error message.
sendResultEmail:
action: std.email
parameters:
params:
to: [$.admin_email]
subject: Workflow result
body: |
Workflow result of execution {$.__execution.id} is {$.result}
-- Thanks, Mistral Team.
settings:
smtp_server: $.smtp_server
from: $.from_email
password: $.smtp_password
on-finish: deleteVM
# In case of createVM error send e-mail with error message.
sendCreateVMError:
action: std.email
parameters:
params:
to: [$.admin_email]
subject: Workflow error
body: |
Failed to create a VM in execution {$.__execution.id}
-- Thanks, Mistral Team.
settings:
smtp_server: $.smtp_server
from: $.from_email
password: $.smtp_password
on-finish: deleteVM
# Destroy the VM (request to Nova).
deleteVM:
action: Nova.deleteVM
parameters:
nova_url: $.nova_url
project_id: $.project_id
auth_token: $.auth_token
vm_id: $.vm_id