---
# Install OpenCL drivers.

## Step 0/3: Dependencies ##
- name: Miner | Driver | AMDGPU | Variables
  set_fact:
    amdgpu_cron_job: AMDGPU - Need To Finish Installation
    amdgpu_cron_cmd: "{{ root_home.stdout }}/scm.sh"

- name: Miner | Driver | AMDGPU | Install Dependencies
  package: 
    name: 
      - dkms 
      - mesa-common-dev
      - clinfo
    state: present

- name: Miner | Driver | AMDGPU | Set GRUB Timer
  lineinfile:
    path: /etc/default/grub
    regexp: '^GRUB_TIMEOUT='
    line: 'GRUB_TIMEOUT=3'
    state: present
    backup: yes

- name: Miner | Driver | AMDGPU | Remove Previous Run's Cron Job
  cron:
    user: root
    name: "{{ amdgpu_cron_job }}"
    state: absent

# Tests
- name: Miner | Driver | AMDGPU | Check If GA Kernel Installed
  shell: 'uname --kernel-release | grep 5.4.0-65-generic'
  register: ga_kernel
  ignore_errors: yes

- name: Miner | Driver | AMDGPU | Check If HWE Kernel Installed
  shell: 'apt search linux-image-5.8.0-* | grep -c installed'
  register: hwe_kernel
  ignore_errors: yes

#- name: Miner | Driver | AMDGPU | Check If All Driver Installed
#  shell: 'which amdgpu-uninstall'
#  register: amdgpu_install
#  ignore_errors: yes

- name: Miner | Driver | AMDGPU | Check If Pro Driver Installed
  shell: 'amdgpu-pro-uninstall -y'
  register: amdgpu_install
  ignore_errors: yes

- name: Miner | Driver | AMDGPU | DEBUG
  debug:
    var: "{{ item }}"
  loop:
    - ga_kernel
    - hwe_kernel
    - amdgpu_install



## Step 1/3: Get Correct Kernel ##
- name: Miner | Driver | AMDGPU | Install Recommended GA Kernel
  shell: apt install --install-recommends linux-generic 
  when: amdgpu_install.failed and hwe_kernel.stdout != "0" and ga_kernel.failed

- name: Miner | Driver | AMDGPU | Install Specific GA Kernel For Booting
  package:
    name: 
      - linux-headers-5.4.0-65 
      - linux-headers-5.4.0-65-generic 
      - linux-headers-generic 
      - linux-image-generic 
      - linux-modules-extra-5.4.0-65-generic
    state: present
  when: amdgpu_install.failed and hwe_kernel.stdout != "0" and ga_kernel.failed

- name: Miner | Driver | AMDGPU | Prepare GRUB To Boot GA Kernel
  lineinfile:
    path: /etc/default/grub
    regexp: '^GRUB_DEFAULT='
    line: 'GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.4.0-65-generic"'
    state: present
    backup: yes
  when: amdgpu_install.failed and hwe_kernel.stdout != "0" and ga_kernel.failed

- name: Miner | Driver | AMDGPU | Update GRUB
  shell: update-grub
  when: amdgpu_install.failed and hwe_kernel.stdout != "0" and ga_kernel.failed

- name: Miner | Driver | AMDGPU | Prepare Cron Job To SCM
  cron:
    user: root
    name: "{{ amdgpu_cron_job }}"
    special_time: reboot
    job: "{{ amdgpu_cron_cmd }}"
    state: present
    disabled: no
  when: amdgpu_install.failed and hwe_kernel.stdout != "0" and ga_kernel.failed

- name: Miner | Driver | AMDGPU | Reboot To GA Kernel
  shell: reboot
  when: amdgpu_install.failed and hwe_kernel.stdout != "0" and ga_kernel.failed

- pause:
    prompt: "Rebooting to GA kernel! Please hold."
  when: amdgpu_install.failed and hwe_kernel.stdout != "0" and ga_kernel.failed



