#! /usr/bin/env bash
function usage() {
    cat <<EOF
Usage:
    cluster.sh
        --up [image-name]   Create a Kind cluster and deploy a TiDB cluster with the given SLI Reporter image.
        --down              Destory the created cluster.
EOF
    exit 1
}

reg_name=kind-registry
reg_port=5000
# Copied from https://kind.sigs.k8s.io/docs/user/local-registry/
function kind-with-registry() {
    image_name=$1
    
    running="$(docker inspect -f '{{.State.Running}}' "${reg_name}" 2>/dev/null || true)"
    if [ "${running}" != 'true' ]; then
        docker run \
        -d --restart=always -p "127.0.0.1:${reg_port}:5000" --name "${reg_name}" \
        registry:2
    fi
    
    # Create a cluster with the local registry enabled in containerd
    cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
- |-
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:${reg_port}"]
    endpoint = ["http://${reg_name}:${reg_port}"]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
    endpoint = ["https://registry-mirror.pingcap.net"]
nodes:
- role: control-plane
- role: worker
- role: worker
EOF
    
    # Connect the registry to the cluster network
    # (the network may already be connected)
    docker network connect "kind" "${reg_name}" || true
    
    # Tag and push the proxy image to the local registry
    docker tag $image_name localhost:5000/sli-reporter
    docker push localhost:5000/sli-reporter
    
    # Document the local registry
    # https://github.com/kubernetes/enhancements/tree/master/keps/sig-cluster-lifecycle/generic/1755-communicating-a-local-registry
    cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: local-registry-hosting
  namespace: kube-public
data:
  localRegistryHosting.v1: |
    host: "localhost:${reg_port}"
    help: "https://kind.sigs.k8s.io/docs/user/local-registry/"
EOF
    
}

function cleanup() {
    docker rm -f $reg_name
    kind delete cluster --name kind
}

export PULUMI_CONFIG_PASSPHRASE=""
pulumi_config_dir="./specs/pulumi"
function cluster_up() {
    image_name=$1
    if [ -z "$image_name" ]; then
        usage
    fi
    set -euox pipefail
    
    trap '[[ $? -eq 1 ]] && cleanup' EXIT
    
    kind-with-registry $image_name
    
    pulumi login --local
    # Pulumi does not handle the dependency of the Helm charts and YAML
    # config files correctly, so retry in case of dependency issues.
    for i in {1..2}
    do
        pulumi -C $pulumi_config_dir up -r -f -y -s test || true
    done
}

function cluster_down() {
    set -euox pipefail
    cleanup
}

case $1 in
    up)
        image_name=$2
        cluster_up $image_name
    ;;
    down)
        cluster_down
    ;;
    *)
        usage
    ;;
esac
