#!/bin/bash
#
# Copyright 2020 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Utility to manage COS extensions.

set -o errexit
set -o pipefail
set -o nounset

readonly PROG_NAME=$(basename "$0")
readonly COS_GPU_INSTALLER="${COS_GPU_INSTALLER:-\
gcr.io/cos-cloud/cos-gpu-installer:v2.0.9}"
readonly OS_RELEASE="/etc/os-release"
readonly EXTENSIONS_CACHE="/var/lib/cos-extensions"

usage() {
  cat <<EOF

${PROG_NAME}: Utility to manage COS extensions.

Usage:
    ${PROG_NAME} [OPTIONS] COMMAND [ARGS]...

Options:
    -h, --help    print help message

Commands:
    list                                  list all available COS extensions and
                                          their versions.

    install <extension> [-- -<version>]   install a COS extension. If no version
                                          is given, then the default version
                                          will be installed.

Additional Description:
    ${PROG_NAME} install gpu --use-build-tools-cache
    The gpu extension can be invoked with a --use-build-tools-cache
    optional argument that can be used to cache the toolchain for the installer.
    Caching the toolchain carries the overhead of ~1GB disk space on the
    stateful partition. It may also help to save time on downloading the
    toolchain during the installation, after the first run.
}
EOF
  exit "${1}"
}

parse_args() {
  local args
  if ! args=$(getopt --options "h" --longoptions "help" -- "$@"); then
    usage 1
  fi

  eval set -- "${args}"
  while true; do
    case "$1" in
      -h|--help)
        usage 0
        ;;
      --)
        shift
        break
        ;;
      *)
        usage 1
        ;;
    esac
  done

  if [[ "$#" -eq 0 ]]; then
    usage 1
  fi

  case "$1" in
    list)
      list
      ;;
    install)
      if [[ "$#" -eq 2 ]]; then
        install "$2"
      elif [[ "$#" -ge 3 ]]; then
        extension="$2"
        shift 2
        install "${extension}" "$@"
      else
        usage 1
      fi
      ;;
    *)
      usage 1
      ;;
  esac
}

list() {
  printf "Available extensions for COS version %s-%s:\n\n" \
    "${VERSION_ID}" "${BUILD_ID}"
  echo "[gpu]"
  run_gpu_installer list 2>/dev/null
}

install() {
  case "$1" in
    gpu)
      shift
      run_gpu_installer install "-host-dir=/var/lib/nvidia" "$@"
      ;;
    *)
      echo "Unsupported extension $1"
      exit 1
      ;;
    esac
}

check_arch() {
  arch=$(uname -m)
  if  [[ ${arch} != "x86_64" ]]; then
    echo "GPU installation is only supported on X86 for now.
    Current architecture detected: ${arch}"
    exit 1
  fi
}

run_gpu_installer() {
  check_arch
  local use_build_cache=false

  local installer_args=()
  for i in "$@"; do
    if [[ $i == '--use-build-tools-cache' ]]; then
      use_build_cache=true
    else
      installer_args+=($i)
    fi
  done

  local docker_args=(
    --rm
    --name="cos-gpu-installer"
    --privileged
    --net=host
    --pid=host
    --volume /dev:/dev
    --volume /:/root
  )

  if [[ "$use_build_cache" = true ]]; then
    docker_args+=(--volume ${EXTENSIONS_CACHE}/:/build/)
  fi

  /usr/bin/docker run "${docker_args[@]}" "${COS_GPU_INSTALLER}"\
    "${installer_args[@]}"
}

main() {
  source "${OS_RELEASE}"
  parse_args "$@"
}

main "$@"