## Step 2/3: Remove Incorrect Kernels ##
- name: Miner | Driver | AMDGPU | Remove Bad Kernels
  shell: "apt remove --purge linux-generic-hwe-20.04 \
                             linux-oem-20.04 \
                             linux-hwe-* \
                             linux-oem-* \
                             linux-modules-5.1* \
                             linux-modules-5.8.0-* \
                             linux-modules-5.6.0-*"
  when: amdgpu_install.failed and hwe_kernel.stdout != "0"

- name: Miner | Driver | AMDGPU | Update + Clean System
  shell: "apt update; apt dist-upgrade -y; apt autoremove -y"
  when: amdgpu_install.failed and hwe_kernel.stdout != "0"

# This is to ensure we can test adding `apt install --install-recommends linux-generic` later 
- name: Miner | Driver | AMDGPU | Boot Default Kernel
  lineinfile:
    path: /etc/default/grub
    regexp: '^GRUB_DEFAULT='
    line: 'GRUB_DEFAULT=0'
    state: present
    backup: yes
  when: amdgpu_install.failed and hwe_kernel.stdout != "0"

- name: Miner | Driver | AMDGPU | Update GRUB
  shell: update-grub
  when: amdgpu_install.failed and hwe_kernel.stdout != "0"

- name: Miner | Driver | AMDGPU | Prepare Cron Job To SCM
  cron:
    user: root
    name: "{{ amdgpu_cron_job }}"
    special_time: reboot
    job: "{{ amdgpu_cron_cmd }}"
    state: present
    disabled: no
  when: amdgpu_install.failed and hwe_kernel.stdout != "0"

# This reboot may not be necessary.
#- name: Miner | Driver | AMDGPU | Reboot To Ensure GA Is 0
#  shell: reboot
#  when: amdgpu_install.failed and hwe_kernel.stdout != "0"
#
#- pause:
#    prompt: "Rebooting to clear kernels! Please hold."
#  when: amdgpu_install.failed and hwe_kernel.stdout != "0"



## Step 3/3: Install AMD PRO Driver ##
- name: Miner | Driver | AMDGPU | Download Driver
  shell: 'scp ling@leet:InstallFiles/Drivers/amdgpu-pro-20.45-1188099-ubuntu-20.04.tar.xz {{ root_home.stdout }}/Downloads/'
  when: amdgpu_install.failed or "1" == "1"

- name: Miner | Driver | AMDGPU | Extract Tarball
  shell: 'cd {{ root_home.stdout }}/Downloads; tar -xvf amdgpu-pro-20.45-1188099-ubuntu-20.04.tar.xz'
  when: amdgpu_install.failed or "1" == "1"

## Only one driver set can exist at a time! ##
#- name: Miner | Driver | AMDGPU | Install AMDGPU All Driver
#  shell: 'cd {{ root_home.stdout }}/Downloads/amdgpu-pro-20.45-1188099-ubuntu-20.04; ./amdgpu-install -y'
#  when: amdgpu_install.failed

- name: Miner | Driver | AMDGPU | Install AMDGPU-Pro Driver
  shell: 'cd {{ root_home.stdout }}/Downloads/amdgpu-pro-20.45-1188099-ubuntu-20.04; ./amdgpu-pro-install -y --opencl=pal,legacy'
  when: amdgpu_install.failed or "1" == "1"

- name: Miner | Driver | AMDGPU | Prepare Cron Job To SCM
  cron:
    user: root
    name: "{{ amdgpu_cron_job }}"
    special_time: reboot
    job: "{{ amdgpu_cron_cmd }}"
    state: present
    disabled: no
  when: amdgpu_install.failed

- name: Miner | Driver | AMDGPU | Reboot To GA Kernel
  shell: reboot
  when: amdgpu_install.failed

- pause:
    prompt: "Rebooting to use driver! Please hold."
  when: amdgpu_install.failed



## We're done! ##
- name: Miner | Driver | AMDGPU | Test Driver
  shell: clinfo -l
  register: clinfo

- name: Miner | Driver | AMDGPU | Test Results
  debug:
    var: clinfo
  ignore_errors: yes