---
# Gather an inventory of nodes from the seed's Ironic service. Use this to
# generate an Ansible inventory for Kayobe.

- name: Ensure the overcloud Ansible inventory is populated
  hosts: seed
  tags:
    - inventory-discover
  tasks:
    - name: Gather the Ironic node inventory using Bifrost
      command: >
        docker exec bifrost_deploy
        bash -c '
        export OS_CLOUD=bifrost &&
        export BIFROST_INVENTORY_SOURCE=ironic &&
        /bifrost/playbooks/inventory/bifrost_inventory.py'
      register: inventory_result
      changed_when: False

    - name: Set a fact containing the Ironic node inventory
      set_fact:
        ironic_inventory: "{{ inventory_result.stdout | from_json }}"

    - name: Ensure Kayobe overcloud inventory exists
      local_action:
        module: copy
        content: |
          # Managed by Ansible - do not edit.
          # This is the Kayobe overcloud inventory, autogenerated from the seed
          # node's Ironic inventory.

          {# Build a list of all hosts with explicit mappings. #}
          {% set all_mapped_hosts = [] %}
          {% for hosts in overcloud_group_hosts_map.values() %}
          {% set _ = all_mapped_hosts.extend(hosts) %}
          {% endfor %}
          {% set ignore_hosts = overcloud_group_hosts_map.get("ignore", []) %}

          {# Add a section for each group. #}
          {% for group in overcloud_groups | sort %}
          [{{ group }}]
          {% set group_hosts = overcloud_group_hosts_map.get(group, []) %}
          {% for host in ironic_inventory.baremetal.hosts | sort %}
          {% if (host in group_hosts or
                 (group == overcloud_group_default and host not in all_mapped_hosts))
                and host not in ignore_hosts %}
          {% set hostvars=ironic_inventory._meta.hostvars[host] %}
          {% set ipmi_address=hostvars.driver_info.ipmi_address | default %}
          {% set system_vendor=hostvars.extra.system_vendor | default %}
          {% set bmc_type=system_vendor | bmc_type_from_system_vendor %}
          {{ host }} ipmi_address={{ ipmi_address }} bmc_type={{ bmc_type }}
          {% endif %}
          {% endfor %}

          {% endfor %}
        dest: "{{ kayobe_config_path }}/inventory/overcloud"
