#!/bin/bash

set -x
set -e

if cat /etc/os-release | grep -iq "Alpine Linux"; then
 apk update && apk add --no-cache gcompat g++ make
fi

OS="$(uname -s)"
case "${OS}" in
    Linux*)     MACHINE=amd64;;
    Darwin*)    MACHINE=darwin-amd64;;
esac

case "${MACHINE}" in
 amd64*)        GOLANG_PGK_SUFFIX=linux-amd64 ;;
 darwin-amd64*) GOLANG_PGK_SUFFIX=darwin-amd64 ;;
esac

GO_DL_URL="https://go.dev/dl" 
GO_DL_VERSION="${GO_DL_VERSION:-1.20.5}"
GO_PKG_FILENAME="go${GO_DL_VERSION}.${GOLANG_PGK_SUFFIX}.tar.gz"
GO_DL_PACKAGE="${GO_DL_URL}/${GO_PKG_FILENAME}"
CORRAL_PATH="${WORKSPACE}/bin"
CORRAL="${CORRAL_PATH}/corral"
CORRAL_VERSION="${CORRAL_VERSION:-1.1.1}"
CORRAL_DOWNLOAD_URL="https://github.com/rancherlabs/corral/releases/download/"
CORRAL_DOWNLOAD_BIN="${CORRAL_DOWNLOAD_URL}v${CORRAL_VERSION}/corral-${CORRAL_VERSION}-${MACHINE}"
PATH="${CORRAL_PATH}:${PATH}"
CORRAL_PACKAGES_REPO="${CORRAL_PACKAGES_REPO:-rancherlabs/corral-packages.git}"
CORRAL_PACKAGES_BRANCH="${CORRAL_PACKAGES_BRANCH:-main}"
DASHBOARD_REPO="${DASHBOARD_REPO:-rancher/dashboard.git}"
DASHBOARD_BRANCH="${DASHBOARD_BRANCH:-master}"
GITHUB_URL="https://github.com/"
RANCHER_TYPE="${RANCHER_TYPE:-local}"
RANCHER_HELM_REPO="${RANCHER_HELM_REPO:-latest}"
HELM_VERSION="${HELM_VERSION:-3.13.2}"
NODEJS_VERSION="${NODEJS_VERSION:-14.19.1}"
CYPRESS_VERSION="${CYPRESS_VERSION:-13.2.0}"
YARN_VERSION="${YARN_VERSION:-1.22.19}"
KUBECTL_VERSION="${KUBECTL_VERSION:-v1.29.8}"
YQ_BIN="mikefarah/yq/releases/latest/download/yq_linux_amd64"

mkdir -p "${WORKSPACE}/bin"
wget "${GITHUB_URL}${YQ_BIN}" -O "${WORKSPACE}/bin/yq"
chmod +x "${WORKSPACE}/bin/yq"

if [ -f "${CORRAL}" ]; then rm "${CORRAL}"; fi
curl -L -o "${CORRAL}" "${CORRAL_DOWNLOAD_BIN}"
chmod +x "${CORRAL}"

curl -L -o "${GO_PKG_FILENAME}" "${GO_DL_PACKAGE}"
tar -C "${WORKSPACE}" -xzf "${GO_PKG_FILENAME}"

curl -sSL https://raw.githubusercontent.com/parleer/semver-bash/latest/semver -o semver
chmod +x semver
mv semver "${WORKSPACE}/bin"

ls -al "${WORKSPACE}"
export PATH=$PATH:"${WORKSPACE}/go/bin:${WORKSPACE}/bin"
export GOROOT="${WORKSPACE}/go"
echo "${PATH}"


ls -al "${WORKSPACE}/go"
go version


if [[ ! -d "${WORKSPACE}/.ssh" ]]; then mkdir -p "${WORKSPACE}/.ssh"; fi
export PRIV_KEY="${WORKSPACE}/.ssh/jenkins_ecdsa"

if [ -f "${PRIV_KEY}" ]; then rm "${PRIV_KEY}"; fi
ssh-keygen -t ecdsa -b 521 -N "" -f "${PRIV_KEY}"
ls -al "${WORKSPACE}/.ssh/"

