#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.
#

# config check
function config_check() {
  FAIL=0
  if [ ! -r "${KIND_CONFIG}" ]; then
    echo "  kind config not found"
    FAIL=1
  fi
  if [ ! -d "${HELMCHART}" ]; then
    echo "  helm chart directory not found"
    FAIL=1
  fi
  return ${FAIL}
}

# docker check
function docker_check() {
  DOCKER_UP=$(docker version | grep "^Server:")
  if [ -z "${DOCKER_UP}" ]; then
    echo "docker daemon must be running"
    return 1
  fi
}

# tool check
function tool_check() {
  FAIL=0
  if ! command -v kind &> /dev/null
  then
    echo "  kind must be installed and on the path"
    FAIL=1
  fi
  if ! command -v kubectl &> /dev/null
  then
    echo "  kubectl must be installed and on the path"
    FAIL=1
  fi
  if ! command -v helm &> /dev/null
  then
    echo "  helm must be installed and on the path"
    FAIL=1
  fi
  if ! command -v docker &> /dev/null
  then
    echo "  docker must be installed and on the path"
    FAIL=1
  fi
  if ! command -v make &> /dev/null
  then
    echo "  make must be installed and on the path"
    FAIL=1
  fi
  return ${FAIL}
}

# show run details 
function run_detail() {
  echo "Creating kind validation cluster"
  echo "  Apache YuniKorn version: ${VERSION}"
  echo "  Helm chart directory:    ${HELMCHART}"
  echo "  Kind cluster config:     ${KIND_CONFIG}"
  echo "  Kubernetes image:        ${KIND_IMAGE}"
  echo "  Registry name:           ${REGISTRY}"
  echo "  Plugin mode:             ${PLUGIN}"
  echo "  Executable Architecture: ${EXEC_ARCH}"
  echo "  Image Architecture:      ${DOCKER_ARCH}"
}

# usage message
function usage() {
  NAME=$(basename "$0")
  echo "You must enter exactly 1 command line argument"
  echo "  ${NAME} K8s-VERSION"
  echo "K8s-VERSION: the numeric version of the K8s release, example: 1.22.4"
  echo
  echo "Overrides for settings via shell variables"
  echo "  REGISTRY=local ${NAME} 1.22.4"
  echo
  echo "variable names with default values:"
  echo "  VERSION,      default: latest"
  echo "  REGISTRY,     default: 'apache'"
  echo "  KIND_CONFIG,  default: './kind.yaml'"
  echo "  HELMCHART,    default: './helm-charts/yunikorn'"
  echo "  PLUGIN,       default: 'false'"
  echo "  HOST_ARCH,    default: '$(uname -m)'"
}

# remove kind cluster ion failure
function remove_cluster() {
	echo "Removing kind cluster"
	kind delete cluster --name yk8s
	exit 1
}

# print message on how to cleanup cluster
function cleanup() {
	echo
	echo "To clean up the cluster after use execute the following command:"
	echo "  kind delete cluster --name yk8s"
	echo
}

# tool check: run before input check to make sure all tools are available
tool_check
if [ $? -eq 1 ]; then
  echo "tool check failed please install required tool(s) before continuing." 
  echo
  usage
  exit 1
fi

