---
- hosts: OSEv3
  become: true
  vars:
    registries: []
    insecure_registries: []

  tasks:
  - name: Check if docker is even installed
    command: docker

  - name: Install atomic-registries package
    yum:
      name: atomic-registries
      state: latest

  - name: Get registry configuration file
    register: file_result
    stat:
      path: /etc/containers/registries.conf

  - name: Check if it exists
    assert:
      that: 'file_result.stat.exists'
      msg: "Configuration file does not exist."

  - name: Load configuration file
    shell: cat /etc/containers/registries.conf
    register: file_content

  - name: Store file content into a variable
    set_fact:
      docker_conf: "{{ file_content.stdout | from_yaml }}"

  - name: Make sure that docker file content is a dictionary
    when: '(docker_conf is string) and (not docker_conf)'
    set_fact:
      docker_conf: {}

  - name: Make sure that registries is a list
    when: 'registries is string'
    set_fact:
      registries_list: [ "{{ registries }}" ]

  - name: Make sure that insecure_registries is a list
    when: 'insecure_registries is string'
    set_fact:
      insecure_registries_list: [ "{{ insecure_registries }}" ]

  - name: Set default values if there are no registries defined
    set_fact:
      docker_conf_registries: "{{ [] if docker_conf['registries'] is not defined else docker_conf['registries'] }}"
      docker_conf_insecure_registries: "{{ [] if docker_conf['insecure_registries'] is not defined else docker_conf['insecure_registries'] }}"

  - name: Add other registries
    when: 'registries_list is not defined'
    register: registries_merge_result
    set_fact:
      docker_conf: "{{ docker_conf | combine({'registries': (docker_conf_registries + registries) | unique}, recursive=True) }}"

  - name: Add other registries (if registries had to be converted)
    when: 'registries_merge_result|skipped'
    set_fact:
      docker_conf: "{{ docker_conf | combine({'registries': (docker_conf_registries + registries_list) | unique}, recursive=True) }}"

  - name: Add insecure registries
    when: 'insecure_registries_list is not defined'
    register: insecure_registries_merge_result
    set_fact:
      docker_conf: "{{ docker_conf | combine({'insecure_registries': (docker_conf_insecure_registries + insecure_registries) | unique }, recursive=True) }}"

  - name: Add insecure registries (if insecure_registries had to be converted)
    when: 'insecure_registries_merge_result|skipped'
    set_fact:
      docker_conf: "{{ docker_conf | combine({'insecure_registries': (docker_conf_insecure_registries + insecure_registries_list) | unique }, recursive=True) }}"

  - name: Load variable back to file
    copy:
      content: "{{ docker_conf | to_yaml }}"
      dest: /etc/containers/registries.conf

  - name: Restart registries service
    service:
      name: registries
      state: restarted

  - name: Restart docker
    service:
      name: docker
      state: restarted
