---
- name: Check whether Ironic is enabled
  hosts: controllers
  gather_facts: False
  tags:
    - ipa-images
  tasks:
    - name: Create controllers group with ironic enabled
      group_by:
        key: "controllers_for_ipa_images_{{ kolla_enable_ironic | bool }}"
      changed_when: false

- name: Ensure Ironic Python Agent (IPA) images are downloaded and registered
  hosts: controllers_for_ipa_images_True[0]
  tags:
    - ipa-images
  vars:
    # These are the filenames generated by overcloud-ipa-build.yml.
    ipa_image_name: "ipa"
    ipa_images:
      - "{{ ipa_image_name }}.kernel"
      - "{{ ipa_image_name }}.initramfs"
  pre_tasks:
    - name: Validate OpenStack password authentication parameters
      fail:
        msg: >
          Required OpenStack authentication parameter {{ item }} is
          {% if item in openstack_auth %}empty{% else %}not present{% endif %}
          in openstack_auth. Have you sourced the environment file?
      when:
        - openstack_auth_type == 'password'
        - item not in openstack_auth or not openstack_auth[item]
      with_items: "{{ openstack_auth_password_required_params }}"
      tags:
        - config-validation

    - block:
        - name: Check for the presence of locally built Ironic Python Agent (IPA) images
          stat:
            path: "{{ image_cache_path }}/{{ ipa_image_name }}/{{ item }}"
            get_checksum: False
            mime: False
          with_items: "{{ ipa_images }}"
          register: ipa_image_stat

        - name: Validate the presence of locally built Ironic Python Agent (IPA) images
          fail:
            msg: >
              Expected locally built Ironic Python Agent (IPA) image
              {{ item.item }} was not present in {{ image_cache_path }}.
          with_items: "{{ ipa_image_stat.results }}"
          when: not item.stat.exists
      when: ipa_build_images | bool
      tags:
        - config-validation

    - name: Set fact containing the Ironic Python Agent (IPA) image URLs
      set_fact:
        # Don't pass the kernel and ramdisk image URLs if using built images.
        ipa_images_kernel_url: "{{ ipa_kernel_upstream_url }}"
        ipa_images_kernel_checksum_url: "{{ ipa_kernel_checksum_url }}"
        ipa_images_kernel_checksum_algorithm: "{{ ipa_kernel_checksum_algorithm }}"
        ipa_images_ramdisk_url: "{{ ipa_ramdisk_upstream_url }}"
        ipa_images_ramdisk_checksum_url: "{{ ipa_ramdisk_checksum_url }}"
        ipa_images_ramdisk_checksum_algorithm: "{{ ipa_ramdisk_checksum_algorithm }}"
      when: not ipa_build_images | bool

    - name: Check whether the image cache directory exists
      stat:
        path: "{{ image_cache_path }}"
        get_checksum: False
        mime: False
      register: image_cache_stat

    - name: Ensure the image cache directory exists
      file:
        path: "{{ image_cache_path }}"
        state: directory
        owner: "{{ ansible_facts.user_uid }}"
        group: "{{ ansible_facts.user_gid }}"
      become: True
      when: >-
        not image_cache_stat.stat.exists or
        not image_cache_stat.stat.writeable

    - name: Ensure locally built Ironic Python Agent (IPA) images are copied
      copy:
        src: "{{ image_cache_path }}/{{ ipa_image_name }}/{{ item.src }}"
        dest: "{{ image_cache_path }}/{{ ipa_image_name }}/{{ item.dest }}"
        remote_src: True
      with_items:
        - src: "{{ ipa_images[0] }}"
          dest: "{{ ipa_images_kernel_name }}"
        - src: "{{ ipa_images[1] }}"
          dest: "{{ ipa_images_ramdisk_name }}"
      when:
        - ipa_build_images | bool
        - item.src != item.dest
  roles:
    - role: ipa-images
      os_openstacksdk_install_epel: "{{ dnf_install_epel }}"
      os_openstacksdk_state: "latest"
      ipa_images_venv: "{{ virtualenv_path }}/openstacksdk"
      ipa_images_upper_constraints_file: "{{ openstacksdk_upper_constraints_file }}"
      ipa_images_openstack_auth_type: "{{ openstack_auth_type }}"
      ipa_images_openstack_auth: "{{ openstack_auth }}"
      ipa_images_openstack_auth_env: "{{ openstack_auth_env }}"
      ipa_images_openstack_cacert: "{{ openstack_cacert }}"
      ipa_images_openstack_interface: "{{ openstack_interface }}"
      ipa_images_cache_path: "{{ image_cache_path }}/{{ ipa_image_name }}"
