apiVersion: v1
kind: ConfigMap
metadata:
  name: oncall-workbench-bootstrap
data:
  gardener-craweler: |
    #!/usr/bin/env bash

    # set -euo pipefail

    KUBECONFIG=${HOME}/.kube/config

    BACKUP_KUBECONFIG=${HOME}/.kube/config-$(date +"%Y_%m_%d_%I_%M")
    if test -f "$KUBECONFIG"; then
        mv $KUBECONFIG $BACKUP_KUBECONFIG
    fi


    # garden
    kubectl get secret -n garden garden-kubeconfig-for-admin --template={{'.data.kubeconfig'}} | base64 -d > garden
    trap "rm garden" EXIT
    KUBECONFIG=${KUBECONFIG}:garden kubectl config view --flatten > merged-kubeconfig && mv merged-kubeconfig ${KUBECONFIG}
    echo "GARDEN base context ready."

    export KUBECONFIG=${KUBECONFIG}

    function merge_secret() {
      namespace=$1
      name=$2
      secret=$3
      kubectl --context garden -n ${namespace} get secret $secret --template={{'.data.kubeconfig'}} | base64 -d > $name || (echo "cannot get secret ${secret}" && exit 0) 
      trap "rm $name" RETURN
      # better naming
      KUBECONFIG=$name kubectl config rename-context $(KUBECONFIG=$name kubectl config current-context) $name > /dev/null
      # merge
      KUBECONFIG=${KUBECONFIG}:$name kubectl config view --flatten > merged-kubeconfig && mv merged-kubeconfig ${KUBECONFIG}
    }

    # seeds
    seeds=$(kubectl --context garden get secret -n garden --no-headers -o custom-columns=":metadata.name" | grep 'seed$')
    for seed in ${seeds}; do
      merge_secret "garden" $seed $seed
      echo "SEED ${seed} context ready"
    done

    # shoots
    projects=$(kubectl --context garden get ns --no-headers -o custom-columns=":metadata.name" | grep 'garden-')
    for project in ${projects}; do
      shoots=$(kubectl --context garden get shoot -n ${project} --no-headers -o custom-columns=":metadata.name")
      for shoot in ${shoots}; do
        # append details in favor of searching tenant and region using fzf
        seed_detail=$(kubectl --context garden get shoot -n ${project} $shoot --template='{{.spec.seedName}}-{{.metadata.labels.tenant}}')
        seed_detail=$(echo "$seed_detail" | sed "s/<no value>/no-tenant-id/")
        shoot_name="${project}-${shoot}-${seed_detail}"
        merge_secret ${project} ${shoot_name} "${shoot}.kubeconfig"
        # do not print shoot details in log, simply use shoot
        echo "SHOOT ${shoot} context ready"
      done
    done

    echo "all context initialized"
    bash

  bootstrap: |
    #!/usr/bin/env bash
    EXT_PUBLISHER=ms-kubernetes-tools EXT_PACKAGE=vscode-kubernetes-tools && \
    mkdir -pv "/home/workspace/.vscode-remote/extensions/${EXT_PUBLISHER}.${EXT_PACKAGE}" && \
    curl -sSL "https://${EXT_PUBLISHER}.gallery.vsassets.io/_apis/public/gallery/publisher/${EXT_PUBLISHER}/extension/${EXT_PACKAGE}/latest/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage" | bsdtar xvf - --strip-components=1 -C "/home/workspace/.vscode-remote/extensions/${EXT_PUBLISHER}.${EXT_PACKAGE}"
    EXT_PUBLISHER=redhat EXT_PACKAGE=vscode-yaml && \
    mkdir -pv "/home/workspace/.vscode-remote/extensions/${EXT_PUBLISHER}.${EXT_PACKAGE}" && \
    curl -sSL "https://${EXT_PUBLISHER}.gallery.vsassets.io/_apis/public/gallery/publisher/${EXT_PUBLISHER}/extension/${EXT_PACKAGE}/latest/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage" | bsdtar xvf - --strip-components=1 -C "/home/workspace/.vscode-remote/extensions/${EXT_PUBLISHER}.${EXT_PACKAGE}"
    bash /gardener-craweler/gardener-craweler.sh && yes | cp -rf /home/workspace/. /home/workspace2/ && cp -rf ~/.kube/config /home/workspace2/.kube/config
---
apiVersion: v1
kind: Service
metadata:
  name: oncall-workbench
  labels:
    app: oncall-workbench
spec:
  ports:
    - port: 3000
      name: oncall-workbench
  clusterIP: None
  selector:
    app: oncall-workbench
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: oncall-workbench
spec:
  selector:
    matchLabels:
      app: oncall-workbench
  serviceName: "oncall-workbench"
  replicas: 1
  template:
    metadata:
      labels:
        app: oncall-workbench
    spec:
      terminationGracePeriodSeconds: 10
      serviceAccountName: "central"
      initContainers:
        - name: init
          image: 385595570414.dkr.ecr.us-west-2.amazonaws.com/dbaas/chenyiwen/code-server
          command: ["sh", "-c", "bash /bootstrap/bootstrap.sh"]
          volumeMounts:
            - name: data-storage
              mountPath: /home/workspace2
            - name: bootstrap
              mountPath: /bootstrap
            - name: gardener-craweler
              mountPath: /gardener-craweler
      volumes:
        - name: bootstrap
          configMap:
            defaultMode: 420
            name: oncall-workbench-bootstrap
            items:
              - key: bootstrap
                path: bootstrap.sh
          
        - name: gardener-craweler
          configMap:
            defaultMode: 420
            name: oncall-workbench-bootstrap
            items:
              - key: gardener-craweler
                path: gardener-craweler.sh
      containers:
        - name: oncall-workbench
          image: 385595570414.dkr.ecr.us-west-2.amazonaws.com/dbaas/chenyiwen/code-server
          ports:
            - containerPort: 3000
          args:
            - "--connection-token"
            - "<connection-token>"
            - "--folder"
            - "/home/workspace"
          volumeMounts:
            - name: data-storage
              mountPath: /home/workspace
  volumeClaimTemplates:
    - metadata:
        name: data-storage
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 8Gi
