{{- if and (not .Values.agent) (not .Values.cloudAgent) (.Values.kubecostAggregator) }}
{{- if .Values.kubecostAggregator.enabled }}

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: {{ template "aggregator.fullname" . }}
  namespace: {{ .Release.Namespace }}
  labels:
    {{- include "aggregator.commonLabels" . | nindent 4 }}
spec:
  replicas: {{ .Values.kubecostAggregator.replicas }}
  serviceName: {{ template "aggregator.serviceName" . }}
  selector:
    matchLabels:
      app.kubernetes.io/name: aggregator
      app.kubernetes.io/instance: {{ .Release.Name }}
      app: aggregator
  volumeClaimTemplates:
  - metadata:
      name: persistent-configs
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: {{ .Values.kubecostAggregator.persistentConfigsStorage.storageClass }}
      resources:
        requests:
          storage: {{ .Values.kubecostAggregator.persistentConfigsStorage.storageRequest }}
  - metadata:
      name: aggregator-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: {{ .Values.kubecostAggregator.aggregatorStorage.storageClass }}
      resources:
        requests:
          storage:  {{ .Values.kubecostAggregator.aggregatorStorage.storageRequest }}
  {{- if .Values.kubecostAggregator.aggregatorDbStorage }}
  - metadata:
      name: aggregator-db-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: {{ .Values.kubecostAggregator.aggregatorDbStorage.storageClass }}
      resources:
        requests:
          storage:  {{ .Values.kubecostAggregator.aggregatorDbStorage.storageRequest }}
  {{- end }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: aggregator
        app.kubernetes.io/instance: {{ .Release.Name }}
        app: aggregator
    spec:
      restartPolicy: Always
      {{- if .Values.kubecostAggregator.securityContext }}
      securityContext:
        {{- toYaml .Values.kubecostAggregator.securityContext | nindent 8 }}
      {{- else if .Values.global.securityContext }}
      securityContext:
        {{- toYaml .Values.global.securityContext | nindent 8 }}
      {{ end }}
      serviceAccountName: {{ template "aggregator.serviceAccountName" . }}
      volumes:
        {{- $etlBackupBucketSecret := "" }}
        {{- if .Values.kubecostModel.federatedStorageConfigSecret }}
            {{- $etlBackupBucketSecret = .Values.kubecostModel.federatedStorageConfigSecret }}
        {{- end }}
        {{- if $etlBackupBucketSecret }}
        - name: bucket-config
          secret:
            defaultMode: 420
            secretName: {{ $etlBackupBucketSecret }}
        {{- end }}
      containers:
      {{- if .Values.kubecostAggregator.jaeger.enabled }}
        - name: embedded-jaeger
          securityContext:
            {{- toYaml .Values.kubecostAggregator.jaeger.containerSecurityContext | nindent 12 }}
          image: {{ .Values.kubecostAggregator.jaeger.image }}:{{ .Values.kubecostAggregator.jaeger.imageVersion }}
      {{- end }}
        - name: aggregator
        {{- if .Values.kubecostAggregator.containerSecurityContext }}
          securityContext:
            {{- toYaml .Values.kubecostAggregator.containerSecurityContext | nindent 12 }}
        {{- else if .Values.global.containerSecurityContext }}
          securityContext:
            {{- toYaml .Values.global.containerSecurityContext | nindent 12 }}
        {{ end }}
          {{- if .Values.kubecostModel }}
          {{- if .Values.kubecostModel.openSourceOnly }}
          {{- fail "Kubecost Aggregator cannot be used with open source only" }}
          {{- else if .Values.kubecostAggregator.fullImageName }}
          image: {{ .Values.kubecostAggregator.fullImageName }}
          {{- else if .Values.kubecostModel.fullImageName }}
          image: {{ .Values.kubecostModel.fullImageName }}
          {{- else if .Values.imageVersion }}
          image: {{ .Values.kubecostModel.image }}:{{ .Values.imageVersion }}
          {{- else }}
          image: {{ .Values.kubecostModel.image }}:prod-{{ $.Chart.AppVersion }}
          {{ end }}
          {{- else }}
          image: gcr.io/kubecost1/cost-model:prod-{{ $.Chart.AppVersion }}
          {{ end }}
          readinessProbe:
            httpGet:
              path: /healthz
              port: 9004
            initialDelaySeconds: 10
            periodSeconds: 5
            failureThreshold: 200
          imagePullPolicy: Always
          args: ["waterfowl"]
          ports:
            - name: tcp-api
              containerPort: 9004
              protocol: TCP
          resources:
            {{ toYaml .Values.kubecostAggregator.resources | nindent 12 }}
          volumeMounts:
            - name: persistent-configs
              mountPath: /var/configs
            - name: bucket-config
              mountPath: /var/configs/etl
            - name: aggregator-storage
              mountPath: /var/configs/waterfowl
            {{- if .Values.kubecostAggregator.aggregatorDbStorage }}
            - name: aggregator-db-storage
              mountPath: /var/configs/waterfowl/duckdb
            {{- end }}
          env:
            {{- if and (.Values.prometheus.server.global.external_labels.cluster_id) (not .Values.prometheus.server.clusterIDConfigmap) }}
            - name: CLUSTER_ID
              value: {{ .Values.prometheus.server.global.external_labels.cluster_id }}
            {{- end }}
            {{- if .Values.prometheus.server.clusterIDConfigmap }}
            - name: CLUSTER_ID
              valueFrom:
                configMapKeyRef:
                  name: {{ .Values.prometheus.server.clusterIDConfigmap }}
                  key: CLUSTER_ID
            {{- end }}
            {{- if .Values.kubecostAggregator.jaeger.enabled }}
            - name: TRACING_URL
              value: "http://localhost:14268/api/traces"
            {{- end }}
            - name: CONFIG_PATH
              value: /var/configs/
            - name: ETL_ENABLED
              value: "false" # this pod should never run KC's concept of "ETL"
            - name: CLOUD_PROVIDER_API_KEY
              value: "AIzaSyDXQPG_MHUEy9neR7stolq6l0ujXmjJlvk" # The GCP Pricing API key.This GCP api key is expected to be here and is limited to accessing google's billing API.'
              value: "true" # just in case, not sure if necessary

            {{- if $etlBackupBucketSecret }}
            # If this isn't set, we pretty much have to be in a read only state,
            # initialization will probably fail otherwise.
            - name: ETL_BUCKET_CONFIG
              {{- if not .Values.kubecostModel.federatedStorageConfigSecret}}
              value: "/var/configs/etl/object-store.yaml"
              {{- else  }}
              value: "/var/configs/etl/federated-store.yaml"
            - name: FEDERATED_STORE_CONFIG
              value: "/var/configs/etl/federated-store.yaml"
            - name: FEDERATED_PRIMARY_CLUSTER # this ensures the ingester runs assuming federated primary paths in the bucket
              value: "true"
            - name: FEDERATED_CLUSTER # this ensures the ingester runs assuming federated primary paths in the bucket
              value: "true"
              {{- end }}
            {{- end }}

            {{- range $key, $value := .Values.kubecostAggregator.env }}
            - name: {{ $key | quote }}
              value: {{ $value | quote }}
            {{- end }}
            - name: KUBECOST_NAMESPACE
              value: {{ .Release.Namespace }}

    {{- if .Values.imagePullSecrets }}
      imagePullSecrets:
      {{ toYaml .Values.imagePullSecrets | indent 2 }}
    {{- end }}
      {{- if .Values.kubecostAggregator.priority }}
      {{- if .Values.kubecostAggregator.priority.enabled }}
      {{- if .Values.kubecostAggregator.priority.name }}
      priorityClassName: {{ .Values.kubecostAggregator.priority.name }}
      {{- else }}
      priorityClassName: {{ template "cost-analyzer.fullname" . }}-aggregator-priority
      {{- end }}
      {{- end }}
      {{- end }}
      {{- with .Values.kubecostAggregator.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.kubecostAggregator.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.kubecostAggregator.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
      {{- end }}
{{- end }}
{{- end }}