apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
  name: {{ template "rabbitmq.fullname" . }}
  labels:
    app: {{ template "rabbitmq.name" . }}
    chart: {{ template "rabbitmq.chart" .  }}
    release: "{{ .Release.Name }}"
    heritage: "{{ .Release.Service }}"
spec:
  serviceName: {{ template "rabbitmq.fullname" . }}
  replicas: {{ .Values.replicas }}
  selector:
    matchLabels:
      app: {{ template "rabbitmq.name" . }}
      release: "{{ .Release.Name }}"
  template:
    metadata:
      labels:
        app: {{ template "rabbitmq.name" . }}
        release: "{{ .Release.Name }}"
    spec:
      {{- if .Values.image.pullSecrets }}
      imagePullSecrets:
      {{- range .Values.image.pullSecrets }}
        - name: {{ . }}
      {{- end}}
      {{- end }}
      {{- if .Values.rbacEnabled}}
      serviceAccountName: {{ template "rabbitmq.fullname" . }}
      {{- end }}
      {{- if .Values.affinity }}
      affinity:
{{ toYaml .Values.affinity | indent 8 }}
      {{- end }}
      {{- if .Values.nodeSelector }}
      nodeSelector:
{{ toYaml .Values.nodeSelector | indent 8 }}
      {{- end }}
      {{- if .Values.tolerations }}
      tolerations:
{{ toYaml .Values.tolerations | indent 8 }}
      {{- end }}
      terminationGracePeriodSeconds: 10
      containers:
      - name: {{ template "rabbitmq.fullname" . }}
        image: "{{ .Values.image.registry }}/{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
        command:
         - bash
         - -ec
         - |
            #create the var/lib/rabbitmq directory under the bitnami folder
            mkdir -p /opt/bitnami/rabbitmq/var/lib/rabbitmq/

            #persist the erlang cookie in both places for server and cli tools
            echo $RABBITMQ_ERL_COOKIE > /opt/bitnami/rabbitmq/var/lib/rabbitmq/.erlang.cookie
            cp /opt/bitnami/rabbitmq/var/lib/rabbitmq/.erlang.cookie /root

            #change permision so only the user has access to the cookie file
            chmod 400 /root/.erlang.cookie
            chmod 400 /opt/bitnami/rabbitmq/var/lib/rabbitmq/.erlang.cookie

            #copy the mounted configuration to both places
            cp  /opt/bitnami/rabbitmq/conf/* /opt/bitnami/rabbitmq/etc/rabbitmq

            #replace the default password that is generated
            sed -i "s/CHANGEME/$RABBITMQ_PASSWORD/g" /opt/bitnami/rabbitmq/etc/rabbitmq/rabbitmq.conf

            exec rabbitmq-server
        {{- if .Values.resources }}
        resources:
{{ toYaml .Values.resources | indent 10 }}
        {{- end }}
        volumeMounts:
          - name: config-volume
            mountPath: /opt/bitnami/rabbitmq/conf
          - name: data
            mountPath: /bitnami/rabbitmq
        ports:
        - name: epmd
          containerPort: 4369
        - name: amqp
          containerPort: {{ .Values.rabbitmq.nodePort }}
        - name: dist
          containerPort: {{ .Values.rabbitmq.nodePort | add 20000 }}
        - name: stats
          containerPort: {{ .Values.rabbitmq.managerPort }}
        {{- if .Values.livenessProbe.enabled }}
        livenessProbe:
          exec:
            command:
            - rabbitmqctl
            - status
          initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
          timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
          failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
        {{- end }}
        {{- if .Values.readinessProbe.enabled }}
        readinessProbe:
          exec:
            command:
            - rabbitmqctl
            - status
          initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
          timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
          periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
        {{- end }}
        env:
        {{- if .Values.image.debug}}
          - name: BASH_DEBUG
            value: 1
          - name: NAMI_DEBUG
            value: 1
        {{- end }}
          - name: MY_POD_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
          - name: RABBITMQ_USE_LONGNAME
            value: "true"
          - name: RABBITMQ_NODENAME
            value: "rabbit@$(MY_POD_IP)"
          - name: K8S_SERVICE_NAME
            value: "{{ template "rabbitmq.fullname" . }}"
          - name: RABBITMQ_ERL_COOKIE
            valueFrom:
              secretKeyRef:
                name: {{ template "rabbitmq.fullname" . }}
                key: rabbitmq-erlang-cookie
          - name: RABBITMQ_PASSWORD
            valueFrom:
              secretKeyRef:
                name: {{ template "rabbitmq.fullname" . }}
                key: rabbitmq-password
      volumes:
        - name: config-volume
          configMap:
            name: {{ template "rabbitmq.fullname" . }}-config
            items:
            - key: rabbitmq.conf
              path: rabbitmq.conf
            - key: enabled_plugins
              path: enabled_plugins
        - name: data
        {{- if .Values.persistence.enabled }}
          persistentVolumeClaim:
             claimName: {{ .Values.persistence.existingClaim | default (include "rabbitmq.fullname" .) }}
        {{- else }}
          emptyDir: {}
        {{- end -}}
