#  Copyright 2020 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: Create a custom fact directory on each host
  file:
    path: "{{ custom_fact_dir }}"
    state: directory
    mode: "{{ custom_fact_dir_mode }}"

- name: Install accelerator discovery script
  copy:
    src: inventory.fact
    dest: "{{ accelerator_discovery_script_dest }}"
    owner: root
    group: root
    mode: "{{ accelerator_discovery_script_mode }}"

- name: Add epel-release repo
  package:
    name: epel-release
    state: present
  tags: install

- name: Add elrepo GPG key
  rpm_key:
    state: present
    key: "{{ elrepo_gpg_key_url }}"
  register: elrepo_gpg_key
  until: elrepo_gpg_key is not failed
  retries: 20
  delay: 10
  tags: install

- name: Add elrepo (nvidia kmod drivers)
  package:
    name: "{{ elrepo_rpm_url }}"
    state: present
  register: elrepo
  until: elrepo is not failed
  retries: 20
  delay: 10
  tags: install

- name: Add docker community edition repository
  get_url:
    url: "{{ docker_repo_url }}"
    dest: "{{ docker_repo_dest }}"
  register: docker_repo
  until: docker_repo is not failed
  retries: 20
  delay: 10
  tags: install

- name: Permanently Disable swap
  mount:
    name: "swap"
    fstype: swap
    state: absent

- name: Disable selinux
  selinux:
    state: disabled
  tags: install

- name: Install common packages
  package:
    name: "{{ common_packages }}"
    state: present
  tags: install

- name: Versionlock docker
  command: "yum versionlock '{{ item }}'"
  args:
    warn: false
  with_items:
    - "{{ docker_packages }}"
  changed_when: true
  tags: install

- name: Collect host facts (including acclerator information)
  setup: ~

- name: Install infiniBand support
  package:
    name: "@Infiniband Support"
    state: present
  tags: install

- name: Deploy time ntp/chrony
  include_tasks: ntp.yml
  tags: install

- name: Install Nvidia drivers and software components
  include_tasks: nvidia.yml
  when:
    - ansible_local.inventory.nvidia_gpu > 0
    - ansible_facts['distribution'] == os_name
    - ansible_facts['distribution_major_version'] == os_version
  tags: install

- name: Install AMD GPU drivers and software components
  include_tasks: amd.yml
  when:
    - ansible_local.inventory.amd_gpu > 0
    - ansible_facts['distribution'] == os_name
  tags: install

- name: Get the hostname
  command: hostname
  register: machine_hostname
  changed_when: true

- name: Set facts for node hostname and ip
  set_fact:
    node_ip: "{{ inventory_hostname }}"
    node_hostname: "{{ machine_hostname.stdout }}"

- name: Add host name in hosts file
  lineinfile:
    dest: "{{ hosts_file_dest }}"
    line: "{{ inventory_hostname }} {{ machine_hostname.stdout }}"
    state: present
    create: yes
    mode: "{{ hosts_file_mode }}"

- name: Add compute hosts info in manager node hosts file
  lineinfile:
    dest: "{{ hosts_file_dest }}"
    line: "{{ hostvars[item].node_ip }} {{ hostvars[item].node_hostname }}"
    state: present
    create: yes
    mode: "{{ hosts_file_mode }}"
  with_items:
    - "{{ groups['compute'] }}"
  when: "'manager' in group_names"

- name: Add manager hosts info in compute node hosts file
  lineinfile:
    dest: "{{ hosts_file_dest }}"
    line: "{{ hostvars[item].node_ip }} {{ hostvars[item].node_hostname }}"
    state: present
    create: yes
    mode: "{{ hosts_file_mode }}"
  with_items:
    - "{{ groups['manager'] }}"
  when: "'compute' in group_names"

- name: Add login node info in /etc/hosts of manager node
  lineinfile:
    dest: "{{ hosts_file_dest }}"
    line: "{{ hostvars[item].node_ip }} {{ hostvars[item].node_hostname }}"
    state: present
    create: yes
    mode: "{{ hosts_file_mode }}"
  with_items:
    - "{{ groups['login_node'] }}"
  when:
    - '"manager" in group_names'
    - hostvars["127.0.0.1"]["login_node_required"]

- name: Add manager info in /etc/hosts of login node
  lineinfile:
    dest: "{{ hosts_file_dest }}"
    line: "{{ hostvars[item].node_ip }} {{ hostvars[item].node_hostname }}"
    state: present
    create: yes
    mode: "{{ hosts_file_mode }}"
  with_items:
    - "{{ groups['manager'] }}"
  when:
    - '"login_node" in group_names'
    - hostvars["127.0.0.1"]["login_node_required"]

- name: Add compute info in /etc/hosts of login node
  lineinfile:
    dest: "{{ hosts_file_dest }}"
    line: "{{ hostvars[item].node_ip }} {{ hostvars[item].node_hostname }}"
    state: present
    create: yes
    mode: "{{ hosts_file_mode }}"
  with_items:
    - "{{ groups['compute'] }}"
  when:
    - hostvars["127.0.0.1"]["login_node_required"]
    - '"login_node" in group_names'