set -euo pipefail

function usage() {
cat << EOF

check-endpoint.sh

Check the endpoint, in case not alive do rollback to previous release version.

USAGE: check-endpoint.sh [OPTIONS]

OPTIONS:
  -h    Show this message
  -u    Healthcheck
  -r    Release name

EXAMPLES:

  check-endpoint.sh -u 'https://api-marco.finboot-test.com/plugins/status/health' -r marco-plugins
  check-endpoint.sh -u 'https://api-marco.finboot-test.com/plugins/status/health' -r marco-plugins

EOF
}

while getopts ":u:r:h" opt; do
  case "$opt" in
    h)
      usage
      exit 0
      ;;
    u)
      HEALTHCHECK=$OPTARG
      ;;
    r)
      RELEASE_NAME=$OPTARG
      ;;
    ?)
      usage
      exit 1
      ;;
  esac
done

function checkUrl {
  local HEALTHCHECK=$1

  local HEALTHCHECK_TIMEOUT=$((SECONDS+20))
  local HEALTHCHECK_HTTPCODE=$(curl -sL -w "%{http_code}" "${HEALTHCHECK}" -o /dev/null)

  while [[ ${SECONDS} -lt ${HEALTHCHECK_TIMEOUT} ]] && [[ ${HEALTHCHECK_HTTPCODE} -ne 200 ]]; do
    sleep 5
    HEALTHCHECK_HTTPCODE=$(curl -sL -w "%{http_code}" "${HEALTHCHECK}" -o /dev/null)
  done

  return $(test ${HEALTHCHECK_HTTPCODE} -eq 200)
}

function checkRollout {
  local RELEASE_NAME=$1
  local ROLLOUT_TIMEOUT=$((SECONDS+300))
  local DEPLOYMENT_STATUS=$(timeout -t 1 kubectl rollout status deployment/${RELEASE_NAME} > /dev/null 2>&1)$?
  # Start a check delayed because livenessProbe
  sleep 60
  while [[ ${SECONDS} -lt ${ROLLOUT_TIMEOUT} ]] && [[ ${DEPLOYMENT_STATUS} -ne 0 ]]; do
    sleep 5
    # kubectl rollout status --watch=false returns 0 even if the deployment has not finished
    # that's why we rely on timeout command
    DEPLOYMENT_STATUS=$(timeout -t 1 kubectl rollout status deployment/${RELEASE_NAME} > /dev/null 2>&1)$?
  done

  echo -e "\n -- DEPLOYMENT_STATUS_CODE = ${DEPLOYMENT_STATUS}"

  return ${DEPLOYMENT_STATUS}
}

function doRollback {
  local RELEASE_NAME=$1

  # rollback 0 deploys the last revision
  helm rollback ${RELEASE_NAME} 0
}

if ! checkRollout ${RELEASE_NAME}; then
  echo -e "=========================================================================================\n"
  echo -e ">>> ERROR: Deploy was failed, check logs below or talk with the Administrator."
  echo -e "=========================================================================================\n"
  kubectl get pods | grep ${RELEASE_NAME}
  echo -e "=========================================================================================\n"
  echo -e "\n\n"
  for i in $(kubectl get po --sort-by=.status.startTime | grep ${RELEASE_NAME} | tail -n1 | awk '{print $1}');do kubectl logs $i --tail=1000;done
  echo -e "=========================================================================================\n"
  echo -e ">>> WARNING: Doing rollback..."
  doRollback ${RELEASE_NAME}
  echo -e "=========================================================================================\n"
  kubectl get po --sort-by=.status.startTime | grep ${RELEASE_NAME}
  echo -e "=========================================================================================\n"
  exit 1
fi

if ! checkUrl $HEALTHCHECK; then
  echo -e "=========================================================================================\n"
  echo -e ">>> ERROR: The Healthcheck verification failed."
  echo -e ">>> URL: ${HEALTHCHECK}"
  echo -e "=========================================================================================\n"
  kubectl get pods | grep ${RELEASE_NAME}
  echo -e "=========================================================================================\n"
  echo -e "\n\n"
  for i in $(kubectl get po --sort-by=.status.startTime | grep ${RELEASE_NAME} | tail -n1 | awk '{print $1}');do kubectl logs $i --tail=1000;done
  echo -e "=========================================================================================\n"
  echo -e ">>> WARNING: Doing rollback... because HEALTHCHECK defined in .gitlab-ci.yml was down"
  doRollback ${RELEASE_NAME}
  echo -e "=========================================================================================\n"
  kubectl get po --sort-by=.status.startTime | grep ${RELEASE_NAME} 
  echo -e "=========================================================================================\n"
  exit 1
fi
