apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: {{ .Release.Name }}
  name: {{ .Release.Name }}
  namespace: observability
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.env.PROVIDER "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:
            - python
            - o11ydiagnosis/engine/engine.py
          env:
          - name: POD_NUMBER
            valueFrom:
              fieldRef:
                fieldPath: metadata.labels['statefulset.kubernetes.io/pod-name']
          - name: TOTAL_REPLICAS
            value: "{{ .Values.env.TOTAL_REPLICAS }}"
          - name: CACHE_ROOT
            value: "{{ .Values.env.CACHE_ROOT }}"
          - name: LOCAL_DEV
            value: "{{ .Values.env.LOCAL_DEV }}"
          - name: START_TIMESTEMP
            value: "{{ .Values.env.START_TIMESTEMP }}"
          {{- if eq .Values.env.PROVIDER "alicloud" }}
          - name: PROVIDER
            value: "aws"
          - name: AWS_ENDPOINT_S3
            value: "{{ .Values.env.AWS_ENDPOINT_S3 }}"
          - name: AWS_ACCESS_KEY_ID
            valueFrom:
              secretKeyRef:
                name: o11y-regional-ram-credentials
                key: AWS_ACCESS_KEY_ID
          - name: AWS_SECRET_ACCESS_KEY
            valueFrom:
              secretKeyRef:
                name: o11y-regional-ram-credentials
                key: AWS_SECRET_ACCESS_KEY
          - name: AWS_REQUEST_CHECKSUM_CALCULATION
            value: "WHEN_REQUIRED"
          - name: AWS_RESPONSE_CHECKSUM_VALIDATION
            value: "WHEN_REQUIRED"
          {{- else }}
          - name: PROVIDER
            value: "{{ .Values.env.PROVIDER }}"
          {{- end }}
          {{- if eq .Values.env.PROVIDER "gcp" }}
          - name: GCP_PROJECT
            value: "{{ .Values.env.GCP_PROJECT }}"
          - name: REMOTE_PROVIDER
            value: "{{ .Values.env.REMOTE_PROVIDER }}"
          {{- end }}
          - name: BUCKET_NAME
            value: "{{ .Values.env.BUCKET_NAME }}"
          - name: USE_LOCAL_LOADER
            value: "{{ .Values.env.USE_LOCAL_LOADER }}"
          - name: ENGINE_ID
            value: "{{ .Values.env.ENGINE_ID }}"
          - name: ENV
            value: "{{ .Values.env.ENV }}"
          - name: ENABLE_SERVERLESS_TASK
            value: "{{ .Values.env.ENABLE_SERVERLESS_TASK }}"
          - name: SERVERLESS_TASK_TIERS
            value: "{{ .Values.env.SERVERLESS_TASK_TIERS }}"
          {{- if .Values.env.SLOWLOG_ETL_INTERVAL_SECS }}
          - name: SLOWLOG_ETL_INTERVAL_SECS
            value: "{{ .Values.env.SLOWLOG_ETL_INTERVAL_SECS }}"
          {{- end }}
          {{- if eq .Values.env.PROVIDER "azure" }}
          - name: AZURE_STORAGE_ACCOUNT
            value: "{{ .Values.env.AZURE_STORAGE_ACCOUNT }}"
          - name: REMOTE_PROVIDER
            value: "{{ .Values.env.PROVIDER }}"
          {{- end }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          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.env.PROVIDER "azure" }}
            - mountPath: /var/run/secrets/azure/tokens
              name: azure-identity-token
              readOnly: true
            {{- end }}
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: regional-server-controller-manager
      serviceAccountName: regional-server-controller-manager
      terminationGracePeriodSeconds: 30
      {{- if eq .Values.env.PROVIDER "azure" }}
      volumes:
      - name: azure-identity-token
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              audience: api://AzureADTokenExchange
              expirationSeconds: 3600
              path: azure-identity-token
      {{- end }}
  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 }}
        storageClassName: {{ .Values.persistence.storageClass }}
        volumeMode: Filesystem
      status:
        phase: Pending
