#
# 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.
#

{{- if .Values.components.tubemqServer }}
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: {{ template "inlong.fullname" . }}-{{ .Values.tubemqBroker.component }}
  namespace: {{ .Release.Namespace }}
  labels:
    {{- include "inlong.commonLabels" . | nindent 4 }}
    component: {{ .Values.tubemqBroker.component }}
spec:
  serviceName: {{ template "inlong.fullname" . }}-{{ .Values.tubemqBroker.component }}
  replicas: {{ .Values.tubemqBroker.replicas }}
  selector:
    matchLabels:
      {{- include "inlong.matchLabels" . | nindent 6 }}
      component: {{ .Values.tubemqBroker.component }}
  updateStrategy:
    type: {{ .Values.tubemqBroker.updateStrategy.type | quote }}
  podManagementPolicy: {{ .Values.tubemqBroker.podManagementPolicy | quote }}
  template:
    metadata:
      labels:
        {{- include "inlong.template.labels" . | nindent 8 }}
        component: {{ .Values.tubemqBroker.component }}
      {{- if .Values.tubemqBroker.annotations }}
      annotations:
        {{- toYaml .Values.tubemqBroker.annotations | nindent 8 }}
      {{- end }}
    spec:
      {{- if .Values.tubemqBroker.tolerations }}
      tolerations:
        {{- toYaml .Values.tubemqBroker.tolerations | nindent 8 }}
      {{- end }}
      {{- if .Values.tubemqBroker.nodeSelector }}
      nodeSelector:
        {{- toYaml .Values.tubemqBroker.nodeSelector | nindent 8 }}
      {{- end }}
      {{- if .Values.tubemqBroker.affinity }}
      affinity:
        {{- if .Values.tubemqBroker.affinity.antiAffinity }}
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                      - "{{ template "inlong.name" . }}-{{ .Values.tubemqBroker.component }}"
                  - key: "release"
                    operator: In
                    values:
                      - {{ .Release.Name }}
                  - key: "component"
                    operator: In
                    values:
                      - {{ .Values.tubemqBroker.component }}
              topologyKey: "kubernetes.io/hostname"
        {{- end }}
      {{- end }}
      terminationGracePeriodSeconds: {{ .Values.tubemqBroker.terminationGracePeriodSeconds }}
      initContainers:
        - name: wait-{{ .Values.tubemqMaster.component }}-ready
          image: {{ .Values.images.initContainer.repository }}:{{ .Values.images.initContainer.tag }}
          imagePullPolicy: {{ .Values.images.pullPolicy }}
          command: [ "/bin/sh", "-c" ]
          args:
            - |
              count={{ .Values.tubemqMaster.replicas }}
              for i in $(seq 0 $(expr $count - 1))
              do
                replica="{{ template "inlong.fullname" . }}-{{ .Values.tubemqMaster.component }}-$i"
                host="$replica.{{ template "inlong.tubemqMaster.hostname" . }}"
                port={{ .Values.tubemqMaster.ports.webPort }}
                until nc -z $host $port 2>/dev/null
                do
                  echo "waiting for $replica to be ready"
                  sleep 3
                done
              done
      containers:
        - name: {{ template "inlong.fullname" . }}-{{ .Values.tubemqBroker.component }}
          image: {{ .Values.images.tubemqServer.repository }}:{{ .Values.images.tubemqServer.tag }}
          imagePullPolicy: {{ .Values.images.pullPolicy }}
          {{- if .Values.tubemqBroker.resources }}
          resources:
            {{- toYaml .Values.tubemqBroker.resources | nindent 12 }}
          {{- end }}
          command: [ "/bin/sh", "-c" ]
          args:
            - >
              /config-scripts/run
          ports:
            - name: broker-web-port
              containerPort: 8081
            - name: broker-rpc-port
              containerPort: 8123
          env:
            - name: MY_POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            {{- range $key, $value := .Values.tubemqBroker.env }}
            - name: {{ $key }}
              value: {{ $value | quote }}
            {{- end }}
            - name: TZ
              value: {{ .Values.timezone }}
          {{- if .Values.tubemqBroker.probe.readiness.enabled }}
          readinessProbe:
            exec:
              command:
                - /config-scripts/ready
            initialDelaySeconds: {{ .Values.tubemqBroker.probe.readiness.initialDelaySeconds }}
            periodSeconds: {{ .Values.tubemqBroker.probe.readiness.periodSeconds }}
            failureThreshold: {{ .Values.tubemqBroker.probe.readiness.failureThreshold }}
          {{- end }}
          {{- if .Values.tubemqBroker.probe.liveness.enabled }}
          livenessProbe:
            exec:
              command:
                - /config-scripts/ok
            initialDelaySeconds: {{ .Values.tubemqBroker.probe.liveness.initialDelaySeconds }}
            periodSeconds: {{ .Values.tubemqBroker.probe.liveness.periodSeconds }}
            failureThreshold: {{ .Values.tubemqBroker.probe.liveness.failureThreshold }}
          {{- end }}
          volumeMounts:
            - name: {{ template "inlong.fullname" . }}-{{ .Values.tubemqBroker.component }}-{{ .Values.tubemqBroker.volumes.name }}
              mountPath: /data
            - name: config
              mountPath: /config-scripts
            - name: {{ .Values.tubemqBroker.component }}-ini
              mountPath: /opt/tubemq-server/conf/broker.ini.raw
              subPath: broker.ini.raw
              readOnly: false
      volumes:
        - name: config
          configMap:
            name: {{ template "inlong.fullname" . }}-{{ .Values.tubemqBroker.component }}
            defaultMode: 0755
        - name: {{ .Values.tubemqBroker.component }}-ini
          configMap:
            name: {{ template "inlong.fullname" . }}-{{ .Values.tubemqBroker.component }}-ini
            defaultMode: 0644
        {{- if not .Values.tubemqBroker.volumes.persistence }}
        - name: {{ template "inlong.fullname" . }}-{{ .Values.tubemqBroker.component }}-{{ .Values.tubemqBroker.volumes.name }}
          emptyDir: {}
        {{- end }}
  {{- if .Values.tubemqBroker.volumes.persistence }}
  volumeClaimTemplates:
    - metadata:
        name: {{ template "inlong.fullname" . }}-{{ .Values.tubemqBroker.component }}-{{ .Values.tubemqBroker.volumes.name }}
      spec:
        accessModes: [ "ReadWriteOnce" ]
        resources:
          requests:
            storage: {{ .Values.tubemqBroker.volumes.size }}
        {{- if .Values.tubemqBroker.volumes.storageClassName }}
        storageClassName: "{{ .Values.tubemqBroker.volumes.storageClassName }}"
        {{- end }}
  {{- end }}
{{- end }}
