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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "solr-operator.fullname" . }}
  namespace: {{ .Release.Namespace }}
  labels:
    control-plane: solr-operator
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      control-plane: solr-operator
  template:
    metadata:
      annotations:
        prometheus.io/scrape: "true"
        {{- if .Values.annotations }}
        {{ toYaml .Values.annotations | nindent 8 }}
        {{- end }}
      labels:
        control-plane: solr-operator
        {{- if .Values.labels }}
        {{ toYaml .Values.labels | nindent 8 }}
        {{- end }}
    spec:
      serviceAccountName: {{ include "solr-operator.serviceAccountName" . }}
      {{- if .Values.priorityClassName }}
      priorityClassName: {{ .Values.priorityClassName }}
      {{- end }}
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" 
        imagePullPolicy: {{ .Values.image.pullPolicy }}
        args:
        {{- if or (index .Values "zookeeper-operator" "install") (index .Values "zookeeper-operator" "use") }}
        - -zk-operator=true
        {{- else }}
        - -zk-operator=false
        {{- end }}
        {{- if .Values.watchNamespaces }}
        - --watch-namespaces={{- include "solr-operator.watchNamespaces" . -}}
        {{- end }}
        {{- if .Values.mTLS.clientCertSecret }}
        - --tls-client-cert-path={{- include "solr-operator.mTLS.clientCertDirectory" . -}}/tls.crt
        - --tls-client-cert-key-path={{- include "solr-operator.mTLS.clientCertDirectory" . -}}/tls.key
        {{- end }}
        {{- if .Values.mTLS.caCertSecret }}
        - --tls-ca-cert-path={{- include "solr-operator.mTLS.caCertDirectory" . -}}/{{- include "solr-operator.mTLS.caCertName" . -}}
        {{- end }}
        {{- if .Values.mTLS.insecureSkipVerify }}
        - --tls-skip-verify-server={{ .Values.mTLS.insecureSkipVerify }}
        {{- end }}
        - --tls-watch-cert={{ .Values.mTLS.watchForUpdates }}
        - "--health-probe-bind-address=:8081"
        {{- if .Values.metrics.enable }}
        - "--metrics-bind-address=:8080"
        {{- end }}
        {{- if .Values.leaderElection.enable }}
        - "--leader-elect=true"
        {{- else }}
        - "--leader-elect=false"
        {{- end }}

        env:
          - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          {{- if .Values.envVars }}
          {{- toYaml .Values.envVars | nindent 10 }}
          {{- end }}

        securityContext:
          {{- toYaml .Values.securityContext | nindent 10 }}
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8081
          initialDelaySeconds: 15
          periodSeconds: 20
        readinessProbe:
          httpGet:
            path: /readyz
            port: 8081
          initialDelaySeconds: 5
          periodSeconds: 10

        resources:
          {{- toYaml .Values.resources | nindent 10 }}
        {{- if (include "solr-operator.mTLS.volumeMounts" .) }}
        volumeMounts:
          {{- include "solr-operator.mTLS.volumeMounts" .  | nindent 10 }}
        {{- end }}

        {{- if .Values.metrics.enable }}
        ports:
          - containerPort: 8080
            name: metrics
        {{- end }}
      {{- if (include "solr-operator.mTLS.volumes" .) }}
      volumes:
        {{- include "solr-operator.mTLS.volumes" . | nindent 8 }}
      {{- end }}

      {{- if .Values.sidecarContainers }}
      {{ toYaml .Values.sidecarContainers | nindent 6 }}
      {{- end }}
      {{- if .Values.nodeSelector }}
      nodeSelector:
        {{ toYaml .Values.nodeSelector | nindent 8 }}
      {{- end }}
      {{- if .Values.affinity }}
      affinity:
        {{ toYaml .Values.affinity | nindent 8 }}
      {{- end }}
      {{- if .Values.tolerations }}
      tolerations:
        {{ toYaml .Values.tolerations | nindent 8 }}
      {{- end }}
      terminationGracePeriodSeconds: 10
