---
# We generate a configuration file and execute a python script in a container
# that builds a ring based on the config file contents. Doing it this way
# avoids a large task loop with docker container for each step, which would be
# quite slow.

# Execute the following commands on the ring build host.
- block:
    - name: Ensure Swift ring build directory exists
      file:
        path: "{{ swift_ring_build_path }}"
        state: directory

    - name: Ensure Swift ring builder script exists
      copy:
        src: swift-ring-builder.py
        dest: "{{ swift_ring_build_path }}"
      register: copy_result

    - name: Ensure Swift ring builder configuration exists
      template:
        src: swift-ring.yml.j2
        dest: "{{ swift_ring_build_path }}/{{ service_name }}-ring.yml"
      with_items: "{{ swift_service_names }}"
      loop_control:
        loop_var: service_name

    - name: Ensure Swift rings exist
      kayobe_container:
        cleanup: true
        command: >-
          python3 {{ swift_container_build_path }}/swift-ring-builder.py
          {{ swift_container_build_path }}/{{ item }}-ring.yml
          {{ swift_container_build_path }}
          {{ item }}
        detach: false
        image: "{{ swift_ring_build_image }}"
        name: "swift_{{ item }}_ring_builder"
        user: "{{ copy_result.uid }}:{{ copy_result.gid }}"
        volumes:
          - "{{ swift_ring_build_path }}/:{{ swift_container_build_path }}/"
      with_items: "{{ swift_service_names }}"
      become: "{{ container_engine == 'podman' }}"

    - name: Ensure Swift ring files are copied
      fetch:
        src: "{{ swift_ring_build_path }}/{{ item[0] }}.{{ item[1] }}"
        dest: "{{ swift_config_path }}/{{ item[0] }}.{{ item[1] }}"
        flat: true
        mode: 0644
      with_nested:
        - "{{ swift_service_names }}"
        - - ring.gz
          - builder
      become: true

  always:
    - name: Remove Swift ring build directory from build host
      file:
        path: "{{ swift_ring_build_path }}"
        state: absent
      become: true

  delegate_to: "{{ swift_ring_build_host }}"
  vars:
    # NOTE: Without this, the seed's ansible_host variable will not be
    # respected when using delegate_to.
    ansible_host: "{{ hostvars[swift_ring_build_host].ansible_host | default(swift_ring_build_host) }}"
