suite: container volumeMounts test
templates:
  - common.yaml
release:
  name: test-release-name
  namespace: test-release-namespace
tests:
  - it: should pass with shared volume on multiple workloads and containers with targetSelectAll
    set:
      some_path: /some/path
      image: &image
        repository: nginx
        tag: 1.19.0
        pullPolicy: IfNotPresent
      workload:
        workload-name:
          enabled: true
          primary: true
          type: Deployment
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: &probes
                  liveness:
                    enabled: false
                  readiness:
                    enabled: false
                  startup:
                    enabled: false
              container-name2:
                enabled: true
                primary: false
                imageSelector: image
                probes: *probes
        workload-name2:
          enabled: true
          primary: false
          type: Job
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: *probes
              container-name2:
                enabled: true
                primary: false
                imageSelector: image
                probes: *probes
      persistence:
        shared-vol:
          enabled: true
          type: emptyDir
          mountPath: "{{ .Values.some_path }}"
          targetSelectAll: true
    asserts:
      - documentIndex: &deploymentDoc 0
        isKind:
          of: Deployment
      - documentIndex: *deploymentDoc
        isAPIVersion:
          of: apps/v1
      - documentIndex: *deploymentDoc
        contains:
          path: spec.template.spec.containers[0].volumeMounts
          content:
            name: shared-vol
            mountPath: /some/path
            readOnly: false
      - documentIndex: *deploymentDoc
        contains:
          path: spec.template.spec.containers[1].volumeMounts
          content:
            name: shared-vol
            mountPath: /some/path
            readOnly: false
      - documentIndex: &jobDoc 1
        isKind:
          of: Job
      - documentIndex: *jobDoc
        isAPIVersion:
          of: batch/v1
      - documentIndex: *jobDoc
        contains:
          path: spec.template.spec.containers[0].volumeMounts
          content:
            name: shared-vol
            mountPath: /some/path
            readOnly: false
      - documentIndex: *jobDoc
        contains:
          path: spec.template.spec.containers[1].volumeMounts
          content:
            name: shared-vol
            mountPath: /some/path
            readOnly: false

  - it: should pass with volume on primary workload and container
    set:
      image: *image
      workload:
        workload-name:
          enabled: true
          primary: true
          type: Deployment
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: *probes
              container-name2:
                enabled: true
                primary: false
                imageSelector: image
                probes: *probes
        workload-name2:
          enabled: true
          primary: false
          type: Job
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: *probes
              container-name2:
                enabled: true
                primary: false
                imageSelector: image
                probes: *probes
      persistence:
        some-vol:
          enabled: true
          type: emptyDir
          mountPath: /some/path
          readOnly: true
    asserts:
      - documentIndex: &deploymentDoc 0
        isKind:
          of: Deployment
      - documentIndex: *deploymentDoc
        isAPIVersion:
          of: apps/v1
      - documentIndex: *deploymentDoc
        contains:
          path: spec.template.spec.containers[0].volumeMounts
          content:
            name: some-vol
            mountPath: /some/path
            readOnly: true
      - documentIndex: &jobDoc 1
        isKind:
          of: Job
      - documentIndex: *jobDoc
        isAPIVersion:
          of: batch/v1

  - it: should pass with volume with selected pod and container
    set:
      image: *image
      workload:
        workload-name:
          enabled: true
          primary: true
          type: Deployment
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: *probes
              container-name2:
                enabled: true
                primary: false
                imageSelector: image
                probes: *probes
        workload-name2:
          enabled: true
          primary: false
          type: Job
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: *probes
              container-name2:
                enabled: true
                primary: false
                imageSelector: image
                probes: *probes
      persistence:
        some-vol:
          enabled: true
          type: emptyDir
          mountPath: /some/path
          readOnly: true
          targetSelector:
            workload-name:
              container-name2: {}
            workload-name2:
              container-name1: {}
    asserts:
      - documentIndex: &deploymentDoc 0
        isKind:
          of: Deployment
      - documentIndex: *deploymentDoc
        isAPIVersion:
          of: apps/v1
      - documentIndex: *deploymentDoc
        contains:
          path: spec.template.spec.containers[1].volumeMounts
          content:
            name: some-vol
            mountPath: /some/path
            readOnly: true
      - documentIndex: &jobDoc 1
        isKind:
          of: Job
      - documentIndex: *jobDoc
        isAPIVersion:
          of: batch/v1
      - documentIndex: *jobDoc
        contains:
          path: spec.template.spec.containers[0].volumeMounts
          content:
            name: some-vol
            mountPath: /some/path
            readOnly: true

  - it: should pass with volume with selected pod and multiple containers
    set:
      image: *image
      workload:
        workload-name:
          enabled: true
          primary: true
          type: Deployment
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: *probes
              container-name2:
                enabled: true
                primary: false
                imageSelector: image
                probes: *probes
        workload-name2:
          enabled: true
          primary: false
          type: Job
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: *probes
              container-name2:
                enabled: true
                primary: false
                imageSelector: image
                probes: *probes
      persistence:
        some-vol:
          enabled: true
          type: emptyDir
          mountPath: /some/path
          readOnly: true
          targetSelector:
            workload-name:
              container-name1: {}
              container-name2: {}
    asserts:
      - documentIndex: &deploymentDoc 0
        isKind:
          of: Deployment
      - documentIndex: *deploymentDoc
        isAPIVersion:
          of: apps/v1
      - documentIndex: *deploymentDoc
        contains:
          path: spec.template.spec.containers[0].volumeMounts
          content:
            name: some-vol
            mountPath: /some/path
            readOnly: true
      - documentIndex: *deploymentDoc
        contains:
          path: spec.template.spec.containers[1].volumeMounts
          content:
            name: some-vol
            mountPath: /some/path
            readOnly: true
      - documentIndex: &jobDoc 1
        isKind:
          of: Job
      - documentIndex: *jobDoc
        isAPIVersion:
          of: batch/v1
      - documentIndex: *jobDoc
        contains:
          path: spec.template.spec.containers[0].volumeMounts
          content:
            mountPath: /dev/shm
            name: devshm
            readOnly: false
      - documentIndex: *jobDoc
        contains:
          path: spec.template.spec.containers[0].volumeMounts
          content:
            mountPath: /shared
            name: shared
            readOnly: false
      - documentIndex: *jobDoc
        contains:
          path: spec.template.spec.containers[0].volumeMounts
          content:
            mountPath: /tmp
            name: tmp
            readOnly: false
      - documentIndex: *jobDoc
        contains:
          path: spec.template.spec.containers[0].volumeMounts
          content:
            mountPath: /var/logs
            name: varlogs
            readOnly: false
      - documentIndex: *jobDoc
        contains:
          path: spec.template.spec.containers[1].volumeMounts
          content:
            mountPath: /dev/shm
            name: devshm
            readOnly: false
      - documentIndex: *jobDoc
        contains:
          path: spec.template.spec.containers[1].volumeMounts
          content:
            mountPath: /shared
            name: shared
            readOnly: false
      - documentIndex: *jobDoc
        contains:
          path: spec.template.spec.containers[1].volumeMounts
          content:
            mountPath: /tmp
            name: tmp
            readOnly: false
      - documentIndex: *jobDoc
        contains:
          path: spec.template.spec.containers[1].volumeMounts
          content:
            mountPath: /var/logs
            name: varlogs
            readOnly: false

  - it: should pass with volume with selected pod and containers and specific values
    set:
      image: *image
      workload:
        workload-name:
          enabled: true
          primary: true
          type: Deployment
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: *probes
              container-name2:
                enabled: true
                primary: false
                imageSelector: image
                probes: *probes
        workload-name2:
          enabled: true
          primary: false
          type: Job
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: *probes
              container-name2:
                enabled: true
                primary: false
                imageSelector: image
                probes: *probes
      persistence:
        some-vol:
          enabled: true
          type: emptyDir
          mountPath: /some/path
          readOnly: true
          targetSelector:
            workload-name:
              container-name1:
                mountPath: /some/other/path
                readOnly: false
                mountPropagation: None
                subPath: /some/sub/path
              container-name2: {}
    asserts:
      - documentIndex: &deploymentDoc 0
        isKind:
          of: Deployment
      - documentIndex: *deploymentDoc
        isAPIVersion:
          of: apps/v1
      - documentIndex: *deploymentDoc
        contains:
          path: spec.template.spec.containers[0].volumeMounts
          content:
            name: some-vol
            mountPath: /some/other/path
            readOnly: false
            mountPropagation: None
            subPath: /some/sub/path
      - documentIndex: *deploymentDoc
        contains:
          path: spec.template.spec.containers[1].volumeMounts
          content:
            name: some-vol
            mountPath: /some/path
            readOnly: true
      - documentIndex: &jobDoc 1
        isKind:
          of: Job
      - documentIndex: *jobDoc
        isAPIVersion:
          of: batch/v1

  - it: should pass with volume with selected pod and containers and specific values from tpl
    set:
      some_path: /some/other/path
      some_propagation: None
      some_sub_path: /some/sub/path
      image: *image
      workload:
        workload-name:
          enabled: true
          primary: true
          type: Deployment
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: *probes
              container-name2:
                enabled: true
                primary: false
                imageSelector: image
                probes: *probes
      persistence:
        some-vol:
          enabled: true
          type: emptyDir
          mountPath: /some/path
          readOnly: true
          targetSelector:
            workload-name:
              container-name1:
                mountPath: "{{ .Values.some_path }}"
                readOnly: false
                mountPropagation: "{{ .Values.some_propagation }}"
                subPath: "{{ .Values.some_sub_path }}"
              container-name2: {}
    asserts:
      - documentIndex: &deploymentDoc 0
        isKind:
          of: Deployment
      - documentIndex: *deploymentDoc
        isAPIVersion:
          of: apps/v1
      - documentIndex: *deploymentDoc
        contains:
          path: spec.template.spec.containers[0].volumeMounts
          content:
            name: some-vol
            mountPath: /some/other/path
            readOnly: false
            mountPropagation: None
            subPath: /some/sub/path
      - documentIndex: *deploymentDoc
        contains:
          path: spec.template.spec.containers[1].volumeMounts
          content:
            name: some-vol
            mountPath: /some/path
            readOnly: true

  - it: should pass with vct mounted
    set:
      image: *image
      workload:
        workload-name:
          enabled: true
          primary: true
          type: StatefulSet
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: *probes
        workload-name2:
          enabled: true
          primary: false
          type: StatefulSet
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: *probes
      persistence:
        vct-vol:
          enabled: true
          type: vct
          size: 50Gi
          targetSelector:
            workload-name:
              container-name1:
                mountPath: /some/path
    asserts:
      - documentIndex: &statefulSetDoc 0
        isKind:
          of: StatefulSet
      - documentIndex: *statefulSetDoc
        isAPIVersion:
          of: apps/v1
      - documentIndex: *statefulSetDoc
        contains:
          path: spec.template.spec.containers[0].volumeMounts
          content:
            name: test-release-name-common-test-vct-vol
            mountPath: /some/path
            readOnly: false
      - documentIndex: &otherStatefulSetDoc 1
        isKind:
          of: StatefulSet
      - documentIndex: *otherStatefulSetDoc
        isAPIVersion:
          of: apps/v1

  - it: should default mountPath to hostPath on device type
    set:
      image: *image
      workload:
        workload-name1:
          enabled: true
          primary: true
          type: Deployment
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: *probes
      persistence:
        dev01:
          enabled: true
          type: device
          hostPath: /dev/sda
    asserts:
      - documentIndex: &deploymentDoc 0
        isKind:
          of: Deployment
      - documentIndex: *deploymentDoc
        isAPIVersion:
          of: apps/v1
      - documentIndex: *deploymentDoc
        contains:
          path: spec.template.spec.containers[0].volumeMounts
          content:
            name: dev01
            mountPath: /dev/sda
            readOnly: false

  - it: should use mountPath if given instead of hostPath on device type
    set:
      image: *image
      workload:
        workload-name1:
          enabled: true
          primary: true
          type: Deployment
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: *probes
      persistence:
        dev01:
          enabled: true
          type: device
          hostPath: /dev/sda
          mountPath: /dev/sdb
    asserts:
      - documentIndex: &deploymentDoc 0
        isKind:
          of: Deployment
      - documentIndex: *deploymentDoc
        isAPIVersion:
          of: apps/v1
      - documentIndex: *deploymentDoc
        contains:
          path: spec.template.spec.containers[0].volumeMounts
          content:
            name: dev01
            mountPath: /dev/sdb
            readOnly: false

  - it: should respect tpl in enabled
    set:
      image: *image
      flag: false
      workload:
        workload-name1:
          enabled: true
          primary: true
          type: Deployment
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: *probes
      persistence:
        some-vol:
          enabled: "{{ .Values.flag }}"
          type: emptyDir
          mountPath: /some/path
    asserts:
      - documentIndex: &deploymentDoc 0
        isKind:
          of: Deployment
      - documentIndex: *deploymentDoc
        isAPIVersion:
          of: apps/v1
      - documentIndex: *deploymentDoc
        equal:
          path: spec.template.spec.volumes
          value:
            - name: devshm
              emptyDir:
                medium: Memory
                sizeLimit: 2400Mi
            - name: shared
              emptyDir: {}
            - name: tmp
              emptyDir:
                medium: Memory
                sizeLimit: 2400Mi
            - name: varlogs
              emptyDir:
                medium: Memory
                sizeLimit: 2400Mi
            - name: varrun
              emptyDir:
                medium: Memory
                sizeLimit: 2400Mi

      - documentIndex: *deploymentDoc
        equal:
          # some-vol should not be present
          path: spec.template.spec.containers[0].volumeMounts
          value:
            - mountPath: /dev/shm
              name: devshm
              readOnly: false
            - mountPath: /shared
              name: shared
              readOnly: false
            - mountPath: /tmp
              name: tmp
              readOnly: false
            - mountPath: /var/logs
              name: varlogs
              readOnly: false
            - mountPath: /var/run
              name: varrun
              readOnly: false

  # Failures
  - it: should fail with invalid mountPropagation
    set:
      image: *image
      workload:
        workload-name: &workload
          enabled: true
          primary: true
          type: Deployment
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
      persistence:
        vol-name:
          enabled: true
          type: pvc
          mountPath: /some/path
          mountPropagation: HostToContainer
          targetSelector:
            workload-name:
              container-name1:
                mountPropagation: invalid
    asserts:
      - failedTemplate:
          errorMessage: Persistence - Expected [mountPropagation] to be one of [None, HostToContainer, Bidirectional], but got [invalid]

  - it: should fail with non-boolean readOnly
    set:
      image: *image
      workload:
        workload-name: *workload
      persistence:
        vol-name:
          enabled: true
          type: pvc
          mountPath: /some/path
          targetSelector:
            workload-name:
              container-name1:
                readOnly: invalid
    asserts:
      - failedTemplate:
          errorMessage: Persistence - Expected [readOnly] to be [boolean], but got [string]

  - it: should fail with empty readOnly
    set:
      image: *image
      workload:
        workload-name: *workload
      persistence:
        vol-name:
          enabled: true
          type: pvc
          mountPath: /some/path
          targetSelector:
            workload-name:
              container-name1:
                readOnly:
    asserts:
      - failedTemplate:
          errorMessage: Persistence - Expected [readOnly] to be [boolean], but got [invalid]

  - it: should fail with empty mountPath
    set:
      image: *image
      workload:
        workload-name: *workload
      persistence:
        vol-name:
          enabled: true
          type: pvc
          mountPath: ""
          targetSelector:
            workload-name:
              container-name1: {}
    asserts:
      - failedTemplate:
          errorMessage: Persistence - Expected non-empty [mountPath]

  - it: should fail with mountPath not starting with /
    set:
      image: *image
      workload:
        workload-name: *workload
      persistence:
        vol-name:
          enabled: true
          type: pvc
          targetSelector:
            workload-name:
              container-name1:
                mountPath: some/path
    asserts:
      - failedTemplate:
          errorMessage: Persistence - Expected [mountPath] to start with a forward slash [/]

  - it: should fail with non-dict targetSelect.workloadName
    set:
      image: *image
      workload:
        workload-name: *workload
      persistence:
        vol-name:
          enabled: true
          type: pvc
          targetSelector:
            workload-name: string
    asserts:
      - failedTemplate:
          errorMessage: Persistence - Expected [targetSelector.workload-name] to be a [dict], but got [string]

  - it: should fail with empty targetSelect.workloadName
    set:
      image: *image
      workload:
        workload-name: *workload
      persistence:
        vol-name:
          enabled: true
          type: pvc
          targetSelector:
            workload-name: {}
    asserts:
      - failedTemplate:
          errorMessage: Persistence - Expected non-empty [targetSelector.workload-name]
