# Required Python packages:
#
# ansible
# openstackclient
# openstacksdk
# netaddr

- ansible.builtin.import_playbook: common.yaml

- hosts: all
  gather_facts: no

  tasks:
  - name: 'Create the Compute ports'
    openstack.cloud.port:
      name: "{{ item.1 }}-{{ item.0 }}"
      network: "{{ os_network }}"
      security_groups:
      - "{{ os_sg_worker }}"
      allowed_address_pairs:
      - ip_address: "{{ os_ingressVIP }}"
    with_indexed_items: "{{ [os_port_worker] * os_compute_nodes_number }}"
    register: ports
    when: os_subnet6 is not defined

  - name: 'Create the dualstack Compute ports'
    openstack.cloud.port:
      name: "{{ item.1 }}-{{ item.0 }}"
      network: "{{ os_network }}"
      security_groups:
      - "{{ os_sg_worker }}"
      allowed_address_pairs:
      - ip_address: "{{ os_ingressVIP }}"
      - ip_address: "{{ os_ingressVIP6 }}"
    with_indexed_items: "{{ [os_port_worker] * os_compute_nodes_number }}"
    register: ports
    when: os_subnet6 is defined

  - name: 'Set Compute ports tag'
    ansible.builtin.command:
      cmd: "openstack port set --tag {{ cluster_id_tag }} {{ item.1 }}-{{ item.0 }}"
    with_indexed_items: "{{ [os_port_worker] * os_compute_nodes_number }}"

  - name: 'List the Server groups'
    ansible.builtin.command:
      # os-compute-api-version 2.15 or higher is required for the 'soft-anti-affinity' policy
      cmd: "openstack --os-compute-api-version=2.15 server group list -f json -c ID -c Name"
    register: server_group_list

  - name: 'Parse the Server group ID from existing'
    ansible.builtin.set_fact:
      server_group_id: "{{ (server_group_list.stdout | from_json | json_query(list_query) | first).ID }}"
    vars:
      list_query: "[?Name=='{{ os_compute_server_group_name }}']"
    when:
    - "os_compute_server_group_name|string in server_group_list.stdout"

  - name: 'Create the Compute server group'
    ansible.builtin.command:
      # os-compute-api-version 2.15 or higher is required for the 'soft-anti-affinity' policy
      cmd: "openstack --os-compute-api-version=2.15 server group create -f json -c id --policy=soft-anti-affinity {{ os_compute_server_group_name }}"
    register: server_group_created
    when:
    - server_group_id is not defined

  - name: 'Parse the Server group ID from creation'
    ansible.builtin.set_fact:
      server_group_id: "{{ (server_group_created.stdout | from_json).id }}"
    when:
    - server_group_id is not defined

  - name: 'Create the Compute servers'
    openstack.cloud.server:
      name: "{{ item.1 }}-{{ item.0 }}"
      image: "{{ os_image_rhcos }}"
      flavor: "{{ os_flavor_worker }}"
      auto_ip: no
      userdata: "{{ lookup('file', 'worker.ign') | string }}"
      nics:
      - port-name: "{{ os_port_worker }}-{{ item.0 }}"
      scheduler_hints:
        group: "{{ server_group_id }}"
      meta: "{{ cluster_id_tag }}"
    with_indexed_items: "{{ [os_compute_server_name] * os_compute_nodes_number }}"
