---
- name: Populate config host groups
  hosts: localhost
  connection: local
  become: no
  gather_facts: no
  tasks:
  - 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. If this is a
        new install please define an 'etcd' group with either one or three
        hosts. These hosts may be the same hosts as your masters. If this is an
        upgrade you may set openshift_master_unsupported_embedded_etcd=true
        until a migration playbook becomes available.
    when:
    - g_etcd_hosts | default([]) | length not in [3,1]
    - not openshift_master_unsupported_embedded_etcd | default(False)
    - 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
