{{- include "nplus.init" $ -}}
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: {{ .component.fullName }}
  {{- if .this.utils.includeNamespace }}
  namespace: {{ .Release.Namespace }}
  {{- end }}
  labels:
    {{- include "nplus.instanceLabels" . | nindent 4 }}
  annotations:
    {{- include "nplus.argoWave" . | nindent 4 }}
    {{- include "nplus.annotations" . | nindent 4 }}
    {{- include "nplus.securityAnnotations" . | nindent 4 }}
spec:
  serviceName: {{ .component.fullName }}
  selector:
    matchLabels:
      {{- include "nplus.selectorLabels" . | nindent 6 }}
  replicas: {{ .Values.replicaCount }}
  podManagementPolicy: OrderedReady
  updateStrategy:
    type: {{ .Values.updateStrategy | default "OnDelete" }}  
  minReadySeconds: 5

  template:
    metadata:
      labels:
        {{- include "nplus.templateLabels" . | nindent 8 }}
      annotations:
        {{- include "nplus.templateAnnotations" . | nindent 8 }}
        {{- include "nplus.securityAnnotations" . | nindent 8 }}
    spec:
      {{- include "nplus.imagePullSecrets" . | nindent 6 }}
      {{- include "nplus.podSecurityContext" . | nindent 6 }}
      {{- include "nplus.securityIllumioReadinessGates" . | nindent 6 }}
      {{- include "nplus.terminationGracePeriodSeconds" . | nindent 6 }}
      
      initContainers:
      {{- include "nplus.waitFor" . | nindent 6 }}
      {{- include "nplus.copyConfig" . | nindent 6 }}

      containers:
      - name: pipeliner
        image: {{ include "nplus.image"  (dict "global" .Values.global "image" .Values.image) }}
        imagePullPolicy: {{ include "nplus.imagePullPolicy" .Values.image }}
        {{- include "nplus.containerSecurityContext" . | nindent 8 }}
        env:
        {{- include "nplus.environment" . | nindent 8 }}

        {{- if .this.utils.maintenance }}
          {{- include "nplus.idle" . | nindent 8 }}
        {{- else }}
        startupProbe:
          exec:
            command:
            - "java"
            - "-jar"
            - "/opt/ceyoniq/nscale-pipeliner/javalibs/PipelinerCheck.jar"
            - "localhost"
            - "4173"
          initialDelaySeconds: 10
          failureThreshold: 12
          periodSeconds: 10
        readinessProbe:
          exec:
            command:
            - "java"
            - "-jar"
            - "/opt/ceyoniq/nscale-pipeliner/javalibs/PipelinerCheck.jar"
            - "localhost"
            - "4173"
          periodSeconds: 30
          timeoutSeconds: 3
        # -- Ceyoniq does currently not define an *official* livenessProbe, so we use
        # one that quickly checks the main socket on Layer 4.
        livenessProbe:
          tcpSocket:
            port: tcp
          # initialDelaySeconds: 20
          periodSeconds: 10
        {{- end }}

        ports:
        - containerPort: {{ required "Pipeliner tcp port must be set" ((.this.meta).ports).tcp }}
          name: tcp

        {{- include "nplus.resources" . | nindent 8 }}

        volumeMounts:
        {{- include "nplus.defaultMounts" . | nindent 8 }}

      {{- if .Values.dav }}
      - name: {{ .Release.Namespace }}-nplus-webdav-container
        image: {{ include "nplus.image" (dict "global" .Values.global "image" .Values.dav.image) }}
        imagePullPolicy: {{ include "nplus.imagePullPolicy" .Values.dav.image }}
        {{- include "nplus.containerSecurityContext" . | nindent 8 }}
        {{- include "nplus.sidecarResources" . | nindent 8 }}

        command: [ "/nplus/davserver" ]

        volumeMounts:
        - name: data
          mountPath: "/webdav"
          subPath: {{ .component.storagePath | quote }}

        env:
        # -- DAV Connection Credentials
          {{- include "nplus.envCredentials" (list
            "DAV_USER"      ($.this.dav).account
            "DAV_PASSWORD"  ($.this.dav).password
                            ($.this.dav).secret
          ) | nindent 10 }}

          - name: DAV_ROOT
            value: "/{{ .component.name }}"

        ports:
        {{- if not (.this.security).zeroTrust }}
        - containerPort: 8080
          name: http
        {{- end }}

        readinessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 10

        {{- end }}

      volumes:
      {{- include "nplus.defaultVolumes" . | nindent 6 }}

