apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "hapi-fhir-jpaserver.fullname" . }}
  labels:
    {{- include "hapi-fhir-jpaserver.labels" . | nindent 4 }}
  {{- with .Values.deploymentAnnotations }}
  annotations:
    {{- toYaml . | nindent 8 }}
  {{- end }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      {{- include "hapi-fhir-jpaserver.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      {{- with .Values.podAnnotations }}
      annotations:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      labels:
        {{- include "hapi-fhir-jpaserver.selectorLabels" . | nindent 8 }}
    spec:
      {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      serviceAccountName: {{ include "hapi-fhir-jpaserver.serviceAccountName" . }}
      securityContext:
        {{- toYaml .Values.podSecurityContext | nindent 8 }}
      initContainers:
        - name: wait-for-db-to-be-ready
          image: docker.io/bitnami/postgresql:16.2.0-debian-12-r6@sha256:ea55532b6f75afbc97f617d91ec5efae17609c8eb825a31845fa9cb9e4aa13e1
          imagePullPolicy: IfNotPresent
          {{- with .Values.restrictedContainerSecurityContext }}
          securityContext:
            {{- toYaml . | nindent 12 }}
          {{- end }}
          env:
            - name: PGHOST
              value: "{{ include "hapi-fhir-jpaserver.database.host" . }}"
            - name: PGPORT
              value: "{{ include "hapi-fhir-jpaserver.database.port" . }}"
            - name: PGUSER
              value: "{{ include "hapi-fhir-jpaserver.database.user" . }}"
          command: ["/bin/sh", "-c"]
          args:
            - |
              until pg_isready; do
                echo "Waiting for DB ${PGUSER}@${PGHOST}:${PGPORT} to be up";
                sleep 15;
              done;
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: {{ .Values.image.registry }}/{{ .Values.image.repository }}:{{ .Values.image.tag }}
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
            - name: http-metrics
              containerPort: 8081
              protocol: TCP
          {{- with .Values.startupProbe }}
          startupProbe:
            {{- toYaml . | nindent 12 }}
          {{- end }}
          {{- with .Values.livenessProbe }}
          livenessProbe:
            {{- toYaml . | nindent 12 }}
          {{- end }}
          {{- with .Values.readinessProbe }}
          readinessProbe:
            {{- toYaml . | nindent 12 }}
          {{- end }}
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
          env:
            - name: SPRING_DATASOURCE_URL
              value: {{ include "hapi-fhir-jpaserver.database.jdbcUrl" $ }}
            - name: SPRING_DATASOURCE_USERNAME
              value: {{ include "hapi-fhir-jpaserver.database.user" $ }}
            - name: SPRING_DATASOURCE_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: {{ include "hapi-fhir-jpaserver.postgresql.secretName" . }}
                  key: {{ include "hapi-fhir-jpaserver.postgresql.secretKey" . }}
            - name: SPRING_DATASOURCE_DRIVERCLASSNAME
              value: org.postgresql.Driver
            - name: spring.jpa.properties.hibernate.dialect
              value: ca.uhn.fhir.jpa.model.dialect.HapiFhirPostgres94Dialect
            - name: HAPI_FHIR_USE_APACHE_ADDRESS_STRATEGY
              value: "true"
            - name: MANAGEMENT_ENDPOINT_HEALTH_PROBES_ADD_ADDITIONAL_PATHS
              value: "true"
            - name: MANAGEMENT_SERVER_PORT
              value: "8081"
            {{- if .Values.extraConfig }}
            - name: SPRING_CONFIG_IMPORT
              value: "/app/config/application-extra.yaml"
            {{- end }}
            {{- if .Values.extraEnv }}
            {{ toYaml .Values.extraEnv | nindent 12 }}
            {{- end }}
          volumeMounts:
            - mountPath: /tmp
              name: tmp-volume
            - mountPath: /app/target
              name: lucenefiles-volume
          {{- if .Values.extraConfig }}
            - name: application-extra-config
              mountPath: /app/config/application-extra.yaml
              readOnly: true
              subPath: application-extra.yaml
          {{- end }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.topologySpreadConstraints }}
      topologySpreadConstraints:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      volumes:
        - name: tmp-volume
          emptyDir: {}
        - name: lucenefiles-volume
          emptyDir: {}
      {{- if .Values.extraConfig }}
        - name: application-extra-config
          configMap:
            name: {{ include "hapi-fhir-jpaserver.fullname" . }}-application-config
      {{- end }}
