apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: {{ template "zookeeper.fullname" . }}
  labels:
    app: {{ template "zookeeper.name" . }}
    chart: {{ template "zookeeper.chart" . }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
    component: server
spec:
  serviceName: {{ template "zookeeper.fullname" . }}-headless
  replicas: {{ .Values.replicaCount }}
  terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }}
  selector:
    matchLabels:
      app: {{ template "zookeeper.name" . }}
      release: {{ .Release.Name }}
      component: server
  updateStrategy:
{{ toYaml .Values.updateStrategy | indent 4 }}
  template:
    metadata:
      labels:
        app: {{ template "zookeeper.name" . }}
        release: {{ .Release.Name }}
        component: server
      {{- if .Values.podLabels }}
        ## Custom pod labels
        {{- range $key, $value := .Values.podLabels }}
        {{ $key }}: {{ $value | quote }}
        {{- end }}
      {{- end }}
      annotations:
      {{- if .Values.podAnnotations }}
        ## Custom pod annotations
        {{- range $key, $value := .Values.podAnnotations }}
        {{ $key }}: {{ $value | quote }}
        {{- end }}
      {{- end }}
    spec:
{{- if .Values.schedulerName }}
      schedulerName: "{{ .Values.schedulerName }}"
{{- end }}
      securityContext:
{{ toYaml .Values.securityContext | indent 8 }}
{{- if .Values.priorityClassName }}
      priorityClassName: "{{ .Values.priorityClassName }}"
{{- end }}
      containers:

        - name: zookeeper
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          command:
            - /bin/bash
            - -xec
            - zkGenConfig.sh && exec zkServer.sh start-foreground
          ports:
{{- range $key, $port := .Values.ports }}
            - name: {{ $key }}
{{ toYaml $port | indent 14 }}
{{- end }}
          livenessProbe:
{{ toYaml .Values.livenessProbe | indent 12 }}
          readinessProbe:
{{ toYaml .Values.readinessProbe | indent 12 }}
          env:
            - name: ZK_REPLICAS
              value: {{ .Values.replicaCount | quote }}
          {{- range $key, $value := .Values.env }}
            - name: {{ $key | upper | replace "." "_" }}
              value: {{ $value | quote }}
          {{- end }}
          resources:
{{ toYaml .Values.resources | indent 12 }}
          volumeMounts:
            - name: data
              mountPath: /var/lib/zookeeper

{{- if .Values.exporters.jmx.enabled }}
        - name: jmx-exporter
          image: "{{ .Values.exporters.jmx.image.repository }}:{{ .Values.exporters.jmx.image.tag }}"
          imagePullPolicy: {{ .Values.exporters.jmx.image.pullPolicy }}
          ports:
  {{- range $key, $port := .Values.exporters.jmx.ports }}
            - name: {{ $key }}
{{ toYaml $port | indent 14 }}
  {{- end }}
          livenessProbe:
{{ toYaml .Values.exporters.jmx.livenessProbe | indent 12 }}
          readinessProbe:
{{ toYaml .Values.exporters.jmx.readinessProbe | indent 12 }}
          env:
            - name: SERVICE_PORT
              value: {{ .Values.exporters.jmx.ports.jmxxp.containerPort | quote }}
          {{- with .Values.exporters.jmx.env }}
            {{- range $key, $value := . }}
            - name: {{ $key | upper | replace "." "_" }}
              value: {{ $value | quote }}
            {{- end }}
          {{- end }}
          resources:
{{ toYaml .Values.exporters.jmx.resources | indent 12 }}
          volumeMounts:
            - name: config-jmx-exporter
              mountPath: /opt/jmx_exporter/config.yml
              subPath: config.yml
{{- end }}

{{- if .Values.exporters.zookeeper.enabled }}
        - name: zookeeper-exporter
          image: "{{ .Values.exporters.zookeeper.image.repository }}:{{ .Values.exporters.zookeeper.image.tag }}"
          imagePullPolicy: {{ .Values.exporters.zookeeper.image.pullPolicy }}
          args:
            - -bind-addr=:{{ .Values.exporters.zookeeper.ports.zookeeperxp.containerPort }}
            - -metrics-path={{ .Values.exporters.zookeeper.path }}
            - -zookeeper=localhost:{{ .Values.ports.client.containerPort }}
            - -log-level={{ .Values.exporters.zookeeper.config.logLevel }}
            - -reset-on-scrape={{ .Values.exporters.zookeeper.config.resetOnScrape }}
          ports:
  {{- range $key, $port := .Values.exporters.zookeeper.ports }}
            - name: {{ $key }}
{{ toYaml $port | indent 14 }}
  {{- end }}
          livenessProbe:
{{ toYaml .Values.exporters.zookeeper.livenessProbe | indent 12 }}
          readinessProbe:
{{ toYaml .Values.exporters.zookeeper.readinessProbe | indent 12 }}
          env:
          {{- range $key, $value := .Values.exporters.zookeeper.env }}
            - name: {{ $key | upper | replace "." "_" }}
              value: {{ $value | quote }}
          {{- end }}
          resources:
{{ toYaml .Values.exporters.zookeeper.resources | indent 12 }}
{{- end }}

    {{- with .Values.nodeSelector }}
      nodeSelector:
{{ toYaml . | indent 8 }}
    {{- end }}
    {{- with .Values.affinity }}
      affinity:
{{ toYaml . | indent 8 }}
    {{- end }}
    {{- with .Values.tolerations }}
      tolerations:
{{ toYaml . | indent 8 }}
    {{- end }}
      {{- if (or .Values.exporters.jmx.enabled (not .Values.persistence.enabled)) }}
      volumes:
        {{- if .Values.exporters.jmx.enabled }}
        - name: config-jmx-exporter
          configMap:
            name: {{ .Release.Name }}-jmx-exporter
        {{- end }}
        {{- if not .Values.persistence.enabled }}
        - name: data
          emptyDir: {}
        {{- end }}
      {{- end }}
  {{- if .Values.persistence.enabled }}
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes:
          - {{ .Values.persistence.accessMode | quote }}
        resources:
          requests:
            storage: {{ .Values.persistence.size | quote }}
      {{- if .Values.persistence.storageClass }}
        {{- if (eq "-" .Values.persistence.storageClass) }}
        storageClassName: ""
        {{- else }}
        storageClassName: "{{ .Values.persistence.storageClass }}"
        {{- end }}
      {{- end }}
  {{- end }}
