{{/*
# Copyright © 2021 Orange
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
*/}}

apiVersion: batch/v1
kind: Job
metadata:
  name: {{ include "common.fullname" . }}-config-job
  namespace: {{ include "common.namespace" . }}
  labels:
    app: {{ include "common.name" . }}
    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
    release: {{ include "common.release" . }}
    heritage: {{ .Release.Service }}
spec:
  backoffLimit: 20
  template:
    metadata:
      labels:
        app: {{ include "common.name" . }}
        release: {{ include "common.release" . }}
      name: {{ include "common.name" . }}
    spec:
      initContainers: {{ include "common.readinessCheck.waitFor" . | nindent 6 }}
      containers:
      - command:
        - sh
        args:
        - -c
        - |
          function prepare_password {
            echo -n $1 | sed -e "s/'/''/g"
          }
          export PG_PASSWORD=`prepare_password $PG_PASSWORD_INPUT`;
          export PG_ROOT_PASSWORD=`prepare_password $PG_ROOT_PASSWORD_INPUT`;
          {{- if include "common.onServiceMesh" . }}
          echo "waiting 15s for istio side cars to be up"; sleep 15s;{{- end }}
          cd /config-input && for PFILE in `ls -1 .`; do envsubst <${PFILE} >/config/${PFILE}; done;
          psql "postgresql://postgres:$PG_ROOT_PASSWORD@$PG_HOST" < /config/setup.sql
        env:
        - name: PG_HOST
          value: "{{ .Values.global.postgres.service.name2 }}"
        - name: PG_PRIMARY_USER
          value: primaryuser
        - name: MODE
          value: postgres
        - name: PG_PRIMARY_PASSWORD_INPUT
          {{- include "common.secret.envFromSecretFast" (dict "global" . "uid" (include "common.postgres.secret.primaryPasswordUID" .) "key" "password") | indent 10 }}
        - name: PG_USER
          {{- include "common.secret.envFromSecretFast" (dict "global" . "uid" (include "common.postgres.secret.userCredentialsUID" .) "key" "login") | indent 10 }}
        - name: PG_PASSWORD_INPUT
          {{- include "common.secret.envFromSecretFast" (dict "global" . "uid" (include "common.postgres.secret.userCredentialsUID" .) "key" "password") | indent 10 }}
        - name: PG_DATABASE
          value: "{{ .Values.config.pgDatabase }}"
        - name: PG_ROOT_PASSWORD_INPUT
          {{- include "common.secret.envFromSecretFast" (dict "global" . "uid" (include "common.postgres.secret.rootPassUID" .) "key" "password") | indent 10 }}
        image: {{ include "repositoryGenerator.image.postgres" . }}
        imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
        name: {{ include "common.name" . }}-update-config
        volumeMounts:
        - mountPath: /etc/localtime
          name: localtime
          readOnly: true
        - mountPath: /config-input/setup.sql
          name: config
          subPath: setup.sql
        - mountPath: /config
          name: pgconf
        resources: {{ include "common.resources" . | nindent 10 }}
      {{ include "common.waitForJobContainer" . | indent 6 | trim }}
      {{- if .Values.nodeSelector }}
      nodeSelector:
{{ toYaml .Values.nodeSelector | indent 10 }}
      {{- end -}}
      {{- if .Values.affinity }}
      affinity:
{{ toYaml .Values.affinity | indent 10 }}
      {{- end }}
      serviceAccountName: {{ include "common.fullname" (dict "suffix" "read" "dot" . )}}
      volumes:
      - name: localtime
        hostPath:
          path: /etc/localtime
      - name: config
        configMap:
          name: {{ include "common.fullname" . }}
      - name: pgconf
        emptyDir:
          medium: Memory
      restartPolicy: Never
      imagePullSecrets:
      - name: "{{ include "common.namespace" . }}-docker-registry-key"
