#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.

{{- $platform := .Values.platform }}
{{- $zkReplicas := .Values.zkReplicas }}

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: {{ .Release.Name }}-zookeeper
  labels:
    app: {{ .Release.Name }}-zookeeper
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    release: {{ .Release.Name | quote }}
    heritage: {{ .Release.Service | quote }}
spec:
  selector:
    matchLabels:
      app: {{ .Release.Name }}-zookeeper
      release: {{ .Release.Name | quote }}
  {{- if .Values.minAvailable }}
  minAvailable: {{ .Values.zookeeper.minAvailable }}
  {{- else }}
  minAvailable: 1
  {{- end }}

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: {{ .Release.Name }}-zookeeper
  labels:
    app: {{ .Release.Name }}-zookeeper
    release: {{ .Release.Name | quote }}
spec:
  selector:
    matchLabels:
      app: {{ .Release.Name }}-zookeeper
      release: {{ .Release.Name | quote }}    
  serviceName: {{ .Release.Name }}-zookeeper-headless
  replicas: {{ $zkReplicas }}
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}-zookeeper
        release: {{ .Release.Name | quote }}
    spec:
      {{- if eq .Values.zookeeper.antiAffinity "hard" }}
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - topologyKey: "kubernetes.io/hostname"
              labelSelector:
                matchLabels:
                  app: {{ .Release.Name }}
                  release: {{ .Release.Name | quote }}
      {{- else if eq .Values.zookeeper.antiAffinity "soft" }}
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 1
              podAffinityTerm:
                topologyKey: "kubernetes.io/hostname"
                labelSelector:
                  matchLabels:
                    app: {{ .Release.Name }}-zookeeper
                    release: {{ .Release.Name | quote }}
      {{- end }}
      containers:
      - name: zookeeper-server
        image: {{ .Values.image }}
        imagePullPolicy: {{ .Values.imagePullPolicy }}
        resources:
{{ toYaml .Values.zookeeper.resources | indent 10 }}
        ports:
        - containerPort: {{ .Values.zookeeper.clientPort }}
          name: client
        - containerPort: {{ .Values.zookeeper.serverPort }}
          name: server
        - containerPort: {{ .Values.zookeeper.leaderElectionPort }}
          name: leader-election
        env:
        - name : ZK_REPLICAS
          value: "{{ $zkReplicas }}"
        - name : ZK_HEAP_SIZE
          value: "{{ .Values.zookeeper.heap }}"
        - name : ZK_TICK_TIME
          value: "{{ .Values.zookeeper.tickTimeMs }}"
        - name : ZK_INIT_LIMIT
          value: "{{ .Values.zookeeper.initTicks }}"
        - name : ZK_SYNC_LIMIT
          value: "{{ .Values.zookeeper.syncTicks }}"
        - name : ZK_MAX_CLIENT_CNXNS
          value: "{{ .Values.zookeeper.clientCnxns }}"
        - name: ZK_SNAP_RETAIN_COUNT
          value: "{{ .Values.zookeeper.snapRetain }}"
        - name: ZK_PURGE_INTERVAL
          value: "{{ .Values.zookeeper.purgeHours }}"
        - name: ZK_LOG_LEVEL
          value: {{ .Values.zookeeper.logLevel }}
        - name: ZK_CLIENT_PORT
          value: "{{ .Values.zookeeper.clientPort }}"
        - name: ZK_SERVER_PORT
          value: "{{ .Values.zookeeper.serverPort }}"
        - name: ZK_ELECTION_PORT
          value: "{{ .Values.zookeeper.leaderElectionPort }}"
        command:
        - sh
        - -c
        - /opt/zookeeper/scripts/start-zookeeper.sh 
        readinessProbe:
          exec:
            command:
            - "/opt/zookeeper/scripts/zookeeper-ruok.sh"
          initialDelaySeconds: {{ .Values.zookeeper.probeInitialDelaySeconds }}
          timeoutSeconds: {{ .Values.zookeeper.probeTimeoutSeconds }}
        livenessProbe:
          exec:
            command:
            - "/opt/zookeeper/scripts/zookeeper-ruok.sh"
          initialDelaySeconds: {{ .Values.zookeeper.probeInitialDelaySeconds }}
          timeoutSeconds: {{ .Values.zookeeper.probeTimeoutSeconds }}
        volumeMounts:
        - name: datadir
          mountPath: /var/lib/zookeeper
          subPath: data
      {{- if eq .Values.zookeeper.security.enabled true }}
      securityContext:
        runAsUser: {{ .Values.zookeeper.security.runAsUser }}
        fsGroup: {{ .Values.zookeeper.security.fsGroup }}
      {{- end }}
  volumeClaimTemplates:
  - metadata:
      name: datadir
    spec:
      accessModes: [ "ReadWriteOnce" ]
      {{- if ne .Values.zookeeper.storageClassName "none" }}
      storageClassName: {{ .Values.zookeeper.storageClassName }}
      {{- end }}
      resources:
        requests:
          storage: {{ .Values.zookeeper.storage }}

---
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}-zookeeper-headless
  labels:
    app: {{ .Release.Name }}-zookeeper
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    release: {{ .Release.Name | quote }}
    heritage: {{ .Release.Service | quote }}
spec:
  ports:
  - port: {{ .Values.zookeeper.serverPort }}
    name: server
  - port: {{ .Values.zookeeper.leaderElectionPort }}
    name: leader-election
  clusterIP: None
  selector:
    app: {{ .Release.Name }}-zookeeper
    release: {{ .Release.Name | quote }}

---
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}-zookeeper
  labels:
    app: {{ .Release.Name }}-zookeeper
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    release: {{ .Release.Name | quote }}
    heritage: {{ .Release.Service | quote }}
spec:
  ports:
  - port: {{ .Values.zookeeper.clientPort }}
    name: client
  selector:
    app: {{ .Release.Name }}-zookeeper
    release: {{ .Release.Name | quote }}
