# ConfigMaps that will be updated by the configuration job:
# 1. Step CA config directory.
# 2. Step CA certs direcotry.
# 3. Step CA secrets directory.
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ include "step-certificates.fullname" . }}-config
  namespace: {{.Release.Namespace}}
  labels: {{ include "step-certificates.labels" . | nindent 4 }}
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ include "step-certificates.fullname" . }}-certs
  namespace: {{.Release.Namespace}}
  labels: {{ include "step-certificates.labels" . | nindent 4 }}
---
apiVersion: v1
data:
  intermediate_ca_key: ""
  root_ca_key: ""
kind: ConfigMap
metadata:
  name: {{ include "step-certificates.fullname" . }}-secrets
  namespace: {{.Release.Namespace}}
  labels: {{ include "step-certificates.labels" . | nindent 4 }}
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ include "step-certificates.fullname" . }}-bootstrap
  namespace: {{.Release.Namespace}}
  labels: {{ include "step-certificates.labels" . | nindent 4 }}
data:
  bootstrap.sh: |-
    #!/bin/sh
    STEPPATH=/home/step
    echo -e "\e[1mWelcome to Step Certificates configuration.\e[0m\n"
    function permission_error () {
      echo -e "\033[0;31mPERMISSION ERROR:\033[0m $1\n"
      exit 1
    }
    function kbreplace() {
      kubectl $@ -o yaml --dry-run=client | kubectl replace -f -
    }

    echo -e "\e[1mConfiguring kubctl with service account...\e[0m"
    # Use the service account context
    kubectl config set-cluster cfc --server=https://kubernetes.default --certificate-authority=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    kubectl config set-credentials bootstrap --token=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
    kubectl config set-context cfc --cluster=cfc --user=bootstrap
    kubectl config use-context cfc

    echo -e "\n\e[1mChecking cluster permissions...\e[0m"
    echo -n "Checking for permission to create configmaps in {{.Release.Namespace}} namespace: "
    kubectl auth can-i create configmaps --namespace {{.Release.Namespace}}
    if [ $? -ne 0 ]; then
      permission_error "create configmaps"
    fi

    echo -n "Checking for permission to create secrets in {{.Release.Namespace}} namespace: "
    kubectl auth can-i create secrets --namespace {{.Release.Namespace}}
    if [ $? -ne 0 ]; then
      permission_error "create secrets"
    fi
    {{ if .Values.autocert.enabled }}
    echo -n "Checking for permission to create mutatingwebhookconfiguration in {{.Release.Namespace}} namespace: "
        kubectl auth can-i create mutatingwebhookconfiguration --namespace {{.Release.Namespace}}
        if [ $? -ne 0 ]; then
          permission_error "create mutatingwebhookconfiguration"
      fi
    {{- end }}

    # Setting this here on purpose, after the above section which explicitly checks
    # for and handles exit errors.
      set -e

      echo -e "\n\e[1mInitializating the CA...\e[0m"

    # CA password
    {{- if .Values.ca.password }}
      CA_PASSWORD={{ quote .Values.ca.password }}
    {{- else }}
      CA_PASSWORD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32 ; echo '')
    {{- end }}
    # Provisioner password
    {{- if .Values.ca.provisioner.password }}
      CA_PROVISIONER_PASSWORD={{ quote .Values.ca.provisioner.password }}
    {{- else }}
      CA_PROVISIONER_PASSWORD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32 ; echo '')
    {{- end }}

    TMP_CA_PASSWORD=$(mktemp /tmp/autocert.XXXXXX)
    TMP_CA_PROVISIONER_PASSWORD=$(mktemp /tmp/autocert.XXXXXX)

    echo $CA_PASSWORD > $TMP_CA_PASSWORD
    echo $CA_PROVISIONER_PASSWORD > $TMP_CA_PROVISIONER_PASSWORD

    step ca init \
    --name "{{.Values.ca.name}}" \
    --dns "{{include "step-certificates.dns" .}}" \
    --address "{{.Values.ca.address}}" \
    --provisioner "{{.Values.ca.provisioner.name}}" \
    --with-ca-url "{{include "step-certificates.url" .}}" \
    --password-file "$TMP_CA_PASSWORD" \
    --provisioner-password-file "$TMP_CA_PROVISIONER_PASSWORD" {{ if not .Values.ca.db.enabled }}--no-db{{ end }}

    rm -f $TMP_CA_PASSWORD $TMP_CA_PROVISIONER_PASSWORD

    echo -e "\n\e[1mCreating configmaps and secrets in {{.Release.Namespace}} namespace ...\e[0m"

    # Replace secrets created on helm install
    # It allows to properly remove them on helm delete
    kbreplace -n {{.Release.Namespace}} create configmap {{ include "step-certificates.fullname" . }}-config --from-file $(step path)/config
    kbreplace -n {{.Release.Namespace}} create configmap {{ include "step-certificates.fullname" . }}-certs --from-file $(step path)/certs
    kbreplace -n {{.Release.Namespace}} create configmap {{ include "step-certificates.fullname" . }}-secrets --from-file $(step path)/secrets

    kbreplace -n {{.Release.Namespace}} create secret generic {{ include "step-certificates.fullname" . }}-ca-password --from-literal "password=${CA_PASSWORD}"
    kbreplace -n {{.Release.Namespace}} create secret generic {{ include "step-certificates.fullname" . }}-provisioner-password --from-literal "password=${CA_PROVISIONER_PASSWORD}"

    # Label all configmaps and secrets
    kubectl -n {{.Release.Namespace}} label configmap {{ include "step-certificates.fullname" . }}-config {{ include "step-certificates.labels" . | replace ": " "=" | replace "\n" " " }}
    kubectl -n {{.Release.Namespace}} label configmap {{ include "step-certificates.fullname" . }}-certs {{ include "step-certificates.labels" . | replace ": " "=" | replace "\n" " " }}
    kubectl -n {{.Release.Namespace}} label configmap {{ include "step-certificates.fullname" . }}-secrets {{ include "step-certificates.labels" . | replace ": " "=" | replace "\n" " " }}
    kubectl -n {{.Release.Namespace}} label secret {{ include "step-certificates.fullname" . }}-ca-password {{ include "step-certificates.labels" . | replace ": " "=" | replace "\n" " " }}
    kubectl -n {{.Release.Namespace}} label secret {{ include "step-certificates.fullname" . }}-provisioner-password {{ include "step-certificates.labels" . | replace ": " "=" | replace "\n" " " }}

    # Patch webhook if autocert is enabled
    {{ if .Values.autocert.enabled }}
      CA_BUNDLE=$(cat $(step path)/certs/root_ca.crt | base64 | tr -d '\n')
      kubectl patch mutatingwebhookconfigurations {{ .Release.Name }}-autocert-webhook-config \
      --type json -p="[{\"op\":\"replace\",\"path\":\"/webhooks/0/clientConfig/caBundle\",\"value\":\"$CA_BUNDLE\"}]"
    {{- end }}

      echo -e "\n\e[1mStep Certificates installed!\e[0m"
      echo
    echo "CA URL: {{include "step-certificates.url" .}}"
    echo "CA Fingerprint: $(step certificate fingerprint $(step path)/certs/root_ca.crt)"
    echo