# Copyright 2022 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---

- name: Initialize variables
  set_fact:
    cobbler_container_status: false
    cobbler_image_status: false
    cobbler_config_status: false
    backup_map_status: false
    new_node_status: false
    provision_os_change: false
    previous_os: None
  tags: install

- name: Set centos kickstart file name
  set_fact:
    cobbler_kickstart_file: "{{ cobbler_centos_ks }}"
  when: provision_os == os_supported_centos

- name: Set rocky kickstart file name
  set_fact:
    cobbler_kickstart_file: "{{ cobbler_rocky_ks }}"
  when: provision_os == os_supported_rocky

- name: Set rocky kickstart file name
  set_fact:
    cobbler_kickstart_file: "{{ cobbler_leap_ks }}"
  when: provision_os == os_supported_leap

- name: Check if any backup file exists
  block:
  - name: Check status of backup file
    stat:
      path: "{{ role_path }}/files/backup_mapping_file.csv"
    register: backup_map

  - name: Set status for backup file
    set_fact:
      backup_map_status: true
    when: backup_map.stat.exists
  rescue:
  - name: Message
    debug:
      msg: "All nodes are new"
      verbosity: 2

- name: Get K8s namespaces
  command: kubectl get namespaces
  changed_when: false
  register: k8s_namespaces

- name: Create namespace network-config
  command: kubectl create namespace cobbler
  changed_when: true
  when: cobbler_namespace not in k8s_namespaces.stdout

- name: Inspect the cobbler image
  command: buildah images
  register: cobbler_image_result
  failed_when: false
  changed_when: false
  tags: install

- name: Check cobbler pod status on the machine
  command: kubectl get pods -n {{ cobbler_namespace }}
  register: cobbler_pod_result
  failed_when: false
  changed_when: false
  tags: install

- name: Update cobbler image status
  set_fact:
    cobbler_image_status: true
  when: cobbler_image_name in cobbler_image_result.stdout
  tags: install

- name: Update cobbler container status
  set_fact:
    cobbler_container_status: true
  when: "'cobbler' in cobbler_pod_result.stdout"
  tags: install

- name: Get cobbler pod name
  command: 'kubectl get pod -n {{ cobbler_namespace }} -l app=cobbler -o jsonpath="{.items[0].metadata.name}"'
  changed_when: false
  register: cobbler_pod_name
  when: cobbler_container_status
  tags: install

- name: Fetch cobbler profile list
  command: "kubectl exec --stdin --tty -n {{ cobbler_namespace }} {{ cobbler_pod_name.stdout }} -- cobbler profile list"
  changed_when: false
  register: cobbler_profile_list
  failed_when: false
  when: cobbler_container_status

- name: Check crontab list
  command: "kubectl exec --stdin --tty -n {{ cobbler_namespace }} {{ cobbler_pod_name.stdout }} -- crontab -l"
  changed_when: false
  register: crontab_list
  failed_when: false
  when: cobbler_container_status

- name: Check if .provisioned_os file exists
  stat:
    path: "/root/omnia/control_plane/roles/provision_cobbler/files/.provisioned_os"
  register: provisioned_os_file

- name: Create .provisioned_os file
  file:
    path: "{{ role_path }}/files/.provisioned_os"
    state: touch
    mode: "{{ temp_file_perm }}"
  when: not provisioned_os_file.stat.exists

- name: Check status of .provisioned_os file
  stat:
    path: "{{ role_path }}/files/.provisioned_os"
  register: provisioned_os_file

- name: Get the previous os provisioned
  set_fact:
    previous_os: "{{ lookup('file', '{{ role_path }}/files/.provisioned_os').split() | last }}"
  when:
    - provisioned_os_file.stat.exists
    - provisioned_os_file.stat.size > 0

- name: Update cobbler config status
  set_fact:
    cobbler_config_status: true
  when:
    - cobbler_container_status
    - (provision_os in cobbler_profile_list.stdout) or (previous_os in cobbler_profile_list.stdout) or ( "" in cobbler_profile_list.stdout)
    - "'* * * * * /usr/bin/ansible-playbook /root/tftp.yml' in crontab_list.stdout"
    - "'*/5 * * * * /usr/bin/ansible-playbook /root/inventory_creation.yml' in crontab_list.stdout"

- name: Set status for provison_os_change
  set_fact:
    provision_os_change: true
  when:
    - previous_os != None
    - previous_os != provision_os
    - cobbler_config_status