---
version: '2.0'

std.create_instance:
  type: direct

  description: |
    Creates VM and waits till VM OS is up and running.

  input:
    - name
    - image_id
    - flavor_id
    - ssh_username: null
    - ssh_password: null

    # Name of previously created keypair to inject into the instance.
    # Either ssh credentials or keypair must be provided.
    - key_name: null

    # Security_groups: A list of security group names
    - security_groups: null

    # An ordered list of nics to be added to this server, with information about connected networks, fixed IPs, port etc.
    # Example: nics: [{"net-id": "27aa8c1c-d6b8-4474-b7f7-6cdcf63ac856"}]
    - nics: null

  task-defaults:
    on-error:
      - delete_vm

  output:
    ip: <% $.vm_ip %>
    id: <% $.vm_id %>
    name: <% $.name %>
    status: <% $.status %>

  tasks:
    create_vm:
      description: Initial request to create a VM.
      action: nova.servers_create name=<% $.name %> image=<% $.image_id %> flavor=<% $.flavor_id %>
      input:
        key_name: <% $.key_name %>
        security_groups: <% $.security_groups %>
        nics: <% $.nics %>
      publish:
        vm_id: <% $.create_vm.id %>
      on-success:
        - search_for_ip

    search_for_ip:
      description: Gets first free ip from Nova floating IPs.
      action: nova.floating_ips_findall instance_id=null
      publish:
        vm_ip: <% $.search_for_ip[0].ip %>
      on-success:
        - wait_vm_active

    wait_vm_active:
      description: Waits till VM is ACTIVE.
      action: nova.servers_find id=<% $.vm_id %> status="ACTIVE"
      retry:
        count: 10
        delay: 10
      publish:
        status: <% $.wait_vm_active.status %>
      on-success:
        - associate_ip

    associate_ip:
      description: Associate server with one of floating IPs.
      action: nova.servers_add_floating_ip server=<% $.vm_id %> address=<% $.vm_ip %>
      wait-after: 5
      on-success:
        - wait_ssh

    wait_ssh:
      description: Wait till operating system on the VM is up (SSH command).
      action: std.wait_ssh username=<% $.ssh_username %> password=<% $.ssh_password %> host=<% $.vm_ip %>
      retry:
        count: 10
        delay: 10

    delete_vm:
      description: Destroy VM.
      workflow: std.delete_instance instance_id=<% $.vm_id %>
      on-complete:
        - fail
