---
# NOTE(awiddersheim): Gather facts for all hosts as a
# first step since several plays below require them when
# building their configurations.
- name: Gather facts for all hosts
  hosts: all
  any_errors_fatal: "{{ kolla_ansible_setup_any_errors_fatal | bool }}"
  serial: '{{ kolla_serial|default("0") }}'
  gather_facts: false
  tasks:
    - name: Gather facts
      setup:
        filter: "{{ kolla_ansible_setup_filter }}"
        gather_subset: "{{ kolla_ansible_setup_gather_subset }}"
      when:
        - not ansible_facts

    - name: Gather package facts
      package_facts:
      when:
        - "'packages' not in ansible_facts"
        - kolla_action is defined
        - kolla_action == "precheck"

    - name: Group hosts to determine when using --limit
      group_by:
        key: "all_using_limit_{{ (ansible_play_batch | length) != (groups['all'] | length) }}"
      changed_when: false
  tags: always

# NOTE(pbourke): This case covers deploying subsets of hosts using --limit. The
# limit arg will cause the first play to gather facts only about that node,
# meaning facts such as IP addresses for rabbitmq nodes etc. will be undefined
# in the case of adding a single compute node.
# NOTE(mgoddard): Divide all hosts to be queried between the hosts selected via
# the limit.
- name: Gather facts for all hosts (if using --limit)
  hosts: all_using_limit_True
  any_errors_fatal: "{{ kolla_ansible_setup_any_errors_fatal | bool }}"
  serial: '{{ kolla_serial|default("0") }}'
  gather_facts: false
  vars:
    batch_index: "{{ ansible_play_batch.index(inventory_hostname) }}"
    batch_size: "{{ ansible_play_batch | length }}"
    # Use a python list slice to divide the group up.
    # Syntax: [<start index>:<end index>:<step size>]
    delegate_hosts: "{{ groups['all'][batch_index | int::batch_size | int] }}"
  tasks:
    - name: Gather facts
      setup:
        filter: "{{ kolla_ansible_setup_filter }}"
        gather_subset: "{{ kolla_ansible_setup_gather_subset }}"
      delegate_facts: True
      delegate_to: "{{ item }}"
      with_items: "{{ delegate_hosts }}"
      # We gathered facts for all hosts in the batch during the first play.
      when:
        - not hostvars[item].ansible_facts

    - name: Gather package facts
      package_facts:
      delegate_facts: True
      delegate_to: "{{ item }}"
      with_items: "{{ delegate_hosts }}"
      when:
        - "'packages' not in hostvars[item].ansible_facts"
        - kolla_action is defined
        - "kolla_action == 'precheck'"
  tags: always
