apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: {{ .Release.Name }}
  name: {{ .Release.Name }}
  namespace: {{ .Release.Namespace }}
spec:
  persistentVolumeClaimRetentionPolicy:
    whenDeleted: Retain
    whenScaled: Retain
  podManagementPolicy: OrderedReady
  replicas: {{ .Values.replicaCount }}
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: {{ .Release.Name }}
  serviceName: {{ .Release.Name }}-service
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: {{ .Release.Name }}
        {{- if eq .Values.commandArgs.vendor "azure" }}
        azure.workload.identity/use: "true"
        {{- end }}
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - {{ .Release.Name }}
              topologyKey: "kubernetes.io/hostname"
      containers:
        - command:
            - /diagnosis-compute
            - -env
            - {{ .Values.commandArgs.env }}
            - -vendor
            - {{ .Values.commandArgs.vendor }}
            - -region
            - {{ .Values.commandArgs.region }}
            - -s3-concurrency
            - "{{ .Values.commandArgs.s3Concurrency }}"
            - -max-secs
            - "{{ .Values.commandArgs.maxSecs }}"
          {{- if .Values.commandArgs.conprofFirstHalvingDays }}
            - -conprof-first-halving-days
            - "{{ .Values.commandArgs.conprofFirstHalvingDays }}"
          {{- end }}
          {{- if .Values.commandArgs.conprofSecondHalvingDays }}
            - -conprof-second-halving-days
            - "{{ .Values.commandArgs.conprofSecondHalvingDays }}"
          {{- end }}
          {{- if .Values.commandArgs.logicalRegion }}
            - -logical-region
            - {{ .Values.commandArgs.logicalRegion }}
          {{- end }}
          {{- if .Values.commandArgs.bucket }}
            - -bucket
            - {{ .Values.commandArgs.bucket }}
          {{- end }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          {{- if eq .Values.commandArgs.vendor "alicloud" }}
          env:
            - name: ALIBABA_CLOUD_ACCESS_KEY_ID
              valueFrom:
                secretKeyRef:
                  key: AWS_ACCESS_KEY_ID
                  name: o11y-regional-ram-credentials
            - name: ALIBABA_CLOUD_ACCESS_KEY_SECRET
              valueFrom:
                secretKeyRef:
                  key: AWS_SECRET_ACCESS_KEY
                  name: o11y-regional-ram-credentials
          {{- end }}
          name: {{ .Release.Name }}
          ports:
            - containerPort: 8000
              name: http-metrics
          resources:
            limits:
              cpu: "{{ .Values.resources.limits.cpu }}"
              memory: "{{ .Values.resources.limits.memory }}"
            requests:
              cpu: "{{ .Values.resources.requests.cpu }}"
              memory: "{{ .Values.resources.requests.memory }}"
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /data
              name: {{ .Release.Name }}-data
            {{- if eq .Values.commandArgs.vendor "azure" }}
            - name: azure-identity-token
              mountPath: /var/run/secrets/azure/tokens
              readOnly: true
            {{- end }}
      dnsPolicy: ClusterFirst
      nodeSelector:
        node_type: worker
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: regional-server-controller-manager
      serviceAccountName: regional-server-controller-manager
      {{- if eq .Values.commandArgs.vendor "azure" }}
      volumes:
      - name: azure-identity-token
        projected:
          sources:
          - serviceAccountToken:
              audience: api://AzureADTokenExchange
              expirationSeconds: 3600
              path: azure-identity-token
      {{- end }}
      terminationGracePeriodSeconds: 30
  updateStrategy:
    rollingUpdate:
      partition: 0
    type: RollingUpdate
  volumeClaimTemplates:
    - apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        creationTimestamp: null
        labels:
          app: {{ .Release.Name }}
        name: {{ .Release.Name }}-data
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: {{ .Values.persistence.size }}
        {{- if and .Values.persistence .Values.persistence.storageClass }}
        storageClassName: {{ .Values.persistence.storageClass }}
        {{- end }}
        volumeMode: Filesystem
