---
- name: Check if the master has embedded etcd
  hosts: localhost
  connection: local
  become: no
  gather_facts: no
  tags:
  - always
  tasks:
  - fail:
      msg: "Migration of an embedded etcd is not supported. Please, migrate the embedded etcd into an external etcd first."
    when:
    - groups.oo_etcd_to_config | default([]) | length == 0

- name: Run pre-checks
  hosts: oo_etcd_to_migrate
  tasks:
  - include_role:
      name: etcd
      tasks_from: migrate.pre_check
    vars:
      r_etcd_common_embedded_etcd: "{{ groups.oo_etcd_to_config | default([]) | length == 0 }}"
      etcd_peer: "{{ ansible_default_ipv4.address }}"

# TODO: This will be different for release-3.6 branch
- name: Prepare masters for etcd data migration
  hosts: oo_masters_to_config
  tasks:
  - set_fact:
      master_services:
      - "{{ openshift.common.service_type + '-master-controllers' }}"
      - "{{ openshift.common.service_type + '-master-api' }}"
  - debug:
      msg: "master service name: {{ master_services }}"
  - name: Stop masters
    service:
      name: "{{ item }}"
      state: stopped
    with_items: "{{ master_services }}"

- name: Backup v2 data
  hosts: oo_etcd_to_migrate
  gather_facts: no
  roles:
  - role: openshift_facts
  post_tasks:
  - include_role:
      name: etcd
      tasks_from: backup
    vars:
      r_etcd_common_etcd_runtime: "{{ openshift.common.etcd_runtime }}"
      r_etcd_common_backup_tag: pre-migration
      r_etcd_common_embedded_etcd: "{{ groups.oo_etcd_to_config | default([]) | length == 0 }}"
      r_etcd_common_backup_sufix_name: "{{ lookup('pipe', 'date +%Y%m%d%H%M%S') }}"

- name: Gate on etcd backup
  hosts: localhost
  connection: local
  become: no
  tasks:
  - set_fact:
      etcd_backup_completed: "{{ hostvars
                                 | oo_select_keys(groups.oo_etcd_to_migrate)
                                 | oo_collect('inventory_hostname', {'r_etcd_common_backup_complete': true}) }}"
  - set_fact:
      etcd_backup_failed: "{{ groups.oo_etcd_to_migrate | difference(etcd_backup_completed) | list }}"
  - fail:
      msg: "Migration cannot continue. The following hosts did not complete etcd backup: {{ etcd_backup_failed | join(',') }}"
    when:
    - etcd_backup_failed | length > 0

- name: Stop etcd
  hosts: oo_etcd_to_migrate
  gather_facts: no
  pre_tasks:
  - include_role:
      name: etcd
      tasks_from: disable_etcd
    vars:
      r_etcd_common_etcd_runtime: "{{ openshift.common.etcd_runtime }}"

- name: Migrate data on first etcd
  hosts: oo_etcd_to_migrate[0]
  gather_facts: no
  tasks:
  - include_role:
      name: etcd
      tasks_from: migrate
    vars:
      r_etcd_common_embedded_etcd: "{{ groups.oo_etcd_to_config | default([]) | length == 0 }}"
      etcd_peer: "{{ openshift.common.ip }}"
      etcd_url_scheme: "https"
      etcd_peer_url_scheme: "https"

- name: Clean data stores on remaining etcd hosts
  hosts: oo_etcd_to_migrate[1:]
  gather_facts: no
  tasks:
  - include_role:
      name: etcd
      tasks_from: clean_data
    vars:
      r_etcd_common_embedded_etcd: "{{ groups.oo_etcd_to_config | default([]) | length == 0 }}"
      etcd_peer: "{{ openshift.common.ip }}"
      etcd_url_scheme: "https"
      etcd_peer_url_scheme: "https"
  - name: Add etcd hosts
    delegate_to: localhost
    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: "{{ groups.oo_etcd_to_migrate[1:] | default([]) }}"
    changed_when: no
  - name: Set success
    set_fact:
      r_etcd_migrate_success: true

- include: ./scaleup.yml

- name: Gate on etcd migration
  hosts: oo_masters_to_config
  gather_facts: no
  tasks:
  - set_fact:
      etcd_migration_completed: "{{ hostvars
                                 | oo_select_keys(groups.oo_etcd_to_migrate)
                                 | oo_collect('inventory_hostname', {'r_etcd_migrate_success': true}) }}"
  - set_fact:
      etcd_migration_failed: "{{ groups.oo_etcd_to_migrate | difference(etcd_migration_completed) | list }}"

- name: Add TTLs on the first master
  hosts: oo_first_master[0]
  tasks:
  - include_role:
      name: etcd
      tasks_from: migrate.add_ttls
    vars:
      etcd_peer: "{{ hostvars[groups.oo_etcd_to_migrate.0].openshift.common.ip }}"
      etcd_url_scheme: "https"
      etcd_peer_url_scheme: "https"
    when: etcd_migration_failed | length == 0

- name: Configure masters if etcd data migration is succesfull
  hosts: oo_masters_to_config
  tasks:
  - include_role:
      name: etcd
      tasks_from: migrate.configure_master
    when: etcd_migration_failed | length == 0
  - debug:
      msg: "Skipping master re-configuration since migration failed."
    when:
    - etcd_migration_failed | length > 0
  - name: Start master services
    service:
      name: "{{ item }}"
      state: started
    register: service_status
    # Sometimes the master-api, resp. master-controllers fails to start for the first time
    until: service_status.state is defined and service_status.state == "started"
    retries: 5
    delay: 10
    with_items: "{{ master_services[::-1] }}"
  - fail:
      msg: "Migration failed. The following hosts were not properly migrated: {{ etcd_migration_failed | join(',') }}"
    when:
    - etcd_migration_failed | length > 0
