# Copyright 2021 Nutanix Inc
#
# example usage: kubectl create -f <this_file>

kind: Deployment
apiVersion: apps/v1
metadata:
  name: nutanix-csi-controller
  namespace: {{ .Release.Namespace }}
spec:
  replicas: {{ .Values.controller.replicas }}
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 0
  selector:
    matchLabels:
      app: nutanix-csi-controller
  template:
    metadata:
      labels:
        app: nutanix-csi-controller
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - podAffinityTerm:
              labelSelector:
                matchLabels:
                  app: nutanix-csi-controller
              topologyKey: kubernetes.io/hostname
            weight: 100
      serviceAccount: nutanix-csi-controller
      hostNetwork: true
      containers:
        - name: csi-provisioner
          {{- if semverCompare ">=1.20-0" .Capabilities.KubeVersion.Version }}
          image: {{ .Values.sidecars.provisioner.image }}
          {{- else }}
          image: {{ .Values.sidecars.provisioner.imageLegacy }}
          {{- end }}
          imagePullPolicy: {{ .Values.imagePullPolicy }}
          args:
            - --csi-address=$(ADDRESS)
            - --timeout=60s
            - --worker-threads=16
            # This adds PV/PVC metadata to create volume requests
            - --extra-create-metadata=true
            - --default-fstype=ext4
            # This is used to collect CSI operation metrics
            - --http-endpoint=:9809
            - --v=2
            - --leader-election=true
          env:
            - name: ADDRESS
              value: /var/lib/csi/sockets/pluginproxy/csi.sock
          resources:
            requests:
              cpu: 100m
              memory: 200Mi
          volumeMounts:
            - name: socket-dir
              mountPath: /var/lib/csi/sockets/pluginproxy/
        - name: csi-resizer
          image: {{ .Values.sidecars.resizer.image }}
          imagePullPolicy: {{ .Values.imagePullPolicy }}
          args:
            - --v=2
            - --csi-address=$(ADDRESS)
            - --timeout=60s
            - --leader-election=true
            # NTNX CSI dirver supports online volume expansion.
            - --handle-volume-inuse-error=false
            - --http-endpoint=:9810
          env:
            - name: ADDRESS
              value: /var/lib/csi/sockets/pluginproxy/csi.sock
          resources:
            requests:
              cpu: 5m
              memory: 30Mi
          volumeMounts:
            - name: socket-dir
              mountPath: /var/lib/csi/sockets/pluginproxy/
        - name: csi-snapshotter
          {{- if .Capabilities.APIVersions.Has "snapshot.storage.k8s.io/v1" }}
          image: {{ .Values.sidecars.snapshotter.image }}
          {{- else }}
          image: {{ .Values.sidecars.snapshotter.imageBeta }}
          {{- end }}
          imagePullPolicy: {{ .Values.imagePullPolicy }}
          args:
          - --csi-address=$(ADDRESS)
          - --leader-election=true
          - --logtostderr=true
          - --timeout=300s
          env:
          - name: ADDRESS
            value: /csi/csi.sock
          resources:
            requests:
              cpu: 5m
              memory: 30Mi
          volumeMounts:
          - name: socket-dir
            mountPath: /csi
        - name: nutanix-csi-plugin
          image: {{ .Values.controller.image }}
          imagePullPolicy: {{ .Values.imagePullPolicy }}
          securityContext:
            allowPrivilegeEscalation: true
            privileged: true
          args:
            - --endpoint=$(CSI_ENDPOINT)
            - --nodeid=$(NODE_ID)
            - --drivername={{ include "nutanix-csi-storage.drivername" . }}
          env:
            - name: CSI_ENDPOINT
              value: unix:///var/lib/csi/sockets/pluginproxy/csi.sock
            - name: NODE_ID
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
          resources:
            requests:
              cpu: 100m
              memory: 200Mi
          volumeMounts:
            - mountPath: /var/lib/csi/sockets/pluginproxy/
              name: socket-dir
            # This is needed for static NFS volume feature.
            - mountPath: /host
              name: root-dir
          ports:
            - containerPort: 9807
              name: http-endpoint
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /healthz
              port: http-endpoint
            initialDelaySeconds: 10
            timeoutSeconds: 3
            periodSeconds: 2
            failureThreshold: 3
        - name: liveness-probe
          resources:
            requests:
              cpu: 5m
              memory: 20Mi
          volumeMounts:
            - mountPath: /csi
              name: socket-dir
          image: {{ .Values.sidecars.livenessprobe.image }}
          imagePullPolicy: {{ .Values.imagePullPolicy }}
          args:
            - --csi-address=/csi/csi.sock
            - --http-endpoint=:9807
      priorityClassName: system-cluster-critical
    {{- with (.Values.controller.nodeSelector | default .Values.nodeSelector) }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
    {{- end }}
    {{- with (.Values.controller.tolerations | default .Values.tolerations) }}
      tolerations:
        {{- toYaml . | nindent 8 }}
    {{- end }}
      volumes:
        - emptyDir: {}
          name: socket-dir
        - hostPath:
            path: /
            type: Directory
          name: root-dir