#!/usr/bin/env bash

### Install PR ###
#
# This script takes a GitHub pull request number as an argument and loads the
# images into a local Kubernetes cluster. It then installs the CLI so that it
# can be used to install with any specific configuration needed.
#
# It requires a GitHub personal access token in the $GITHUB_TOKEN environment
# variable.

set -eo pipefail

cluster=''
is_kind=false
is_k3d=false

# Read script flags and arguments
while :
do
  case $1 in
    -h|--help)
      echo "Install Linkerd with the changes made in a GitHub Pull Request.

Usage:
    --cluster: The name of the cluster to use

    # Install Linkerd into the current cluster
    bin/install-pr 1234

    # Install Linkerd into the current k3d cluster
    bin/install-pr --k3d 1234

    # Install Linkerd into the current KinD cluster
    bin/install-pr --kind 1234

    # Install Linkerd into the 'pr-1234' k3d cluster
    bin/install-pr --k3d --cluster pr-1234 1234"
      exit 0
      ;;
    --cluster)
      cluster=$2
      shift
      ;;
    --kind)
      is_kind=true
      ;;
    --k3d)
      is_k3d=true
      ;;
    -?*)
      echo "Error: Unknown option: $1" >&2
      exit 1
      ;;
    *)
      break
  esac
  shift
done

pr=$1

if [ -z "$pr" ]; then
  echo "Error: ${0##*/} accepts 1 argument
Usage:
    ${0##*/} ####" >&2
  exit 1
fi

if [ -z "$GITHUB_TOKEN" ]; then
  # shellcheck disable=SC2016
  echo 'Error: Generate a personal access token at https://github.com/settings/tokens and set it in the $GITHUB_TOKEN env var'
  exit 1
fi

linkerd2_pulls_url='https://api.github.com/repos/linkerd/linkerd2/pulls'
linkerd2_integration_url='https://api.github.com/repos/linkerd/linkerd2/actions/workflows/integration_tests.yml'

bindir=$( cd "${BASH_SOURCE[0]%/*}" && pwd )

# Get the URL for downloading the artifacts archive
auth="Authorization: token $GITHUB_TOKEN"
branch=$("$bindir"/scurl -H "$auth" "$linkerd2_pulls_url/$pr" | jq -r '.head.ref')
artifacts=$("$bindir"/scurl -H "$auth" "$linkerd2_integration_url/runs?branch=$branch" | jq -r '.workflow_runs[0].artifacts_url')
archive=$("$bindir"/scurl -H "$auth" "$artifacts" | jq -r '.artifacts[0].archive_download_url')

dir=$(mktemp -d -t "linkerd-pr-$pr.XXXXXXXXXX")

# shellcheck source=_docker.sh
. "$bindir"/_docker.sh

cd "$dir" || exit

echo '### Downloading images ###'

"$bindir"/scurl -o archive.zip -H "$auth" "$archive"
unzip -o archive.zip -d image-archives/

echo '### Loading images into Docker ###'

image=$(docker load -i image-archives/cli-bin.tar | sed 's/Loaded image: //')
tag=$(echo "$image" | cut -f 2 -d ":")

for image in "${DOCKER_IMAGES[@]}"
do
  docker load -i "image-archives/$image.tar"
done

if [ "$is_kind" = true ] || [ "$is_k3d" = true ]; then
  # When importing into k3d or kind, the images must be renamed to use the
  # proper registry so that users don't have to change the default install
  # output.
  docker_rename_registry "$tag" 'ghcr.io/linkerd' 'cr.l5d.io/linkerd'
  distro=k3d
  if [ "$is_kind" = true ]; then
    distro=kind
  fi
  export TAG=$tag
  "$bindir"/image-load --"$distro" --cluster "$cluster"
else
  # The images were built with the ghcr.io registry so when pushing to a
  # remote cluster for testing, no renaming needs to occur.
  for image in "${DOCKER_IMAGES[@]}"
  do
    docker push "$image"
  done
fi

cd -

rm -rf "$dir"

case $(uname) in
  Darwin)
    platform=darwin
    ;;
  Linux)
    platform=linux
    ;;
  *)
    platform=windows
    ;;
esac

# Images created based off PRs use the ghcr.io registry, so override the
# default here when pulling the binary.
export DOCKER_REGISTRY=ghcr.io/linkerd
linkerd=$("$bindir"/docker-pull-binaries "$tag" | awk -v platform=$platform '$0 ~ platform')

echo "
Linkerd CLI available:
$linkerd"