corral config --public_key "${PRIV_KEY}.pub" --user_id jenkins
corral config vars set corral_user_public_key "$(cat ${PRIV_KEY}.pub)"
corral config vars set corral_user_id jenkins
corral config vars set aws_ssh_user "${AWS_SSH_USER}"
corral config vars set aws_access_key "${AWS_ACCESS_KEY_ID}"
corral config vars set aws_secret_key "${AWS_SECRET_ACCESS_KEY}"
corral config vars set aws_ami "${AWS_AMI}"
corral config vars set aws_region "${AWS_REGION}"
corral config vars set aws_security_group "${AWS_SECURITY_GROUP}"
corral config vars set aws_subnet "${AWS_SUBNET}"
corral config vars set aws_vpc "${AWS_VPC}"
corral config vars set aws_volume_size "${AWS_VOLUME_SIZE}"
corral config vars set aws_volume_type "${AWS_VOLUME_TYPE}"
corral config vars set volume_type "${AWS_VOLUME_TYPE}"
corral config vars set volume_iops "${AWS_VOLUME_IOPS}"
corral config vars set azure_subscription_id "${AZURE_AKS_SUBSCRIPTION_ID}"
corral config vars set azure_client_id "${AZURE_CLIENT_ID}"
corral config vars set azure_client_secret "${AZURE_CLIENT_SECRET}"
corral config vars set create_initial_clusters "${CREATE_INITIAL_CLUSTERS}"
corral config vars set gke_service_account "${GKE_SERVICE_ACCOUNT}"
corral config vars set percy_token "${PERCY_TOKEN}"

