suite: Controller > DaemonSet
templates:
  - controller-daemonset.yaml

tests:
  - it: should create a DaemonSet if `controller.kind` is "DaemonSet"
    set:
      controller.kind: DaemonSet
    asserts:
      - hasDocuments:
          count: 1
      - isKind:
          of: DaemonSet
      - equal:
          path: metadata.name
          value: RELEASE-NAME-ingress-nginx-controller

  - it: should create a DaemonSet with argument `--enable-metrics=false` if `controller.metrics.enabled` is false
    set:
      controller.kind: DaemonSet
      controller.metrics.enabled: false
    asserts:
      - contains:
          path: spec.template.spec.containers[0].args
          content: --enable-metrics=false

  - it: should create a DaemonSet without argument `--enable-metrics=false` if `controller.metrics.enabled` is true
    set:
      controller.kind: DaemonSet
      controller.metrics.enabled: true
    asserts:
      - notContains:
          path: spec.template.spec.containers[0].args
          content: --enable-metrics=false

  - it: should create a DaemonSet with argument `--controller-class=k8s.io/ingress-nginx-internal` if `controller.ingressClassResource.controllerValue` is "k8s.io/ingress-nginx-internal"
    set:
      controller.kind: DaemonSet
      controller.ingressClassResource.controllerValue: k8s.io/ingress-nginx-internal
    asserts:
      - contains:
          path: spec.template.spec.containers[0].args
          content: --controller-class=k8s.io/ingress-nginx-internal

  - it: should create a DaemonSet with resource limits if `controller.resources.limits` is set
    set:
      controller.kind: DaemonSet
      controller.resources.limits.cpu: 500m
      controller.resources.limits.memory: 512Mi
    asserts:
      - equal:
          path: spec.template.spec.containers[0].resources.limits.cpu
          value: 500m
      - equal:
          path: spec.template.spec.containers[0].resources.limits.memory
          value: 512Mi

  - it: should create a DaemonSet with topology spread constraints if `controller.topologySpreadConstraints` is set
    set:
      controller.kind: DaemonSet
      controller.topologySpreadConstraints:
        - labelSelector:
            matchLabels:
              app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}'
              app.kubernetes.io/instance: '{{ .Release.Name }}'
              app.kubernetes.io/component: controller
          topologyKey: topology.kubernetes.io/zone
          maxSkew: 1
          whenUnsatisfiable: ScheduleAnyway
        - labelSelector:
            matchLabels:
              app.kubernetes.io/name: '{{ include "ingress-nginx.name" . }}'
              app.kubernetes.io/instance: '{{ .Release.Name }}'
              app.kubernetes.io/component: controller
          topologyKey: kubernetes.io/hostname
          maxSkew: 1
          whenUnsatisfiable: ScheduleAnyway
    asserts:
      - equal:
          path: spec.template.spec.topologySpreadConstraints
          value:
            - labelSelector:
                matchLabels:
                  app.kubernetes.io/name: ingress-nginx
                  app.kubernetes.io/instance: RELEASE-NAME
                  app.kubernetes.io/component: controller
              topologyKey: topology.kubernetes.io/zone
              maxSkew: 1
              whenUnsatisfiable: ScheduleAnyway
            - labelSelector:
                matchLabels:
                  app.kubernetes.io/name: ingress-nginx
                  app.kubernetes.io/instance: RELEASE-NAME
                  app.kubernetes.io/component: controller
              topologyKey: kubernetes.io/hostname
              maxSkew: 1
              whenUnsatisfiable: ScheduleAnyway

  - it: should create a DaemonSet with affinity if `controller.affinity` is set
    set:
      controller.kind: DaemonSet
      controller.affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app.kubernetes.io/name
                    operator: In
                    values:
                      - '{{ include "ingress-nginx.name" . }}'
                  - key: app.kubernetes.io/instance
                    operator: In
                    values:
                      - '{{ .Release.Name }}'
                  - key: app.kubernetes.io/component
                    operator: In
                    values:
                      - controller
              topologyKey: kubernetes.io/hostname
    asserts:
      - equal:
          path: spec.template.spec.affinity
          value:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                - labelSelector:
                    matchExpressions:
                      - key: app.kubernetes.io/name
                        operator: In
                        values:
                          - ingress-nginx
                      - key: app.kubernetes.io/instance
                        operator: In
                        values:
                          - RELEASE-NAME
                      - key: app.kubernetes.io/component
                        operator: In
                        values:
                          - controller
                  topologyKey: kubernetes.io/hostname

  - it: should create a DaemonSet with a custom registry if `controller.image.registry` is set
    set:
      controller.kind: DaemonSet
      controller.image.registry: custom.registry.io
      controller.image.tag: v1.0.0-dev
      controller.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd
    asserts:
      - equal:
          path: spec.template.spec.containers[0].image
          value: custom.registry.io/ingress-nginx/controller:v1.0.0-dev@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd

  - it: should create a DaemonSet with a custom image if `controller.image.image` is set
    set:
      controller.kind: DaemonSet
      controller.image.image: custom-repo/custom-image
      controller.image.tag: v1.0.0-dev
      controller.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd
    asserts:
      - equal:
          path: spec.template.spec.containers[0].image
          value: registry.k8s.io/custom-repo/custom-image:v1.0.0-dev@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd

  - it: should create a DaemonSet with a custom tag if `controller.image.tag` is set
    set:
      controller.kind: DaemonSet
      controller.image.tag: custom-tag
      controller.image.digest: sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd
    asserts:
      - equal:
          path: spec.template.spec.containers[0].image
          value: registry.k8s.io/ingress-nginx/controller:custom-tag@sha256:faa2d18687f734994b6bd9e309e7a73852a81c30e1b8f63165fcd4f0a087e3cd
