---
# Node Ready: type = ready, status = True
# Node NotReady: type = ready, status = Unknown
- name: See if node is in ready state
  shell: >-
    {{ bin_dir }}/kubectl get node {{ inventory_hostname }}
    -o jsonpath='{ range .status.conditions[?(@.type == "Ready")].status }{ @ }{ end }'
  register: kubectl_node_ready
  delegate_to: "{{ groups['kube-master'][0] }}"
  failed_when: false
  changed_when: false

# SchedulingDisabled: unschedulable = true
# else unschedulable key doesn't exist
- name: See if node is schedulable
  shell: >-
    {{ bin_dir }}/kubectl get node {{ inventory_hostname }}
    -o jsonpath='{ .spec.unschedulable }'
  register: kubectl_node_schedulable
  delegate_to: "{{ groups['kube-master'][0] }}"
  failed_when: false
  changed_when: false

- name: Set if node needs cordoning
  set_fact:
    needs_cordoning: >-
      {% if kubectl_node_ready.stdout == "True" and not kubectl_node_schedulable.stdout -%}
      true
      {%- else -%}
      false
      {%- endif %}

- name: Cordon node
  command: "{{ bin_dir }}/kubectl cordon {{ inventory_hostname }}"
  delegate_to: "{{ groups['kube-master'][0] }}"
  when: needs_cordoning

- name: Check kubectl version
  command: "{{ bin_dir }}/kubectl version --client --short"
  register: kubectl_version
  delegate_to: "{{ groups['kube-master'][0] }}"
  run_once: yes
  changed_when: false
  when:
    - drain_nodes
    - needs_cordoning
    - drain_pod_selector

- name: Ensure minimum version for drain label selector if necessary
  assert:
    that: "kubectl_version.stdout.split(' ')[-1] is version('v1.10.0', '>=')"
  when:
    - drain_nodes
    - needs_cordoning
    - drain_pod_selector

- name: Drain node
  command: >-
    {{ bin_dir }}/kubectl drain
    --force
    --ignore-daemonsets
    --grace-period {{ drain_grace_period }}
    --timeout {{ drain_timeout }}
    --delete-local-data {{ inventory_hostname }}
    {% if drain_pod_selector %}--pod-selector '{{ drain_pod_selector }}'{% endif %}
  delegate_to: "{{ groups['kube-master'][0] }}"
  when:
    - drain_nodes
    - needs_cordoning