---
- name: Ensure the overcloud nodes' hardware introspection data is saved
  hosts: overcloud
  max_fail_percentage: >-
    {{ overcloud_introspection_data_save_max_fail_percentage |
       default(kayobe_max_fail_percentage) |
       default(100) }}
  vars:
    seed_host: "{{ groups['seed'][0] }}"
    # Override this to save results to another location.
    output_dir: "{{ lookup('env', 'PWD') }}/overcloud-introspection-data"
    # Override this to set the output data format. One of json, yaml.
    output_format: json
  gather_facts: no
  tasks:
    - name: Query overcloud nodes' hardware introspection data
      command: >
        docker exec bifrost_deploy
        bash -c '
        env BIFROST_INVENTORY_SOURCE=ironic BIFROST_NODE_NAMES="{{ inventory_hostname }}" OS_CLOUD=bifrost
        ansible baremetal
        --connection local
        --inventory /etc/bifrost/inventory/
        -e @/etc/bifrost/bifrost.yml
        -e @/etc/bifrost/dib.yml
        --limit {{ inventory_hostname }}
        -m shell
        -a "env OS_CLOUD=bifrost baremetal introspection data save {% raw %}{{ inventory_hostname }}{% endraw %}"'
      register: save_result
      changed_when: False
      # Ignore errors, log a message later.
      failed_when: False
      delegate_to: "{{ seed_host }}"
      vars:
        # NOTE: Without this, the seed's ansible_host variable will not be
        # respected when using delegate_to.
        ansible_host: "{{ hostvars[seed_host].ansible_host | default(seed_host) }}"

    - name: Ensure introspection data output directory exists
      local_action:
        module: file
        path: "{{ output_dir }}"
        state: directory

    - name: Ensure introspection data is saved locally
      local_action:
        module: copy
        content: "{{ introspection_data_map[output_format | lower] }}"
        dest: "{{ output_dir }}/{{ inventory_hostname }}.{{ output_format | lower }}"
      when: save_result.rc == 0
      vars:
        introspection_data: "{{ save_result.stdout_lines[1:] | join('\n') | from_json }}"
        introspection_data_json: "{{ introspection_data | to_nice_json(indent=4) }}"
        introspection_data_yaml: "{{ introspection_data | to_nice_yaml }}"
        introspection_data_map:
          json: "{{ introspection_data_json }}"
          yaml: "{{ introspection_data_yaml }}"

    - name: Log when introspection data could not be queried
      debug:
        msg: >
          Could not query hardware introspection data for
          {{ inventory_hostname }}.
          Stdout: {{ save_result.stdout }}.
          Stderr: {{ save_result.stderr }}.
      when: save_result.rc != 0
