---
- name: Create the directory for the kubernetes_config_file
  file:
    path: "{{ kubernetes_kubeadm_kubelet_config_file_path | dirname }}"
    state: directory

- name: Deploy the config-file for kubeadm and kubelet
  template:
    src: "kubeadm-kubelet-config.j2"
    dest: "{{ kubernetes_kubeadm_kubelet_config_file_path }}"

- name: Initialize Kubernetes control plane with kubeadm init
  command: >
    kubeadm init
    --config {{ kubernetes_kubeadm_kubelet_config_file_path }}
    {{ kubernetes_kubeadm_init_extra_opts }}
  register: kubeadmin_init
  when: (not kubernetes_init_stat.stat.exists) and (kubernetes_ignore_preflight_errors is not defined)

- name: Initialize Kubernetes control plane with kubeadm init and ignore_preflight_errors
  command: >
    kubeadm init
    --config {{ kubernetes_kubeadm_kubelet_config_file_path }}
    --ignore-preflight-errors={{ kubernetes_ignore_preflight_errors }}
    {{ kubernetes_kubeadm_init_extra_opts }}
  register: kubeadmin_init
  when: (not kubernetes_init_stat.stat.exists) and (kubernetes_ignore_preflight_errors is defined)

- name: Print the init output to screen.
  debug:
    var: kubeadmin_init.stdout
    verbosity: 2
  when: not kubernetes_init_stat.stat.exists

- name: Ensure .kube directory exists.
  file:
    path: ~/.kube
    state: directory
    mode: 0755

- name: Symlink the kubectl admin.conf to ~/.kube/conf.
  file:
    src: /etc/kubernetes/admin.conf
    dest: ~/.kube/config
    state: link
    mode: 0644

- name: Configure Flannel networking.
  command: "kubectl apply -f {{ kubernetes_flannel_manifest_file }}"
  register: flannel_result
  changed_when: "'created' in flannel_result.stdout"
  when: kubernetes_pod_network.cni == 'flannel'
  until: flannel_result is not failed
  retries: 12
  delay: 5

- name: Configure Calico networking.
  command: "kubectl apply -f {{ kubernetes_calico_manifest_file }}"
  register: calico_result
  changed_when: "'created' in calico_result.stdout"
  when: kubernetes_pod_network.cni == 'calico'
  until: calico_result is not failed
  retries: 12
  delay: 5

- name: Get Kubernetes version for Weave installation.
  shell: kubectl version | base64 | tr -d '\n'
  changed_when: false
  register: kubectl_version
  when: kubernetes_pod_network.cni == 'weave'
  until: kubectl_version is not failed
  retries: 12
  delay: 5

- name: Configure Weave networking.
  command: "{{ item }}"
  with_items:
    - "kubectl apply -f https://cloud.weave.works/k8s/net?k8s-version={{ kubectl_version.stdout_lines[0] }}"
  register: weave_result
  changed_when: "'created' in weave_result.stdout"
  when: kubernetes_pod_network.cni == 'weave'

# TODO: Check if taint exists with something like `kubectl describe nodes`
# instead of using kubernetes_init_stat.stat.exists check.
- name: Allow pods on control plane (if configured).
  command: "kubectl taint nodes --all node-role.kubernetes.io/control-plane-"
  when:
    - kubernetes_allow_pods_on_control_plane | bool
    - not kubernetes_init_stat.stat.exists
