apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: {{ template "influxdb.fullname" . }}
  labels:
    {{ include "influxdb.labels" . | nindent 4 }}
spec:
  replicas: 1
  selector:
    matchLabels:
      {{- include "influxdb.selectorLabels" . | nindent 6 }}
  serviceName: "{{ include "influxdb.fullname" . }}"
  template:
    metadata:
      labels:
      {{- include "influxdb.selectorLabels" . | nindent 8 }}
      annotations:
      {{- toYaml .Values.podAnnotations | nindent 8 }}
    spec:
      volumes:
        - name: data
        {{- if .Values.persistence.enabled }}
          {{- if not (empty .Values.persistence.name) }}
          persistentVolumeClaim:
            claimName: {{ .Values.persistence.name }}
          {{- else }}
          persistentVolumeClaim:
            claimName: {{ template "influxdb.fullname" . }}
          {{- end }}
        {{- else }}
          emptyDir: {}
        {{- end }}
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: {{ .Values.service.portName }}
              containerPort: 8086
              protocol: TCP
          env:
            # Automated setup will not run if an existing boltdb file is found at the configured path.
            # This behavior allows for the InfluxDB container to reboot post-setup without encountering "DB is already set up" errors.
            - name: DOCKER_INFLUXDB_INIT_MODE
              value: setup
            # The username to set for the system's initial super-user (Required).
            - name: DOCKER_INFLUXDB_INIT_USERNAME
              value: {{ .Values.adminUser.user }}
            # The password to set for the system's inital super-user (Required).
            - name: DOCKER_INFLUXDB_INIT_PASSWORD
              valueFrom:
                secretKeyRef:
                  {{- if .Values.adminUser.existingSecret }}
                  name: {{ .Values.adminUser.existingSecret -}}
                  {{ else }}
                  name: {{ template "influxdb.fullname" . }}-auth
                  {{- end }}
                  key: admin-password
            # The name to set for the system's initial organization (Required).
            - name: DOCKER_INFLUXDB_INIT_ORG
              value: {{ .Values.adminUser.organization }}
            # The name to set for the system's initial bucket (Required).
            - name: DOCKER_INFLUXDB_INIT_BUCKET
              value: {{ .Values.adminUser.bucket }}
            # The duration the system's initial bucket should retain data. If not set, the initial bucket will retain data forever.
            - name: DOCKER_INFLUXDB_INIT_RETENTION
              value: {{ .Values.adminUser.retention_policy }}
            # The authentication token to associate with the system's initial super-user. If not set, a token will be auto-generated by the system.
            - name: DOCKER_INFLUXDB_INIT_ADMIN_TOKEN
              valueFrom:
                secretKeyRef:
                  {{- if .Values.adminUser.existingSecret }}
                  name: {{ .Values.adminUser.existingSecret -}}
                  {{ else }}
                  name: {{ template "influxdb.fullname" . }}-auth
                  {{- end }}
                  key: admin-token

            # Path to the BoltDB database.
            - name: INFLUXD_BOLT_PATH
              value: {{ .Values.persistence.mountPath }}/influxd.bolt
            # Path to persistent storage engine files where InfluxDB stores all Time-Structure Merge Tree (TSM) data on disk.
            - name: INFLUXD_ENGINE_PATH
              value: {{ .Values.persistence.mountPath }}

            # Extra environment variables from .Values.env
            {{- with .Values.env }}
            {{- toYaml . | nindent 12 }}
            {{- end }}

          {{- if .Values.securityContext }}
          securityContext:
            {{ toYaml .Values.securityContext | nindent 12 }}
          {{- end }}
          livenessProbe:
            httpGet:
              path: /health
              port: http
          readinessProbe:
            httpGet:
              path: /health
              port: http
          volumeMounts:
          - name: data
            mountPath: {{ .Values.persistence.mountPath }}
          resources:
            {{ .Values.resources | toYaml | nindent 12 | trim }}

      {{- if .Values.securityContext.runAsGroup }}
      securityContext:
        fsGroup: {{ .Values.securityContext.runAsGroup }}
      {{- end }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{ toYaml . | nindent 8 | trim }}
      {{- end }}

      {{- with .Values.affinity }}
      affinity:
        {{ toYaml . | nindent 8 | trim }}
      {{- end }}

      {{- with .Values.tolerations }}
      tolerations:
        {{ toYaml . | nindent 8 | trim }}
      {{- end }}