---
- name: Populate config host groups
  hosts: localhost
  connection: local
  become: no
  gather_facts: no
  tasks:
  - name: Load group name mapping variables
    include_vars: vars/cluster_hosts.yml

  - name: Evaluate groups - g_etcd_hosts or g_new_etcd_hosts required
    fail:
      msg: This playbook requires g_etcd_hosts or g_new_etcd_hosts to be set
    when: g_etcd_hosts is not defined and g_new_etcd_hosts is not defined

  - name: Evaluate groups - g_master_hosts or g_new_master_hosts required
    fail:
      msg: This playbook requires g_master_hosts or g_new_master_hosts to be set
    when: g_master_hosts is not defined and g_new_master_hosts is not defined

  - name: Evaluate groups - g_node_hosts or g_new_node_hosts required
    fail:
      msg: This playbook requires g_node_hosts or g_new_node_hosts to be set
    when: g_node_hosts is not defined and g_new_node_hosts is not defined

  - name: Evaluate groups - g_lb_hosts required
    fail:
      msg: This playbook requires g_lb_hosts to be set
    when: g_lb_hosts is not defined

  - name: Evaluate groups - g_nfs_hosts required
    fail:
      msg: This playbook requires g_nfs_hosts to be set
    when: g_nfs_hosts is not defined

  - name: Evaluate groups - g_nfs_hosts is single host
    fail:
      msg: The nfs group must be limited to one host
    when: g_nfs_hosts | default([]) | length > 1

  - name: Evaluate groups - g_glusterfs_hosts required
    fail:
      msg: This playbook requires g_glusterfs_hosts to be set
    when: g_glusterfs_hosts is not defined

  - name: Evaluate groups - Fail if no etcd hosts group is defined
    fail:
      msg: >
        Running etcd as an embedded service is no longer supported.
    when:
    - g_etcd_hosts | default([]) | length not in [3,1]
    - not (openshift_node_bootstrap | default(False))

  - name: Evaluate oo_all_hosts
    add_host:
      name: "{{ item }}"
      groups: oo_all_hosts
      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}"
      ansible_become: "{{ g_sudo | default(omit) }}"
    with_items: "{{ g_all_hosts | default([]) }}"
    changed_when: no

  - name: Evaluate oo_masters
    add_host:
      name: "{{ item }}"
      groups: oo_masters
      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}"
      ansible_become: "{{ g_sudo | default(omit) }}"
    with_items: "{{ g_master_hosts | union(g_new_master_hosts) | default([]) }}"
    changed_when: no

  - name: Evaluate oo_first_master
    add_host:
      name: "{{ g_master_hosts[0] }}"
      groups: oo_first_master
      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}"
      ansible_become: "{{ g_sudo | default(omit) }}"
    when: g_master_hosts|length > 0
    changed_when: no

  - name: Evaluate oo_new_etcd_to_config
    add_host:
      name: "{{ item }}"
      groups: oo_new_etcd_to_config
      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}"
      ansible_become: "{{ g_sudo | default(omit) }}"
    with_items: "{{ g_new_etcd_hosts | default([]) }}"
    changed_when: no

  - name: Evaluate oo_masters_to_config
    add_host:
      name: "{{ item }}"
      groups: oo_masters_to_config
      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}"
      ansible_become: "{{ g_sudo | default(omit) }}"
    with_items: "{{ g_new_master_hosts | default(g_master_hosts | default([], true), true) }}"
    changed_when: no

  - name: Evaluate oo_etcd_to_config
    add_host:
      name: "{{ item }}"
      groups: oo_etcd_to_config
      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}"
      ansible_become: "{{ g_sudo | default(omit) }}"
    with_items: "{{ g_etcd_hosts | default([]) }}"
    changed_when: no

  - name: Evaluate oo_first_etcd
    add_host:
      name: "{{ g_etcd_hosts[0] }}"
      groups: oo_first_etcd
      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}"
      ansible_become: "{{ g_sudo | default(omit) }}"
    when: g_etcd_hosts|length > 0
    changed_when: no

  # We use two groups one for hosts we're upgrading which doesn't include embedded etcd
  # The other for backing up which includes the embedded etcd host, there's no need to
  # upgrade embedded etcd that just happens when the master is updated.
  - name: Evaluate oo_etcd_hosts_to_upgrade
    add_host:
      name: "{{ item }}"
      groups: oo_etcd_hosts_to_upgrade
    with_items: "{{ groups.oo_etcd_to_config if groups.oo_etcd_to_config is defined and groups.oo_etcd_to_config | length > 0 else [] }}"
    changed_when: False

  - name: Evaluate oo_etcd_hosts_to_backup
    add_host:
      name: "{{ item }}"
      groups: oo_etcd_hosts_to_backup
    with_items: "{{ groups.oo_etcd_to_config if groups.oo_etcd_to_config is defined and groups.oo_etcd_to_config | length > 0 else (groups.oo_first_master | default([])) }}"
    changed_when: False

  - name: Evaluate oo_nodes_to_config
    add_host:
      name: "{{ item }}"
      groups: oo_nodes_to_config
      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}"
      ansible_become: "{{ g_sudo | default(omit) }}"
    with_items: "{{ g_new_node_hosts | default(g_node_hosts | default([], true), true) }}"
    changed_when: no

  # Skip adding the master to oo_nodes_to_config when g_new_node_hosts is
  - name: Add master to oo_nodes_to_config
    add_host:
      name: "{{ item }}"
      groups: oo_nodes_to_config
      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}"
      ansible_become: "{{ g_sudo | default(omit) }}"
    with_items: "{{ g_master_hosts | default([]) }}"
    when: g_nodeonmaster | default(false) | bool and not g_new_node_hosts | default(false) | bool
    changed_when: no

  - name: Evaluate oo_lb_to_config
    add_host:
      name: "{{ item }}"
      groups: oo_lb_to_config
      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}"
      ansible_become: "{{ g_sudo | default(omit) }}"
    with_items: "{{ g_lb_hosts | default([]) }}"
    changed_when: no

  - name: Evaluate oo_nfs_to_config
    add_host:
      name: "{{ item }}"
      groups: oo_nfs_to_config
      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}"
      ansible_become: "{{ g_sudo | default(omit) }}"
    with_items: "{{ g_nfs_hosts | default([]) }}"
    changed_when: no

  - name: Evaluate oo_glusterfs_to_config
    add_host:
      name: "{{ item }}"
      groups: oo_glusterfs_to_config
      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}"
      ansible_become: "{{ g_sudo | default(omit) }}"
    with_items: "{{ g_glusterfs_hosts | union(g_glusterfs_registry_hosts | default([])) }}"
    changed_when: no

  - name: Evaluate oo_etcd_to_migrate
    add_host:
      name: "{{ item }}"
      groups: oo_etcd_to_migrate
      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}"
      ansible_become: "{{ g_sudo | default(omit) }}"
    with_items: "{{ groups.oo_etcd_to_config if groups.oo_etcd_to_config | default([]) | length != 0 else (groups.oo_first_master |default([]))}}"
    changed_when: no