# input check need at least the versions
if [ $# -ne 1 ]; then
  usage
  exit 1
fi

K8S=$1
KIND_IMAGE=kindest/node:v${K8S}
VERSION="${VERSION:-latest}"
REGISTRY="${REGISTRY:-apache}"
KIND_CONFIG="${KIND_CONFIG:-./kind.yaml}"
HELMCHART="${HELMCHART:-./helm-charts/yunikorn}"
PLUGIN="${PLUGIN:-false}"
# load the docker architecture via make
eval "$(make -s arch)"

# show details for the run
run_detail

# check if docker is up prevents kind failures
docker_check
if [ $? -eq 1 ]; then
  exit 1
fi

# check the configs
config_check
if [ $? -eq 1 ]; then
  exit 1
fi

kind create cluster --name yk8s --image "${KIND_IMAGE}" --config="${KIND_CONFIG}"
if [ $? -eq 1 ]; then
  exit 1
fi
echo
echo "Pre-Loading docker images..."
echo
ADM_IMAGE=admission-${DOCKER_ARCH}-${VERSION}
kind load docker-image "${REGISTRY}"/yunikorn:"${ADM_IMAGE}" --name yk8s >/dev/null 2>&1
if [ $? -eq 1 ]; then
	echo "Pre-Loading ${ADM_IMAGE} image failed, aborting"
  remove_cluster
fi
SCHED_IMAGE=scheduler-${DOCKER_ARCH}-${VERSION}
kind load docker-image "${REGISTRY}"/yunikorn:"${SCHED_IMAGE}" --name yk8s >/dev/null 2>&1
if [ $? -eq 1 ]; then
	echo "Pre-Loading ${SCHED_IMAGE} image failed, aborting"
  remove_cluster
fi
PLUGIN_IMAGE=scheduler-plugin-${DOCKER_ARCH}-${VERSION}
kind load docker-image "${REGISTRY}"/yunikorn:"${PLUGIN_IMAGE}" --name yk8s >/dev/null 2>&1
if [ $? -eq 1 ]; then
	echo "Pre-Loading ${PLUGIN_IMAGE} image failed, aborting"
  remove_cluster
fi
WEB_IMAGE=web-${DOCKER_ARCH}-${VERSION}
kind load docker-image "${REGISTRY}"/yunikorn:"${WEB_IMAGE}" --name yk8s >/dev/null 2>&1
if [ $? -eq 1 ]; then
	echo "Pre-Loading ${WEB_IMAGE} image failed, aborting"
  remove_cluster
fi

kubectl config use-context kind-yk8s
if [ $? -eq 1 ]; then
	echo "Kubernetes context switch failed, aborting"
  remove_cluster
fi

kubectl create namespace yunikorn
if [ $? -eq 1 ]; then
	echo "Namespace creation failed, aborting"
  remove_cluster
fi
echo
echo "Deploying helm chart..."
helm install yunikorn "${HELMCHART}" --namespace yunikorn \
    --set image.repository="${REGISTRY}"/yunikorn \
    --set image.tag="${SCHED_IMAGE}" \
    --set image.pullPolicy=IfNotPresent \
    --set pluginImage.repository="${REGISTRY}"/yunikorn \
    --set pluginImage.tag="${PLUGIN_IMAGE}" \
    --set pluginImage.pullPolicy=IfNotPresent \
    --set admissionController.image.repository="${REGISTRY}"/yunikorn \
    --set admissionController.image.tag="${ADM_IMAGE}" \
    --set admissionController.image.pullPolicy=IfNotPresent \
    --set web.image.repository="${REGISTRY}"/yunikorn \
    --set web.image.tag="${WEB_IMAGE}" \
    --set web.image.pullPolicy=IfNotPresent \
    --set enableSchedulerPlugin="${PLUGIN}"
echo
echo "Waiting for helm deployment to finish..."
kubectl wait --for=condition=available --timeout=150s deployment/yunikorn-scheduler -n yunikorn
if [ $? -eq 1 ]; then
	cleanup
  exit 1
fi

kubectl wait --for=condition=ready --timeout=150s pod -l app=yunikorn -n yunikorn
if [ $? -eq 1 ]; then
	cleanup
  exit 1
fi

echo
echo "Setting up port forwarding for REST (9080) and web UI (9889)"
kubectl port-forward svc/yunikorn-service 9889:9889 -n yunikorn >/dev/null 2>&1 &
kubectl port-forward svc/yunikorn-service 9080:9080 -n yunikorn >/dev/null 2>&1 &
cleanup
