---
- name: Cluster Installation
  hosts: kubernetes
  become: true
  gather_facts: true
  any_errors_fatal: true
  pre_tasks:
    - name: Pausing for 2 seconds...
      ansible.builtin.pause:
        seconds: 2
  tasks:
    - name: Check if cluster is installed
      check_mode: false
      ansible.builtin.stat:
        path: /etc/rancher/k3s/config.yaml
      register: k3s_installed

    - name: Ignore manifests templates and urls if the cluster is already installed
      when: k3s_installed.stat.exists
      ansible.builtin.set_fact:
        k3s_server_manifests_templates: []
        k3s_server_manifests_urls: []

    - name: Install Kubernetes
      ansible.builtin.include_role:
        name: xanmanning.k3s
        public: true
      vars:
        k3s_state: installed

    - name: Kubeconfig
      ansible.builtin.include_tasks: tasks/kubeconfig.yaml
      vars:
        repository_base: "{{ lookup('ansible.builtin.pipe', 'git rev-parse --show-toplevel') }}"

    - name: Wait for custom manifests to rollout
      when:
        - k3s_primary_control_node
        - (k3s_server_manifests_templates | length > 0
            or k3s_server_manifests_urls | length > 0)
      kubernetes.core.k8s_info:
        kubeconfig: /etc/rancher/k3s/k3s.yaml
        kind: "{{ item.kind }}"
        name: "{{ item.name }}"
        namespace: "{{ item.namespace | default('') }}"
        wait: true
        wait_sleep: 10
        wait_timeout: 360
      loop:
        - { name: cilium, kind: HelmChart, namespace: kube-system }
        - { name: coredns, kind: HelmChart, namespace: kube-system }
        - { name: policy, kind: CiliumL2AnnouncementPolicy }
        - { name: pool, kind: CiliumLoadBalancerIPPool }
        - { name: podmonitors.monitoring.coreos.com, kind: CustomResourceDefinition }
        - { name: prometheusrules.monitoring.coreos.com, kind: CustomResourceDefinition }
        - { name: scrapeconfigs.monitoring.coreos.com, kind: CustomResourceDefinition }
        - { name: servicemonitors.monitoring.coreos.com, kind: CustomResourceDefinition }

    - name: Coredns
      when: k3s_primary_control_node
      ansible.builtin.include_tasks: tasks/coredns.yaml

    - name: Cilium
      when: k3s_primary_control_node
      ansible.builtin.include_tasks: tasks/cilium.yaml

    - name: Cruft
      when: k3s_primary_control_node
      ansible.builtin.include_tasks: tasks/cruft.yaml

    - name: Stale Containers
      ansible.builtin.include_tasks: tasks/stale_containers.yaml
      vars:
        stale_containers_state: disabled

    # - name: Helm controller
    #   notify: Restart Kubernetes
    #   when: k3s_control_node
    #   ansible.builtin.include_tasks: tasks/helm_controller.yaml

    # TODO: Replace this with embedded spegel in the future
    - name: Copy custom containerd configuration
      when: inventory_hostname != 'temp'
      notify: Restart Kubernetes
      ansible.builtin.copy:
        src: files/config.toml.tmpl
        dest: /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl
        owner: root
        group: root
        mode: "0644"

    - name: Copy custom containerd configuration
      when: inventory_hostname == 'temp'
      notify: Restart Kubernetes
      ansible.builtin.copy:
        src: files/config.nvidia.toml.tmpl
        dest: /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl
        owner: root
        group: root
        mode: "0644"


  handlers:
    - name: Restart Kubernetes
      ansible.builtin.systemd:
        name: k3s
        state: restarted