create_initial_clusters() {
  shopt -u nocasematch
  if [[ -n "${RANCHER_IMAGE_TAG}" ]]; then
    TARFILE="helm-v${HELM_VERSION}-linux-amd64.tar.gz"
    curl -L -o "${TARFILE}" "https://get.helm.sh/${TARFILE}"
    tar -C "${WORKSPACE}/bin" --strip-components=1 -xzf "${TARFILE}"
    if [[ -n "${RANCHER_HELM_REPO}" ]]; then
      if [[ "${RANCHER_HELM_REPO}" == "prime" ]]; then
        RANCHER_CHART_URL=https://charts.rancher.com/server-charts/prime
        helm repo add rancher-prime "${RANCHER_CHART_URL}"
        helm repo update
        corral config vars set rancher_image "registry.suse.com/rancher/rancher"
        corral config vars set env_var_map '["CATTLE_AGENT_IMAGE|registry.suse.com/rancher/rancher-agent:'${RANCHER_IMAGE_TAG}', RANCHER_PRIME|true, CATTLE_UI_BRAND|suse"]'
      elif [[ "${RANCHER_HELM_REPO}" == "optimus_prime" ]]; then
        RANCHER_HELM_REPO=optimus
        RANCHER_CHART_URL=https://charts.optimus.rancher.io/server-charts/latest
        helm repo add rancher-optimus "${RANCHER_CHART_URL}"
        helm repo update
        corral config vars set rancher_image "stgregistry.suse.com/rancher/rancher"
        corral config vars set env_var_map '["CATTLE_AGENT_IMAGE|stgregistry.suse.com/rancher/rancher-agent:'${RANCHER_IMAGE_TAG}', RANCHER_PRIME|true, CATTLE_UI_BRAND|suse"]'
      elif [[ "${RANCHER_HELM_REPO}" == "alpha" ]]; then
        RANCHER_CHART_URL=https://releases.rancher.com/server-charts/alpha
        helm repo add rancher-alpha "${RANCHER_CHART_URL}"
        helm repo update
      elif [[ "${RANCHER_HELM_REPO}" == "stable" ]]; then
        RANCHER_CHART_URL=https://releases.rancher.com/server-charts/stable
        helm repo add rancher-stable "${RANCHER_CHART_URL}"
        helm repo update
      else
        RANCHER_CHART_URL=https://releases.rancher.com/server-charts/latest
        helm repo add rancher-latest "${RANCHER_CHART_URL}"
        helm repo update
      fi
      corral config vars set rancher_chart_repo "${RANCHER_HELM_REPO}"
      if [[ "${RANCHER_HELM_REPO}" == "optimus" ]]; then
        corral config vars set rancher_chart_url "${RANCHER_CHART_URL}"
      else
        url_string=$(echo "${RANCHER_CHART_URL}" | grep -o '.*server-charts')
        corral config vars set rancher_chart_url "${url_string}"
      fi
    fi
    version_string=$(echo "${RANCHER_IMAGE_TAG}" | cut -f1 -d"-")
    if [[ "${RANCHER_IMAGE_TAG}" == "head" ]]; then
      RANCHER_VERSION=$(helm search repo "rancher-${RANCHER_HELM_REPO}" --devel --versions | sed -n '1!p' | head -1 | cut -f2 | tr -d '[:space:]')
    else
      RANCHER_VERSION=$(helm search repo "rancher-${RANCHER_HELM_REPO}" --devel --versions | grep "${version_string}" | head -n 1 | cut -f2 | tr -d '[:space:]')
    fi
    corral config vars set rancher_image_tag "${RANCHER_IMAGE_TAG}"
  fi
  cd "${WORKSPACE}/corral-packages"
  yq -i e ".variables.rancher_version += [\"${RANCHER_VERSION}\"] | .variables.rancher_version style=\"literal\"" packages/aws/rancher-k3s.yaml
  yq -i e ".variables.kubernetes_version += [\"${K3S_KUBERNETES_VERSION}\"] | .variables.kubernetes_version style=\"literal\"" packages/aws/rancher-k3s.yaml
  yq -i e ".variables.cert_manager_version += [\"${CERT_MANAGER_VERSION}\"] | .variables.kubernetes_version style=\"literal\"" packages/aws/rancher-k3s.yaml

  echo $'manifest:\n  name: custom-node\ndescription: custom generated node\ntemplates:\n  - aws/nodes\nvariables:\n  instance_type:\n    - t3a.xlarge' > packages/aws/custom-node.yaml

  yq -i e ".variables.kubernetes_version += [\"${K3S_KUBERNETES_VERSION}\"] | .variables.kubernetes_version style=\"literal\"" packages/aws/k3s.yaml
  cat packages/aws/rancher-k3s.yaml
  ls -al packages/aws/
  cat packages/aws/dashboard-tests.yaml
  cat packages/aws/custom-node.yaml

  prefix_random=$(cat /dev/urandom | env LC_ALL=C tr -dc 'a-z0-9' | fold -w 8 | head -n 1)

  corral config vars set bootstrap_password "${BOOTSTRAP_PASSWORD:-password}"
  corral config vars set aws_route53_zone "${AWS_ROUTE53_ZONE}"
  corral config vars set server_count "${SERVER_COUNT:-3}"
  corral config vars set agent_count "${AGENT_COUNT:-0}"
  corral config vars delete rancher_host
  if [[ "${JOB_TYPE}" == "recurring" ]]; then
    RANCHER_HOST="jenkins-${prefix_random}.${AWS_ROUTE53_ZONE}"
  fi

  K3S_KUBERNETES_VERSION="${K3S_KUBERNETES_VERSION//+/-}"
  make init
  make build
  ls -al dist
  corral config vars set node_count 1
  corral config vars set aws_hostname_prefix "jenkins-${prefix_random}-c"
  corral config vars delete instance_type
  corral config vars set bastion_ip ""

  echo "Custom Node for RKE2 Cluster"
  corral create --skip-cleanup --recreate --debug customnode \
    "dist/aws-t3a.xlarge"
  corral config vars set custom_node_ip "$(corral vars customnode first_node_ip)"
  corral config vars set custom_node_key "$(corral vars customnode corral_private_key | base64 -w 0)"

  echo "Custom Node for RKE1 Cluster"
  corral create --skip-cleanup --recreate --debug customnoderke1 \
    "dist/aws-t3a.xlarge"
  corral config vars set custom_node_ip_rke1 "$(corral vars customnoderke1 first_node_ip)"
  corral config vars set custom_node_key_rke1 "$(corral vars customnoderke1 corral_private_key | base64 -w 0)"
  
  corral config vars set instance_type "${AWS_INSTANCE_TYPE}"
  corral config vars set aws_hostname_prefix "jenkins-${prefix_random}"
  echo "Corral Package string: ${K3S_KUBERNETES_VERSION}-${RANCHER_VERSION//v}-${CERT_MANAGER_VERSION}"
  corral config vars set aws_hostname_prefix "jenkins-${prefix_random}-i"
  corral config vars set server_count 1
  corral create --skip-cleanup --recreate --debug importcluster \
    "dist/aws-k3s-${K3S_KUBERNETES_VERSION}"
  corral config vars set imported_kubeconfig $(corral vars importcluster kubeconfig)
  corral config vars set aws_hostname_prefix "jenkins-${prefix_random}"
  corral config vars set server_count "${SERVER_COUNT:-3}"
  if [[ "${JOB_TYPE}" == "recurring" ]]; then
    corral create --skip-cleanup --recreate --debug rancher \
      "dist/aws-k3s-rancher-${K3S_KUBERNETES_VERSION}-${RANCHER_VERSION//v}-${CERT_MANAGER_VERSION}"
  fi
}


