{{- if .Values.monitor.create }}
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ template "cluster.name" . }}-monitor
  labels:
    app.kubernetes.io/name: {{ template "chart.name" . }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/component: monitor
    helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+"  "_" }}
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ template "chart.name" . }}
      app.kubernetes.io/instance: {{ .Release.Name }}
      app.kubernetes.io/component: monitor
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ template "chart.name" . }}
        app.kubernetes.io/instance: {{ .Release.Name }}
        app.kubernetes.io/component: monitor
    spec:
  {{- if .Values.monitor.serviceAccount }}
      serviceAccount: {{ .Values.monitor.serviceAccount }}
  {{- else }}
    {{- if .Values.rbac.create }}
      serviceAccount: {{ template "cluster.name" . }}-monitor
    {{- end }}
  {{- end }}
    {{- if .Values.monitor.nodeSelector }}
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
            {{- range $key, $val := .Values.monitor.nodeSelector }}
              {{- $valList := splitList "," $val }}
              - key: {{ $key }}
                operator: In
                values:
              {{- range $kl, $vl := $valList }}
                - {{ $vl }}
              {{- end }}
            {{- end }}
    {{- end }}
      initContainers:
      - name: init-data
        image: {{ .Values.monitor.prometheus.image }}
        imagePullPolicy: {{ .Values.monitor.prometheus.imagePullPolicy | default "IfNotPresent" }}
        command:
        - /bin/sh
        - -c
        - |
          mkdir -p /data/prometheus {{- if .Values.monitor.grafana.create }} /data/grafana {{- end }}
          chmod 777 /data/prometheus {{- if .Values.monitor.grafana.create }} /data/grafana {{- end }}
        securityContext:
          runAsUser: 0
        volumeMounts:
        - name: monitor-data
          mountPath: /data
      containers:
      - name: prometheus
        image: {{ .Values.monitor.prometheus.image }}
        imagePullPolicy: {{ .Values.monitor.prometheus.imagePullPolicy | default "IfNotPresent" }}
        {{- if .Values.monitor.prometheus.resources }}
        resources:
{{ toYaml .Values.monitor.prometheus.resources | indent 12 }}
        {{- end }}
        command:
        - /bin/prometheus
        - --web.enable-admin-api
        - --log.level={{ .Values.monitor.prometheus.logLevel }}
        - --config.file=/etc/prometheus/prometheus.yml
        - --storage.tsdb.path=/data/prometheus
        - --storage.tsdb.retention={{ .Values.monitor.prometheus.reserveDays }}d
        ports:
        - name: prometheus
          containerPort: 9090
          protocol: TCP
        # `TZ` is unused in Prometheus Docker image, we set it here just to keep consistency
        env:
        - name: TZ
          value: {{ .Values.timezone | default "UTC" }}
        volumeMounts:
          - name: prometheus-config
            mountPath: /etc/prometheus
            readOnly: true
          - name: monitor-data
            mountPath: /data
      {{- if .Values.monitor.grafana.create }}
      - name: grafana
        image: {{ .Values.monitor.grafana.image }}
        imagePullPolicy: {{ .Values.monitor.grafana.imagePullPolicy | default "IfNotPresent" }}
        lifecycle:
            postStart:
              exec:
                command: ["/bin/bash", "/tmp/grafanaPrestart.sh"]
        {{- if .Values.monitor.grafana.resources }}
        resources:
{{ toYaml .Values.monitor.grafana.resources | indent 12 }}
        {{- end }}
        ports:
        - name: grafana
          containerPort: 3000
          protocol: TCP
        env:
        - name: GF_PATHS_DATA
          value: /data/grafana
        - name: GF_SECURITY_ADMIN_USER
          valueFrom:
            secretKeyRef:
              name: {{ template "cluster.name" . }}-monitor
              key: username
        - name: GF_SECURITY_ADMIN_PASSWORD
          valueFrom:
            secretKeyRef:
              name: {{ template "cluster.name" . }}-monitor
              key: password
        {{- if .Values.monitor.grafana.config }}
        {{- range $key, $value := .Values.monitor.grafana.config }}
        - name: {{ $key }}
          value: {{ $value | quote }}
        {{- end }}
        {{- end }}
        - name: TZ
          value: {{ .Values.timezone | default "UTC" }}
        volumeMounts:
          - name: monitor-data
            mountPath: /data
          - mountPath: /etc/grafana/provisioning/datasources
            name: datasource
            readOnly: false
          - mountPath: /etc/grafana/provisioning/dashboards
            name: dashboards-provisioning
            readOnly: false
          - mountPath: /tmp/dashboard-v2
            name: dashboard-v2
            readOnly: false
          - mountPath: /tmp/dashboard-v3
            name: dashboard-v3
            readOnly: false
          - mountPath: /tmp/dashboard-v3/extra
            name: dashboard-extra-v3
            readOnly: false
          - mountPath: /grafana-dashboard-definitions/tidb
            name: grafana-dashboard
            readOnly: false
          - mountPath: /tmp
            name: grafana-prestart
            readOnly: false
      {{- end }}
      volumes:
      - name: monitor-data
        {{- if .Values.monitor.persistent }}
        persistentVolumeClaim:
          claimName: {{ template "cluster.name" . }}-monitor
        {{- else }}
        emptyDir: {}
        {{- end }}
      - name: prometheus-config
        configMap:
          name: {{ template "cluster.name" . }}-monitor
          items:
          - key: prometheus-config
            path: prometheus.yml
          - key: alert-rules-config
            path: alert.rules
      {{- if .Values.monitor.grafana.create }}
      - configMap:
          name: {{ template "cluster.name" . }}-monitor
          items:
          - key: datasource-config
            path: datasource.yaml
        name: datasource
      - configMap:
          name: {{ template "cluster.name" . }}-monitor
          items:
          - key: dashboard-config
            path: dashboards.yaml
        name: dashboards-provisioning
      - emptyDir: {}
        name: grafana-dashboard
      - configMap:
          name: {{ template "cluster.name" . }}-monitor-dashboard-v2
        name: dashboard-v2
      - configMap:
          name: {{ template "cluster.name" . }}-monitor-dashboard-v3
        name: dashboard-v3
      - configMap:
          name: {{ template "cluster.name" . }}-monitor-dashboard-extra-v3
        name: dashboard-extra-v3
      - configMap:
          name: {{ template "cluster.name" . }}-monitor
          items:
          - key: grafana-prestart
            path: grafanaPrestart.sh
        name: grafana-prestart
      {{- end }}
    {{- if .Values.monitor.tolerations }}
      tolerations:
{{ toYaml .Values.monitor.tolerations | indent 6 }}
    {{- end }}
{{- end }}
