#cloud-config
#
# Copyright 2018 Google LLC
#
# 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.

write_files:
  - path: /tmp/preloader-test/test.sh
    permissions: 0644
    owner: root
    content: |
      set -o errexit
      set -o pipefail

      # Templated by cloudbuild config that runs this test.
      EXPECTED_DRIVER_VERSION=%s

      trap 'fail exiting due to errors' EXIT

      fail() {
        echo "TestFail: $@"
      }

      testGpuDirExists() {
        if [[ ! -d /var/lib/nvidia ]]; then
          echo "/var/lib/nvidia is not a valid directory (does it exist?)"
          echo "testGpuDirExists fail"
          RESULT="fail"
          return
        fi
        echo "testGpuDirExists pass"
      }

      testDockerImageCached() {
        expected=$'gcr.io/cos-cloud/cos-gpu-installer\nubuntu'
        actual="$(docker images --format {{.Repository}} | sort)"
        if [[ "${expected}" != "${actual}" ]]; then
          echo "expected docker images: ${expected}"
          echo "actual docker images: ${actual}"
          echo "testDockerImageCached fail"
          RESULT="fail"
          return
        fi
        echo "testDockerImageCached pass"
      }

      testActivateDrivers() {
        local activate_drivers="pass"
        /bin/bash /var/lib/nvidia/setup_gpu.sh
        if [[ ! -c "/dev/nvidia-uvm" ]]; then
          echo "Cannot find character device /dev/nvidia-uvm"
          activate_drivers="fail"
          RESULT="fail"
        fi
        if [[ ! -c "/dev/nvidia-uvm-tools" ]]; then
          echo "Cannot find character device /dev/nvidia-uvm-tools"
          activate_drivers="fail"
          RESULT="fail"
        fi
        if [[ ! -c "/dev/nvidia0" ]]; then
          echo "Cannot find character device /dev/nvidia0"
          activate_drivers="fail"
          RESULT="fail"
        fi
        if [[ ! -c "/dev/nvidiactl" ]]; then
          echo "Cannot find character device /dev/nvidiactl"
          activate_drivers="fail"
          RESULT="fail"
        fi
        if ! pgrep -f nvidia-persistenced > /dev/null; then
          echo "nvidia-persistenced is not running"
          activate_drivers="fail"
          RESULT="fail"
        fi
        if [[ "$(cat /proc/sys/kernel/softlockup_panic)" != "1" ]]; then
          echo "softlockup_panic is not set"
          activate_drivers="fail"
          RESULT="fail"
        fi
        if [[ "${activate_drivers}" == "fail" ]]; then
          echo "testActivateDrivers fail"
          return
        fi
        echo "testActivateDrivers pass"
      }

      testDriverVersion() {
        source /var/lib/nvidia/.cache
        if [[ "${EXPECTED_DRIVER_VERSION}" != "${CACHE_NVIDIA_DRIVER_VERSION}" ]]; then
          echo "Wrong driver version"
          echo "Expected: ${EXPECTED_DRIVER_VERSION}"
          echo "Actual: ${CACHE_NVIDIA_DRIVER_VERSION}"
          echo "testDriverVersion fail"
          RESULT="fail"
          return
        fi
        echo "testDriverVersion pass"
      }

      main() {
        RESULT="pass"
        testGpuDirExists
        testDockerImageCached
        testActivateDrivers
        testDriverVersion
        if [[ "${RESULT}" == "fail" ]]; then
          exit 1
        fi
      }

      main 2>&1 | sed "s/^/TestStatus: /"
      trap - EXIT
      echo "TestPass: all tests passed"

  - path: /etc/systemd/system/preloader-test.service
    permissions: 0644
    owner: root
    content: |
      [Unit]
      Description=Preloader test
      Wants=network-online.target gcr-online.target docker.service
      After=network-online.target gcr-online.target docker.service

      [Service]
      Type=oneshot
      RemainAfterExit=yes
      User=root
      ExecStart=/bin/bash /tmp/preloader-test/test.sh
      StandardOutput=tty
      StandardError=tty
      TTYPath=/dev/ttyS1

runcmd:
  - systemctl daemon-reload
  - systemctl --no-block start preloader-test.service
