---
- name: Master | restart kubelet
  command: /bin/true
  notify:
    - Master | reload systemd
    - Master | reload kubelet
    - Master | wait for master static pods

- name: Master | wait for master static pods
  command: /bin/true
  notify:
    - Master | wait for the apiserver to be running
    - Master | wait for kube-scheduler
    - Master | wait for kube-controller-manager

- name: Master | Restart apiserver
  command: /bin/true
  notify:
    - Master | Remove apiserver container docker
    - Master | Remove apiserver container containerd/crio
    - Master | wait for the apiserver to be running

- name: Master | Restart kube-scheduler
  command: /bin/true
  notify:
    - Master | Remove scheduler container docker
    - Master | Remove scheduler container containerd/crio
    - Master | wait for kube-scheduler

- name: Master | Restart kube-controller-manager
  command: /bin/true
  notify:
    - Master | Remove controller manager container docker
    - Master | Remove controller manager container containerd/crio
    - Master | wait for kube-controller-manager

- name: Master | reload systemd
  systemd:
    daemon_reload: true

- name: Master | reload kubelet
  service:
    name: kubelet
    state: restarted

- name: Master | Remove apiserver container docker
  shell: docker ps -af name=k8s_kube-apiserver* -q | xargs --no-run-if-empty docker rm -f
  register: remove_apiserver_container
  retries: 10
  until: remove_apiserver_container.rc == 0
  delay: 1
  when: container_manager == "docker"

- name: Master | Remove apiserver container containerd/crio
  shell: crictl pods --name kube-apiserver* -q | xargs -I% --no-run-if-empty bash -c 'crictl stopp % && crictl rmp %'
  register: remove_apiserver_container
  retries: 10
  until: remove_apiserver_container.rc == 0
  delay: 1
  when: container_manager in ['containerd', 'crio']

- name: Master | Remove scheduler container docker
  shell: "docker ps -af name=k8s_kube-scheduler* -q | xargs --no-run-if-empty docker rm -f"
  register: remove_scheduler_container
  retries: 10
  until: remove_scheduler_container.rc == 0
  delay: 1
  when: container_manager == "docker"

- name: Master | Remove scheduler container containerd/crio
  shell: crictl pods --name kube-scheduler* -q | xargs -I% --no-run-if-empty bash -c 'crictl stopp % && crictl rmp %'
  register: remove_scheduler_container
  retries: 10
  until: remove_scheduler_container.rc == 0
  delay: 1
  when: container_manager in ['containerd', 'crio']

- name: Master | Remove controller manager container docker
  shell: "docker ps -af name=k8s_kube-controller-manager* -q | xargs --no-run-if-empty docker rm -f"
  register: remove_cm_container
  retries: 10
  until: remove_cm_container.rc == 0
  delay: 1
  when: container_manager == "docker"

- name: Master | Remove controller manager container containerd/crio
  shell: crictl pods --name kube-controller-manager* -q | xargs -I% --no-run-if-empty bash -c 'crictl stopp % && crictl rmp %'
  register: remove_cm_container
  retries: 10
  until: remove_cm_container.rc == 0
  delay: 1
  when: container_manager in ['containerd', 'crio']

- name: Master | wait for kube-scheduler
  uri:
    url: http://localhost:10251/healthz
  register: scheduler_result
  until: scheduler_result.status == 200
  retries: 60
  delay: 1

- name: Master | wait for kube-controller-manager
  uri:
    url: http://localhost:10252/healthz
  register: controller_manager_result
  until: controller_manager_result.status == 200
  retries: 60
  delay: 1

- name: Master | wait for the apiserver to be running
  uri:
    url: "{{ kube_apiserver_endpoint }}/healthz"
    validate_certs: no
    client_cert: "{{ kube_apiserver_client_cert }}"
    client_key: "{{ kube_apiserver_client_key }}"
  register: result
  until: result.status == 200
  retries: 60
  delay: 1

- name: Master | set secret_changed
  command: /bin/true
  notify:
    - Master | set secret_changed to true
    - Master | Copy new kubeconfig for root user

- name: Master | set secret_changed to true
  set_fact:
    secret_changed: true

- name: Master | Copy new kubeconfig for root user
  copy:
    src: "{{ kube_config_dir }}/admin.conf"
    dest: "{{ ansible_env.HOME | default('/root') }}/.kube/config"
    remote_src: yes
    mode: "0600"
    backup: yes