if [[ "${JOB_TYPE}" == "recurring" ]]; then 
  RANCHER_TYPE="recurring"
  create_initial_clusters
fi

if [[ "${JOB_TYPE}" == "existing" ]]; then
  RANCHER_TYPE="existing"
  shopt -s nocasematch
  if [[ "${CREATE_INITIAL_CLUSTERS}" == "yes" ]]; then
    create_initial_clusters
  fi
  shopt -u nocasematch
fi

echo "Rancher type: ${RANCHER_TYPE}"

if semver lt "${RANCHER_VERSION}" "2.9.99" && [[ "${RANCHER_IMAGE_TAG}" != "head" ]]; then NODEJS_VERSION="16.20.2"; fi

corral config vars set rancher_type "${RANCHER_TYPE}"
corral config vars set nodejs_version "${NODEJS_VERSION}"
corral config vars set dashboard_repo "${DASHBOARD_REPO}"
corral config vars set dashboard_branch "${DASHBOARD_BRANCH}"

# Disable vai where it doesn't exist or is turn off by default
case "${RANCHER_IMAGE_TAG}" in
    "v2.7-head" | "v2.8-head" | "v2.9-head" )
        CYPRESS_TAGS="${CYPRESS_TAGS}+-@vai"
        ;;
    *)
esac
corral config vars set cypress_tags "${CYPRESS_TAGS}"
corral config vars set cypress_version "${CYPRESS_VERSION}"
corral config vars set yarn_version "${YARN_VERSION}"
corral config vars set kubectl_version "${KUBECTL_VERSION}"

if [[ -n "${RANCHER_USERNAME}" ]]; then
   corral config vars set rancher_username "${RANCHER_USERNAME}"
fi

if [[ -n "${RANCHER_PASSWORD}" ]]; then
   corral config vars set rancher_password "${RANCHER_PASSWORD}"
fi

if [[ -n "${RANCHER_HOST}" ]]; then
   corral config vars set rancher_host "${RANCHER_HOST}"
fi

if [[ -n "${CHROME_VERSION}" ]]; then
   corral config vars set chrome_version "${CHROME_VERSION}"
fi

cd "${WORKSPACE}/corral-packages"
make init
make build
echo "${PWD}"
chmod -R 766 "${WORKSPACE}/corral-packages"
corral config vars set node_count 1
corral config vars set bastion_ip ""
corral config vars delete instance_type
corral config vars set aws_hostname_prefix "jenkins-${prefix_random}-ci"
corral create --skip-cleanup --recreate --debug ci dist/aws-dashboard-tests-t3a.xlarge
corral config vars -o yaml
corral vars ci corral_private_key -o yaml
NODE_EXTERNAL_IP="$(corral vars ci first_node_ip)"
cd "${WORKSPACE}"
echo "${PWD}"
