---
- name: Query docker daemon information
  command: "docker info"
  register: docker_info
  changed_when: False
  failed_when: False

- name: Fail when non-devicemapper containers or images exist
  fail:
    msg: >
      Not configuring docker storage in {{ docker_storage_driver }} mode as
      non-devicemapper containers or images exist.
  when:
    - docker_info.rc == 0
    - "'Data loop file' in docker_info.stdout or 'devicemapper' not in docker_info.stdout"
    - "'Images: 0' not in docker_info.stdout or 'Containers: 0' not in docker_info.stdout"

- name: Ensure the docker storage metadata profile exists
  template:
    src: docker-thinpool.profile.j2
    dest: /etc/lvm/profile/docker-thinpool.profile
  become: True

- name: Query LVM thinpool volume
  command: "lvs {{ docker_storage_volume_group }}/{{ docker_storage_volume_thinpool }}"
  register: lvs_result
  changed_when: false
  failed_when: false
  become: true

- block:
    - name: Ensure the docker storage data and metadata volumes exist
      lvol:
        vg: "{{ docker_storage_volume_group }}"
        lv: "{{ item.name }}"
        size: "{{ item.size }}"
        shrink: no
        state: present
      with_items:
        - name: "{{ docker_storage_volume_thinpool }}"
          size: "{{ docker_storage_volume_thinpool_size }}"
        - name: "{{ docker_storage_volume_thinpool_meta }}"
          size: "{{ docker_storage_volume_thinpool_meta_size }}"
      become: True

    - name: Ensure the docker storage volume is converted to a thinpool
      command: >
        lvconvert -y --zero n -c 512K
        --thinpool {{ docker_storage_volume_group }}/{{ docker_storage_volume_thinpool }}
        --poolmetadata {{ docker_storage_volume_group }}/{{ docker_storage_volume_thinpool_meta }}
      become: True

    - name: Ensure the docker storage metadata profile is applied
      command: >
        lvchange --metadataprofile docker-thinpool
        {{ docker_storage_volume_group }}/{{ docker_storage_volume_thinpool }}
      become: True
  when: lvs_result.rc != 0
