#  Copyright 2021 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: Wait for CoreDNS to restart
  command: kubectl rollout status deployment/coredns -n kube-system
  changed_when: false
  failed_when: false

- name: Get K8s pods
  command: kubectl get pods --all-namespaces
  changed_when: false
  register: k8s_pods

- name: Deploy MetalLB
  command: "kubectl apply -f '{{ metallb_yaml_url }}'"
  changed_when: true
  when: "'metallb' not in k8s_pods.stdout"

- name: Create MetalLB Setup Config Files
  copy:
    src: metal-config.yaml
    dest: "{{ metallb_config_file_dest }}"
    owner: root
    group: root
    mode: "{{ metallb_config_file_mode }}"

- name: Replace metallb_addresses
  replace:
    path: "{{ metallb_config_file_dest }}"
    regexp: 'addresses:'
    replace: "{{ metallb_addresses }}"

- name: Remove ^M characters from metal-config file
  shell: 'sed -e "s/\r//g" {{ metallb_config_file_dest }} > {{ metallb_config_updated_file_dest }}'
  args:
    warn: false
  changed_when: true

- name: Update metal-config file permissions
  file:
    path: "{{ metallb_config_updated_file_dest }}"
    owner: root
    group: root
    mode: "{{ metallb_config_file_mode }}"

- name: Remove old metallb-config file
  file:
    path: "{{ metallb_config_file_dest }}"
    state: absent

- name: Create MetalLB Setup Deployment Files
  copy:
    src: metallb.yaml
    dest: "{{ metallb_deployment_file_dest }}"
    owner: root
    group: root
    mode: "{{ metallb_deployment_file_mode }}"

- name: Replace metallb_container_port
  replace:
    path: "{{ metallb_deployment_file_dest }}"
    regexp: 'metallb_container_port'
    replace: "{{ metallb_container_port }}"

- name: Replace metallb_container_port
  replace:
    path: "{{ metallb_deployment_file_dest }}"
    regexp: 'metallb_run_as_user_port'
    replace: "{{ metallb_run_as_user_port }}"

- name: Deploy MetalLB
  command: "kubectl apply -f '{{ metallb_deployment_file_dest }}'"
  changed_when: true
  when: "'metallb' not in k8s_pods.stdout"

- name: Create default setup for MetalLB
  command: "kubectl apply -f '{{ metallb_config_updated_file_dest }}'"
  changed_when: true
  when: "'metallb' not in k8s_pods.stdout"

- name: Deploy K8s dashboard
  command: "kubectl apply -f {{ k8s_dashboard_yaml_url }}"
  changed_when: true
  when: "'kubernetes-dashboard' not in k8s_pods.stdout"

- name: Copy k8s_dashboard_admin.yml file
  copy:
    src: k8s_dashboard_admin.yaml
    dest: "{{ k8s_dashboard_admin_file_dest }}"
    owner: root
    group: root
    mode: "{{ k8s_dashboard_admin_file_mode }}"

- name: Create admin user for K8s dashboard
  command: "kubectl apply -f {{ k8s_dashboard_admin_file_dest }}"
  changed_when: true

- name: Start NFS Client Provisioner
  command: "helm install nfs-control-plane stable/nfs-client-provisioner --set nfs.server='{{ public_ip }}' --set nfs.path='{{ nfs_path }}'"
  changed_when: true
  when: "'nfs-client-provisioner' not in k8s_pods.stdout"

- name: Set NFS-Client Provisioner as DEFAULT StorageClass
  shell: >
    kubectl patch storageclasses.storage.k8s.io nfs-client \
    -p '{ "metadata": { "annotations":{ "storageclass.kubernetes.io/is-default-class":"true" }}}'
  changed_when: true

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

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