---
- name: Set kubeadm_discovery_address
  set_fact:
    kubeadm_discovery_address: >-
      {%- if "127.0.0.1" or "localhost" in kube_apiserver_endpoint -%}
      {{ first_kube_master }}:{{ kube_apiserver_port }}
      {%- else -%}
      {{ kube_apiserver_endpoint }}
      {%- endif %}
  when: not is_kube_master
  tags:
    - facts

- name: Check if kubelet.conf exists
  stat:
    path: "{{ kube_config_dir }}/kubelet.conf"
  register: kubelet_conf

- name: Calculate kubeadm CA cert hash
  shell: openssl x509 -pubkey -in {{ kube_config_dir }}/ssl/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
  register: kubeadm_ca_hash
  delegate_to: "{{ groups['kube-master'][0] }}"
  run_once: true

- name: Create kubeadm token for joining nodes with 24h expiration (default)
  command: "{{ bin_dir }}/kubeadm token create"
  run_once: true
  register: temp_token
  delegate_to: "{{ groups['kube-master'][0] }}"

- name: Create kubeadm client config
  template:
    src: kubeadm-client.conf.j2
    dest: "{{ kube_config_dir }}/kubeadm-client.conf"
    backup: yes
  when: not is_kube_master
  vars:
    kubeadm_token: "{{ temp_token.stdout }}"
  register: kubeadm_client_conf

- name: Join to cluster if needed
  command: >-
    {{ bin_dir }}/kubeadm join
    --config {{ kube_config_dir}}/kubeadm-client.conf
    --ignore-preflight-errors=all
  register: kubeadm_join
  when: not is_kube_master and (kubeadm_client_conf.changed or not kubelet_conf.stat.exists)

- name: Wait for kubelet bootstrap to create config
  wait_for:
    path: "{{ kube_config_dir }}/kubelet.conf"
    delay: 1
    timeout: 60

- name: Update server field in kubelet kubeconfig
  replace:
    path: "{{ kube_config_dir }}/kubelet.conf"
    regexp: '(\s+)https://{{ first_kube_master }}:{{ kube_apiserver_port }}(\s+.*)?$'
    replace: '\1{{ kube_apiserver_endpoint }}\2'
    backup: yes
  when: not is_kube_master and kubeadm_discovery_address != kube_apiserver_endpoint
  notify: restart kubelet

# FIXME(mattymo): Reconcile kubelet kubeconfig filename for both deploy modes
- name: Symlink kubelet kubeconfig for calico/canal
  file:
    src: "{{ kube_config_dir }}//kubelet.conf"
    dest: "{{ kube_config_dir }}/node-kubeconfig.yaml"
    state: link
    force: yes
  when: kube_network_plugin in ['calico','canal']
