#!/usr/bin/env bash
set -euo pipefail

BASE=$(cd $(dirname ${BASH_SOURCE[0]}) && pwd)

function eks_kubeconfig() {
    region=$1
    cluster=$2
    tempfile=$(mktemp)
    indent=${3:-0}
    trap 'test -f $tempfile && rm $tempfile' RETURN
    aws eks --region $region update-kubeconfig --name $2 --kubeconfig $tempfile > /dev/null
    cat $tempfile | sed "s/^/$(printf '%*s' $indent)/"
}

function gke_kubeconfig() {
    project=$1
    region=$2
    cluster=$3
    indent=${4:-0}
    tempfile=$(mktemp)
    trap 'test -f $tempfile && rm $tempfile' RETURN
    KUBECONFIG=$tempfile gcloud container clusters get-credentials ${cluster} --region ${region} --project ${project} > /dev/null
    sed "s/cmd-path:.*gcloud/cmd-path: gcloud/g" $tempfile | sed "s/^/$(printf '%*s' $indent)/"
}

function eks_output() {
    pulumi -C $BASE/../eks stack output --stack $1 $2
}

function gke_output() {
    pulumi -C $BASE/../gke stack output --stack $1 $2
}

function garden_output() {
    pulumi -C $BASE/../garden-pulumi stack output --stack $1 $2
}

function resource_base() {
    indent=${1:-0}
    # override components resource config to evaluation level
    if [[ ${QOS} == "evaluate" ]]; then
        cat <<EOF | sed "s/^/$(printf '%*s' $indent)/"
versions:
  etcd:
    etcd:
      resources:
        requests:
          cpu: 200m
          memory: 1Gi
    backup_restore:
      resources:
        requests:
          cpu: 50m
          memory: 128Mi
  gardener:
    apiserver:
      resources:
        requests:
          cpu: 20m
          memory: 128M
    controller_manager:
      resources:
        requests:
          cpu: 20m
          memory: 64Mi
    scheduler:
      resources:
        requests:
          cpu: 20m
          memory: 65Mi
    gardenlet:
      resources:
        requests:
          cpu: 50m
          memory: 128Mi
    extensions:
      dns-external:
        resources:
          requests:
            cpu: 50m
            memory: 128Mi
      os-ubuntu:
        resources:
          requests:
            cpu: 20m
            memory: 64Mi
      provider-aws:
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          vpa:
            enabled: false
        overrideHelmValues:
          cloud-controller-manager:
            resources:
              requests:
                cpu: 100m
                memory: 128Mi
          machine-controller-manager:
            resources:
              requests:
                cpu: 100m
                memory: 128Mi
      provider-gcp:
        overrideHelmValues:
          machine-controller-manager:
            resources:
              requests:
                cpu: 50m
                memory: 64Mi
      networking-calico:
        resources:
          requests:
            cpu: 50m
            memory: 64Mi
      os-centos:
        resources:
          requests:
            cpu: 20m
            memory: 64Mi
      os-centos-tidb:
        resources:
          requests:
            cpu: 20m
            memory: 64Mi
EOF
    else
        echo ""
    fi
}

function eks_seed_spec() {
    region=$1
    stack=$2
    remote_write_url=$3
    indent=${4:-0}
    cat <<EOF | sed "s/^/$(printf '%*s' $indent)/"
type: aws
mode: seed
region: ${region}
credentials:
  accessKeyID: ""
  secretAccessKey: ""
overrideHelmValues:
  kind: HelmValues
  prometheus:
    remoteWriteUrl: ${remote_write_url}
  core:
    coredns:
      horizontalPodAutoScaler:
        spec:
          maxReplicas: 2
          minReplicas: 2
      deployment:
        spec:
          containers:
            resources:
              limits:
                cpu: 400m
                memory: 100Mi
              requests:
                cpu: 400m
                memory: 100Mi
  etcd:
    serviceAccountAnnotations:
      "eks.amazonaws.com/role-arn": $(eks_output $stack etcdRoleID)
$(etcd_resource 4)
  kube-controller-manager:
    serviceAccountAnnotations:
      "eks.amazonaws.com/role-arn": $(eks_output $stack kubeControllerManagerRoleID)
    resources:
      requests:
        cpu: 100m
        memory: 200Mi
      limits:
        cpu: 800m
        memory: 300Mi
  provider-aws:
    config:
      overrideHelmValues:
        cloud-controller-manager:
          serviceAccountAnnotations:
            eks.amazonaws.com/role-arn: $(eks_output $stack cloudControllerManagerRoleID)
        kind: HelmValues
        machine-controller-manager:
          serviceAccountAnnotations:
            eks.amazonaws.com/role-arn: $(eks_output $stack machineControllerManagerRoleID)
        csi-driver-controller:
          serviceAccountAnnotations:
            eks.amazonaws.com/role-arn: $(eks_output $stack csiDriverControllerRoleID)
    serviceAccountAnnotations:
      eks.amazonaws.com/role-arn: $(eks_output $stack gardenerExtensionProviderAWSRoleID)
  dns-external:
    serviceAccountAnnotations:
      eks.amazonaws.com/role-arn: $(eks_output $stack dnsControllerManagerRoleID)
cluster:
  networks:
    nodes: "192.168.0.0/16"
    pods: "10.0.0.0/16"
    services: "172.20.0.0/16"
  kubeconfig:
$(eks_kubeconfig ${region} ${stack} 4)
EOF
}

function gke_seed_spec() {
    env=$1
    region=$2
    project=$3
    gke=$4
    remote_write_url=$5
    indent=${6:-0}
    cat <<EOF | sed "s/^/$(printf '%*s' $indent)/"
region: ${region}
type: gcp
mode: seed
credentials:
  serviceaccount.json: '{"project_id": "${project}"}'
overrideHelmValues:
  kind: HelmValues
  prometheus:
    remoteWriteUrl: ${remote_write_url}
  core:
    coredns:
      horizontalPodAutoScaler:
        spec:
          maxReplicas: 2
          minReplicas: 2
      deployment:
        spec:
          containers:
            resources:
              limits:
                cpu: 400m
                memory: 100Mi
              requests:
                cpu: 400m
                memory: 100Mi
  etcd:
$(etcd_resource 4)
  kube-controller-manager:
    resources:
      requests:
        cpu: 100m
        memory: 200Mi
      limits:
        cpu: 800m
        memory: 300Mi
  dns-external:
    gcpIdentity:
      enable: true
      image: gcr.io/pingcap-gardener/jenkins/gcp-web-identity:20201201
      roleArn: $(garden_output ${env} baseDnsControllerRole)
cluster:
  networks:
    nodes: "10.0.0.0/17"
    pods: "10.0.128.0/17"
    services: "172.20.0.0/16"
  kubeconfig:
$(gke_kubeconfig ${project} ${region} ${gke} 4)
EOF
}

function etcd_resource() {
    indent=${1:-0}
    if [[ ${QOS} == "evaluate" ]]; then
        cat <<EOF | sed "s/^/$(printf '%*s' $indent)/"
resources:
  requests:
    cpu: 500m
    memory: 1Gi
EOF
        return
    fi
cat <<EOF | sed "s/^/$(printf '%*s' $indent)/"
resources:
  requests:
    cpu: 2
    memory: 15Gi
  limits:
    cpu: 2
    memory: 15Gi
EOF
}
