suite: container volumeMounts test
templates:
  - common.yaml
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:
            restartPolicy: Never
            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:
            restartPolicy: Never
            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: *deploymentDoc
        isNull:
          path: spec.template.spec.containers[1].volumeMounts
      - documentIndex: &jobDoc 1
        isKind:
          of: Job
      - documentIndex: *jobDoc
        isAPIVersion:
          of: batch/v1
      - documentIndex: *jobDoc
        isNull:
          path: spec.template.spec.containers[0].volumeMounts
      - documentIndex: *jobDoc
        isNull:
          path: spec.template.spec.containers[1].volumeMounts

  - 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:
            restartPolicy: Never
            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
        isNull:
          path: spec.template.spec.containers[0].volumeMounts
      - 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
      - documentIndex: *jobDoc
        isNull:
          path: spec.template.spec.containers[1].volumeMounts

  - 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:
            restartPolicy: Never
            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
        isNull:
          path: spec.template.spec.containers[0].volumeMounts
      - documentIndex: *jobDoc
        isNull:
          path: spec.template.spec.containers[1].volumeMounts

  - 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:
            restartPolicy: Never
            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
      - documentIndex: *jobDoc
        isNull:
          path: spec.template.spec.containers[0].volumeMounts
      - documentIndex: *jobDoc
        isNull:
          path: spec.template.spec.containers[1].volumeMounts

  - 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 cert mounted as volume with subPath
    set:
      image: *image
      ixCertificates:
        "1":
          certificate: some_cert
          key: some_key
      scaleCertificate:
        cert-name:
          enabled: false
          id: 1
      workload:
        workload-name:
          enabled: true
          primary: true
          type: Deployment
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: *probes
      persistence:
        cert-vol:
          enabled: true
          type: secret
          objectName: cert-name
          readOnly: true
          targetSelector:
            workload-name:
              container-name1:
                mountPath: /some/path/cert.crt
                readOnly: true
                subPath: cert.crt
    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: cert-vol
            mountPath: /some/path/cert.crt
            readOnly: true
            subPath: cert.crt

  - it: should pass with cert mounted as volume with subPath
    set:
      image: *image
      ixCertificates:
        "1":
          certificate: some_cert
          key: some_key
      scaleCertificate:
        cert-name:
          enabled: false
          id: 1
      workload:
        workload-name:
          enabled: true
          primary: true
          type: Deployment
          podSpec:
            containers:
              container-name1:
                enabled: true
                primary: true
                imageSelector: image
                probes: *probes
      persistence:
        cert-vol:
          enabled: true
          type: secret
          objectName: cert-name
          readOnly: true
          items:
            - key: tls.crt
              path: cert.crt
          targetSelector:
            workload-name:
              container-name1:
                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: cert-vol
            mountPath: /some/path
            readOnly: true

  # 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: emptyDir
          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: emptyDir
          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: emptyDir
          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: emptyDir
          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: emptyDir
          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: emptyDir
          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: emptyDir
          targetSelector:
            workload-name: {}
    asserts:
      - failedTemplate:
          errorMessage: Persistence - Expected non-empty <targetSelector.workload-name>
