{{- if .Values.topologyUpdater.enable -}}
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: {{ include "node-feature-discovery.fullname" . }}-topology-updater
  namespace: {{ include "node-feature-discovery.namespace" . }}
  labels:
    {{- include "node-feature-discovery.labels" . | nindent 4 }}
    role: topology-updater
  {{- with .Values.topologyUpdater.daemonsetAnnotations }}
  annotations:
    {{- toYaml . | nindent 4 }}
  {{- end }}
spec:
  selector:
    matchLabels:
      {{- include "node-feature-discovery.selectorLabels" . | nindent 6 }}
      role: topology-updater
  template:
    metadata:
      labels:
        {{- include "node-feature-discovery.selectorLabels" . | nindent 8 }}
        role: topology-updater
      {{- with .Values.topologyUpdater.annotations }}
      annotations:
        {{- toYaml . | nindent 8 }}
      {{- end }}
    spec:
      serviceAccountName: {{ include "node-feature-discovery.topologyUpdater.serviceAccountName" . }}
      dnsPolicy: ClusterFirstWithHostNet
    {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
    {{- end }}
      securityContext:
        {{- toYaml .Values.topologyUpdater.podSecurityContext | nindent 8 }}
      containers:
        - name: topology-updater
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: "{{ .Values.image.pullPolicy }}"
          env:
            - name: NODE_NAME
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
            - name: NODE_ADDRESS
              valueFrom:
                fieldRef:
                  fieldPath: status.hostIP
          command:
            - "nfd-topology-updater"
          args:
            - "-podresources-socket=/host-var/lib/kubelet-podresources/kubelet.sock"
          {{- if .Values.topologyUpdater.updateInterval | empty | not }}
            - "-sleep-interval={{ .Values.topologyUpdater.updateInterval }}"
          {{- else }}
            - "-sleep-interval=3s"
          {{- end }}
          {{- if .Values.topologyUpdater.watchNamespace | empty | not }}
            - "-watch-namespace={{ .Values.topologyUpdater.watchNamespace }}"
          {{- else }}
            - "-watch-namespace=*"
          {{- end }}
          {{- if .Values.tls.enable }}
            - "-ca-file=/etc/kubernetes/node-feature-discovery/certs/ca.crt"
            - "-key-file=/etc/kubernetes/node-feature-discovery/certs/tls.key"
            - "-cert-file=/etc/kubernetes/node-feature-discovery/certs/tls.crt"
          {{- end }}
          {{- if .Values.topologyUpdater.podSetFingerprint }}
            - "-pods-fingerprint"
          {{- end }}
          {{- if .Values.topologyUpdater.kubeletConfigPath | empty | not }}
            - "-kubelet-config-uri=file:///host-var/kubelet-config"
          {{- end }}
          {{- if .Values.topologyUpdater.kubeletStateDir | empty }}
            # Disable kubelet state tracking by giving an empty path
            - "-kubelet-state-dir="
          {{- end }}
            - -metrics={{ .Values.topologyUpdater.metricsPort | default "8081"}}
          ports:
            - name: metrics
              containerPort: {{ .Values.topologyUpdater.metricsPort | default "8081"}}
          volumeMounts:
        {{- if .Values.topologyUpdater.kubeletConfigPath | empty | not }}
            - name: kubelet-config
              mountPath: /host-var/kubelet-config
        {{- end }}
            - name: kubelet-podresources-sock
              mountPath: /host-var/lib/kubelet-podresources/kubelet.sock
            - name: host-sys
              mountPath: /host-sys
        {{- if .Values.topologyUpdater.kubeletStateDir | empty | not }}
            - name: kubelet-state-files
              mountPath: /host-var/lib/kubelet
              readOnly: true
        {{- end }}
        {{- if .Values.tls.enable }}
            - name: nfd-topology-updater-cert
              mountPath: "/etc/kubernetes/node-feature-discovery/certs"
              readOnly: true
        {{- end }}
            - name: nfd-topology-updater-conf
              mountPath: "/etc/kubernetes/node-feature-discovery"
              readOnly: true

          resources:
      {{- toYaml .Values.topologyUpdater.resources | nindent 12 }}
          securityContext:
      {{- toYaml .Values.topologyUpdater.securityContext | nindent 12 }}
      volumes:
        - name: host-sys
          hostPath:
            path: "/sys"
      {{- if .Values.topologyUpdater.kubeletConfigPath | empty | not }}
        - name: kubelet-config
          hostPath:
            path: {{ .Values.topologyUpdater.kubeletConfigPath }}
      {{- end }}
        - name: kubelet-podresources-sock
          hostPath:
          {{- if .Values.topologyUpdater.kubeletPodResourcesSockPath | empty | not }}
            path: {{ .Values.topologyUpdater.kubeletPodResourcesSockPath }}
          {{- else }}
            path: /var/lib/kubelet/pod-resources/kubelet.sock
          {{- end }}
      {{- if .Values.topologyUpdater.kubeletStateDir | empty | not }}
        - name: kubelet-state-files
          hostPath:
            path: {{ .Values.topologyUpdater.kubeletStateDir }}
      {{- end }}
        - name: nfd-topology-updater-conf
          configMap:
            name: {{ include "node-feature-discovery.fullname" . }}-topology-updater-conf
            items:
              - key: nfd-topology-updater.conf
                path: nfd-topology-updater.conf
      {{- if .Values.tls.enable }}
        - name: nfd-topology-updater-cert
          secret:
            secretName: nfd-topology-updater-cert
      {{- end }}


    {{- with .Values.topologyUpdater.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
    {{- with .Values.topologyUpdater.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
    {{- end }}
    {{- with .Values.topologyUpdater.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
    {{- end }}
{{- end }}