From 6a2b7e7a99d0bba3fcefdaabd39db6fd3cec1d2e Mon Sep 17 00:00:00 2001 From: Stavros kois Date: Thu, 10 Nov 2022 00:09:26 +0200 Subject: [PATCH] add volumes and some volume tets --- .../tests/pods/deployment_test.yaml | 134 ++++++++++++++++ .../1.0.0/templates/lib/controller/_pod.tpl | 4 + .../1.0.0/templates/lib/controller/_ports.tpl | 3 +- .../templates/lib/controller/_probes.tpl | 6 + .../templates/lib/controller/_volumes.tpl | 89 +++++++++++ .../1.0.0/templates/pods/_deployment.tpl | 4 +- library/common/1.0.0/values.yaml | 151 ++++++++++++++++++ 7 files changed, 387 insertions(+), 4 deletions(-) create mode 100644 library/common/1.0.0/templates/lib/controller/_probes.tpl create mode 100644 library/common/1.0.0/templates/lib/controller/_volumes.tpl diff --git a/library/common-test/tests/pods/deployment_test.yaml b/library/common-test/tests/pods/deployment_test.yaml index 8aefd059..bec07fba 100644 --- a/library/common-test/tests/pods/deployment_test.yaml +++ b/library/common-test/tests/pods/deployment_test.yaml @@ -200,3 +200,137 @@ tests: documentIndex: *deploymentDoc path: spec.template.metadata.labels.test value: some_value + + - it: should pass with added emptyDir volume + set: + persistence: + volume1: + enabled: true + type: emptyDir + sizeLimit: 1Gi + asserts: + - equal: + path: spec.template.spec.volumes[0] + value: + name: volume1 + emptyDir: + sizeLimit: 1Gi + + - it: should pass with added emptyDir volume and no sizeLimit + set: + persistence: + volume1: + enabled: true + type: emptyDir + asserts: + - equal: + path: spec.template.spec.volumes[0] + value: + name: volume1 + emptyDir: {} + + - it: should pass with added emptyDir volume memory backed with sizeLimit + set: + persistence: + volume1: + enabled: true + type: emptyDir + medium: Memory + sizeLimit: 1Gi + asserts: + - equal: + path: spec.template.spec.volumes[0] + value: + name: volume1 + emptyDir: + medium: Memory + sizeLimit: 1Gi + + - it: should pass with added emptyDir volume memory backed with sizeLimit via tpl + set: + some_medium: Memory + some_size: 1Gi + persistence: + volume1: + enabled: true + type: emptyDir + medium: "{{ .Values.some_medium }}" + sizeLimit: "{{ .Values.some_size }}" + asserts: + - equal: + path: spec.template.spec.volumes[0] + value: + name: volume1 + emptyDir: + medium: Memory + sizeLimit: 1Gi + + - it: should pass with added emptyDir volume memory backed and no sizeLimit + set: + persistence: + volume1: + enabled: true + type: emptyDir + medium: Memory + asserts: + - equal: + path: spec.template.spec.volumes[0] + value: + name: volume1 + emptyDir: + medium: Memory + + - it: should pass with added nfs + set: + persistence: + volume1: + enabled: true + type: nfs + server: some.server.local + path: /nfs/path + asserts: + - equal: + path: spec.template.spec.volumes[0] + value: + name: volume1 + nfs: + server: some.server.local + path: /nfs/path + + - it: should pass with added hostPath + set: + persistence: + volume1: + enabled: true + type: hostpath + hostPath: /mnt/pool/test + asserts: + - equal: + path: spec.template.spec.volumes[0] + value: + name: volume1 + hostPath: + path: /mnt/pool/test + + - it: should pass with added hostPath and hostPathType set via tpl + set: + some_key: Directory + persistence: + volume1: + enabled: true + type: hostpath + hostPathType: "{{ .Values.some_key }}" + hostPath: /mnt/pool/test + asserts: + - equal: + path: spec.template.spec.volumes[0] + value: + name: volume1 + hostPath: + path: /mnt/pool/test + type: Directory + +TODO: configmap +TODO: secret +TODO: PVC +TODO: ports diff --git a/library/common/1.0.0/templates/lib/controller/_pod.tpl b/library/common/1.0.0/templates/lib/controller/_pod.tpl index d04fa497..ab7e0ccc 100644 --- a/library/common/1.0.0/templates/lib/controller/_pod.tpl +++ b/library/common/1.0.0/templates/lib/controller/_pod.tpl @@ -2,4 +2,8 @@ The pod definition included in the controller. */}} {{- define "ix.v1.common.controller.pod" -}} + {{- with (include "ix.v1.common.controller.volumes" . | trim) }} +volumes: + {{- . | nindent 2 }} + {{- end }} {{- end -}} diff --git a/library/common/1.0.0/templates/lib/controller/_ports.tpl b/library/common/1.0.0/templates/lib/controller/_ports.tpl index d46db7b2..1b2d1daf 100644 --- a/library/common/1.0.0/templates/lib/controller/_ports.tpl +++ b/library/common/1.0.0/templates/lib/controller/_ports.tpl @@ -1,5 +1,5 @@ {{/* -Ports included in the controller. +Ports included by the controller. */}} {{- define "ix.v1.common.controller.ports" -}} {{ $ports := list }} @@ -12,7 +12,6 @@ Ports included in the controller. {{- end -}} {{- end -}} - {{/* Render the list of ports */}} diff --git a/library/common/1.0.0/templates/lib/controller/_probes.tpl b/library/common/1.0.0/templates/lib/controller/_probes.tpl new file mode 100644 index 00000000..710639ab --- /dev/null +++ b/library/common/1.0.0/templates/lib/controller/_probes.tpl @@ -0,0 +1,6 @@ +{{/* +Probes selection logic. +*/}} +{{- define "ix.v1.common.controller.probes" -}} + +{{- end -}} diff --git a/library/common/1.0.0/templates/lib/controller/_volumes.tpl b/library/common/1.0.0/templates/lib/controller/_volumes.tpl new file mode 100644 index 00000000..2c892272 --- /dev/null +++ b/library/common/1.0.0/templates/lib/controller/_volumes.tpl @@ -0,0 +1,89 @@ +{{/* +Volumes included by the controller. +*/}} +{{- define "ix.v1.common.controller.volumes" -}} +{{- $persistenceDefault := "pvc" -}} +{{- range $index, $persistence := .Values.persistence }} +{{- if $persistence.enabled }} + {{/* If persistence type is not defined, fallback to $persistenceDefault */}} + {{- if not $persistence.type }} + {{ $_ := set $persistence "type" $persistenceDefault }} + {{- end }} +- name: {{ tpl ( toString $index ) $ }} + {{/* PVC */}} + {{- if eq ($persistence.type | lower) "pvc" }} + {{- $pvcName := (include "ix.v1.common.names.fullname" $) -}} + {{- if $persistence.existingClaim }} + {{/* Always prefer existingClaim if it set */}} + {{- $pvcName = $persistence.existingClaim -}} + {{- else -}} + {{/* Otherwise refer to the PVC name */}} + {{- if $persistence.nameOverride -}} + {{- if not (eq $persistence.nameOverride "-") -}} + {{- $pvcName = (printf "%s-%s" (include "ix.v1.common.names.fullname" $) $persistence.nameOverride) -}} + {{- end -}} + {{- else -}} + {{- $pvcName = (printf "%s-%s" (include "ix.v1.common.names.fullname" $) $index) -}} + {{- end -}} + {{- if $persistence.forceName -}} + {{- $pvcName = $persistence.forceName }} + {{- end -}} + {{- end }} + persistentVolumeClaim: + claimName: {{ tpl $pvcName $ }} + {{/* emptyDir */}} + {{- else if eq ($persistence.type | lower) "emptydir" }} + {{- $emptyDir := dict -}} + {{- with $persistence.medium -}} + {{- $_ := set $emptyDir "medium" "Memory" -}} + {{- end }} + {{/* + If the `SizeMemoryBackedVolumes` feature gate is enabled, + you can specify a size for memory backed volumes. + */}} + {{- with $persistence.sizeLimit -}} + {{- $_ := set $emptyDir "sizeLimit" . -}} + {{- end }} + emptyDir: {{- tpl (toYaml $emptyDir) $ | nindent 4 }} + {{- else if or (eq ($persistence.type | lower) "configmap") (eq ($persistence.type | lower) "secret") }} + {{- $objectName := (required (printf "objectName not set for persistence item %s" $index) $persistence.objectName) }} + {{- $objectName = tpl $objectName $ }} + {{/* configMap */}} + {{- if eq ($persistence.type | lower) "configmap" }} + configMap: + name: {{ $objectName }} + {{- else }} + {{/* secret */}} + secret: + secretName: {{ $objectName }} + {{- end }} + {{- with $persistence.defaultMode }} + defaultMode: {{ tpl . $ }} + {{- end }} + {{- with $persistence.items }} + items: + {{- tpl (toYaml .) $ | nindent 6 }} + {{- end }} + {{- else if eq ($persistence.type | lower) "hostpath" }} + {{/* hostPath */}} + hostPath: + path: {{ required "hostPath not set" $persistence.hostPath }} + {{- with $persistence.hostPathType }} + type: {{ tpl . $ }} + {{- end }} + {{- else if eq ($persistence.type | lower) "nfs" }} + nfs: + server: {{ required "NFS Server not set" $persistence.server }} + path: {{ required "NFS Path not set" $persistence.path }} + {{/* ix-volumes */}} + {{- else if eq ($persistence.type | lower) "ix-volumes" }} + {{/* TODO: Implement ix-volumes */}} + {{/* Custom, in case we want to add something once */}} + {{- else if eq ($persistence.type | lower) "custom" }} + {{- tpl ( toYaml $persistence.volumeSpec ) $ | nindent 2 }} + {{- else }} + {{- fail (printf "Not a valid persistence.type (%s)" $persistence.type) }} + {{- end }} +{{- end }} +{{- end }} +{{- end }} diff --git a/library/common/1.0.0/templates/pods/_deployment.tpl b/library/common/1.0.0/templates/pods/_deployment.tpl index e999d8f1..9f83c3a0 100644 --- a/library/common/1.0.0/templates/pods/_deployment.tpl +++ b/library/common/1.0.0/templates/pods/_deployment.tpl @@ -48,6 +48,6 @@ spec: {{- with .Values.podLabels }} {{- tpl (toYaml .) $ | nindent 8 }} {{- end }} - spec: - {{- include "ix.v1.common.controller.pod" . | nindent 6 }} + spec: + {{- include "ix.v1.common.controller.pod" . | nindent 6 }} {{- end }} diff --git a/library/common/1.0.0/values.yaml b/library/common/1.0.0/values.yaml index 0f046c66..4c875d14 100644 --- a/library/common/1.0.0/values.yaml +++ b/library/common/1.0.0/values.yaml @@ -74,3 +74,154 @@ service: # -- Specify the nodePort value NodePort service types. # [[ref]](https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport) nodePort: + +# -- Configure persistence for the chart here. +# Additional items can be added by adding a dictionary key similar to the 'pvc-example' key. +# @default -- See below +persistence: + # TODO: Move examples to documentation instead of here + pvc-example: + # -- Enables or disables the persistence item + enabled: false + # -- Sets the persistence type + # Valid options are: pvc | emptyDir | secret | configMap | hostPath | custom + type: pvc + # -- Sets an override for the suffix of this volume + nameOverride: "" + annotationsList: [] + # - name: somename + # value: somevalue + # -- Add annotations to PVC object + annotations: {} + # -- If you want to reuse an existing claim, the name of the existing PVC can be passed here. + existingClaim: "" + # -- force the complete PVC name + # Will not add any prefix or suffix + forceName: "" + # -- Example of a hostPath mount + # [[ref]]https://kubernetes.io/docs/concepts/storage/volumes/#hostpath) + # @default -- See below + host-dev: + enabled: false + type: hostPath + # -- Which path on the host should be mounted. + hostPath: /dev + # -- Automatic set permissions using chown and chmod + setPermissions: false + # -- Where to mount the path in the main container. + # Defaults to the value of `hostPath` + mountPath: # /myDev + # -- Specifying a hostPathType adds a check before trying to mount the path. + # See Kubernetes documentation for options. + hostPathType: "" + # -- Specify if the path should be mounted read-only. + readOnly: true + + # -- Example of a configmap mount + # @default -- See below + configmap-example: + enabled: false + type: configMap + # -- Specify the name of the configmap object to be mounted. Helm templates can be used. + objectName: myconfig-map + # -- Where to mount the volume in the main container. + # Defaults to `/`, + # setting to '-' creates the volume but disables the volumeMount. + mountPath: # /custom-mount + # -- Specify if the volume should be mounted read-only. + readOnly: false + + # -- Example of a secret mount + # @default -- See below + secret-example: + enabled: false + type: secret + # -- Specify the name of the secret object to be mounted. Helm templates can be used. + objectName: mysecret + # -- Where to mount the volume in the main container. + # Defaults to `/`, + # setting to '-' creates the volume but disables the volumeMount. + mountPath: # /custom-mount + # -- Specify if the volume should be mounted read-only. + readOnly: false + # -- define the default mount mode for the secret + defaultMode: 0644 + # -- Define the secret items to be mounted + items: + - key: username + path: my-group/my-username + + # -- Example of a nfs mount + # @default -- See below + nfs-example: + enabled: false + type: nfs + # -- Specify the name of the secret object to be mounted + server: 192.168.10.10 + # -- define the default mount path on the nfs server + path: "/somepath" + # -- Where to mount the volume in the main container. + # Defaults to `/`, + # setting to '-' creates the volume but disables the volumeMount. + mountPath: # /custom-mount + # -- Specify if the volume should be mounted read-only. + readOnly: false + + # -- Create an emptyDir volume to for /dev/shm + # [[ref]]https://kubernetes.io/docs/concepts/storage/volumes/#emptydir) + # @default -- See below + shm: + # TODO: discuss if we enable it by default + enabled: false + type: emptyDir + mountPath: /dev/shm + # -- Set the medium to "Memory" to mount a tmpfs (RAM-backed filesystem) instead + # of the storage medium that backs the node. + medium: Memory + # -- If the `SizeMemoryBackedVolumes` feature gate is enabled, you can + # specify a size for memory backed volumes. + sizeLimit: # 1Gi + + # -- Create an emptyDir volume to share between all containers for temporary storage + # @default -- See below + temp: + # TODO: discuss if we enable it by default + enabled: false + type: emptyDir + mountPath: /tmp + # -- Set the medium to "Memory" to mount a tmpfs (RAM-backed filesystem) instead + # of the storage medium that backs the node. + medium: # Memory + # -- If the `SizeMemoryBackedVolumes` feature gate is enabled, you can + # specify a size for memory backed volumes. + sizeLimit: # 1Gi + + # -- Create an emptyDir volume to share between all containers + # [[ref]]https://kubernetes.io/docs/concepts/storage/volumes/#emptydir) + # @default -- See below + varlogs: + # TODO: discuss if we enable it by default + enabled: false + type: emptyDir + mountPath: /var/logs + # -- Set the medium to "Memory" to mount a tmpfs (RAM-backed filesystem) instead + # of the storage medium that backs the node. + medium: # Memory + # -- If the `SizeMemoryBackedVolumes` feature gate is enabled, you can + # specify a size for memory backed volumes. + sizeLimit: # 1Gi + + # -- Create an emptyDir volume to share between all containers + # [[ref]]https://kubernetes.io/docs/concepts/storage/volumes/#emptydir) + # @default -- See below + shared: + # TODO: discuss if we enable it by default + enabled: false + type: emptyDir + mountPath: /shared + # -- Set the medium to "Memory" to mount a tmpfs (RAM-backed filesystem) instead + # of the storage medium that backs the node. + medium: # Memory + # -- If the `SizeMemoryBackedVolumes` feature gate is enabled, you can + # specify a size for memory backed volumes. + sizeLimit: # 1Gi