aboutsummaryrefslogtreecommitdiffstats
path: root/kubernetes/common/mongodb/templates
diff options
context:
space:
mode:
authorLukasz Rajewski <lukasz.rajewski@t-mobile.pl>2024-03-11 15:39:30 +0000
committerGerrit Code Review <gerrit@onap.org>2024-03-11 15:39:30 +0000
commitfa01ec554cfa10cb1f9ec8be0c5530dd3f3ea50a (patch)
tree0f21b55af795554e19a745a4dcb0b063eb7ff18a /kubernetes/common/mongodb/templates
parent9964927d8766c5c396ef2caf6f7aeb7494db279e (diff)
parentcde4a784a593555c17146635dcc25013872cabc5 (diff)
Merge "[MONGODB] Update to latest bitnami mongodb chart"
Diffstat (limited to 'kubernetes/common/mongodb/templates')
-rw-r--r--kubernetes/common/mongodb/templates/NOTES.txt203
-rw-r--r--kubernetes/common/mongodb/templates/_helpers.tpl514
-rw-r--r--kubernetes/common/mongodb/templates/arbiter/configmap.yaml20
-rw-r--r--kubernetes/common/mongodb/templates/arbiter/headless-svc.yaml31
-rw-r--r--kubernetes/common/mongodb/templates/arbiter/pdb.yaml28
-rw-r--r--kubernetes/common/mongodb/templates/arbiter/statefulset.yaml310
-rw-r--r--kubernetes/common/mongodb/templates/backup/cronjob.yaml204
-rw-r--r--kubernetes/common/mongodb/templates/backup/pvc.yaml41
-rw-r--r--kubernetes/common/mongodb/templates/common-scripts-cm.yaml146
-rw-r--r--kubernetes/common/mongodb/templates/configmap.yaml20
-rw-r--r--kubernetes/common/mongodb/templates/extra-list.yaml9
-rw-r--r--kubernetes/common/mongodb/templates/hidden/configmap.yaml20
-rw-r--r--kubernetes/common/mongodb/templates/hidden/external-access-svc.yaml69
-rw-r--r--kubernetes/common/mongodb/templates/hidden/headless-svc.yaml32
-rw-r--r--kubernetes/common/mongodb/templates/hidden/pdb.yaml28
-rw-r--r--kubernetes/common/mongodb/templates/hidden/statefulset.yaml601
-rw-r--r--kubernetes/common/mongodb/templates/initialization-configmap.yaml19
-rw-r--r--kubernetes/common/mongodb/templates/metrics-svc.yaml31
-rw-r--r--kubernetes/common/mongodb/templates/networkpolicy.yaml83
-rw-r--r--kubernetes/common/mongodb/templates/prometheusrule.yaml23
-rw-r--r--kubernetes/common/mongodb/templates/psp.yaml51
-rw-r--r--kubernetes/common/mongodb/templates/replicaset/external-access-svc.yaml69
-rw-r--r--kubernetes/common/mongodb/templates/replicaset/headless-svc.yaml32
-rw-r--r--kubernetes/common/mongodb/templates/replicaset/pdb.yaml28
-rw-r--r--kubernetes/common/mongodb/templates/replicaset/scripts-configmap.yaml317
-rw-r--r--kubernetes/common/mongodb/templates/replicaset/statefulset.yaml606
-rw-r--r--kubernetes/common/mongodb/templates/replicaset/svc.yaml41
-rw-r--r--kubernetes/common/mongodb/templates/role.yaml31
-rw-r--r--kubernetes/common/mongodb/templates/rolebinding.yaml21
-rw-r--r--kubernetes/common/mongodb/templates/secrets-ca.yaml33
-rw-r--r--kubernetes/common/mongodb/templates/secrets.yaml128
-rw-r--r--kubernetes/common/mongodb/templates/serviceaccount.yaml20
-rw-r--r--kubernetes/common/mongodb/templates/servicemonitor.yaml48
-rw-r--r--kubernetes/common/mongodb/templates/standalone/dep-sts.yaml520
-rw-r--r--kubernetes/common/mongodb/templates/standalone/pvc.yaml31
-rw-r--r--kubernetes/common/mongodb/templates/standalone/svc.yaml62
36 files changed, 4470 insertions, 0 deletions
diff --git a/kubernetes/common/mongodb/templates/NOTES.txt b/kubernetes/common/mongodb/templates/NOTES.txt
new file mode 100644
index 0000000000..89a693ea34
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/NOTES.txt
@@ -0,0 +1,203 @@
+CHART NAME: {{ .Chart.Name }}
+CHART VERSION: {{ .Chart.Version }}
+APP VERSION: {{ .Chart.AppVersion }}
+
+{{- if .Values.diagnosticMode.enabled }}
+The chart has been deployed in diagnostic mode. All probes have been disabled and the command has been overwritten with:
+
+ command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 4 }}
+ args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 4 }}
+
+Get the list of pods by executing:
+
+ kubectl get pods --namespace {{ .Release.Namespace }} -l app.kubernetes.io/instance={{ .Release.Name }}
+
+Access the pod you want to debug by executing
+
+ kubectl exec --namespace {{ .Release.Namespace }} -ti <NAME OF THE POD> -- bash
+
+In order to replicate the container startup scripts execute this command:
+
+ /opt/bitnami/scripts/mongodb/entrypoint.sh /opt/bitnami/scripts/mongodb/run.sh
+
+{{- else }}
+
+{{- $replicaCount := int .Values.replicaCount }}
+{{- $portNumber := int .Values.service.ports.mongodb }}
+{{- $fullname := include "mongodb.fullname" . }}
+{{- $releaseNamespace := include "mongodb.namespace" . }}
+{{- $clusterDomain := .Values.clusterDomain }}
+{{- $loadBalancerIPListLength := len .Values.externalAccess.service.loadBalancerIPs }}
+{{- $mongoList := list }}
+{{- range $e, $i := until $replicaCount }}
+{{- $mongoList = append $mongoList (printf "%s-%d.%s-headless.%s.svc.%s:%d" $fullname $i $fullname $releaseNamespace $clusterDomain $portNumber) }}
+{{- end }}
+
+{{- if and (eq .Values.architecture "replicaset") .Values.externalAccess.enabled (not .Values.externalAccess.autoDiscovery.enabled) (not (eq $replicaCount $loadBalancerIPListLength )) (eq .Values.externalAccess.service.type "LoadBalancer") }}
+
+####################################################################################
+### ERROR: You enabled external access to MongoDB&reg; nodes without specifying ###
+### the array of load balancer IPs for MongoDB&reg; nodes. ###
+####################################################################################
+
+This deployment will be incomplete until you configure the array of load balancer
+IPs for MongoDB&reg; nodes. To complete your deployment follow the steps below:
+
+1. Wait for the load balancer IPs (it may take a few minutes for them to be available):
+
+ kubectl get svc --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ template "mongodb.name" . }},app.kubernetes.io/instance={{ .Release.Name }},app.kubernetes.io/component=mongodb" -w
+
+2. Obtain the load balancer IPs and upgrade your chart:
+
+ {{- range $e, $i := until $replicaCount }}
+ LOAD_BALANCER_IP_{{ add $i 1 }}="$(kubectl get svc --namespace {{ $releaseNamespace }} {{ $fullname }}-{{ $i }}-external -o jsonpath='{.status.loadBalancer.ingress[0].ip}')"
+ {{- end }}
+
+3. Upgrade you chart:
+
+ helm upgrade --namespace {{ .Release.Namespace }} {{ .Release.Name }} oci://registry-1.docker.io/bitnamicharts/{{ .Chart.Name }} \
+ --set mongodb.replicaCount={{ $replicaCount }} \
+ --set mongodb.externalAccess.enabled=true \
+ {{- range $i, $e := until $replicaCount }}
+ --set mongodb.externalAccess.service.loadBalancerIPs[{{ $i }}]=$LOAD_BALANCER_IP_{{ add $i 1 }} \
+ {{- end }}
+ --set mongodb.externalAccess.service.type=LoadBalancer
+
+{{- else }}
+
+{{- if and (or (and (eq .Values.architecture "standalone") (or (eq .Values.service.type "LoadBalancer") (eq .Values.service.type "NodePort"))) (and (eq .Values.architecture "replicaset") .Values.externalAccess.enabled)) (not .Values.auth.enabled) }}
+-------------------------------------------------------------------------------
+ WARNING
+
+ By not enabling "mongodb.auth.enabled" you have most likely exposed the
+ MongoDB&reg; service externally without any authentication mechanism.
+
+ For security reasons, we strongly suggest that you enable authentiation
+ setting the "mongodb.auth.enabled" parameter to "true".
+
+-------------------------------------------------------------------------------
+{{- end }}
+
+** Please be patient while the chart is being deployed **
+
+MongoDB&reg; can be accessed on the following DNS name(s) and ports from within your cluster:
+
+{{- if eq .Values.architecture "replicaset" }}
+{{ join "\n" $mongoList | nindent 4 }}
+{{- else }}
+
+ {{ $fullname }}.{{ $releaseNamespace }}.svc.{{ .Values.clusterDomain }}
+
+{{- end }}
+
+{{- if .Values.auth.enabled }}
+
+To get the root password run:
+
+ export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace {{ template "mongodb.namespace" . }} {{ template "mongodb.secretName" . }} -o jsonpath="{.data.mongodb-root-password}" | base64 -d)
+
+{{- end }}
+{{- $customUsers := include "mongodb.customUsers" . -}}
+{{- $customDatabases := include "mongodb.customDatabases" . -}}
+{{- if and (not (empty $customUsers)) (not (empty $customDatabases)) }}
+{{- $customUsersList := splitList "," $customUsers }}
+{{- range $index, $user := $customUsersList }}
+
+To get the password for "{{ $user }}" run:
+
+ export MONGODB_PASSWORD=$(kubectl get secret --namespace {{ include "mongodb.namespace" $ }} {{ include "mongodb.secretName" $ }} -o jsonpath="{.data.mongodb-passwords}" | base64 -d | awk -F',' '{print ${{ add 1 $index }}}')
+
+{{- end }}
+{{- end }}
+
+To connect to your database, create a MongoDB&reg; client container:
+
+ kubectl run --namespace {{ template "mongodb.namespace" . }} {{ template "mongodb.fullname" . }}-client --rm --tty -i --restart='Never' --env="MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD" --image {{ template "mongodb.image" . }} --command -- bash
+
+Then, run the following command:
+
+ {{- if eq .Values.architecture "replicaset" }}
+ mongosh admin --host "{{ join "," $mongoList }}" {{- if .Values.auth.enabled }} --authenticationDatabase admin -u $MONGODB_ROOT_USER -p $MONGODB_ROOT_PASSWORD{{- end }}
+ {{- else }}
+ mongosh admin --host "{{ template "mongodb.service.nameOverride" . }}" {{- if .Values.auth.enabled }} --authenticationDatabase admin -u $MONGODB_ROOT_USER -p $MONGODB_ROOT_PASSWORD{{- end }}
+ {{- end }}
+
+{{- if and (eq .Values.architecture "replicaset") .Values.externalAccess.enabled }}
+
+To connect to your database nodes from outside, you need to add both primary and secondary nodes hostnames/IPs to your Mongo client. To obtain them, follow the instructions below:
+
+{{- if eq "NodePort" .Values.externalAccess.service.type }}
+{{- if .Values.externalAccess.service.domain }}
+
+ MongoDB&reg; nodes domain: Use your provided hostname to reach MongoDB&reg; nodes, {{ .Values.externalAccess.service.domain }}
+
+{{- else }}
+
+ MongoDB&reg; nodes domain: you can reach MongoDB&reg; nodes on any of the K8s nodes external IPs.
+
+ kubectl get nodes -o wide
+
+{{- end }}
+
+ MongoDB&reg; nodes port: You will have a different node port for each MongoDB&reg; node. You can get the list of configured node ports using the command below:
+
+ echo "$(kubectl get svc --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ template "mongodb.name" . }},app.kubernetes.io/instance={{ .Release.Name }},app.kubernetes.io/component=mongodb,pod" -o jsonpath='{.items[*].spec.ports[0].nodePort}' | tr ' ' '\n')"
+
+{{- else if contains "LoadBalancer" .Values.externalAccess.service.type }}
+
+ NOTE: It may take a few minutes for the LoadBalancer IPs to be available.
+ Watch the status with: 'kubectl get svc --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ template "mongodb.name" . }},app.kubernetes.io/instance={{ .Release.Name }},app.kubernetes.io/component=mongodb,pod" -w'
+
+ MongoDB&reg; nodes domain: You will have a different external IP for each MongoDB&reg; node. You can get the list of external IPs using the command below:
+
+ echo "$(kubectl get svc --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ template "mongodb.name" . }},app.kubernetes.io/instance={{ .Release.Name }},app.kubernetes.io/component=mongodb,pod" -o jsonpath='{.items[*].status.loadBalancer.ingress[0].ip}' | tr ' ' '\n')"
+
+ MongoDB&reg; nodes port: {{ .Values.externalAccess.service.ports.mongodb }}
+
+{{- end }}
+
+{{- else if eq .Values.architecture "standalone" }}
+
+To connect to your database from outside the cluster execute the following commands:
+
+{{- if contains "NodePort" .Values.service.type }}
+
+ export NODE_IP=$(kubectl get nodes --namespace {{ template "mongodb.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}")
+ export NODE_PORT=$(kubectl get --namespace {{ template "mongodb.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "mongodb.service.nameOverride" . }})
+ mongo --host $NODE_IP --port $NODE_PORT {{- if .Values.auth.enabled }} --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD{{- end }}
+
+{{- else if contains "LoadBalancer" .Values.service.type }}
+
+ NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+ Watch the status with: 'kubectl get svc --namespace {{ template "mongodb.namespace" . }} -w {{ template "mongodb.service.nameOverride" . }}'
+
+ export SERVICE_IP=$(kubectl get svc --namespace {{ template "mongodb.namespace" . }} {{ template "mongodb.service.nameOverride" . }} --template "{{ "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}" }}")
+ mongosh --host $SERVICE_IP --port {{ $portNumber }} {{- if .Values.auth.enabled }} --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD{{- end }}
+
+{{- else if contains "ClusterIP" .Values.service.type }}
+
+ kubectl port-forward --namespace {{ template "mongodb.namespace" . }} svc/{{ template "mongodb.service.nameOverride" . }} {{ $portNumber }}:{{ $portNumber }} &
+ mongosh --host 127.0.0.1 {{- if .Values.auth.enabled }} --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD{{- end }}
+
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{- if .Values.metrics.enabled }}
+
+To access the MongoDB&reg; Prometheus metrics, get the MongoDB&reg; Prometheus URL by running:
+
+ kubectl port-forward --namespace {{ .Release.Namespace }} svc/{{ printf "%s-metrics" (include "mongodb.fullname" .) }} {{ .Values.metrics.service.ports.metrics }}:{{ .Values.metrics.service.ports.metrics }} &
+ echo "Prometheus Metrics URL: http://127.0.0.1:{{ .Values.metrics.service.ports.metrics }}/metrics"
+
+Then, open the obtained URL in a browser.
+
+{{- end }}
+{{- end }}
+{{- include "common.warnings.rollingTag" .Values.image }}
+{{- include "common.warnings.rollingTag" .Values.metrics.image }}
+{{- include "common.warnings.rollingTag" .Values.externalAccess.autoDiscovery.image }}
+{{- include "common.warnings.rollingTag" .Values.volumePermissions.image }}
+{{- include "common.warnings.rollingTag" .Values.tls.image }}
+{{- include "mongodb.validateValues" . }}
+{{- include "common.warnings.resources" (dict "sections" (list "arbiter" "externalAccess.autoDiscovery" "hidden" "metrics" "" "tls" "volumePermissions") "context" $) }}
diff --git a/kubernetes/common/mongodb/templates/_helpers.tpl b/kubernetes/common/mongodb/templates/_helpers.tpl
new file mode 100644
index 0000000000..b6bbb1f781
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/_helpers.tpl
@@ -0,0 +1,514 @@
+{{/*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "mongodb.name" -}}
+{{- include "common.names.name" . -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "mongodb.fullname" -}}
+{{- include "common.names.fullname" . -}}
+{{- end -}}
+
+{{/*
+Create a default mongo service name which can be overridden.
+*/}}
+{{- define "mongodb.service.nameOverride" -}}
+ {{- if and .Values.service .Values.service.nameOverride -}}
+ {{- print .Values.service.nameOverride -}}
+ {{- else -}}
+ {{- if eq .Values.architecture "replicaset" -}}
+ {{- printf "%s-headless" (include "mongodb.fullname" .) -}}
+ {{- else -}}
+ {{- printf "%s" (include "mongodb.fullname" .) -}}
+ {{- end -}}
+ {{- end -}}
+{{- end -}}
+
+{{/*
+Create a default mongo arbiter service name which can be overridden.
+*/}}
+{{- define "mongodb.arbiter.service.nameOverride" -}}
+ {{- if and .Values.arbiter.service .Values.arbiter.service.nameOverride -}}
+ {{- print .Values.arbiter.service.nameOverride -}}
+ {{- else -}}
+ {{- printf "%s-arbiter-headless" (include "mongodb.fullname" .) -}}
+ {{- end }}
+{{- end }}
+
+{{/*
+Return the proper MongoDB&reg; image name
+*/}}
+{{- define "mongodb.image" -}}
+{{- include "common.images.image" (dict "imageRoot" .Values.image "global" .Values.global) -}}
+{{- end -}}
+
+{{/*
+Return the proper image name (for the metrics image)
+*/}}
+{{- define "mongodb.metrics.image" -}}
+{{- include "common.images.image" (dict "imageRoot" .Values.metrics.image "global" .Values.global) -}}
+{{- end -}}
+
+{{/*
+Return the proper image name (for the init container volume-permissions image)
+*/}}
+{{- define "mongodb.volumePermissions.image" -}}
+{{- include "common.images.image" (dict "imageRoot" .Values.volumePermissions.image "global" .Values.global) -}}
+{{- end -}}
+
+{{/*
+Return the proper image name (for the init container auto-discovery image)
+*/}}
+{{- define "mongodb.externalAccess.autoDiscovery.image" -}}
+{{- include "common.images.image" (dict "imageRoot" .Values.externalAccess.autoDiscovery.image "global" .Values.global) -}}
+{{- end -}}
+
+{{/*
+Return the proper image name (for the TLS Certs image)
+*/}}
+{{- define "mongodb.tls.image" -}}
+{{- include "common.images.image" (dict "imageRoot" .Values.tls.image "global" .Values.global) -}}
+{{- end -}}
+
+{{/*
+Return the proper Docker Image Registry Secret Names
+*/}}
+{{- define "mongodb.imagePullSecrets" -}}
+{{- include "common.images.renderPullSecrets" (dict "images" (list .Values.image .Values.metrics.image .Values.volumePermissions.image .Values.tls.image) "context" $) -}}
+{{- end -}}
+
+{{/*
+Allow the release namespace to be overridden for multi-namespace deployments in combined charts.
+*/}}
+{{- define "mongodb.namespace" -}}
+ {{- if and .Values.global .Values.global.namespaceOverride -}}
+ {{- print .Values.global.namespaceOverride -}}
+ {{- else -}}
+ {{- print .Release.Namespace -}}
+ {{- end }}
+{{- end -}}
+{{- define "mongodb.serviceMonitor.namespace" -}}
+ {{- if .Values.metrics.serviceMonitor.namespace -}}
+ {{- print .Values.metrics.serviceMonitor.namespace -}}
+ {{- else -}}
+ {{- include "mongodb.namespace" . -}}
+ {{- end }}
+{{- end -}}
+{{- define "mongodb.prometheusRule.namespace" -}}
+ {{- if .Values.metrics.prometheusRule.namespace -}}
+ {{- print .Values.metrics.prometheusRule.namespace -}}
+ {{- else -}}
+ {{- include "mongodb.namespace" . -}}
+ {{- end }}
+{{- end -}}
+
+{{/*
+Returns the proper service account name depending if an explicit service account name is set
+in the values file. If the name is not set it will default to either mongodb.fullname if serviceAccount.create
+is true or default otherwise.
+*/}}
+{{- define "mongodb.serviceAccountName" -}}
+ {{- if .Values.serviceAccount.create -}}
+ {{- default (include "mongodb.fullname" .) (print .Values.serviceAccount.name) -}}
+ {{- else -}}
+ {{- default "default" (print .Values.serviceAccount.name) -}}
+ {{- end -}}
+{{- end -}}
+
+{{/*
+Return the list of custom users to create during the initialization (string format)
+*/}}
+{{- define "mongodb.customUsers" -}}
+ {{- $customUsers := list -}}
+ {{- if .Values.auth.username -}}
+ {{- $customUsers = append $customUsers .Values.auth.username }}
+ {{- end }}
+ {{- range .Values.auth.usernames }}
+ {{- $customUsers = append $customUsers . }}
+ {{- end }}
+ {{- printf "%s" (default "" (join "," $customUsers)) -}}
+{{- end -}}
+
+{{/*
+Return the list of passwords for the custom users (string format)
+*/}}
+{{- define "mongodb.customPasswords" -}}
+ {{- $customPasswords := list -}}
+ {{- if .Values.auth.password -}}
+ {{- $customPasswords = append $customPasswords .Values.auth.password }}
+ {{- end }}
+ {{- range .Values.auth.passwords }}
+ {{- $customPasswords = append $customPasswords . }}
+ {{- end }}
+ {{- printf "%s" (default "" (join "," $customPasswords)) -}}
+{{- end -}}
+
+{{/*
+Return the list of custom databases to create during the initialization (string format)
+*/}}
+{{- define "mongodb.customDatabases" -}}
+ {{- $customDatabases := list -}}
+ {{- if .Values.auth.database -}}
+ {{- $customDatabases = append $customDatabases .Values.auth.database }}
+ {{- end }}
+ {{- range .Values.auth.databases }}
+ {{- $customDatabases = append $customDatabases . }}
+ {{- end }}
+ {{- printf "%s" (default "" (join "," $customDatabases)) -}}
+{{- end -}}
+
+{{/*
+Return the configmap with the MongoDB&reg; configuration
+*/}}
+{{- define "mongodb.configmapName" -}}
+{{- if .Values.existingConfigmap -}}
+ {{- printf "%s" (tpl .Values.existingConfigmap $) -}}
+{{- else -}}
+ {{- printf "%s" (include "mongodb.fullname" .) -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return true if a configmap object should be created for MongoDB&reg;
+*/}}
+{{- define "mongodb.createConfigmap" -}}
+{{- if and .Values.configuration (not .Values.existingConfigmap) }}
+ {{- true -}}
+{{- else -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return the secret with MongoDB&reg; credentials
+*/}}
+{{- define "mongodb.secretName" -}}
+ {{- if .Values.auth.existingSecret -}}
+ {{- printf "%s" (tpl .Values.auth.existingSecret $) -}}
+ {{- else -}}
+ {{- printf "%s" (include "mongodb.fullname" .) -}}
+ {{- end -}}
+{{- end -}}
+
+{{/*
+Return true if a secret object should be created for MongoDB&reg;
+*/}}
+{{- define "mongodb.createSecret" -}}
+{{- if and .Values.auth.enabled (not .Values.auth.existingSecret) }}
+ {{- true -}}
+{{- else -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Get the initialization scripts ConfigMap name.
+*/}}
+{{- define "mongodb.initdbScriptsCM" -}}
+{{- if .Values.initdbScriptsConfigMap -}}
+{{- printf "%s" .Values.initdbScriptsConfigMap -}}
+{{- else -}}
+{{- printf "%s-init-scripts" (include "mongodb.fullname" .) -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return true if the Arbiter should be deployed
+*/}}
+{{- define "mongodb.arbiter.enabled" -}}
+{{- if and (eq .Values.architecture "replicaset") .Values.arbiter.enabled }}
+ {{- true -}}
+{{- else -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return the configmap with the MongoDB&reg; configuration for the Arbiter
+*/}}
+{{- define "mongodb.arbiter.configmapName" -}}
+{{- if .Values.arbiter.existingConfigmap -}}
+ {{- printf "%s" (tpl .Values.arbiter.existingConfigmap $) -}}
+{{- else -}}
+ {{- printf "%s-arbiter" (include "mongodb.fullname" .) -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return true if a configmap object should be created for MongoDB&reg; Arbiter
+*/}}
+{{- define "mongodb.arbiter.createConfigmap" -}}
+{{- if and (eq .Values.architecture "replicaset") .Values.arbiter.enabled .Values.arbiter.configuration (not .Values.arbiter.existingConfigmap) }}
+ {{- true -}}
+{{- else -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return true if the Hidden should be deployed
+*/}}
+{{- define "mongodb.hidden.enabled" -}}
+{{- if and (eq .Values.architecture "replicaset") .Values.hidden.enabled }}
+ {{- true -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return the configmap with the MongoDB&reg; configuration for the Hidden
+*/}}
+{{- define "mongodb.hidden.configmapName" -}}
+{{- if .Values.hidden.existingConfigmap -}}
+ {{- printf "%s" (tpl .Values.hidden.existingConfigmap $) -}}
+{{- else -}}
+ {{- printf "%s-hidden" (include "mongodb.fullname" .) -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return true if a configmap object should be created for MongoDB&reg; Hidden
+*/}}
+{{- define "mongodb.hidden.createConfigmap" -}}
+{{- if and (include "mongodb.hidden.enabled" .) .Values.hidden.enabled .Values.hidden.configuration (not .Values.hidden.existingConfigmap) }}
+ {{- true -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Compile all warnings into a single message, and call fail.
+*/}}
+{{- define "mongodb.validateValues" -}}
+{{- $messages := list -}}
+{{- $messages := append $messages (include "mongodb.validateValues.pspAndRBAC" .) -}}
+{{- $messages := append $messages (include "mongodb.validateValues.architecture" .) -}}
+{{- $messages := append $messages (include "mongodb.validateValues.customUsersDBs" .) -}}
+{{- $messages := append $messages (include "mongodb.validateValues.customUsersDBsLength" .) -}}
+{{- $messages := append $messages (include "mongodb.validateValues.externalAccessServiceType" .) -}}
+{{- $messages := append $messages (include "mongodb.validateValues.loadBalancerIPsListLength" .) -}}
+{{- $messages := append $messages (include "mongodb.validateValues.nodePortListLength" .) -}}
+{{- $messages := append $messages (include "mongodb.validateValues.externalAccessAutoDiscoveryRBAC" .) -}}
+{{- $messages := append $messages (include "mongodb.validateValues.replicaset.existingSecrets" .) -}}
+{{- $messages := append $messages (include "mongodb.validateValues.hidden.existingSecrets" .) -}}
+{{- $messages := without $messages "" -}}
+{{- $message := join "\n" $messages -}}
+
+{{- if $message -}}
+{{- printf "\nVALUES VALIDATION:\n%s" $message | fail -}}
+{{- end -}}
+{{- end -}}
+
+{{/* Validate RBAC is created when using PSP */}}
+{{- define "mongodb.validateValues.pspAndRBAC" -}}
+{{- if and (.Values.podSecurityPolicy.create) (not .Values.rbac.create) -}}
+mongodb: podSecurityPolicy.create, rbac.create
+ Both podSecurityPolicy.create and rbac.create must be true, if you want
+ to create podSecurityPolicy
+{{- end -}}
+{{- end -}}
+
+{{/* Validate values of MongoDB&reg; - must provide a valid architecture */}}
+{{- define "mongodb.validateValues.architecture" -}}
+{{- if and (ne .Values.architecture "standalone") (ne .Values.architecture "replicaset") -}}
+mongodb: architecture
+ Invalid architecture selected. Valid values are "standalone" and
+ "replicaset". Please set a valid architecture (--set mongodb.architecture="xxxx")
+{{- end -}}
+{{- end -}}
+
+{{/*
+Validate values of MongoDB&reg; - both auth.usernames and auth.databases are necessary
+to create a custom user and database during 1st initialization
+*/}}
+{{- define "mongodb.validateValues.customUsersDBs" -}}
+{{- $customUsers := include "mongodb.customUsers" . -}}
+{{- $customDatabases := include "mongodb.customDatabases" . -}}
+{{- if or (and (empty $customUsers) (not (empty $customDatabases))) (and (not (empty $customUsers)) (empty $customDatabases)) }}
+mongodb: auth.usernames, auth.databases
+ Both auth.usernames and auth.databases must be provided to create
+ custom users and databases during 1st initialization.
+ Please set both of them (--set auth.usernames[0]="xxxx",auth.databases[0]="yyyy")
+{{- end -}}
+{{- end -}}
+
+{{/*
+Validate values of MongoDB&reg; - both auth.usernames and auth.databases arrays should have the same length
+to create a custom user and database during 1st initialization
+*/}}
+{{- define "mongodb.validateValues.customUsersDBsLength" -}}
+{{- if ne (len .Values.auth.usernames) (len .Values.auth.databases) }}
+mongodb: auth.usernames, auth.databases
+ Both auth.usernames and auth.databases arrays should have the same length
+{{- end -}}
+{{- end -}}
+
+{{/*
+Validate values of MongoDB&reg; - service type for external access
+*/}}
+{{- define "mongodb.validateValues.externalAccessServiceType" -}}
+{{- if and (eq .Values.architecture "replicaset") (not (eq .Values.externalAccess.service.type "NodePort")) (not (eq .Values.externalAccess.service.type "LoadBalancer")) (not (eq .Values.externalAccess.service.type "ClusterIP")) -}}
+mongodb: externalAccess.service.type
+ Available service type for external access are NodePort, LoadBalancer or ClusterIP.
+{{- end -}}
+{{- end -}}
+
+{{/*
+Validate values of MongoDB&reg; - number of replicas must be the same than LoadBalancer IPs list
+*/}}
+{{- define "mongodb.validateValues.loadBalancerIPsListLength" -}}
+{{- $replicaCount := int .Values.replicaCount }}
+{{- $loadBalancerListLength := len .Values.externalAccess.service.loadBalancerIPs }}
+{{- if and (eq .Values.architecture "replicaset") .Values.externalAccess.enabled (not .Values.externalAccess.autoDiscovery.enabled ) (eq .Values.externalAccess.service.type "LoadBalancer") (not (eq $replicaCount $loadBalancerListLength )) -}}
+mongodb: .Values.externalAccess.service.loadBalancerIPs
+ Number of replicas and loadBalancerIPs array length must be the same.
+{{- end -}}
+{{- end -}}
+
+{{/*
+Validate values of MongoDB&reg; - number of replicas must be the same than NodePort list
+*/}}
+{{- define "mongodb.validateValues.nodePortListLength" -}}
+{{- $replicaCount := int .Values.replicaCount }}
+{{- $nodePortListLength := len .Values.externalAccess.service.nodePorts }}
+{{- if and (eq .Values.architecture "replicaset") .Values.externalAccess.enabled (eq .Values.externalAccess.service.type "NodePort") (not (eq $replicaCount $nodePortListLength )) -}}
+mongodb: .Values.externalAccess.service.nodePorts
+ Number of replicas and nodePorts array length must be the same.
+{{- end -}}
+{{- end -}}
+
+{{/*
+Validate values of MongoDB&reg; - RBAC should be enabled when autoDiscovery is enabled
+*/}}
+{{- define "mongodb.validateValues.externalAccessAutoDiscoveryRBAC" -}}
+{{- if and (eq .Values.architecture "replicaset") .Values.externalAccess.enabled .Values.externalAccess.autoDiscovery.enabled (not .Values.rbac.create ) }}
+mongodb: rbac.create
+ By specifying "externalAccess.enabled=true" and "externalAccess.autoDiscovery.enabled=true"
+ an initContainer will be used to autodetect the external IPs/ports by querying the
+ K8s API. Please note this initContainer requires specific RBAC resources. You can create them
+ by specifying "--set rbac.create=true".
+{{- end -}}
+{{- end -}}
+
+{{/*
+Validate values of MongoDB&reg; - Number of replicaset secrets must be the same than number of replicaset nodes.
+*/}}
+{{- define "mongodb.validateValues.replicaset.existingSecrets" -}}
+{{- if and .Values.tls.enabled (eq .Values.architecture "replicaset") (not (empty .Values.tls.replicaset.existingSecrets)) }}
+{{- $nbSecrets := len .Values.tls.replicaset.existingSecrets -}}
+{{- if not (eq $nbSecrets (int .Values.replicaCount)) }}
+mongodb: tls.replicaset.existingSecrets
+ tls.replicaset.existingSecrets Number of secrets and number of replicaset nodes must be the same.
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Validate values of MongoDB&reg; - Number of hidden secrets must be the same than number of hidden nodes.
+*/}}
+{{- define "mongodb.validateValues.hidden.existingSecrets" -}}
+{{- if and .Values.tls.enabled (include "mongodb.hidden.enabled" .) (not (empty .Values.tls.hidden.existingSecrets)) }}
+{{- $nbSecrets := len .Values.tls.hidden.existingSecrets -}}
+{{- if not (eq $nbSecrets (int .Values.hidden.replicaCount)) }}
+mongodb: tls.hidden.existingSecrets
+ tls.hidden.existingSecrets Number of secrets and number of hidden nodes must be the same.
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Validate values of MongoDB&reg; exporter URI string - auth.enabled and/or tls.enabled must be enabled or it defaults
+*/}}
+{{- define "mongodb.mongodb_exporter.uri" -}}
+ {{- $tlsEnabled := .Values.tls.enabled -}}
+ {{- $mTlsEnabled := and $tlsEnabled .Values.tls.mTLS.enabled -}}
+ {{- $tlsArgs := "" -}}
+ {{- if $tlsEnabled -}}
+ {{- $tlsCertKeyFile := ternary "&tlsCertificateKeyFile=/certs/mongodb.pem" "" $mTlsEnabled -}}
+ {{- $tlsArgs = printf "tls=true%s&tlsCAFile=/certs/mongodb-ca-cert" $tlsCertKeyFile -}}
+ {{- end -}}
+ {{- if .Values.metrics.username -}}
+ {{- $uriAuth := ternary "$(echo $MONGODB_METRICS_USERNAME | sed -r \"s/@/%40/g;s/:/%3A/g\"):$(echo $MONGODB_METRICS_PASSWORD | sed -r \"s/@/%40/g;s/:/%3A/g\")@" "" .Values.auth.enabled -}}
+ {{- printf "mongodb://%slocalhost:%d/admin?%s" $uriAuth (int .Values.containerPorts.mongodb) $tlsArgs -}}
+ {{- else -}}
+ {{- $uriAuth := ternary "$MONGODB_ROOT_USER:$(echo $MONGODB_ROOT_PASSWORD | sed -r \"s/@/%40/g;s/:/%3A/g\")@" "" .Values.auth.enabled -}}
+ {{- printf "mongodb://%slocalhost:%d/admin?%s" $uriAuth (int .Values.containerPorts.mongodb) $tlsArgs -}}
+ {{- end -}}
+{{- end -}}
+
+{{/*
+Return the appropriate apiGroup for PodSecurityPolicy.
+*/}}
+{{- define "podSecurityPolicy.apiGroup" -}}
+{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
+{{- print "policy" -}}
+{{- else -}}
+{{- print "extensions" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return true if a TLS secret object should be created
+*/}}
+{{- define "mongodb.createTlsSecret" -}}
+{{- if and .Values.tls.enabled (not .Values.tls.existingSecret) (include "mongodb.autoGenerateCerts" .) }}
+ {{- true -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return the secret containing MongoDB&reg; TLS certificates
+*/}}
+{{- define "mongodb.tlsSecretName" -}}
+{{- $secretName := .Values.tls.existingSecret -}}
+{{- if $secretName -}}
+ {{- printf "%s" (tpl $secretName $) -}}
+{{- else -}}
+ {{- printf "%s-ca" (include "mongodb.fullname" .) -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return true if certificates must be auto generated
+*/}}
+{{- define "mongodb.autoGenerateCerts" -}}
+{{- $standalone := (eq .Values.architecture "standalone") | ternary (not .Values.tls.standalone.existingSecret) true -}}
+{{- $replicaset := (eq .Values.architecture "replicaset") | ternary (empty .Values.tls.replicaset.existingSecrets) true -}}
+{{- $arbiter := (eq (include "mongodb.arbiter.enabled" .) "true") | ternary (not .Values.tls.arbiter.existingSecret) true -}}
+{{- $hidden := (eq (include "mongodb.hidden.enabled" .) "true") | ternary (empty .Values.tls.hidden.existingSecrets) true -}}
+{{- if and $standalone $replicaset $arbiter $hidden -}}
+ {{- true -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Generate argument list for mongodb-exporter
+reference: https://github.com/percona/mongodb_exporter/blob/main/REFERENCE.md
+*/}}
+{{- define "mongodb.exporterArgs" -}}
+{{- with .Values.metrics.collector -}}
+{{- ternary " --collect-all" "" .all -}}
+{{- ternary " --collector.diagnosticdata" "" .diagnosticdata -}}
+{{- ternary " --collector.replicasetstatus" "" .replicasetstatus -}}
+{{- ternary " --collector.dbstats" "" .dbstats -}}
+{{- ternary " --collector.topmetrics" "" .topmetrics -}}
+{{- ternary " --collector.indexstats" "" .indexstats -}}
+{{- ternary " --collector.collstats" "" .collstats -}}
+{{- if .collstatsColls -}}
+{{- " --mongodb.collstats-colls=" -}}
+{{- join "," .collstatsColls -}}
+{{- end -}}
+{{- if .indexstatsColls -}}
+{{- " --mongodb.indexstats-colls=" -}}
+{{- join "," .indexstatsColls -}}
+{{- end -}}
+{{- $limitArg := print " --collector.collstats-limit=" .collstatsLimit -}}
+{{- ne (print .collstatsLimit) "0" | ternary $limitArg "" -}}
+{{- end -}}
+{{- ternary " --compatible-mode" "" .Values.metrics.compatibleMode -}}
+{{- end -}}
diff --git a/kubernetes/common/mongodb/templates/arbiter/configmap.yaml b/kubernetes/common/mongodb/templates/arbiter/configmap.yaml
new file mode 100644
index 0000000000..79fbfe5480
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/arbiter/configmap.yaml
@@ -0,0 +1,20 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if (include "mongodb.arbiter.createConfigmap" .) }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ printf "%s-arbiter" (include "mongodb.fullname" .) }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: arbiter
+ {{- if .Values.commonAnnotations }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+data:
+ mongodb.conf: |-
+ {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.configuration "context" $) | nindent 4 }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/arbiter/headless-svc.yaml b/kubernetes/common/mongodb/templates/arbiter/headless-svc.yaml
new file mode 100644
index 0000000000..003bebb2ad
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/arbiter/headless-svc.yaml
@@ -0,0 +1,31 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if (include "mongodb.arbiter.enabled" .) }}
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ include "mongodb.arbiter.service.nameOverride" . }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: arbiter
+ {{- if or .Values.arbiter.service.headless.annotations .Values.commonAnnotations }}
+ {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.arbiter.service.headless.annotations .Values.commonAnnotations ) "context" . ) }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }}
+ {{- end }}
+spec:
+ type: ClusterIP
+ clusterIP: None
+ ports:
+ - name: tcp-mongodb
+ port: {{ .Values.arbiter.service.ports.mongodb }}
+ targetPort: mongodb
+ {{- if .Values.arbiter.service.extraPorts }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.service.extraPorts "context" $) | nindent 4 }}
+ {{- end }}
+ {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.arbiter.podLabels .Values.commonLabels ) "context" . ) }}
+ selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: arbiter
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/arbiter/pdb.yaml b/kubernetes/common/mongodb/templates/arbiter/pdb.yaml
new file mode 100644
index 0000000000..37b5c198af
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/arbiter/pdb.yaml
@@ -0,0 +1,28 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if and (include "mongodb.arbiter.enabled" .) .Values.arbiter.pdb.create }}
+apiVersion: {{ include "common.capabilities.policy.apiVersion" . }}
+kind: PodDisruptionBudget
+metadata:
+ name: {{ printf "%s-arbiter" (include "mongodb.fullname" .) }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: arbiter
+ {{- if .Values.commonAnnotations }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+spec:
+ {{- if .Values.arbiter.pdb.minAvailable }}
+ minAvailable: {{ .Values.arbiter.pdb.minAvailable }}
+ {{- end }}
+ {{- if .Values.arbiter.pdb.maxUnavailable }}
+ maxUnavailable: {{ .Values.arbiter.pdb.maxUnavailable }}
+ {{- end }}
+ {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.arbiter.podLabels .Values.commonLabels ) "context" . ) }}
+ selector:
+ matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }}
+ app.kubernetes.io/component: arbiter
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/arbiter/statefulset.yaml b/kubernetes/common/mongodb/templates/arbiter/statefulset.yaml
new file mode 100644
index 0000000000..269863f3ec
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/arbiter/statefulset.yaml
@@ -0,0 +1,310 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if (include "mongodb.arbiter.enabled" .) }}
+apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }}
+kind: StatefulSet
+metadata:
+ name: {{ printf "%s-arbiter" (include "mongodb.fullname" .) }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.arbiter.labels .Values.commonLabels ) "context" . ) }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: arbiter
+ {{- if or .Values.arbiter.annotations .Values.commonAnnotations }}
+ {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.arbiter.annotations .Values.commonAnnotations ) "context" . ) }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }}
+ {{- end }}
+spec:
+ serviceName: {{ include "mongodb.arbiter.service.nameOverride" . }}
+ podManagementPolicy: {{ .Values.arbiter.podManagementPolicy }}
+ {{- if .Values.arbiter.updateStrategy }}
+ updateStrategy: {{- toYaml .Values.arbiter.updateStrategy | nindent 4 }}
+ {{- end }}
+ {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.arbiter.podLabels .Values.commonLabels ) "context" . ) }}
+ selector:
+ matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }}
+ app.kubernetes.io/component: arbiter
+ template:
+ metadata:
+ labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }}
+ app.kubernetes.io/component: arbiter
+ {{- if or (include "mongodb.arbiter.createConfigmap" .) .Values.arbiter.podAnnotations }}
+ annotations:
+ {{- if (include "mongodb.arbiter.createConfigmap" .) }}
+ checksum/configuration: {{ include (print $.Template.BasePath "/arbiter/configmap.yaml") . | sha256sum }}
+ {{- end }}
+ {{- if .Values.arbiter.podAnnotations }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.podAnnotations "context" $) | nindent 8 }}
+ {{- end }}
+ {{- end }}
+ spec:
+ {{- include "mongodb.imagePullSecrets" . | nindent 6 }}
+ {{- if .Values.arbiter.schedulerName }}
+ schedulerName: {{ .Values.arbiter.schedulerName | quote }}
+ {{- end }}
+ serviceAccountName: {{ template "mongodb.serviceAccountName" . }}
+ {{- if .Values.arbiter.affinity }}
+ affinity: {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.affinity "context" $) | nindent 8 }}
+ {{- else }}
+ affinity:
+ podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.arbiter.podAffinityPreset "component" "arbiter" "customLabels" $podLabels "topologyKey" .Values.topologyKey "context" $) | nindent 10 }}
+ podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.arbiter.podAntiAffinityPreset "component" "arbiter" "customLabels" $podLabels "topologyKey" .Values.topologyKey "context" $) | nindent 10 }}
+ nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.arbiter.nodeAffinityPreset.type "key" .Values.arbiter.nodeAffinityPreset.key "values" .Values.arbiter.nodeAffinityPreset.values) | nindent 10 }}
+ {{- end }}
+ {{- if .Values.arbiter.nodeSelector }}
+ nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.nodeSelector "context" $) | nindent 8 }}
+ {{- end }}
+ automountServiceAccountToken: {{ .Values.arbiter.automountServiceAccountToken }}
+ {{- if .Values.arbiter.hostAliases }}
+ hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.hostAliases "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.arbiter.tolerations }}
+ tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.tolerations "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.arbiter.topologySpreadConstraints }}
+ topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.topologySpreadConstraints "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.arbiter.priorityClassName }}
+ priorityClassName: {{ .Values.arbiter.priorityClassName }}
+ {{- end }}
+ {{- if .Values.arbiter.runtimeClassName }}
+ runtimeClassName: {{ .Values.arbiter.runtimeClassName }}
+ {{- end }}
+ {{- if .Values.arbiter.podSecurityContext.enabled }}
+ securityContext: {{- omit .Values.arbiter.podSecurityContext "enabled" | toYaml | nindent 8 }}
+ {{- end }}
+ {{ if .Values.arbiter.terminationGracePeriodSeconds }}
+ terminationGracePeriodSeconds: {{ .Values.arbiter.terminationGracePeriodSeconds }}
+ {{- end }}
+ enableServiceLinks: {{ .Values.enableServiceLinks }}
+ initContainers:
+ {{- if .Values.arbiter.initContainers }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.initContainers "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if and .Values.tls.enabled .Values.arbiter.enabled }}
+ - name: generate-tls-certs
+ image: {{ include "mongodb.tls.image" . }}
+ imagePullPolicy: {{ .Values.tls.image.pullPolicy | quote }}
+ env:
+ - name: MY_POD_NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ - name: MY_POD_HOST_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.hostIP
+ - name: MY_POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ volumeMounts:
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ {{- if (include "mongodb.autoGenerateCerts" .) }}
+ - name: certs-volume
+ mountPath: /certs/CAs
+ {{- else }}
+ - name: mongodb-certs-0
+ mountPath: /certs-0
+ {{- end }}
+ - name: certs
+ mountPath: /certs
+ - name: common-scripts
+ mountPath: /bitnami/scripts
+ command:
+ - /bitnami/scripts/generate-certs.sh
+ args:
+ - -s {{ include "mongodb.arbiter.service.nameOverride" . }}
+ {{- end }}
+ containers:
+ - name: mongodb-arbiter
+ image: {{ include "mongodb.image" . }}
+ imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
+ {{- if .Values.arbiter.containerSecurityContext.enabled }}
+ securityContext: {{- omit .Values.arbiter.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+ {{- end }}
+ {{- if .Values.diagnosticMode.enabled }}
+ command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+ {{- else if .Values.arbiter.command }}
+ command: {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.command "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if .Values.diagnosticMode.enabled }}
+ args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+ {{- else if .Values.arbiter.args }}
+ args: {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.args "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if .Values.arbiter.lifecycleHooks }}
+ lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.lifecycleHooks "context" $) | nindent 12 }}
+ {{- end }}
+ env:
+ - name: BITNAMI_DEBUG
+ value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }}
+ - name: MY_POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ - name: MY_POD_NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ - name: K8S_SERVICE_NAME
+ value: "{{ include "mongodb.arbiter.service.nameOverride" . }}"
+ - name: MONGODB_REPLICA_SET_MODE
+ value: "arbiter"
+ - name: MONGODB_INITIAL_PRIMARY_HOST
+ value: {{ printf "%s-0.%s.$(MY_POD_NAMESPACE).svc.%s" (include "mongodb.fullname" .) (include "mongodb.service.nameOverride" .) .Values.clusterDomain }}
+ - name: MONGODB_REPLICA_SET_NAME
+ value: {{ .Values.replicaSetName | quote }}
+ - name: MONGODB_ADVERTISED_HOSTNAME
+ value: "$(MY_POD_NAME).$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.{{ .Values.clusterDomain }}"
+ - name: MONGODB_PORT_NUMBER
+ value: {{ .Values.arbiter.containerPorts.mongodb | quote }}
+ - name: MONGODB_ENABLE_IPV6
+ value: {{ ternary "yes" "no" .Values.enableIPv6 | quote }}
+ {{- if .Values.auth.enabled }}
+ - name: MONGODB_INITIAL_PRIMARY_ROOT_USER
+ value: {{ .Values.auth.rootUser | quote }}
+ - name: MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-root-password
+ - name: MONGODB_REPLICA_SET_KEY
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-replica-set-key
+ {{- end }}
+ - name: ALLOW_EMPTY_PASSWORD
+ value: {{ ternary "no" "yes" .Values.auth.enabled | quote }}
+ {{- $extraFlags := .Values.arbiter.extraFlags | join " " -}}
+ {{- if and .Values.tls.enabled .Values.arbiter.enabled }}
+ {{- if .Values.tls.mTLS.enabled }}
+ {{- $extraFlags = printf "--tlsCAFile=/certs/mongodb-ca-cert %s" $extraFlags }}
+ {{- end }}
+ {{- $extraFlags = printf "--tlsMode=%s --tlsCertificateKeyFile=/certs/mongodb.pem %s" .Values.tls.mode $extraFlags }}
+ {{- end }}
+ {{- if ne $extraFlags "" }}
+ - name: MONGODB_EXTRA_FLAGS
+ value: {{ $extraFlags | quote }}
+ {{- end }}
+ {{- if and .Values.tls.enabled .Values.arbiter.enabled }}
+ - name: MONGODB_CLIENT_EXTRA_FLAGS
+ value: --tls {{ if .Values.tls.mTLS.enabled }}--tlsCertificateKeyFile=/certs/mongodb.pem {{ end }}--tlsCAFile=/certs/mongodb-ca-cert
+ {{- end }}
+ {{- if .Values.arbiter.extraEnvVars }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.extraEnvVars "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if or .Values.arbiter.extraEnvVarsCM .Values.arbiter.extraEnvVarsSecret }}
+ envFrom:
+ {{- if .Values.arbiter.extraEnvVarsCM }}
+ - configMapRef:
+ name: {{ tpl .Values.arbiter.extraEnvVarsCM . | quote }}
+ {{- end }}
+ {{- if .Values.arbiter.extraEnvVarsSecret }}
+ - secretRef:
+ name: {{ tpl .Values.arbiter.extraEnvVarsSecret . | quote }}
+ {{- end }}
+ {{- end }}
+ ports:
+ - containerPort: {{ .Values.arbiter.containerPorts.mongodb }}
+ name: mongodb
+ {{- if not .Values.diagnosticMode.enabled }}
+ {{- if .Values.arbiter.customLivenessProbe }}
+ livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.customLivenessProbe "context" $) | nindent 12 }}
+ {{- else if .Values.arbiter.livenessProbe.enabled }}
+ livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.arbiter.livenessProbe "enabled") "context" $) | nindent 12 }}
+ tcpSocket:
+ port: mongodb
+ {{- end }}
+ {{- if .Values.arbiter.customReadinessProbe }}
+ readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.customReadinessProbe "context" $) | nindent 12 }}
+ {{- else if .Values.arbiter.readinessProbe.enabled }}
+ readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.arbiter.readinessProbe "enabled") "context" $) | nindent 12 }}
+ tcpSocket:
+ port: mongodb
+ {{- end }}
+ {{- if .Values.arbiter.customStartupProbe }}
+ startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.customStartupProbe "context" $) | nindent 12 }}
+ {{- else if .Values.arbiter.startupProbe.enabled }}
+ startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.arbiter.startupProbe "enabled") "context" $) | nindent 12 }}
+ tcpSocket:
+ port: mongodb
+ {{- end }}
+ {{- end }}
+ {{- if .Values.arbiter.resources }}
+ resources: {{- toYaml .Values.arbiter.resources | nindent 12 }}
+ {{- else if ne .Values.arbiter.resourcesPreset "none" }}
+ resources: {{- include "common.resources.preset" (dict "type" .Values.arbiter.resourcesPreset) | nindent 12 }}
+ {{- end }}
+ volumeMounts:
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ - name: empty-dir
+ mountPath: /opt/bitnami/mongodb/conf
+ subPath: app-conf-dir
+ - name: empty-dir
+ mountPath: /opt/bitnami/mongodb/tmp
+ subPath: app-tmp-dir
+ - name: empty-dir
+ mountPath: /opt/bitnami/mongodb/logs
+ subPath: app-logs-dir
+ {{- if or .Values.arbiter.configuration .Values.arbiter.existingConfigmap }}
+ - name: config
+ mountPath: /opt/bitnami/mongodb/conf/mongodb.conf
+ subPath: mongodb.conf
+ {{- end }}
+ {{- if and .Values.tls.enabled .Values.arbiter.enabled }}
+ - name: certs
+ mountPath: /certs
+ {{- end }}
+ {{- if .Values.arbiter.extraVolumeMounts }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.extraVolumeMounts "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if .Values.arbiter.sidecars }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.sidecars "context" $) | nindent 8 }}
+ {{- end }}
+ volumes:
+ - name: empty-dir
+ emptyDir: {}
+ {{- if or .Values.arbiter.configuration .Values.arbiter.existingConfigmap .Values.arbiter.extraVolumes .Values.tls.enabled }}
+ - name: common-scripts
+ configMap:
+ name: {{ printf "%s-common-scripts" (include "mongodb.fullname" .) }}
+ defaultMode: 0555
+ {{- if or .Values.arbiter.configuration .Values.arbiter.existingConfigmap }}
+ - name: config
+ configMap:
+ name: {{ include "mongodb.arbiter.configmapName" . }}
+ {{- end }}
+ {{- if and .Values.tls.enabled .Values.arbiter.enabled }}
+ - name: certs
+ emptyDir: {}
+ {{- if (include "mongodb.autoGenerateCerts" .) }}
+ - name: certs-volume
+ secret:
+ secretName: {{ template "mongodb.tlsSecretName" . }}
+ items:
+ - key: mongodb-ca-cert
+ path: mongodb-ca-cert
+ mode: 0600
+ - key: mongodb-ca-key
+ path: mongodb-ca-key
+ mode: 0600
+ {{- else }}
+ - name: mongodb-certs-0
+ secret:
+ secretName: {{ include "common.tplvalues.render" ( dict "value" .Values.tls.arbiter.existingSecret "context" $) }}
+ defaultMode: 256
+ {{- end }}
+ {{- end }}
+ {{- if .Values.arbiter.extraVolumes }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.arbiter.extraVolumes "context" $) | nindent 8 }}
+ {{- end }}
+ {{- end }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/backup/cronjob.yaml b/kubernetes/common/mongodb/templates/backup/cronjob.yaml
new file mode 100644
index 0000000000..79466e919e
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/backup/cronjob.yaml
@@ -0,0 +1,204 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if .Values.backup.enabled }}
+apiVersion: batch/v1
+kind: CronJob
+metadata:
+ name: {{ include "mongodb.fullname" . }}-mongodump
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" . | nindent 4 }}
+ app.kubernetes.io/component: mongodump
+ {{- if .Values.backup.cronjob.labels }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.backup.cronjob.labels "context" $) | nindent 4 }}
+ {{- end }}
+ {{- if .Values.commonLabels }}
+ {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+ {{- end }}
+ {{- if or .Values.backup.cronjob.annotations .Values.commonAnnotations }}
+ annotations:
+ {{- if .Values.backup.cronjob.annotations }}
+ {{- include "common.tplvalues.render" ( dict "value" .Values.backup.cronjob.annotations "context" $) | nindent 4 }}
+ {{- end }}
+ {{- if .Values.commonAnnotations }}
+ {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+ {{- end }}
+spec:
+ schedule: {{ quote .Values.backup.cronjob.schedule }}
+ concurrencyPolicy: {{ .Values.backup.cronjob.concurrencyPolicy }}
+ failedJobsHistoryLimit: {{ .Values.backup.cronjob.failedJobsHistoryLimit }}
+ successfulJobsHistoryLimit: {{ .Values.backup.cronjob.successfulJobsHistoryLimit }}
+ {{- if .Values.backup.cronjob.startingDeadlineSeconds }}
+ startingDeadlineSeconds: {{ .Values.backup.cronjob.startingDeadlineSeconds }}
+ {{- end }}
+ jobTemplate:
+ spec:
+ {{- if .Values.backup.cronjob.ttlSecondsAfterFinished }}
+ ttlSecondsAfterFinished: {{ .Values.backup.cronjob.ttlSecondsAfterFinished }}
+ {{- end }}
+ template:
+ metadata:
+ labels: {{- include "common.labels.standard" . | nindent 12 }}
+ app.kubernetes.io/component: mongodump
+ {{- if .Values.backup.cronjob.labels }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.backup.cronjob.labels "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if .Values.commonLabels }}
+ {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 12 }}
+ {{- end }}
+ {{- if or .Values.backup.cronjob.annotations .Values.commonAnnotations }}
+ annotations:
+ {{- if .Values.backup.cronjob.annotations }}
+ {{- include "common.tplvalues.render" ( dict "value" .Values.backup.cronjob.annotations "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if .Values.commonAnnotations }}
+ {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 12 }}
+ {{- end }}
+ {{- end }}
+ spec:
+ {{- include "mongodb.imagePullSecrets" . | nindent 10 }}
+ {{- if .Values.podSecurityContext.enabled }}
+ securityContext: {{- omit .Values.podSecurityContext "enabled" | toYaml | nindent 12 }}
+ {{- end }}
+ enableServiceLinks: {{ .Values.enableServiceLinks }}
+ {{- if .Values.tls.enabled }}
+ initContainers:
+ - name: generate-tls-certs
+ image: {{ include "mongodb.tls.image" . }}
+ imagePullPolicy: {{ .Values.tls.image.pullPolicy | quote }}
+ env:
+ - name: MY_POD_NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ - name: MY_POD_HOST_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.hostIP
+ volumeMounts:
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ {{- if (include "mongodb.autoGenerateCerts" .) }}
+ - name: certs-volume
+ mountPath: /certs/CAs
+ {{- else }}
+ - name: mongodb-certs-0
+ mountPath: /certs-0
+ {{- end }}
+ - name: certs
+ mountPath: /certs
+ - name: common-scripts
+ mountPath: /bitnami/scripts
+ command:
+ - /bitnami/scripts/generate-certs.sh
+ args:
+ - -s {{ include "mongodb.service.nameOverride" . }}
+ {{- if .Values.externalAccess.service.loadBalancerIPs }}
+ - -i {{ join "," .Values.externalAccess.service.loadBalancerIPs }}
+ {{- end }}
+ {{- if .Values.tls.extraDnsNames }}
+ - -n {{ join "," .Values.tls.extraDnsNames }}
+ {{- end }}
+ {{- if .Values.tls.resources }}
+ resources: {{- toYaml .Values.tls.resources | nindent 16 }}
+ {{- else if ne .Values.tls.resourcesPreset "none" }}
+ resources: {{- include "common.resources.preset" (dict "type" .Values.tls.resourcesPreset) | nindent 16 }}
+ {{- end }}
+ {{- end }}
+ containers:
+ - name: {{ include "mongodb.fullname" . }}-mongodump
+ image: {{ include "mongodb.image" . }}
+ imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
+ env:
+ {{- if .Values.auth.enabled }}
+ - name: MONGODB_ROOT_USER
+ value: {{ .Values.auth.rootUser | quote }}
+ - name: MONGODB_ROOT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-root-password
+ {{- end }}
+ - name: MONGODB_SERVICE_NAME
+ value: {{ include "mongodb.service.nameOverride" . }}
+ - name: MONGODB_PORT_NUMBER
+ value: {{ .Values.containerPorts.mongodb | quote }}
+ - name: MONGODUMP_DIR
+ value: {{ .Values.backup.cronjob.storage.mountPath }}
+ {{- if .Values.tls.enabled }}
+ - name: MONGODB_CLIENT_EXTRA_FLAGS
+ value: --ssl --sslPEMKeyFile=/certs/mongodb.pem --sslCAFile=/certs/mongodb-ca-cert
+ {{- end }}
+ {{- if .Values.backup.cronjob.command }}
+ command: {{- include "common.tplvalues.render" (dict "value" .Values.backup.cronjob.command "context" $) | nindent 14 }}
+ {{- else }}
+ command:
+ - /bin/sh
+ - -c
+ - "mongodump {{- if .Values.auth.enabled }} --username=${MONGODB_ROOT_USER} --password=${MONGODB_ROOT_PASSWORD} --authenticationDatabase=admin {{- end }} --host=${MONGODB_SERVICE_NAME} --port=${MONGODB_PORT_NUMBER} ${MONGODB_CLIENT_EXTRA_FLAGS} {{- if (eq $.Values.architecture "replicaset") }}--oplog{{- end }} --gzip --archive=${MONGODUMP_DIR}/mongodump-$(date '+%Y-%m-%d-%H-%M').gz"
+ {{- end }}
+ volumeMounts:
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ {{- if .Values.tls.enabled }}
+ - name: certs
+ mountPath: /certs
+ {{- if (include "mongodb.autoGenerateCerts" .) }}
+ - name: certs-volume
+ mountPath: /certs/CAs
+ {{- else }}
+ - name: mongodb-certs-0
+ mountPath: /certs-0
+ {{- end }}
+ {{- end }}
+ - name: datadir
+ mountPath: {{ .Values.backup.cronjob.storage.mountPath }}
+ subPath: {{ .Values.backup.cronjob.storage.subPath }}
+ {{- if .Values.backup.cronjob.containerSecurityContext.enabled }}
+ securityContext:
+ {{- include "common.tplvalues.render" ( dict "value" ( omit .Values.backup.cronjob.containerSecurityContext "enabled" ) "context" $) | nindent 14 }}
+ {{- end }}
+ restartPolicy: {{ .Values.backup.cronjob.restartPolicy }}
+ volumes:
+ - name: empty-dir
+ emptyDir: {}
+ - name: common-scripts
+ configMap:
+ name: {{ printf "%s-common-scripts" (include "mongodb.fullname" .) }}
+ defaultMode: 0550
+ {{- if .Values.tls.enabled }}
+ - name: certs
+ emptyDir: {}
+ {{- if (include "mongodb.autoGenerateCerts" .) }}
+ - name: certs-volume
+ secret:
+ secretName: {{ template "mongodb.tlsSecretName" . }}
+ items:
+ - key: mongodb-ca-cert
+ path: mongodb-ca-cert
+ mode: 0600
+ - key: mongodb-ca-key
+ path: mongodb-ca-key
+ mode: 0600
+ {{- else }}
+ - name: mongodb-certs-0
+ secret:
+ secretName: {{ include "common.tplvalues.render" ( dict "value" .Values.tls.standalone.existingSecret "context" $) }}
+ defaultMode: 256
+ {{- end }}
+ {{- end }}
+ {{- if .Values.backup.cronjob.storage.existingClaim }}
+ - name: datadir
+ persistentVolumeClaim:
+ claimName: {{ printf "%s" (tpl .Values.backup.cronjob.storage.existingClaim .) }}
+ {{- else }}
+ - name: datadir
+ persistentVolumeClaim:
+ claimName: {{ include "mongodb.fullname" . }}-mongodump
+ {{- end }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/backup/pvc.yaml b/kubernetes/common/mongodb/templates/backup/pvc.yaml
new file mode 100644
index 0000000000..caefc05f30
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/backup/pvc.yaml
@@ -0,0 +1,41 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if and .Values.backup.enabled (not .Values.backup.cronjob.storage.existingClaim) -}}
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: {{ include "mongodb.fullname" . }}-mongodump
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" . | nindent 4 }}
+ app.kubernetes.io/component: mongodump
+ {{- if .Values.backup.cronjob.labels }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.backup.cronjob.labels "context" $) | nindent 4 }}
+ {{- end }}
+ {{- if .Values.commonLabels }}
+ {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+ {{- end }}
+ {{- if or .Values.backup.cronjob.annotations .Values.commonAnnotations .Values.backup.cronjob.storage.resourcePolicy}}
+ annotations:
+ {{- if .Values.backup.cronjob.annotations }}
+ {{- include "common.tplvalues.render" ( dict "value" .Values.backup.cronjob.annotations "context" $) | nindent 4 }}
+ {{- end }}
+ {{- if .Values.commonAnnotations }}
+ {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+ {{- if .Values.backup.cronjob.storage.resourcePolicy }}
+ helm.sh/resource-policy: {{ .Values.backup.cronjob.storage.resourcePolicy | quote }}
+ {{- end }}
+ {{- end }}
+spec:
+ accessModes:
+ {{- range .Values.backup.cronjob.storage.accessModes }}
+ - {{ . | quote }}
+ {{- end }}
+ resources:
+ requests:
+ storage: {{ .Values.backup.cronjob.storage.size | quote }}
+ {{ include "common.storage.class" (dict "persistence" .Values.backup.cronjob.storage "global" .Values.global) | nindent 2 }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/common-scripts-cm.yaml b/kubernetes/common/mongodb/templates/common-scripts-cm.yaml
new file mode 100644
index 0000000000..bf5feadbf8
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/common-scripts-cm.yaml
@@ -0,0 +1,146 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ printf "%s-common-scripts" (include "mongodb.fullname" .) }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+ {{- if .Values.commonAnnotations }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+data:
+ {{- $fullname := include "mongodb.fullname" . }}
+ startup-probe.sh: |
+ #!/bin/bash
+ {{- if .Values.tls.enabled }}
+ # Probes are using localhost/127.0.0.1 to tests if the service is up, ready or healthy. If TLS is enabled, we shouldn't validate the certificate hostname.
+ TLS_OPTIONS='--tls {{ if .Values.tls.mTLS.enabled }}--tlsCertificateKeyFile=/certs/mongodb.pem {{ end }}--tlsCAFile=/certs/mongodb-ca-cert--tlsAllowInvalidHostnames'
+ {{- end }}
+ exec mongosh $TLS_OPTIONS --port $MONGODB_PORT_NUMBER --eval 'if (!(db.hello().isWritablePrimary || db.hello().secondary)) { throw new Error("Not ready") }'
+ readiness-probe.sh: |
+ #!/bin/bash
+ {{- if .Values.tls.enabled }}
+ # Probes are using localhost/127.0.0.1 to tests if the service is up, ready or healthy. If TLS is enabled, we shouldn't validate the certificate hostname.
+ TLS_OPTIONS='--tls {{ if .Values.tls.mTLS.enabled }}--tlsCertificateKeyFile=/certs/mongodb.pem {{ end }}--tlsCAFile=/certs/mongodb-ca-cert --tlsAllowInvalidHostnames'
+ {{- end }}
+ # Run the proper check depending on the version
+ [[ $(mongod -version | grep "db version") =~ ([0-9]+\.[0-9]+\.[0-9]+) ]] && VERSION=${BASH_REMATCH[1]}
+ . /opt/bitnami/scripts/libversion.sh
+ VERSION_MAJOR="$(get_sematic_version "$VERSION" 1)"
+ VERSION_MINOR="$(get_sematic_version "$VERSION" 2)"
+ VERSION_PATCH="$(get_sematic_version "$VERSION" 3)"
+ readiness_test='db.isMaster().ismaster || db.isMaster().secondary'
+ if [[ ( "$VERSION_MAJOR" -ge 5 ) || ( "$VERSION_MAJOR" -ge 4 && "$VERSION_MINOR" -ge 4 && "$VERSION_PATCH" -ge 2 ) ]]; then
+ readiness_test='db.hello().isWritablePrimary || db.hello().secondary'
+ fi
+ exec mongosh $TLS_OPTIONS --port $MONGODB_PORT_NUMBER --eval "if (!(${readiness_test})) { throw new Error(\"Not ready\") }"
+ ping-mongodb.sh: |
+ #!/bin/bash
+ {{- if .Values.tls.enabled }}
+ # Probes are using localhost/127.0.0.1 to tests if the service is up, ready or healthy. If TLS is enabled, we shouldn't validate the certificate hostname.
+ TLS_OPTIONS='--tls {{ if .Values.tls.mTLS.enabled }}--tlsCertificateKeyFile=/certs/mongodb.pem {{ end }}--tlsCAFile=/certs/mongodb-ca-cert --tlsAllowInvalidHostnames'
+ {{- end }}
+ exec mongosh $TLS_OPTIONS --port $MONGODB_PORT_NUMBER --eval "db.adminCommand('ping')"
+ {{- if .Values.tls.enabled }}
+ generate-certs.sh: |
+ #!/bin/bash
+ {{- if (include "mongodb.autoGenerateCerts" .) }}
+ additional_ips=()
+ additional_names=()
+ while getopts "i:n:s:" flag
+ do
+ case "${flag}" in
+ i) read -a additional_ips <<< ${OPTARG//,/ } ;;
+ n) read -a additional_names <<< ${OPTARG//,/ } ;;
+ s) svc=${OPTARG// /} ;;
+ \?) exit 1 ;;
+ esac
+ done
+
+ my_hostname=$(hostname)
+ cp /certs/CAs/* /certs/
+ cat >/certs/openssl.cnf <<EOL
+ [req]
+ req_extensions = v3_req
+ distinguished_name = req_distinguished_name
+ [req_distinguished_name]
+ [ v3_req ]
+ basicConstraints = CA:FALSE
+ keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+ subjectAltName = @alt_names
+ [alt_names]
+ DNS.1 = $svc
+ DNS.2 = $my_hostname
+ {{- if eq .Values.architecture "replicaset" }}
+ DNS.3 = $my_hostname.$svc.$MY_POD_NAMESPACE.svc.{{ .Values.clusterDomain }}
+ {{- else }}
+ DNS.3 = $svc.$MY_POD_NAMESPACE.svc.{{ .Values.clusterDomain }}
+ {{- end }}
+ DNS.4 = localhost
+ IP.0 = ${MY_POD_HOST_IP}
+ IP.1 = 127.0.0.1
+ EOL
+ index=2
+ for ip in "${additional_ips[@]}"; do
+ cat >>/certs/openssl.cnf <<EOL
+ IP.$index = $ip
+ EOL
+ ((index++))
+ done;
+ index=5
+ for name in "${additional_names[@]}"; do
+ cat >>/certs/openssl.cnf <<EOL
+ DNS.$index = $(eval echo "${name}")
+ EOL
+ ((index++))
+ done;
+
+ export RANDFILE=/certs/.rnd && openssl genrsa -out /certs/mongo.key 2048
+ #Create the client/server cert
+ openssl req -new -key /certs/mongo.key -out /certs/mongo.csr -subj "/C=US/O=My Organisations/OU=IT/CN=$my_hostname" -config /certs/openssl.cnf
+ #Signing the server cert with the CA cert and key
+ openssl x509 -req -in /certs/mongo.csr -CA /certs/mongodb-ca-cert -CAkey /certs/mongodb-ca-key -CAcreateserial -out /certs/mongo.crt -days 3650 -extensions v3_req -extfile /certs/openssl.cnf
+ rm /certs/mongo.csr
+ #Concatenate to a pem file for use as the client PEM file which can be used for both member and client authentication.
+ cat /certs/mongo.crt /certs/mongo.key > /certs/mongodb.pem
+ cd /certs/
+ shopt -s extglob
+ rm -rf !(mongodb-ca-cert|mongodb.pem|CAs|openssl.cnf)
+ chmod 0600 mongodb-ca-cert mongodb.pem
+ {{- else }}
+ {{- if eq .Values.architecture "standalone" }}
+ ID="0"
+ {{- else }}
+ if [[ "$MY_POD_NAME" =~ "arbiter-0"$ ]]; then
+ ID="0"
+ elif [[ "$MY_POD_NAME" =~ "hidden-"[0-9]{1,}$ ]]; then
+ ID="${MY_POD_NAME#"{{ printf "%s-hidden-" $fullname }}"}"
+ else
+ ID="${MY_POD_NAME#"{{ $fullname }}-"}"
+ fi
+ {{- end }}
+
+ {{- if .Values.tls.pemChainIncluded }}
+ #Split the pem chain by the END CERTIFICATE string and store in files /certs/xx00, /certs/xx01 etc.
+ cat /certs-${ID}/tls.crt | csplit - -s -z '/\-*END CERTIFICATE\-*/+1' '{*}' -f /certs/xx
+
+ #Use first certificate as leaf node and combine with key to store in pem file
+ cat "/certs/xx00" "/certs-${ID}/tls.key" > "/certs/mongodb.pem"
+
+ #Use remaining intermediate certificates for ca.crt
+ echo $(find /certs/ -not -name 'xx00' -name 'xx*') | sort | xargs cat > "/certs/mongodb-ca-cert"
+
+ rm -rf /certs/xx*
+ {{- else }}
+ cat "/certs-${ID}/tls.crt" "/certs-${ID}/tls.key" > "/certs/mongodb.pem"
+ cp "/certs-${ID}/ca.crt" "/certs/mongodb-ca-cert"
+ {{- end }}
+
+ chmod 0600 /certs/mongodb-ca-cert /certs/mongodb.pem
+ {{- end }}
+ {{- end }}
diff --git a/kubernetes/common/mongodb/templates/configmap.yaml b/kubernetes/common/mongodb/templates/configmap.yaml
new file mode 100644
index 0000000000..7d11e087ff
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/configmap.yaml
@@ -0,0 +1,20 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if (include "mongodb.createConfigmap" .) }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ include "mongodb.fullname" . }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+ {{- if .Values.commonAnnotations }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+data:
+ mongodb.conf: |-
+ {{- include "common.tplvalues.render" (dict "value" .Values.configuration "context" $) | nindent 4 }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/extra-list.yaml b/kubernetes/common/mongodb/templates/extra-list.yaml
new file mode 100644
index 0000000000..2d35a580e8
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/extra-list.yaml
@@ -0,0 +1,9 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- range .Values.extraDeploy }}
+---
+{{ include "common.tplvalues.render" (dict "value" . "context" $) }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/hidden/configmap.yaml b/kubernetes/common/mongodb/templates/hidden/configmap.yaml
new file mode 100644
index 0000000000..a83087367e
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/hidden/configmap.yaml
@@ -0,0 +1,20 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if (include "mongodb.hidden.createConfigmap" .) }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ printf "%s-hidden" (include "mongodb.fullname" .) }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: hidden
+ {{- if .Values.commonAnnotations }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+data:
+ mongodb.conf: |-
+ {{- include "common.tplvalues.render" (dict "value" .Values.hidden.configuration "context" $) | nindent 4 }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/hidden/external-access-svc.yaml b/kubernetes/common/mongodb/templates/hidden/external-access-svc.yaml
new file mode 100644
index 0000000000..6cbbb40bfc
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/hidden/external-access-svc.yaml
@@ -0,0 +1,69 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if and (include "mongodb.hidden.enabled" .) .Values.externalAccess.hidden.enabled }}
+{{- $fullName := include "mongodb.fullname" . }}
+{{- $replicaCount := .Values.hidden.replicaCount | int }}
+{{- $root := . }}
+
+{{- range $i, $e := until $replicaCount }}
+{{- $targetPod := printf "%s-hidden-%d" (printf "%s" $fullName) $i }}
+{{- $_ := set $ "targetPod" $targetPod }}
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ printf "%s-hidden-%d-external" $fullName $i }}
+ namespace: {{ include "mongodb.namespace" $ }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" $root.Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: hidden
+ pod: {{ $targetPod }}
+ {{- if or $root.Values.externalAccess.hidden.service.annotations $root.Values.commonAnnotations }}
+ {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list $root.Values.externalAccess.hidden.service.annotations $root.Values.commonAnnotations ) "context" $ ) }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }}
+ {{- end }}
+spec:
+ type: {{ $root.Values.externalAccess.hidden.service.type }}
+ {{- if eq $root.Values.externalAccess.hidden.service.type "LoadBalancer" }}
+ {{- if not (empty $root.Values.externalAccess.hidden.service.loadBalancerIPs) }}
+ loadBalancerIP: {{ index $root.Values.externalAccess.hidden.service.loadBalancerIPs $i }}
+ {{- end }}
+ {{- if $root.Values.externalAccess.hidden.service.loadBalancerClass }}
+ loadBalancerClass: {{ $root.Values.externalAccess.hidden.service.loadBalancerClass }}
+ {{- end }}
+ {{- if $root.Values.externalAccess.hidden.service.loadBalancerSourceRanges }}
+ loadBalancerSourceRanges: {{- toYaml $root.Values.externalAccess.hidden.service.loadBalancerSourceRanges | nindent 4 }}
+ {{- end }}
+ allocateLoadBalancerNodePorts: {{ $root.Values.externalAccess.hidden.service.allocateLoadBalancerNodePorts }}
+ {{- end }}
+ {{- if (or (eq $root.Values.externalAccess.hidden.service.type "LoadBalancer") (eq $root.Values.externalAccess.hidden.service.type "NodePort")) }}
+ externalTrafficPolicy: {{ $root.Values.externalAccess.hidden.service.externalTrafficPolicy | quote }}
+ {{- end }}
+ {{- if $root.Values.externalAccess.hidden.service.sessionAffinity }}
+ sessionAffinity: {{ $root.Values.externalAccess.hidden.service.sessionAffinity }}
+ {{- end }}
+ {{- if $root.Values.externalAccess.hidden.service.sessionAffinityConfig }}
+ sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" $root.Values.externalAccess.hidden.service.sessionAffinityConfig "context" $) | nindent 4 }}
+ {{- end }}
+ publishNotReadyAddresses: true
+ ports:
+ - name: {{ $root.Values.externalAccess.hidden.service.portName | quote }}
+ port: {{ $root.Values.externalAccess.hidden.service.ports.mongodb }}
+ {{- if not (empty $root.Values.externalAccess.hidden.service.nodePorts) }}
+ {{- $nodePort := index $root.Values.externalAccess.hidden.service.nodePorts $i }}
+ nodePort: {{ $nodePort }}
+ {{- else }}
+ nodePort: null
+ {{- end }}
+ targetPort: mongodb
+ {{- if $root.Values.externalAccess.hidden.service.extraPorts }}
+ {{- include "common.tplvalues.render" (dict "value" $root.Values.externalAccess.hidden.service.extraPorts "context" $) | nindent 4 }}
+ {{- end }}
+ {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list $root.Values.hidden.podLabels $root.Values.commonLabels ) "context" $ ) }}
+ selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: hidden
+ statefulset.kubernetes.io/pod-name: {{ $targetPod }}
+---
+{{- end }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/hidden/headless-svc.yaml b/kubernetes/common/mongodb/templates/hidden/headless-svc.yaml
new file mode 100644
index 0000000000..49b6845c7e
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/hidden/headless-svc.yaml
@@ -0,0 +1,32 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if (include "mongodb.hidden.enabled" .) }}
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ printf "%s-hidden-headless" (include "mongodb.fullname" .) }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: hidden
+ {{- if or .Values.hidden.service.headless.annotations .Values.commonAnnotations }}
+ {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.hidden.service.headless.annotations .Values.commonAnnotations ) "context" . ) }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }}
+ {{- end }}
+spec:
+ type: ClusterIP
+ clusterIP: None
+ publishNotReadyAddresses: true
+ ports:
+ - name: {{ .Values.hidden.service.portName | quote }}
+ port: {{ .Values.hidden.service.ports.mongodb }}
+ targetPort: mongodb
+ {{- if .Values.hidden.service.extraPorts }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.hidden.service.extraPorts "context" $) | nindent 4 }}
+ {{- end }}
+ {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.hidden.podLabels .Values.commonLabels ) "context" . ) }}
+ selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: hidden
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/hidden/pdb.yaml b/kubernetes/common/mongodb/templates/hidden/pdb.yaml
new file mode 100644
index 0000000000..5420a93275
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/hidden/pdb.yaml
@@ -0,0 +1,28 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if and (include "mongodb.hidden.enabled" .) .Values.hidden.pdb.create }}
+apiVersion: {{ include "common.capabilities.policy.apiVersion" . }}
+kind: PodDisruptionBudget
+metadata:
+ name: {{ printf "%s-hidden" (include "mongodb.fullname" . )}}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: hidden
+ {{- if .Values.commonAnnotations }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+spec:
+ {{- if .Values.hidden.pdb.minAvailable }}
+ minAvailable: {{ .Values.hidden.pdb.minAvailable }}
+ {{- end }}
+ {{- if .Values.hidden.pdb.maxUnavailable }}
+ maxUnavailable: {{ .Values.hidden.pdb.maxUnavailable }}
+ {{- end }}
+ {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.hidden.podLabels .Values.commonLabels ) "context" . ) }}
+ selector:
+ matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }}
+ app.kubernetes.io/component: hidden
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/hidden/statefulset.yaml b/kubernetes/common/mongodb/templates/hidden/statefulset.yaml
new file mode 100644
index 0000000000..5b2a807d84
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/hidden/statefulset.yaml
@@ -0,0 +1,601 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if (include "mongodb.hidden.enabled" .) }}
+{{- $replicaCount := int .Values.hidden.replicaCount }}
+{{- $loadBalancerIPListLength := len .Values.externalAccess.hidden.service.loadBalancerIPs }}
+{{- if not (and .Values.externalAccess.hidden.enabled (not .Values.externalAccess.autoDiscovery.enabled) (not (eq $replicaCount $loadBalancerIPListLength )) (eq .Values.externalAccess.hidden.service.type "LoadBalancer")) }}
+apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }}
+kind: StatefulSet
+metadata:
+ name: {{ printf "%s-hidden" (include "mongodb.fullname" .) }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.hidden.labels .Values.commonLabels ) "context" . ) }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: hidden
+ {{- if or .Values.hidden.annotations .Values.commonAnnotations }}
+ {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.hidden.annotations .Values.commonAnnotations ) "context" . ) }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }}
+ {{- end }}
+spec:
+ serviceName: {{ printf "%s-hidden-headless" (include "mongodb.fullname" .) }}
+ podManagementPolicy: {{ .Values.hidden.podManagementPolicy }}
+ replicas: {{ .Values.hidden.replicaCount }}
+ {{- if .Values.hidden.updateStrategy }}
+ updateStrategy: {{- toYaml .Values.hidden.updateStrategy | nindent 4 }}
+ {{- end }}
+ {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.hidden.podLabels .Values.commonLabels ) "context" . ) }}
+ selector:
+ matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }}
+ app.kubernetes.io/component: hidden
+ template:
+ metadata:
+ labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }}
+ app.kubernetes.io/component: hidden
+ {{- if or (include "mongodb.hidden.createConfigmap" .) .Values.hidden.podAnnotations }}
+ annotations:
+ {{- if (include "mongodb.hidden.createConfigmap" .) }}
+ checksum/configuration: {{ include (print $.Template.BasePath "/hidden/configmap.yaml") . | sha256sum }}
+ {{- end }}
+ {{- if .Values.hidden.podAnnotations }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.hidden.podAnnotations "context" $) | nindent 8 }}
+ {{- end }}
+ {{- end }}
+ spec:
+ {{- include "mongodb.imagePullSecrets" . | nindent 6 }}
+ {{- if .Values.hidden.schedulerName }}
+ schedulerName: {{ .Values.hidden.schedulerName | quote }}
+ {{- end }}
+ serviceAccountName: {{ template "mongodb.serviceAccountName" . }}
+ automountServiceAccountToken: {{ .Values.hidden.automountServiceAccountToken }}
+ {{- if .Values.hidden.hostAliases }}
+ hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.hidden.hostAliases "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.hidden.affinity }}
+ affinity: {{- include "common.tplvalues.render" (dict "value" .Values.hidden.affinity "context" $) | nindent 8 }}
+ {{- else }}
+ affinity:
+ podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.hidden.podAffinityPreset "component" "hidden" "customLabels" $podLabels "topologyKey" .Values.topologyKey "context" $) | nindent 10 }}
+ podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.hidden.podAntiAffinityPreset "component" "hidden" "customLabels" $podLabels "topologyKey" .Values.topologyKey "context" $) | nindent 10 }}
+ nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.hidden.nodeAffinityPreset.type "key" .Values.hidden.nodeAffinityPreset.key "values" .Values.hidden.nodeAffinityPreset.values) | nindent 10 }}
+ {{- end }}
+ {{- if .Values.hidden.nodeSelector }}
+ nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.hidden.nodeSelector "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.hidden.tolerations }}
+ tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.hidden.tolerations "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.hidden.topologySpreadConstraints }}
+ topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.hidden.topologySpreadConstraints "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.hidden.priorityClassName }}
+ priorityClassName: {{ .Values.hidden.priorityClassName }}
+ {{- end }}
+ {{- if .Values.hidden.runtimeClassName }}
+ runtimeClassName: {{ .Values.hidden.runtimeClassName }}
+ {{- end }}
+ {{- if .Values.hidden.podSecurityContext.enabled }}
+ securityContext: {{- omit .Values.hidden.podSecurityContext "enabled" | toYaml | nindent 8 }}
+ {{- end }}
+ {{ if .Values.hidden.terminationGracePeriodSeconds }}
+ terminationGracePeriodSeconds: {{ .Values.hidden.terminationGracePeriodSeconds }}
+ {{- end }}
+ enableServiceLinks: {{ .Values.enableServiceLinks }}
+ {{- if or .Values.hidden.initContainers (and .Values.volumePermissions.enabled .Values.hidden.persistence.enabled) (and .Values.externalAccess.hidden.enabled .Values.externalAccess.autoDiscovery.enabled) .Values.tls.enabled }}
+ initContainers:
+ {{- if .Values.hidden.initContainers }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.hidden.initContainers "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if and .Values.volumePermissions.enabled .Values.hidden.persistence.enabled }}
+ - name: volume-permissions
+ image: {{ include "mongodb.volumePermissions.image" . }}
+ imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
+ command:
+ - /bin/bash
+ args:
+ - -ec
+ - |
+ mkdir -p {{ printf "%s/%s" .Values.hidden.persistence.mountPath (default "" .Values.hidden.persistence.subPath) }}
+ chown {{ .Values.containerSecurityContext.runAsUser }}:{{ .Values.podSecurityContext.fsGroup }} {{ printf "%s/%s" .Values.hidden.persistence.mountPath (default "" .Values.hidden.persistence.subPath) }}
+ find {{ printf "%s/%s" .Values.hidden.persistence.mountPath (default "" .Values.hidden.persistence.subPath) }} -mindepth 1 -maxdepth 1 -not -name ".snapshot" -not -name "lost+found" | xargs -r chown -R {{ .Values.containerSecurityContext.runAsUser }}:{{ .Values.podSecurityContext.fsGroup }}
+ {{- if eq ( toString ( .Values.volumePermissions.securityContext.runAsUser )) "auto" }}
+ securityContext: {{- omit .Values.volumePermissions.securityContext "runAsUser" | toYaml | nindent 12 }}
+ {{- else }}
+ securityContext: {{- .Values.volumePermissions.securityContext | toYaml | nindent 12 }}
+ {{- end }}
+ {{- if .Values.volumePermissions.resources }}
+ resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }}
+ {{- else if ne .Values.volumePermissions.resourcesPreset "none" }}
+ resources: {{- include "common.resources.preset" (dict "type" .Values.volumePermissions.resourcesPreset) | nindent 12 }}
+ {{- end }}
+ volumeMounts:
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ - name: datadir
+ mountPath: {{ .Values.hidden.persistence.mountPath }}
+ {{- end }}
+ {{- if .Values.tls.enabled }}
+ - name: generate-tls-certs
+ image: {{ include "mongodb.tls.image" . }}
+ imagePullPolicy: {{ .Values.tls.image.pullPolicy | quote }}
+ env:
+ - name: MY_POD_NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ - name: MY_POD_HOST_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.hostIP
+ - name: MY_POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ volumeMounts:
+ {{- if (include "mongodb.autoGenerateCerts" .) }}
+ - name: certs-volume
+ mountPath: /certs/CAs
+ {{- else }}
+ {{- range $index, $_ := .Values.tls.hidden.existingSecrets }}
+ - name: mongodb-certs-{{ $index }}
+ mountPath: /certs-{{ $index }}
+ {{- end }}
+ {{- end }}
+ - name: certs
+ mountPath: /certs
+ - name: common-scripts
+ mountPath: /bitnami/scripts
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ command:
+ - /bitnami/scripts/generate-certs.sh
+ args:
+ - -s {{ printf "%s-hidden-headless" (include "mongodb.fullname" .) }}
+ {{- if .Values.externalAccess.hidden.service.loadBalancerIPs }}
+ - -i {{ join "," .Values.externalAccess.hidden.service.loadBalancerIPs }}
+ {{- end }}
+ {{- if .Values.tls.extraDnsNames }}
+ - -n {{ join "," .Values.tls.extraDnsNames }}
+ {{- end }}
+ {{- if .Values.tls.resources }}
+ resources: {{- toYaml .Values.tls.resources | nindent 12 }}
+ {{- else if ne .Values.tls.resourcesPreset "none" }}
+ resources: {{- include "common.resources.preset" (dict "type" .Values.tls.resourcesPreset) | nindent 12 }}
+ {{- end }}
+ {{- end }}
+ {{- if and .Values.externalAccess.hidden.enabled .Values.externalAccess.autoDiscovery.enabled (eq .Values.externalAccess.hidden.service.type "LoadBalancer") }}
+ - name: auto-discovery
+ image: {{ include "mongodb.externalAccess.autoDiscovery.image" . }}
+ imagePullPolicy: {{ .Values.externalAccess.autoDiscovery.image.pullPolicy | quote }}
+ command:
+ - /scripts/auto-discovery.sh
+ # We need the service account token for contacting the k8s API
+ automountServiceAccountToken: true
+ env:
+ - name: MY_POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ - name: SHARED_FILE
+ value: "/shared/info.txt"
+ {{- if .Values.externalAccess.autoDiscovery.resources }}
+ resources: {{- toYaml .Values.externalAccess.autoDiscovery.resources | nindent 12 }}
+ {{- else if ne .Values.externalAccess.autoDiscovery.resourcesPreset "none" }}
+ resources: {{- include "common.resources.preset" (dict "type" .Values.externalAccess.autoDiscovery.resourcesPreset) | nindent 12 }}
+ {{- end }}
+ volumeMounts:
+ - name: shared
+ mountPath: /shared
+ - name: scripts
+ mountPath: /scripts/auto-discovery.sh
+ subPath: auto-discovery.sh
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ {{- end }}
+ {{- end }}
+ containers:
+ - name: mongodb
+ image: {{ include "mongodb.image" . }}
+ imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
+ {{- if .Values.hidden.containerSecurityContext.enabled }}
+ securityContext: {{- omit .Values.hidden.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+ {{- end }}
+ {{- if .Values.diagnosticMode.enabled }}
+ command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+ {{- else if .Values.hidden.command }}
+ command: {{- include "common.tplvalues.render" (dict "value" .Values.hidden.command "context" $) | nindent 12 }}
+ {{- else }}
+ command:
+ - /scripts/setup-hidden.sh
+ {{- end }}
+ {{- if .Values.diagnosticMode.enabled }}
+ args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+ {{- else if .Values.hidden.args }}
+ args: {{- include "common.tplvalues.render" (dict "value" .Values.hidden.args "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if .Values.hidden.lifecycleHooks }}
+ lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.hidden.lifecycleHooks "context" $) | nindent 12 }}
+ {{- end }}
+ env:
+ - name: BITNAMI_DEBUG
+ value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }}
+ {{- if and .Values.externalAccess.hidden.enabled .Values.externalAccess.autoDiscovery.enabled (eq .Values.externalAccess.hidden.service.type "LoadBalancer") }}
+ - name: SHARED_FILE
+ value: "/shared/info.txt"
+ {{- end }}
+ - name: MY_POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ - name: MY_POD_HOST_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.hostIP
+ - name: MY_POD_NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ - name: K8S_SERVICE_NAME
+ value: "{{ include "mongodb.service.nameOverride" . }}"
+ - name: K8S_HIDDEN_NODE_SERVICE_NAME
+ value: "{{ include "mongodb.fullname" . }}-hidden-headless"
+ - name: MONGODB_REPLICA_SET_MODE
+ value: "hidden"
+ - name: MONGODB_INITIAL_PRIMARY_HOST
+ value: {{ printf "%s-0.$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.%s" (include "mongodb.fullname" .) .Values.clusterDomain }}
+ - name: MONGODB_REPLICA_SET_NAME
+ value: {{ .Values.replicaSetName | quote }}
+ {{- if and .Values.replicaSetHostnames (not .Values.externalAccess.hidden.enabled) }}
+ - name: MONGODB_ADVERTISED_HOSTNAME
+ value: "$(MY_POD_NAME).$(K8S_HIDDEN_NODE_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.{{ .Values.clusterDomain }}"
+ {{- end }}
+ {{- $customUsers := include "mongodb.customUsers" . -}}
+ {{- $customDatabases := include "mongodb.customDatabases" . -}}
+ {{- if not (empty $customUsers) }}
+ - name: MONGODB_EXTRA_USERNAMES
+ value: {{ $customUsers | quote }}
+ {{- end }}
+ {{- if not (empty $customDatabases) }}
+ - name: MONGODB_EXTRA_DATABASES
+ value: {{ $customDatabases | quote }}
+ {{- end }}
+ {{- if .Values.auth.enabled }}
+ {{- if and (not (empty $customUsers)) (not (empty $customDatabases)) }}
+ - name: MONGODB_EXTRA_PASSWORDS
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-passwords
+ {{- end }}
+ - name: MONGODB_ROOT_USER
+ value: {{ .Values.auth.rootUser | quote }}
+ - name: MONGODB_ROOT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-root-password
+ - name: MONGODB_REPLICA_SET_KEY
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-replica-set-key
+ {{- end }}
+ {{- if and .Values.metrics.enabled (not (empty .Values.metrics.username)) }}
+ - name: MONGODB_METRICS_USERNAME
+ value: {{ .Values.metrics.username | quote }}
+ {{- if .Values.auth.enabled }}
+ - name: MONGODB_METRICS_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-metrics-password
+ {{- end }}
+ {{- end }}
+ - name: ALLOW_EMPTY_PASSWORD
+ value: {{ ternary "no" "yes" .Values.auth.enabled | quote }}
+ - name: MONGODB_SYSTEM_LOG_VERBOSITY
+ value: {{ .Values.systemLogVerbosity | quote }}
+ - name: MONGODB_DISABLE_SYSTEM_LOG
+ value: {{ ternary "yes" "no" .Values.disableSystemLog | quote }}
+ - name: MONGODB_DISABLE_JAVASCRIPT
+ value: {{ ternary "yes" "no" .Values.disableJavascript | quote }}
+ - name: MONGODB_ENABLE_JOURNAL
+ value: {{ ternary "yes" "no" .Values.enableJournal | quote }}
+ - name: MONGODB_PORT_NUMBER
+ value: {{ .Values.hidden.containerPorts.mongodb | quote }}
+ - name: MONGODB_ENABLE_IPV6
+ value: {{ ternary "yes" "no" .Values.enableIPv6 | quote }}
+ - name: MONGODB_ENABLE_DIRECTORY_PER_DB
+ value: {{ ternary "yes" "no" .Values.directoryPerDB | quote }}
+ {{- $extraFlags := .Values.hidden.extraFlags | join " " -}}
+ {{- if .Values.tls.enabled }}
+ {{- if .Values.tls.mTLS.enabled }}
+ {{- $extraFlags = printf "--tlsCAFile=/certs/mongodb-ca-cert %s" $extraFlags }}
+ {{- end }}
+ {{- $extraFlags = printf "--tlsMode=%s --tlsCertificateKeyFile=/certs/mongodb.pem %s" .Values.tls.mode $extraFlags }}
+ {{- end }}
+ {{- if ne $extraFlags "" }}
+ - name: MONGODB_EXTRA_FLAGS
+ value: {{ $extraFlags | quote }}
+ {{- end }}
+ {{- if .Values.tls.enabled }}
+ - name: MONGODB_CLIENT_EXTRA_FLAGS
+ value: --tls {{ if .Values.tls.mTLS.enabled }}--tlsCertificateKeyFile=/certs/mongodb.pem {{ end }}--tlsCAFile=/certs/mongodb-ca-cert
+ {{- end }}
+ {{- if .Values.hidden.extraEnvVars }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.hidden.extraEnvVars "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if or .Values.hidden.extraEnvVarsCM .Values.hidden.extraEnvVarsSecret }}
+ envFrom:
+ {{- if .Values.hidden.extraEnvVarsCM }}
+ - configMapRef:
+ name: {{ tpl .Values.hidden.extraEnvVarsCM . | quote }}
+ {{- end }}
+ {{- if .Values.hidden.extraEnvVarsSecret }}
+ - secretRef:
+ name: {{ tpl .Values.hidden.extraEnvVarsSecret . | quote }}
+ {{- end }}
+ {{- end }}
+ ports:
+ - containerPort: {{ .Values.hidden.containerPorts.mongodb }}
+ name: mongodb
+ {{- if not .Values.diagnosticMode.enabled }}
+ {{- if .Values.hidden.customLivenessProbe }}
+ livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.hidden.customLivenessProbe "context" $) | nindent 12 }}
+ {{- else if .Values.hidden.livenessProbe.enabled }}
+ livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.hidden.livenessProbe "enabled") "context" $) | nindent 12 }}
+ exec:
+ command:
+ - /bitnami/scripts/ping-mongodb.sh
+ {{- end }}
+ {{- if .Values.hidden.customReadinessProbe }}
+ readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.hidden.customReadinessProbe "context" $) | nindent 12 }}
+ {{- else if .Values.hidden.readinessProbe.enabled }}
+ readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.hidden.readinessProbe "enabled") "context" $) | nindent 12 }}
+ exec:
+ command:
+ - /bitnami/scripts/ping-mongodb.sh
+ {{- end }}
+ {{- if .Values.hidden.customStartupProbe }}
+ startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.hidden.customStartupProbe "context" $) | nindent 12 }}
+ {{- else if .Values.hidden.startupProbe.enabled }}
+ startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.hidden.startupProbe "enabled") "context" $) | nindent 12 }}
+ exec:
+ command:
+ - /bitnami/scripts/startup-probe.sh
+ {{- end }}
+ {{- end }}
+ {{- if .Values.hidden.resources }}
+ resources: {{- toYaml .Values.hidden.resources | nindent 12 }}
+ {{- else if ne .Values.hidden.resourcesPreset "none" }}
+ resources: {{- include "common.resources.preset" (dict "type" .Values.hidden.resourcesPreset) | nindent 12 }}
+ {{- end }}
+ volumeMounts:
+ - name: datadir
+ mountPath: {{ .Values.hidden.persistence.mountPath }}
+ subPath: {{ .Values.hidden.persistence.subPath }}
+ - name: common-scripts
+ mountPath: /bitnami/scripts
+ {{- if or .Values.initdbScriptsConfigMap .Values.initdbScripts }}
+ - name: custom-init-scripts
+ mountPath: /docker-entrypoint-initdb.d
+ {{- end }}
+ {{- if or .Values.hidden.configuration .Values.hidden.existingConfigmap }}
+ - name: config
+ mountPath: /opt/bitnami/mongodb/conf/mongodb.conf
+ subPath: mongodb.conf
+ {{- end }}
+ - name: scripts
+ mountPath: /scripts/setup-hidden.sh
+ subPath: setup-hidden.sh
+ {{- if and .Values.externalAccess.hidden.enabled .Values.externalAccess.autoDiscovery.enabled (eq .Values.externalAccess.hidden.service.type "LoadBalancer") }}
+ - name: shared
+ mountPath: /shared
+ {{- end }}
+ {{- if .Values.tls.enabled }}
+ - name: certs
+ mountPath: /certs
+ {{- end }}
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ - name: empty-dir
+ mountPath: /opt/bitnami/mongodb/conf
+ subPath: app-conf-dir
+ - name: empty-dir
+ mountPath: /opt/bitnami/mongodb/tmp
+ subPath: app-tmp-dir
+ - name: empty-dir
+ mountPath: /opt/bitnami/mongodb/logs
+ subPath: app-logs-dir
+ {{- if .Values.hidden.extraVolumeMounts }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.hidden.extraVolumeMounts "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if .Values.metrics.enabled }}
+ - name: metrics
+ image: {{ template "mongodb.metrics.image" . }}
+ imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }}
+ {{- if .Values.containerSecurityContext.enabled }}
+ securityContext: {{- omit .Values.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+ {{- end }}
+ {{- if .Values.diagnosticMode.enabled }}
+ command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+ {{- else if .Values.metrics.command }}
+ command: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.command "context" $) | nindent 12 }}
+ {{- else }}
+ command:
+ - /bin/bash
+ - -ec
+ {{- end }}
+ {{- if .Values.diagnosticMode.enabled }}
+ args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+ {{- else if .Values.metrics.args }}
+ args: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.args "context" $) | nindent 12 }}
+ {{- else }}
+ args:
+ - |
+ /bin/mongodb_exporter {{ include "mongodb.exporterArgs" $ }} --mongodb.direct-connect --mongodb.global-conn-pool --mongodb.uri "{{ include "mongodb.mongodb_exporter.uri" . }}" {{ .Values.metrics.extraFlags }}
+ {{- end }}
+ env:
+ {{- if .Values.auth.enabled }}
+ {{- if not .Values.metrics.username }}
+ - name: MONGODB_ROOT_USER
+ value: {{ .Values.auth.rootUser | quote }}
+ - name: MONGODB_ROOT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-root-password
+ {{- else }}
+ - name: MONGODB_METRICS_USERNAME
+ value: {{ .Values.metrics.username | quote }}
+ - name: MONGODB_METRICS_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-metrics-password
+ {{- end }}
+ {{- end }}
+ volumeMounts:
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ {{- if .Values.tls.enabled }}
+ - name: certs
+ mountPath: /certs
+ {{- end }}
+ - name: empty-dir
+ mountPath: /opt/bitnami/redis-cluster/tmp
+ subPath: app-tmp-dir
+ {{- if .Values.metrics.extraVolumeMounts }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.metrics.extraVolumeMounts "context" $) | nindent 12 }}
+ {{- end }}
+ ports:
+ - name: metrics
+ containerPort: 9216
+ {{- if not .Values.diagnosticMode.enabled }}
+ {{- if .Values.metrics.customLivenessProbe }}
+ livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customLivenessProbe "context" $) | nindent 12 }}
+ {{- else if .Values.metrics.livenessProbe.enabled }}
+ livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.livenessProbe "enabled") "context" $) | nindent 12 }}
+ httpGet:
+ path: /
+ port: metrics
+ {{- end }}
+ {{- if .Values.metrics.customReadinessProbe }}
+ readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customReadinessProbe "context" $) | nindent 12 }}
+ {{- else if .Values.metrics.readinessProbe.enabled }}
+ readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.readinessProbe "enabled") "context" $) | nindent 12 }}
+ httpGet:
+ path: /
+ port: metrics
+ {{- end }}
+ {{- if .Values.metrics.customStartupProbe }}
+ startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customStartupProbe "context" $) | nindent 12 }}
+ {{- else if .Values.metrics.startupProbe.enabled }}
+ startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.startupProbe "enabled") "context" $) | nindent 12 }}
+ tcpSocket:
+ port: metrics
+ {{- end }}
+ {{- end }}
+ {{- if .Values.metrics.resources }}
+ resources: {{- toYaml .Values.metrics.resources | nindent 12 }}
+ {{- else if ne .Values.metrics.resourcesPreset "none" }}
+ resources: {{- include "common.resources.preset" (dict "type" .Values.metrics.resourcesPreset) | nindent 12 }}
+ {{- end }}
+ {{- end }}
+ {{- if .Values.hidden.sidecars }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.hidden.sidecars "context" $) | nindent 8 }}
+ {{- end }}
+ volumes:
+ - name: empty-dir
+ emptyDir: {}
+ - name: common-scripts
+ configMap:
+ name: {{ printf "%s-common-scripts" (include "mongodb.fullname" .) }}
+ defaultMode: 0555
+ {{- if or .Values.initdbScriptsConfigMap .Values.initdbScripts }}
+ - name: custom-init-scripts
+ configMap:
+ name: {{ template "mongodb.initdbScriptsCM" . }}
+ {{- end }}
+ {{- if or .Values.hidden.configuration .Values.hidden.existingConfigmap }}
+ - name: config
+ configMap:
+ name: {{ include "mongodb.hidden.configmapName" . }}
+ {{- end }}
+ {{- if and .Values.externalAccess.hidden.enabled .Values.externalAccess.autoDiscovery.enabled (eq .Values.externalAccess.hidden.service.type "LoadBalancer") }}
+ - name: shared
+ emptyDir: {}
+ {{- end }}
+ - name: scripts
+ configMap:
+ name: {{ printf "%s-scripts" (include "mongodb.fullname" .) }}
+ defaultMode: 0755
+ {{- if .Values.hidden.extraVolumes }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.hidden.extraVolumes "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.tls.enabled }}
+ - name: certs
+ emptyDir: {}
+ {{- if (include "mongodb.autoGenerateCerts" .) }}
+ - name: certs-volume
+ secret:
+ secretName: {{ template "mongodb.tlsSecretName" . }}
+ items:
+ - key: mongodb-ca-cert
+ path: mongodb-ca-cert
+ mode: 0600
+ - key: mongodb-ca-key
+ path: mongodb-ca-key
+ mode: 0600
+ {{- else }}
+ {{- range $index, $secret := .Values.tls.hidden.existingSecrets }}
+ - name: mongodb-certs-{{ $index }}
+ secret:
+ secretName: {{ include "common.tplvalues.render" ( dict "value" $secret "context" $) }}
+ defaultMode: 256
+ {{- end }}
+ {{- end }}
+ {{- end }}
+ {{- if not .Values.hidden.persistence.enabled }}
+ - name: datadir
+ {{- if .Values.hidden.persistence.medium }}
+ emptyDir:
+ medium: {{ .Values.hidden.persistence.medium | quote }}
+ {{- else }}
+ emptyDir: {}
+ {{- end }}
+ {{- else }}
+ volumeClaimTemplates:
+ - metadata:
+ name: datadir
+ {{- if .Values.hidden.persistence.annotations }}
+ annotations: {{- include "common.tplvalues.render" (dict "value" .Values.hidden.persistence.annotations "context" $) | nindent 10 }}
+ {{- end }}
+ spec:
+ accessModes:
+ {{- range .Values.hidden.persistence.accessModes }}
+ - {{ . | quote }}
+ {{- end }}
+ resources:
+ requests:
+ storage: {{ .Values.hidden.persistence.size | quote }}
+ {{- if .Values.hidden.persistence.volumeClaimTemplates.requests }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.hidden.persistence.volumeClaimTemplates.requests "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if .Values.hidden.persistence.volumeClaimTemplates.dataSource }}
+ dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.hidden.persistence.volumeClaimTemplates.dataSource "context" $) | nindent 10 }}
+ {{- end }}
+ {{- if .Values.hidden.persistence.volumeClaimTemplates.selector }}
+ selector: {{- include "common.tplvalues.render" (dict "value" .Values.hidden.persistence.volumeClaimTemplates.selector "context" $) | nindent 10 }}
+ {{- end }}
+ {{ include "common.storage.class" (dict "persistence" .Values.hidden.persistence "global" .Values.global) }}
+ {{- end }}
+{{- end }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/initialization-configmap.yaml b/kubernetes/common/mongodb/templates/initialization-configmap.yaml
new file mode 100644
index 0000000000..7086e0bf73
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/initialization-configmap.yaml
@@ -0,0 +1,19 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if and .Values.initdbScripts (not .Values.initdbScriptsConfigMap) }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ printf "%s-init-scripts" (include "mongodb.fullname" .) }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+ {{- if .Values.commonAnnotations }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+data:
+{{- include "common.tplvalues.render" (dict "value" .Values.initdbScripts "context" .) | nindent 2 }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/metrics-svc.yaml b/kubernetes/common/mongodb/templates/metrics-svc.yaml
new file mode 100644
index 0000000000..f21401eef7
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/metrics-svc.yaml
@@ -0,0 +1,31 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if .Values.metrics.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ printf "%s-metrics" (include "mongodb.fullname" .) }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: metrics
+ {{- if or .Values.metrics.service.annotations .Values.commonAnnotations }}
+ {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.service.annotations .Values.commonAnnotations ) "context" . ) }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }}
+ {{- end }}
+spec:
+ type: {{ .Values.metrics.service.type }}
+ ports:
+ - port: {{ .Values.metrics.service.ports.metrics }}
+ targetPort: metrics
+ protocol: TCP
+ name: http-metrics
+ {{- if .Values.metrics.service.extraPorts }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.metrics.service.extraPorts "context" $) | nindent 4 }}
+ {{- end }}
+ {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.podLabels .Values.commonLabels ) "context" . ) }}
+ selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/networkpolicy.yaml b/kubernetes/common/mongodb/templates/networkpolicy.yaml
new file mode 100644
index 0000000000..f6d62ca867
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/networkpolicy.yaml
@@ -0,0 +1,83 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if .Values.networkPolicy.enabled }}
+kind: NetworkPolicy
+apiVersion: {{ include "common.capabilities.networkPolicy.apiVersion" . }}
+metadata:
+ name: {{ include "mongodb.fullname" . }}
+ namespace: {{ include "common.names.namespace" . | quote }}
+ {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.labels .Values.commonLabels ) "context" . ) }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+ {{- if or .Values.annotations .Values.commonAnnotation }}
+ {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.annotations .Values.commonAnnotations ) "context" . ) }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }}
+ {{- end }}
+spec:
+ {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.podLabels .Values.commonLabels ) "context" . ) }}
+ podSelector:
+ matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }}
+ app.kubernetes.io/component: mongodb
+ policyTypes:
+ - Ingress
+ - Egress
+ {{- if .Values.networkPolicy.allowExternalEgress }}
+ egress:
+ - {}
+ {{- else }}
+ egress:
+ # Allow dns resolution
+ - ports:
+ - port: 53
+ protocol: UDP
+ - port: 53
+ protocol: TCP
+ # Allow connection to other cluster pods
+ - ports:
+ - port: {{ .Values.containerPorts.mongodb }}
+ to:
+ - podSelector:
+ matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 14 }}
+ {{- if .Values.networkPolicy.extraEgress }}
+ {{- include "common.tplvalues.render" ( dict "value" .Values.rts.networkPolicy.extraEgress "context" $ ) | nindent 4 }}
+ {{- end }}
+ {{- end }}
+ ingress:
+ - ports:
+ - port: {{ .Values.containerPorts.mongodb }}
+ {{- if .Values.metrics.enabled }}
+ - port: {{ .Values.metrics.containerPort }}
+ {{- end }}
+ {{- if not .Values.networkPolicy.allowExternal }}
+ from:
+ - podSelector:
+ matchLabels:
+ {{ template "common.names.fullname" . }}-client: "true"
+ - podSelector:
+ matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 14 }}
+ app.kubernetes.io/component: mongodb
+ {{- $ingressNSMatchLabels := coalesce .Values.networkPolicy.ingressNSMatchLabels .Values.networkPolicy.namespaceSelector }}
+ {{- if $ingressNSMatchLabels }}
+ - namespaceSelector:
+ matchLabels:
+ {{- range $key, $value := $ingressNSMatchLabels }}
+ {{ $key | quote }}: {{ $value | quote }}
+ {{- end }}
+ {{- $ingressNSPodMatchLabels := coalesce .Values.networkPolicy.ingressNSPodMatchLabels .Values.networkPolicy.podSelector }}
+ {{- if $ingressNSPodMatchLabels }}
+ podSelector:
+ matchLabels:
+ {{- range $key, $value := $ingressNSPodMatchLabels }}
+ {{ $key | quote }}: {{ $value | quote }}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+ {{- $extraIngress := coalesce .Values.networkPolicy.extraIngress .Values.networkPolicy.customRules }}
+ {{- if $extraIngress }}
+ {{- include "common.tplvalues.render" ( dict "value" $extraIngress "context" $ ) | nindent 4 }}
+ {{- end }}
+{{- end }} \ No newline at end of file
diff --git a/kubernetes/common/mongodb/templates/prometheusrule.yaml b/kubernetes/common/mongodb/templates/prometheusrule.yaml
new file mode 100644
index 0000000000..00df349fcd
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/prometheusrule.yaml
@@ -0,0 +1,23 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if and .Values.metrics.enabled .Values.metrics.prometheusRule.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: PrometheusRule
+metadata:
+ name: {{ include "mongodb.fullname" . }}
+ namespace: {{ include "mongodb.prometheusRule.namespace" . }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ {{- if .Values.metrics.prometheusRule.additionalLabels }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.metrics.prometheusRule.additionalLabels "context" $) | nindent 4 }}
+ {{- end }}
+ {{- if .Values.commonAnnotations }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+spec:
+ groups:
+ - name: {{ include "mongodb.fullname" . }}
+ rules: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.prometheusRule.rules "context" $ ) | nindent 8 }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/psp.yaml b/kubernetes/common/mongodb/templates/psp.yaml
new file mode 100644
index 0000000000..61c452b48b
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/psp.yaml
@@ -0,0 +1,51 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if and (include "common.capabilities.psp.supported" .) .Values.podSecurityPolicy.create }}
+apiVersion: policy/v1beta1
+kind: PodSecurityPolicy
+metadata:
+ name: {{ include "mongodb.fullname" . }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ {{- if .Values.commonAnnotations }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+spec:
+{{- if .Values.podSecurityPolicy.spec }}
+{{ include "common.tplvalues.render" ( dict "value" .Values.podSecurityPolicy.spec "context" $ ) | nindent 2 }}
+{{- else }}
+ allowPrivilegeEscalation: {{ .Values.podSecurityPolicy.allowPrivilegeEscalation }}
+ fsGroup:
+ rule: 'MustRunAs'
+ ranges:
+ - min: {{ .Values.podSecurityContext.fsGroup }}
+ max: {{ .Values.podSecurityContext.fsGroup }}
+ hostIPC: false
+ hostNetwork: false
+ hostPID: false
+ privileged: {{ .Values.podSecurityPolicy.privileged }}
+ readOnlyRootFilesystem: false
+ requiredDropCapabilities:
+ - ALL
+ runAsUser:
+ rule: 'MustRunAs'
+ ranges:
+ - min: {{ .Values.containerSecurityContext.runAsUser }}
+ max: {{ .Values.containerSecurityContext.runAsUser }}
+ seLinux:
+ rule: 'RunAsAny'
+ supplementalGroups:
+ rule: 'MustRunAs'
+ ranges:
+ - min: {{ .Values.containerSecurityContext.runAsUser }}
+ max: {{ .Values.containerSecurityContext.runAsUser }}
+ volumes:
+ - 'configMap'
+ - 'secret'
+ - 'emptyDir'
+ - 'persistentVolumeClaim'
+{{- end }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/replicaset/external-access-svc.yaml b/kubernetes/common/mongodb/templates/replicaset/external-access-svc.yaml
new file mode 100644
index 0000000000..3bc9900597
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/replicaset/external-access-svc.yaml
@@ -0,0 +1,69 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if and (eq .Values.architecture "replicaset") .Values.externalAccess.enabled (not (eq .Values.externalAccess.service.type "ClusterIP")) }}
+{{- $fullName := include "mongodb.fullname" . }}
+{{- $replicaCount := .Values.replicaCount | int }}
+{{- $root := . }}
+
+{{- range $i, $e := until $replicaCount }}
+{{- $targetPod := printf "%s-%d" (printf "%s" $fullName) $i }}
+{{- $_ := set $ "targetPod" $targetPod }}
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ printf "%s-%d-external" $fullName $i }}
+ namespace: {{ include "mongodb.namespace" $ }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" $root.Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+ pod: {{ $targetPod }}
+ {{- if or $root.Values.externalAccess.service.annotations $root.Values.commonAnnotations }}
+ {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list $root.Values.externalAccess.service.annotations $root.Values.commonAnnotations ) "context" $ ) }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }}
+ {{- end }}
+spec:
+ type: {{ $root.Values.externalAccess.service.type }}
+ {{- if eq $root.Values.externalAccess.service.type "LoadBalancer" }}
+ {{- if not (empty $root.Values.externalAccess.service.loadBalancerIPs) }}
+ loadBalancerIP: {{ index $root.Values.externalAccess.service.loadBalancerIPs $i }}
+ {{- end }}
+ {{- if and (eq $root.Values.externalAccess.service.type "LoadBalancer") $root.Values.externalAccess.service.loadBalancerClass }}
+ loadBalancerClass: {{ $root.Values.externalAccess.service.loadBalancerClass }}
+ {{- end }}
+ {{- if $root.Values.externalAccess.service.loadBalancerSourceRanges }}
+ loadBalancerSourceRanges: {{- toYaml $root.Values.externalAccess.service.loadBalancerSourceRanges | nindent 4 }}
+ {{- end }}
+ allocateLoadBalancerNodePorts: {{ $root.Values.externalAccess.service.allocateLoadBalancerNodePorts }}
+ {{- end }}
+ {{- if (or (eq $root.Values.externalAccess.service.type "LoadBalancer") (eq $root.Values.externalAccess.service.type "NodePort")) }}
+ externalTrafficPolicy: {{ $root.Values.externalAccess.service.externalTrafficPolicy | quote }}
+ {{- end }}
+ {{- if $root.Values.externalAccess.service.sessionAffinity }}
+ sessionAffinity: {{ $root.Values.externalAccess.service.sessionAffinity }}
+ {{- end }}
+ {{- if $root.Values.externalAccess.service.sessionAffinityConfig }}
+ sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" $root.Values.externalAccess.service.sessionAffinityConfig "context" $) | nindent 4 }}
+ {{- end }}
+ publishNotReadyAddresses: true
+ ports:
+ - name: {{ $root.Values.externalAccess.service.portName | quote }}
+ port: {{ $root.Values.externalAccess.service.ports.mongodb }}
+ {{- if not (empty $root.Values.externalAccess.service.nodePorts) }}
+ {{- $nodePort := index $root.Values.externalAccess.service.nodePorts $i }}
+ nodePort: {{ $nodePort }}
+ {{- else }}
+ nodePort: null
+ {{- end }}
+ targetPort: mongodb
+ {{- if $root.Values.externalAccess.service.extraPorts }}
+ {{- include "common.tplvalues.render" (dict "value" $root.Values.externalAccess.service.extraPorts "context" $) | nindent 4 }}
+ {{- end }}
+ {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list $root.Values.podLabels $root.Values.commonLabels ) "context" $ ) }}
+ selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+ statefulset.kubernetes.io/pod-name: {{ $targetPod }}
+---
+{{- end }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/replicaset/headless-svc.yaml b/kubernetes/common/mongodb/templates/replicaset/headless-svc.yaml
new file mode 100644
index 0000000000..bf7a3d91e0
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/replicaset/headless-svc.yaml
@@ -0,0 +1,32 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if eq .Values.architecture "replicaset" }}
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ include "mongodb.service.nameOverride" . }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+ {{- if or .Values.commonAnnotations .Values.service.headless.annotations }}
+ {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.service.headless.annotations .Values.commonAnnotations ) "context" . ) }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }}
+ {{- end }}
+spec:
+ type: ClusterIP
+ clusterIP: None
+ publishNotReadyAddresses: true
+ ports:
+ - name: {{ .Values.service.portName | quote }}
+ port: {{ .Values.service.ports.mongodb }}
+ targetPort: mongodb
+ {{- if .Values.service.extraPorts }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.service.extraPorts "context" $) | nindent 4 }}
+ {{- end }}
+ {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.podLabels .Values.commonLabels ) "context" . ) }}
+ selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/replicaset/pdb.yaml b/kubernetes/common/mongodb/templates/replicaset/pdb.yaml
new file mode 100644
index 0000000000..5bbd31074e
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/replicaset/pdb.yaml
@@ -0,0 +1,28 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if and (eq .Values.architecture "replicaset") .Values.pdb.create }}
+apiVersion: {{ include "common.capabilities.policy.apiVersion" . }}
+kind: PodDisruptionBudget
+metadata:
+ name: {{ include "mongodb.fullname" . }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+ {{- if .Values.commonAnnotations }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+spec:
+ {{- if .Values.pdb.minAvailable }}
+ minAvailable: {{ .Values.pdb.minAvailable }}
+ {{- end }}
+ {{- if .Values.pdb.maxUnavailable }}
+ maxUnavailable: {{ .Values.pdb.maxUnavailable }}
+ {{- end }}
+ {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.podLabels .Values.commonLabels ) "context" . ) }}
+ selector:
+ matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }}
+ app.kubernetes.io/component: mongodb
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/replicaset/scripts-configmap.yaml b/kubernetes/common/mongodb/templates/replicaset/scripts-configmap.yaml
new file mode 100644
index 0000000000..00b2502092
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/replicaset/scripts-configmap.yaml
@@ -0,0 +1,317 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if eq .Values.architecture "replicaset" }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ printf "%s-scripts" (include "mongodb.fullname" .) }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+ {{- if .Values.commonAnnotations }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+data:
+ {{- $fullname := include "mongodb.fullname" . }}
+ {{- $releaseNamespace := include "mongodb.namespace" . }}
+ {{- if and .Values.externalAccess.autoDiscovery.enabled (eq .Values.externalAccess.service.type "LoadBalancer") }}
+ auto-discovery.sh: |-
+ #!/bin/bash
+
+ SVC_NAME="${MY_POD_NAME}-external"
+
+ # Auxiliary functions
+ retry_while() {
+ local -r cmd="${1:?cmd is missing}"
+ local -r retries="${2:-12}"
+ local -r sleep_time="${3:-5}"
+ local return_value=1
+
+ read -r -a command <<< "$cmd"
+ for ((i = 1 ; i <= retries ; i+=1 )); do
+ "${command[@]}" && return_value=0 && break
+ sleep "$sleep_time"
+ done
+ return $return_value
+ }
+ k8s_svc_lb_ip() {
+ local namespace=${1:?namespace is missing}
+ local service=${2:?service is missing}
+ local service_ip=$(kubectl get svc "$service" -n "$namespace" -o jsonpath="{.status.loadBalancer.ingress[0].ip}")
+ local service_hostname=$(kubectl get svc "$service" -n "$namespace" -o jsonpath="{.status.loadBalancer.ingress[0].hostname}")
+
+ if [[ -n ${service_ip} ]]; then
+ echo "${service_ip}"
+ else
+ echo "${service_hostname}"
+ fi
+ }
+ k8s_svc_lb_ip_ready() {
+ local namespace=${1:?namespace is missing}
+ local service=${2:?service is missing}
+ [[ -n "$(k8s_svc_lb_ip "$namespace" "$service")" ]]
+ }
+ # Wait until LoadBalancer IP is ready
+ retry_while "k8s_svc_lb_ip_ready {{ $releaseNamespace }} $SVC_NAME" || exit 1
+ # Obtain LoadBalancer external IP
+ k8s_svc_lb_ip "{{ $releaseNamespace }}" "$SVC_NAME" | tee "$SHARED_FILE"
+ {{- end }}
+ setup.sh: |-
+ #!/bin/bash
+
+ . /opt/bitnami/scripts/mongodb-env.sh
+ . /opt/bitnami/scripts/libfs.sh
+ . /opt/bitnami/scripts/liblog.sh
+ . /opt/bitnami/scripts/libvalidations.sh
+
+ {{- if .Values.externalAccess.enabled }}
+ {{- if eq .Values.externalAccess.service.type "LoadBalancer" }}
+ {{- if .Values.externalAccess.autoDiscovery.enabled }}
+ export MONGODB_ADVERTISED_HOSTNAME="$(<${SHARED_FILE})"
+ {{- else }}
+ ID="${MY_POD_NAME#"{{ $fullname }}-"}"
+ export MONGODB_ADVERTISED_HOSTNAME=$(echo '{{ .Values.externalAccess.service.loadBalancerIPs }}' | tr -d '[]' | cut -d ' ' -f "$(($ID + 1))")
+ {{- end }}
+ {{- else if eq .Values.externalAccess.service.type "NodePort" }}
+ ID="${MY_POD_NAME#"{{ $fullname }}-"}"
+ if is_empty_value "$MONGODB_ADVERTISED_PORT_NUMBER"; then
+ export MONGODB_ADVERTISED_PORT_NUMBER=$(echo '{{ .Values.externalAccess.service.nodePorts }}' | tr -d '[]' | cut -d ' ' -f "$(($ID + 1))")
+ fi
+ {{- if .Values.externalAccess.service.domain }}
+ export MONGODB_ADVERTISED_HOSTNAME={{ .Values.externalAccess.service.domain }}
+ {{- else }}
+ export MONGODB_ADVERTISED_HOSTNAME=$MY_POD_HOST_IP
+ {{- end }}
+ {{- end }}
+ {{- end }}
+
+ {{- if .Values.replicaSetConfigurationSettings.enabled }}
+ # placed here before root password env is overwritten
+ # makes no assumption about starting state
+ # ensures that any stepDown or non-default starting state is handled
+ /scripts/replicaSetConfigurationSettings.sh &
+ {{- end }}
+
+ if is_empty_value "$MONGODB_ADVERTISED_PORT_NUMBER"; then
+ export MONGODB_ADVERTISED_PORT_NUMBER="$MONGODB_PORT_NUMBER"
+ fi
+
+ info "Advertised Hostname: $MONGODB_ADVERTISED_HOSTNAME"
+ info "Advertised Port: $MONGODB_ADVERTISED_PORT_NUMBER"
+
+ # Check for existing replica set in case there is no data in the PVC
+ # This is for cases where the PVC is lost or for MongoDB caches without
+ # persistence
+ current_primary=""
+ if is_dir_empty "${MONGODB_DATA_DIR}/db"; then
+ info "Data dir empty, checking if the replica set already exists"
+ {{- $replicaCount := int .Values.replicaCount }}
+ {{- $portNumber := int .Values.service.ports.mongodb }}
+ {{- $fullname := include "mongodb.fullname" . }}
+ {{- $releaseNamespace := include "mongodb.namespace" . }}
+ {{- $clusterDomain := .Values.clusterDomain }}
+ {{- $loadBalancerIPListLength := len .Values.externalAccess.service.loadBalancerIPs }}
+ {{- $mongoList := list }}
+ {{- range $e, $i := until $replicaCount }}
+ {{- $mongoList = append $mongoList (printf "%s-%d.%s-headless.%s.svc.%s:%d" $fullname $i $fullname $releaseNamespace $clusterDomain $portNumber) }}
+ {{- end }}
+
+ {{- if .Values.externalAccess.externalMaster.enabled }}
+ current_primary={{ printf "%s:%d" (.Values.externalAccess.externalMaster.host) ( int .Values.externalAccess.externalMaster.port) }}
+ {{- else }}
+ current_primary=$(mongosh admin --host "{{ join "," $mongoList }}" {{- if .Values.auth.enabled }} --authenticationDatabase admin -u $MONGODB_ROOT_USER -p $MONGODB_ROOT_PASSWORD{{- end }}{{- if .Values.tls.enabled}} --tls {{ if .Values.tls.mTLS.enabled }}--tlsCertificateKeyFile=/certs/mongodb.pem {{ end }}--tlsCAFile=/certs/mongodb-ca-cert{{- end }} --eval 'db.runCommand("ismaster")' | awk -F\' '/primary/ {print $2}')
+ {{- end }}
+ if ! is_empty_value "$current_primary"; then
+ info "Detected existing primary: ${current_primary}"
+ fi
+ fi
+
+ if ! is_empty_value "$current_primary" && [[ "$MONGODB_ADVERTISED_HOSTNAME:$MONGODB_ADVERTISED_PORT_NUMBER" == "$current_primary" ]]; then
+ info "Advertised name matches current primary, configuring node as a primary"
+ export MONGODB_REPLICA_SET_MODE="primary"
+ elif ! is_empty_value "$current_primary" && [[ "$MONGODB_ADVERTISED_HOSTNAME:$MONGODB_ADVERTISED_PORT_NUMBER" != "$current_primary" ]]; then
+ info "Current primary is different from this node. Configuring the node as replica of ${current_primary}"
+ export MONGODB_REPLICA_SET_MODE="secondary"
+ export MONGODB_INITIAL_PRIMARY_HOST="${current_primary%:*}"
+ export MONGODB_INITIAL_PRIMARY_PORT_NUMBER="${current_primary#*:}"
+ export MONGODB_SET_SECONDARY_OK="yes"
+ elif [[ "$MY_POD_NAME" = "{{ $fullname }}-0" ]]; then
+ info "Pod name matches initial primary pod name, configuring node as a primary"
+ export MONGODB_REPLICA_SET_MODE="primary"
+ else
+ info "Pod name doesn't match initial primary pod name, configuring node as a secondary"
+ export MONGODB_REPLICA_SET_MODE="secondary"
+ export MONGODB_INITIAL_PRIMARY_PORT_NUMBER="$MONGODB_PORT_NUMBER"
+ fi
+
+ if [[ "$MONGODB_REPLICA_SET_MODE" == "secondary" ]]; then
+ export MONGODB_INITIAL_PRIMARY_ROOT_USER="$MONGODB_ROOT_USER"
+ export MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD="$MONGODB_ROOT_PASSWORD"
+ export MONGODB_ROOT_PASSWORD=""
+ export MONGODB_EXTRA_USERNAMES=""
+ export MONGODB_EXTRA_DATABASES=""
+ export MONGODB_EXTRA_PASSWORDS=""
+ export MONGODB_ROOT_PASSWORD_FILE=""
+ export MONGODB_EXTRA_USERNAMES_FILE=""
+ export MONGODB_EXTRA_DATABASES_FILE=""
+ export MONGODB_EXTRA_PASSWORDS_FILE=""
+ fi
+
+ exec /opt/bitnami/scripts/mongodb/entrypoint.sh /opt/bitnami/scripts/mongodb/run.sh
+ setup-hidden.sh: |-
+ #!/bin/bash
+
+ . /opt/bitnami/scripts/mongodb-env.sh
+
+ {{- if .Values.externalAccess.hidden.enabled }}
+ {{- if eq .Values.externalAccess.hidden.service.type "LoadBalancer" }}
+ {{- if .Values.externalAccess.autoDiscovery.enabled }}
+ export MONGODB_ADVERTISED_HOSTNAME="$(<${SHARED_FILE})"
+ {{- else }}
+ ID="${MY_POD_NAME#"{{ $fullname }}-hidden-"}"
+ export MONGODB_ADVERTISED_HOSTNAME=$(echo '{{ .Values.externalAccess.hidden.service.loadBalancerIPs }}' | tr -d '[]' | cut -d ' ' -f "$(($ID + 1))")
+ {{- end }}
+ {{- else if eq .Values.externalAccess.hidden.service.type "NodePort" }}
+ ID="${MY_POD_NAME#"{{ $fullname }}-hidden-"}"
+ if is_empty_value "$MONGODB_ADVERTISED_PORT_NUMBER"; then
+ export MONGODB_ADVERTISED_PORT_NUMBER=$(echo '{{ .Values.externalAccess.service.nodePorts }}' | tr -d '[]' | cut -d ' ' -f "$(($ID + 1))")
+ fi
+ {{- if .Values.externalAccess.hidden.service.domain }}
+ export MONGODB_ADVERTISED_HOSTNAME={{ .Values.externalAccess.hidden.service.domain }}
+ {{- else }}
+ export MONGODB_ADVERTISED_HOSTNAME=$MY_POD_HOST_IP
+ {{- end }}
+ {{- end }}
+ {{- end }}
+
+ {{- if .Values.replicaSetConfigurationSettings.enabled }}
+ # placed here before root password env is overwritten
+ # makes no assumption about starting state
+ # ensures that any stepDown or non-default starting state is handled
+ /scripts/replicaSetConfigurationSettings.sh &
+ {{- end }}
+
+ echo "Advertised Hostname: $MONGODB_ADVERTISED_HOSTNAME"
+ echo "Advertised Port: $MONGODB_ADVERTISED_PORT_NUMBER"
+ echo "Configuring node as a hidden node"
+ export MONGODB_REPLICA_SET_MODE="hidden"
+ export MONGODB_INITIAL_PRIMARY_ROOT_USER="$MONGODB_ROOT_USER"
+ export MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD="$MONGODB_ROOT_PASSWORD"
+ export MONGODB_INITIAL_PRIMARY_PORT_NUMBER="$MONGODB_PORT_NUMBER"
+ export MONGODB_ROOT_PASSWORD=""
+ export MONGODB_EXTRA_USERNAMES=""
+ export MONGODB_EXTRA_DATABASES=""
+ export MONGODB_EXTRA_PASSWORDS=""
+ export MONGODB_ROOT_PASSWORD_FILE=""
+ export MONGODB_EXTRA_USERNAMES_FILE=""
+ export MONGODB_EXTRA_DATABASES_FILE=""
+ export MONGODB_EXTRA_PASSWORDS_FILE=""
+ exec /opt/bitnami/scripts/mongodb/entrypoint.sh /opt/bitnami/scripts/mongodb/run.sh
+ {{- if .Values.replicaSetConfigurationSettings.enabled }}
+ replicaSetConfigurationSettings.sh: |-
+ #!/bin/bash
+ # This script to be called when pod starts.
+ # This script sets rs settings which can not be applied via conf file
+
+ function logger ()
+ #$1 is the line to be logged
+ {
+ echo "replicaSetConfigurationSettings.sh -- ${1}" >&1
+ }
+
+ SLEEP_PERIOD=10
+
+ {{- if and .Values.auth.enabled .Values.auth.rootPassword }}
+ usernameAndPassword="{{- if .Values.tls.enabled}} --tls {{ if .Values.tls.mTLS.enabled }}--tlsCertificateKeyFile=/certs/mongodb.pem {{ end }}--tlsCAFile=/certs/mongodb-ca-cert{{- end }} -u ${MONGODB_ROOT_USER} -p ${MONGODB_ROOT_PASSWORD}"
+ {{- else }}
+ usernameAndPassword=""
+ {{- end }}
+
+ # load Values.replicaSetConfigurationSettings.configuration into associtive array which makes iterating and string manipulation easy
+ declare -A desiredRsConf
+ {{ range $setting, $value := .Values.replicaSetConfigurationSettings.configuration -}}
+ {{ printf "desiredRsConf[%s]='%v'" $setting $value }}
+ {{ end }}
+
+ rsConfWriteAttempts=0
+ rs_conf_configured_ok=unknown
+
+ while [[ "${rs_conf_configured_ok}" != "true" ]]; do
+
+ # give the rs setup a chance to succeed before attempting to read or configure
+ sleep ${SLEEP_PERIOD}
+
+ counter=0
+ while ! mongosh ${usernameAndPassword} --eval 'rs.conf()'; do
+ counter=$((${counter} +1))
+ logger "not yet able to read rs.conf settings from the currently running rs (after ${counter} attempts)"
+ sleep ${SLEEP_PERIOD}
+ done
+ counter=$((${counter} +1))
+ logger "rs.conf settings have been read from the currently running rs (after ${counter} attempts)"
+
+ # read rs.conf again and store it. settings format is '"<key>" : <value>,'
+ currentRsConf=$(mongosh ${usernameAndPassword} --eval 'rs.conf()')
+
+ desiredEqualsactual=unknown
+ settingsToConfigure=""
+ for key in ${!desiredRsConf[@]}; do
+ value=${desiredRsConf[$key]}
+ if ! $(echo "\"${currentRsConf}"\" | grep -q -e "${key}: ${value},"); then
+ if [[ $key =~ ^members\[[0-9]+\]\..+ ]]; then
+ memberIndex=$(echo $key | grep -o -E '[0-9]+')
+ nodeConfigKey=${key#*.}
+ settingsToConfigure="${settingsToConfigure}cfg.members[${memberIndex}].${nodeConfigKey} = ${value}; "
+ else
+ # General rs settings
+ settingsToConfigure="${settingsToConfigure}cfg.settings.${key} = ${value}; "
+ fi
+ desiredEqualsactual=false
+ else
+ logger "rs conf: ${key} is already at desired value: ${value}"
+ fi
+ done
+
+ if [[ "${desiredEqualsactual}" != "false" ]]; then
+ logger "replicaSetConfigurationSettings match the settings of the currently running rs"
+ desiredEqualsactual=true
+ rs_conf_configured_ok=true
+ logger "Current settings match desired settings (There have been ${rsConfWriteAttempts} attempts to write to mongoDB rs configuration)"
+ exit
+ fi
+
+ # apply the settings only if this member is currently the mongo replicaset PRIMARY
+ # it might take a little time before any pod is PRIMARY
+ isMaster=unknown
+ if ! mongosh ${usernameAndPassword} --eval 'rs.isMaster()' | grep -q "ismaster: true"; then
+ isMaster=false
+ logger "This node is not yet PRIMARY - replicaSetConfigurationSettings will only be set on the member that is currently PRIMARY"
+ else
+ isMaster=true
+ logger "This node is PRIMARY"
+ fi
+
+ if [[ "${isMaster}" == "true" ]]; then
+ logger "This node is currently PRIMARY - will apply rs.conf settings"
+
+ # avoiding tricky string substitution with single quotes by making the eval string a set of vars
+ rsconf="cfg = rs.conf();"
+ rsreconf="rs.reconfig(cfg);"
+ rsCommand="${rsconf} ${settingsToConfigure} ${rsreconf}"
+
+ mongosh ${usernameAndPassword} --eval "${rsCommand}"
+ if [ $? -ne 0 ]; then
+ logger "Failed to apply mongodb cfg.settings configuration"
+ else
+ logger "mongodb replicaset cfg.settings configuration applied"
+ logger "Will check rs conf"
+ # don't exit just yet - the settings will be checked in the next loop
+ fi
+ rsConfWriteAttempts=$((${rsConfWriteAttempts} + 1 ))
+ fi
+ done
+ {{- end }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/replicaset/statefulset.yaml b/kubernetes/common/mongodb/templates/replicaset/statefulset.yaml
new file mode 100644
index 0000000000..55158e8fb0
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/replicaset/statefulset.yaml
@@ -0,0 +1,606 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if eq .Values.architecture "replicaset" }}
+{{- $replicaCount := int .Values.replicaCount }}
+{{- $loadBalancerIPListLength := len .Values.externalAccess.service.loadBalancerIPs }}
+{{- if not (and .Values.externalAccess.enabled (not .Values.externalAccess.autoDiscovery.enabled) (not (eq $replicaCount $loadBalancerIPListLength )) (eq .Values.externalAccess.service.type "LoadBalancer")) }}
+apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }}
+kind: StatefulSet
+metadata:
+ name: {{ include "mongodb.fullname" . }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.labels .Values.commonLabels ) "context" . ) }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+ {{- if or .Values.annotations .Values.commonAnnotations }}
+ {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.annotations .Values.commonAnnotations ) "context" . ) }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }}
+ {{- end }}
+spec:
+ serviceName: {{ include "mongodb.service.nameOverride" . }}
+ podManagementPolicy: {{ .Values.podManagementPolicy }}
+ replicas: {{ .Values.replicaCount }}
+ {{- if .Values.updateStrategy }}
+ updateStrategy: {{- toYaml .Values.updateStrategy | nindent 4 }}
+ {{- end }}
+ {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.podLabels .Values.commonLabels ) "context" . ) }}
+ selector:
+ matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }}
+ app.kubernetes.io/component: mongodb
+ template:
+ metadata:
+ labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }}
+ app.kubernetes.io/component: mongodb
+ {{- if or (include "mongodb.createConfigmap" .) .Values.podAnnotations }}
+ annotations:
+ {{- if (include "mongodb.createConfigmap" .) }}
+ checksum/configuration: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
+ {{- end }}
+ {{- if .Values.podAnnotations }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }}
+ {{- end }}
+ {{- end }}
+ spec:
+ {{- include "mongodb.imagePullSecrets" . | nindent 6 }}
+ {{- if .Values.schedulerName }}
+ schedulerName: {{ .Values.schedulerName | quote }}
+ {{- end }}
+ serviceAccountName: {{ template "mongodb.serviceAccountName" . }}
+ automountServiceAccountToken: {{ .Values.automountServiceAccountToken }}
+ {{- if .Values.hostAliases }}
+ hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.hostAliases "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.affinity }}
+ affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }}
+ {{- else }}
+ affinity:
+ podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.podAffinityPreset "component" "mongodb" "customLabels" $podLabels "topologyKey" .Values.topologyKey "context" $) | nindent 10 }}
+ podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.podAntiAffinityPreset "component" "mongodb" "customLabels" $podLabels "topologyKey" .Values.topologyKey "context" $) | nindent 10 }}
+ nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.nodeAffinityPreset.type "key" .Values.nodeAffinityPreset.key "values" .Values.nodeAffinityPreset.values) | nindent 10 }}
+ {{- end }}
+ {{- if .Values.nodeSelector }}
+ nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.tolerations }}
+ tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.topologySpreadConstraints }}
+ topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.topologySpreadConstraints "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.priorityClassName }}
+ priorityClassName: {{ .Values.priorityClassName }}
+ {{- end }}
+ {{- if .Values.runtimeClassName }}
+ runtimeClassName: {{ .Values.runtimeClassName }}
+ {{- end }}
+ {{- if .Values.podSecurityContext.enabled }}
+ securityContext: {{- omit .Values.podSecurityContext "enabled" | toYaml | nindent 8 }}
+ {{- end }}
+ {{ if .Values.terminationGracePeriodSeconds }}
+ terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }}
+ {{- end }}
+ enableServiceLinks: {{ .Values.enableServiceLinks }}
+ {{- if or .Values.initContainers (and .Values.volumePermissions.enabled .Values.persistence.enabled) (and .Values.externalAccess.enabled .Values.externalAccess.autoDiscovery.enabled) .Values.tls.enabled }}
+ initContainers:
+ {{- if .Values.initContainers }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.initContainers "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if and .Values.volumePermissions.enabled .Values.persistence.enabled }}
+ - name: volume-permissions
+ image: {{ include "mongodb.volumePermissions.image" . }}
+ imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
+ command:
+ - /bin/bash
+ args:
+ - -ec
+ - |
+ mkdir -p {{ printf "%s/%s" .Values.persistence.mountPath (default "" .Values.persistence.subPath) }}
+ chown {{ .Values.containerSecurityContext.runAsUser }}:{{ .Values.podSecurityContext.fsGroup }} {{ printf "%s/%s" .Values.persistence.mountPath (default "" .Values.persistence.subPath) }}
+ find {{ printf "%s/%s" .Values.persistence.mountPath (default "" .Values.persistence.subPath) }} -mindepth 1 -maxdepth 1 -not -name ".snapshot" -not -name "lost+found" | xargs -r chown -R {{ .Values.containerSecurityContext.runAsUser }}:{{ .Values.podSecurityContext.fsGroup }}
+ {{- if eq ( toString ( .Values.volumePermissions.securityContext.runAsUser )) "auto" }}
+ securityContext: {{- omit .Values.volumePermissions.securityContext "runAsUser" | toYaml | nindent 12 }}
+ {{- else }}
+ securityContext: {{- .Values.volumePermissions.securityContext | toYaml | nindent 12 }}
+ {{- end }}
+ {{- if .Values.volumePermissions.resources }}
+ resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }}
+ {{- else if ne .Values.volumePermissions.resourcesPreset "none" }}
+ resources: {{- include "common.resources.preset" (dict "type" .Values.volumePermissions.resourcesPreset) | nindent 12 }}
+ {{- end }}
+ volumeMounts:
+ - name: datadir
+ mountPath: {{ .Values.persistence.mountPath }}
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ {{- end }}
+ {{- if .Values.tls.enabled }}
+ - name: generate-tls-certs
+ image: {{ include "mongodb.tls.image" . }}
+ imagePullPolicy: {{ .Values.tls.image.pullPolicy | quote }}
+ env:
+ - name: MY_POD_NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ - name: MY_POD_HOST_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.hostIP
+ - name: MY_POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ volumeMounts:
+ {{- if (include "mongodb.autoGenerateCerts" .) }}
+ - name: certs-volume
+ mountPath: /certs/CAs
+ {{- else }}
+ {{- range $index, $_ := .Values.tls.replicaset.existingSecrets }}
+ - name: mongodb-certs-{{ $index }}
+ mountPath: /certs-{{ $index }}
+ {{- end }}
+ {{- end }}
+ - name: certs
+ mountPath: /certs
+ - name: common-scripts
+ mountPath: /bitnami/scripts
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ command:
+ - /bitnami/scripts/generate-certs.sh
+ args:
+ - -s {{ include "mongodb.service.nameOverride" . }}
+ {{- if .Values.externalAccess.service.loadBalancerIPs }}
+ - -i {{ join "," .Values.externalAccess.service.loadBalancerIPs }}
+ {{- end }}
+ {{- if .Values.tls.extraDnsNames }}
+ - -n {{ join "," .Values.tls.extraDnsNames }}
+ {{- end }}
+ {{- if .Values.tls.resources }}
+ resources: {{- toYaml .Values.tls.resources | nindent 12 }}
+ {{- else if ne .Values.tls.resourcesPreset "none" }}
+ resources: {{- include "common.resources.preset" (dict "type" .Values.tls.resourcesPreset) | nindent 12 }}
+ {{- end }}
+ {{- end }}
+ {{- if and .Values.externalAccess.enabled .Values.externalAccess.autoDiscovery.enabled (eq .Values.externalAccess.service.type "LoadBalancer") }}
+ - name: auto-discovery
+ image: {{ include "mongodb.externalAccess.autoDiscovery.image" . }}
+ imagePullPolicy: {{ .Values.externalAccess.autoDiscovery.image.pullPolicy | quote }}
+ # We need the service account token for contacting the k8s API
+ automountServiceAccountToken: true
+ command:
+ - /scripts/auto-discovery.sh
+ env:
+ - name: MY_POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ - name: SHARED_FILE
+ value: "/shared/info.txt"
+ {{- if .Values.externalAccess.autoDiscovery.resources }}
+ resources: {{- toYaml .Values.externalAccess.autoDiscovery.resources | nindent 12 }}
+ {{- else if ne .Values.externalAccess.autoDiscovery.resourcesPreset "none" }}
+ resources: {{- include "common.resources.preset" (dict "type" .Values.externalAccess.autoDiscovery.resourcesPreset) | nindent 12 }}
+ {{- end }}
+ volumeMounts:
+ - name: shared
+ mountPath: /shared
+ - name: scripts
+ mountPath: /scripts/auto-discovery.sh
+ subPath: auto-discovery.sh
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ {{- end }}
+ {{- end }}
+ containers:
+ - name: mongodb
+ image: {{ include "mongodb.image" . }}
+ imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
+ {{- if .Values.containerSecurityContext.enabled }}
+ securityContext: {{- omit .Values.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+ {{- end }}
+ {{- if .Values.diagnosticMode.enabled }}
+ command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+ {{- else if .Values.command }}
+ command: {{- include "common.tplvalues.render" (dict "value" .Values.command "context" $) | nindent 12 }}
+ {{- else }}
+ command:
+ - /scripts/setup.sh
+ {{- end }}
+ {{- if .Values.diagnosticMode.enabled }}
+ args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+ {{- else if .Values.args }}
+ args: {{- include "common.tplvalues.render" (dict "value" .Values.args "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if .Values.lifecycleHooks }}
+ lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.lifecycleHooks "context" $) | nindent 12 }}
+ {{- end }}
+ env:
+ - name: BITNAMI_DEBUG
+ value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }}
+ {{- if and .Values.externalAccess.enabled .Values.externalAccess.autoDiscovery.enabled (eq .Values.externalAccess.service.type "LoadBalancer") }}
+ - name: SHARED_FILE
+ value: "/shared/info.txt"
+ {{- end }}
+ - name: MY_POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ - name: MY_POD_NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ - name: MY_POD_HOST_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.hostIP
+ - name: K8S_SERVICE_NAME
+ value: "{{ include "mongodb.service.nameOverride" . }}"
+ - name: MONGODB_INITIAL_PRIMARY_HOST
+ value: {{ printf "%s-0.$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.%s" (include "mongodb.fullname" .) .Values.clusterDomain }}
+ - name: MONGODB_REPLICA_SET_NAME
+ value: {{ .Values.replicaSetName | quote }}
+ {{- if and .Values.replicaSetHostnames (not .Values.externalAccess.enabled) }}
+ - name: MONGODB_ADVERTISED_HOSTNAME
+ value: "$(MY_POD_NAME).$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.{{ .Values.clusterDomain }}"
+ {{- end }}
+ {{- $customUsers := include "mongodb.customUsers" . -}}
+ {{- $customDatabases := include "mongodb.customDatabases" . -}}
+ {{- if not (empty $customUsers) }}
+ - name: MONGODB_EXTRA_USERNAMES
+ value: {{ $customUsers | quote }}
+ {{- end }}
+ {{- if not (empty $customDatabases) }}
+ - name: MONGODB_EXTRA_DATABASES
+ value: {{ $customDatabases | quote }}
+ {{- end }}
+ {{- if .Values.auth.enabled }}
+ {{- if and (not (empty $customUsers)) (not (empty $customDatabases)) }}
+ - name: MONGODB_EXTRA_PASSWORDS
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-passwords
+ {{- end }}
+ - name: MONGODB_ROOT_USER
+ value: {{ .Values.auth.rootUser | quote }}
+ - name: MONGODB_ROOT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-root-password
+ - name: MONGODB_REPLICA_SET_KEY
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-replica-set-key
+ {{- end }}
+ {{- if and .Values.metrics.enabled (not (empty .Values.metrics.username)) }}
+ - name: MONGODB_METRICS_USERNAME
+ value: {{ .Values.metrics.username | quote }}
+ {{- if .Values.auth.enabled }}
+ - name: MONGODB_METRICS_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-metrics-password
+ {{- end }}
+ {{- end }}
+ - name: ALLOW_EMPTY_PASSWORD
+ value: {{ ternary "no" "yes" .Values.auth.enabled | quote }}
+ - name: MONGODB_SYSTEM_LOG_VERBOSITY
+ value: {{ .Values.systemLogVerbosity | quote }}
+ - name: MONGODB_DISABLE_SYSTEM_LOG
+ value: {{ ternary "yes" "no" .Values.disableSystemLog | quote }}
+ - name: MONGODB_DISABLE_JAVASCRIPT
+ value: {{ ternary "yes" "no" .Values.disableJavascript | quote }}
+ - name: MONGODB_ENABLE_JOURNAL
+ value: {{ ternary "yes" "no" .Values.enableJournal | quote }}
+ - name: MONGODB_PORT_NUMBER
+ value: {{ .Values.containerPorts.mongodb | quote }}
+ - name: MONGODB_ENABLE_IPV6
+ value: {{ ternary "yes" "no" .Values.enableIPv6 | quote }}
+ - name: MONGODB_ENABLE_DIRECTORY_PER_DB
+ value: {{ ternary "yes" "no" .Values.directoryPerDB | quote }}
+ {{- $extraFlags := .Values.extraFlags | join " " -}}
+ {{- if .Values.tls.enabled }}
+ {{- if .Values.tls.mTLS.enabled }}
+ {{- $extraFlags = printf "--tlsCAFile=/certs/mongodb-ca-cert %s" $extraFlags }}
+ {{- end }}
+ {{- $extraFlags = printf "--tlsMode=%s --tlsCertificateKeyFile=/certs/mongodb.pem %s" .Values.tls.mode $extraFlags }}
+ {{- end }}
+ {{- if ne $extraFlags "" }}
+ - name: MONGODB_EXTRA_FLAGS
+ value: {{ $extraFlags | quote }}
+ {{- end }}
+ {{- if .Values.tls.enabled }}
+ - name: MONGODB_CLIENT_EXTRA_FLAGS
+ value: --tls {{ if .Values.tls.mTLS.enabled }}--tlsCertificateKeyFile=/certs/mongodb.pem {{ end }}--tlsCAFile=/certs/mongodb-ca-cert
+ {{- end }}
+ {{- if .Values.extraEnvVars }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.extraEnvVars "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if or .Values.extraEnvVarsCM .Values.extraEnvVarsSecret }}
+ envFrom:
+ {{- if .Values.extraEnvVarsCM }}
+ - configMapRef:
+ name: {{ tpl .Values.extraEnvVarsCM . | quote }}
+ {{- end }}
+ {{- if .Values.extraEnvVarsSecret }}
+ - secretRef:
+ name: {{ tpl .Values.extraEnvVarsSecret . | quote }}
+ {{- end }}
+ {{- end }}
+ ports:
+ - name: mongodb
+ containerPort: {{ .Values.containerPorts.mongodb }}
+ {{- if not .Values.diagnosticMode.enabled }}
+ {{- if .Values.customLivenessProbe }}
+ livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.customLivenessProbe "context" $) | nindent 12 }}
+ {{- else if .Values.livenessProbe.enabled }}
+ livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.livenessProbe "enabled") "context" $) | nindent 12 }}
+ exec:
+ command:
+ - /bitnami/scripts/ping-mongodb.sh
+ {{- end }}
+ {{- if .Values.customReadinessProbe }}
+ readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.customReadinessProbe "context" $) | nindent 12 }}
+ {{- else if .Values.readinessProbe.enabled }}
+ readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.readinessProbe "enabled") "context" $) | nindent 12 }}
+ exec:
+ command:
+ - /bitnami/scripts/readiness-probe.sh
+ {{- end }}
+ {{- if .Values.customStartupProbe }}
+ startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.customStartupProbe "context" $) | nindent 12 }}
+ {{- else if .Values.startupProbe.enabled }}
+ startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.startupProbe "enabled") "context" $) | nindent 12 }}
+ exec:
+ command:
+ - /bitnami/scripts/startup-probe.sh
+ {{- end }}
+ {{- end }}
+ {{- if .Values.resources }}
+ resources: {{- toYaml .Values.resources | nindent 12 }}
+ {{- else if ne .Values.resourcesPreset "none" }}
+ resources: {{- include "common.resources.preset" (dict "type" .Values.resourcesPreset) | nindent 12 }}
+ {{- end }}
+ volumeMounts:
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ - name: empty-dir
+ mountPath: /opt/bitnami/mongodb/conf
+ subPath: app-conf-dir
+ - name: empty-dir
+ mountPath: /opt/bitnami/mongodb/tmp
+ subPath: app-tmp-dir
+ - name: empty-dir
+ mountPath: /opt/bitnami/mongodb/logs
+ subPath: app-logs-dir
+ - name: datadir
+ mountPath: {{ .Values.persistence.mountPath }}
+ subPath: {{ .Values.persistence.subPath }}
+ - name: common-scripts
+ mountPath: /bitnami/scripts
+ {{- if or .Values.initdbScriptsConfigMap .Values.initdbScripts }}
+ - name: custom-init-scripts
+ mountPath: /docker-entrypoint-initdb.d
+ {{- end }}
+ {{- if or .Values.configuration .Values.existingConfigmap }}
+ - name: config
+ mountPath: /opt/bitnami/mongodb/conf/mongodb.conf
+ subPath: mongodb.conf
+ {{- end }}
+ - name: scripts
+ mountPath: /scripts/setup.sh
+ subPath: setup.sh
+ {{ if .Values.replicaSetConfigurationSettings.enabled }}
+ - name: scripts
+ mountPath: /scripts/replicaSetConfigurationSettings.sh
+ subPath: replicaSetConfigurationSettings.sh
+ {{- end }}
+ {{- if and .Values.externalAccess.enabled .Values.externalAccess.autoDiscovery.enabled (eq .Values.externalAccess.service.type "LoadBalancer") }}
+ - name: shared
+ mountPath: /shared
+ {{- end }}
+ {{- if .Values.tls.enabled }}
+ - name: certs
+ mountPath: /certs
+ {{- end }}
+ {{- if .Values.extraVolumeMounts }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.extraVolumeMounts "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if .Values.metrics.enabled }}
+ - name: metrics
+ image: {{ template "mongodb.metrics.image" . }}
+ imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }}
+ {{- if .Values.containerSecurityContext.enabled }}
+ securityContext: {{- omit .Values.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+ {{- end }}
+ {{- if .Values.diagnosticMode.enabled }}
+ command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+ {{- else if .Values.metrics.command }}
+ command: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.command "context" $) | nindent 12 }}
+ {{- else }}
+ command:
+ - /bin/bash
+ - -ec
+ {{- end }}
+ {{- if .Values.diagnosticMode.enabled }}
+ args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+ {{- else if .Values.metrics.args }}
+ args: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.args "context" $) | nindent 12 }}
+ {{- else }}
+ args:
+ - |
+ /bin/mongodb_exporter {{ include "mongodb.exporterArgs" $ }} --mongodb.direct-connect --mongodb.global-conn-pool --web.listen-address ":{{ .Values.metrics.containerPort }}" --mongodb.uri "{{ include "mongodb.mongodb_exporter.uri" . }}" {{ .Values.metrics.extraFlags }}
+ {{- end }}
+ env:
+ {{- if .Values.auth.enabled }}
+ {{- if not .Values.metrics.username }}
+ - name: MONGODB_ROOT_USER
+ value: {{ .Values.auth.rootUser | quote }}
+ - name: MONGODB_ROOT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-root-password
+ {{- else }}
+ - name: MONGODB_METRICS_USERNAME
+ value: {{ .Values.metrics.username | quote }}
+ - name: MONGODB_METRICS_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-metrics-password
+ {{- end }}
+ {{- end }}
+ volumeMounts:
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ {{- if .Values.tls.enabled }}
+ - name: certs
+ mountPath: /certs
+ {{- end }}
+ {{- if .Values.metrics.extraVolumeMounts }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.metrics.extraVolumeMounts "context" $) | nindent 12 }}
+ {{- end }}
+ ports:
+ - name: metrics
+ containerPort: {{ .Values.metrics.containerPort }}
+ {{- if not .Values.diagnosticMode.enabled }}
+ {{- if .Values.metrics.customLivenessProbe }}
+ livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customLivenessProbe "context" $) | nindent 12 }}
+ {{- else if .Values.metrics.livenessProbe.enabled }}
+ livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.livenessProbe "enabled") "context" $) | nindent 12 }}
+ httpGet:
+ path: /
+ port: metrics
+ {{- end }}
+ {{- if .Values.metrics.customReadinessProbe }}
+ readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customReadinessProbe "context" $) | nindent 12 }}
+ {{- else if .Values.metrics.readinessProbe.enabled }}
+ readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.readinessProbe "enabled") "context" $) | nindent 12 }}
+ httpGet:
+ path: /
+ port: metrics
+ {{- end }}
+ {{- if .Values.metrics.customStartupProbe }}
+ startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customStartupProbe "context" $) | nindent 12 }}
+ {{- else if .Values.metrics.startupProbe.enabled }}
+ startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.startupProbe "enabled") "context" $) | nindent 12 }}
+ tcpSocket:
+ port: metrics
+ {{- end }}
+ {{- end }}
+ {{- if .Values.metrics.resources }}
+ resources: {{- toYaml .Values.metrics.resources | nindent 12 }}
+ {{- else if ne .Values.metrics.resourcesPreset "none" }}
+ resources: {{- include "common.resources.preset" (dict "type" .Values.metrics.resourcesPreset) | nindent 12 }}
+ {{- end }}
+ {{- end }}
+ {{- if .Values.sidecars }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.sidecars "context" $) | nindent 8 }}
+ {{- end }}
+ volumes:
+ - name: empty-dir
+ emptyDir: {}
+ - name: common-scripts
+ configMap:
+ name: {{ printf "%s-common-scripts" (include "mongodb.fullname" .) }}
+ defaultMode: 0550
+ {{- if or .Values.initdbScriptsConfigMap .Values.initdbScripts }}
+ - name: custom-init-scripts
+ configMap:
+ name: {{ template "mongodb.initdbScriptsCM" . }}
+ {{- end }}
+ {{- if or .Values.configuration .Values.existingConfigmap }}
+ - name: config
+ configMap:
+ name: {{ include "mongodb.configmapName" . }}
+ {{- end }}
+ {{- if and .Values.externalAccess.enabled .Values.externalAccess.autoDiscovery.enabled (eq .Values.externalAccess.service.type "LoadBalancer") }}
+ - name: shared
+ emptyDir: {}
+ {{- end }}
+ - name: scripts
+ configMap:
+ name: {{ printf "%s-scripts" (include "mongodb.fullname" .) }}
+ defaultMode: 0755
+ {{- if .Values.extraVolumes }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.extraVolumes "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.tls.enabled }}
+ - name: certs
+ emptyDir: {}
+ {{- if (include "mongodb.autoGenerateCerts" .) }}
+ - name: certs-volume
+ secret:
+ secretName: {{ template "mongodb.tlsSecretName" . }}
+ items:
+ - key: mongodb-ca-cert
+ path: mongodb-ca-cert
+ mode: 0600
+ - key: mongodb-ca-key
+ path: mongodb-ca-key
+ mode: 0600
+ {{- else }}
+ {{- range $index, $secret := .Values.tls.replicaset.existingSecrets }}
+ - name: mongodb-certs-{{ $index }}
+ secret:
+ secretName: {{ include "common.tplvalues.render" ( dict "value" $secret "context" $) }}
+ defaultMode: 256
+ {{- end }}
+ {{- end }}
+ {{- end }}
+ {{- if not .Values.persistence.enabled }}
+ - name: datadir
+ {{- if .Values.persistence.medium }}
+ emptyDir:
+ medium: {{ .Values.persistence.medium | quote }}
+ {{- else }}
+ emptyDir: {}
+ {{- end }}
+ {{- else }}
+ {{- if .Values.persistentVolumeClaimRetentionPolicy.enabled }}
+ persistentVolumeClaimRetentionPolicy:
+ whenDeleted: {{ .Values.persistentVolumeClaimRetentionPolicy.whenDeleted }}
+ whenScaled: {{ .Values.persistentVolumeClaimRetentionPolicy.whenScaled }}
+ {{- end }}
+ volumeClaimTemplates:
+ - apiVersion: v1
+ kind: PersistentVolumeClaim
+ metadata:
+ name: datadir
+ {{- if .Values.persistence.annotations }}
+ annotations: {{- include "common.tplvalues.render" (dict "value" .Values.persistence.annotations "context" $) | nindent 10 }}
+ {{- end }}
+ spec:
+ accessModes:
+ {{- range .Values.persistence.accessModes }}
+ - {{ . | quote }}
+ {{- end }}
+ resources:
+ requests:
+ storage: {{ .Values.persistence.size | quote }}
+ {{- if .Values.persistence.volumeClaimTemplates.requests }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.persistence.volumeClaimTemplates.requests "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if .Values.persistence.volumeClaimTemplates.dataSource }}
+ dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.persistence.volumeClaimTemplates.dataSource "context" $) | nindent 10 }}
+ {{- end }}
+ {{- if .Values.persistence.volumeClaimTemplates.selector }}
+ selector: {{- include "common.tplvalues.render" (dict "value" .Values.persistence.volumeClaimTemplates.selector "context" $) | nindent 10 }}
+ {{- end }}
+ {{ include "common.storage.class" (dict "persistence" .Values.persistence "global" .Values.global) }}
+ {{- end }}
+{{- end }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/replicaset/svc.yaml b/kubernetes/common/mongodb/templates/replicaset/svc.yaml
new file mode 100644
index 0000000000..d95504376a
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/replicaset/svc.yaml
@@ -0,0 +1,41 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if and (eq .Values.architecture "replicaset") .Values.externalAccess.enabled (eq .Values.externalAccess.service.type "ClusterIP") }}
+
+{{- $fullName := include "mongodb.fullname" . }}
+{{- $replicaCount := .Values.replicaCount | int }}
+{{- $root := . }}
+
+{{- range $i, $e := until $replicaCount }}
+{{- $targetPod := printf "%s-%d" (printf "%s" $fullName) $i }}
+{{- $_ := set $ "targetPod" $targetPod }}
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ printf "%s-%d" $fullName $i }}
+ namespace: {{ include "mongodb.namespace" $ }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" $root.Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+ {{- if or $root.Values.service.annotations $root.Values.commonAnnotations }}
+ {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list $root.Values.service.annotations $root.Values.commonAnnotations ) "context" $ ) }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }}
+ {{- end }}
+spec:
+ type: ClusterIP
+ ports:
+ - name: {{ $root.Values.service.portName | quote }}
+ port: {{ $root.Values.service.ports.mongodb }}
+ targetPort: mongodb
+ {{- if $root.Values.service.extraPorts }}
+ {{- include "common.tplvalues.render" (dict "value" $root.Values.service.extraPorts "context" $) | nindent 4 }}
+ {{- end }}
+ {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list $root.Values.podLabels $root.Values.commonLabels ) "context" $ ) }}
+ selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+ statefulset.kubernetes.io/pod-name: {{ $targetPod }}
+---
+{{- end }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/role.yaml b/kubernetes/common/mongodb/templates/role.yaml
new file mode 100644
index 0000000000..b37d192cb0
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/role.yaml
@@ -0,0 +1,31 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if .Values.rbac.create }}
+apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }}
+kind: Role
+metadata:
+ name: {{ include "mongodb.fullname" . }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+rules:
+ - apiGroups:
+ - ""
+ resources:
+ - services
+ verbs:
+ - get
+ - list
+ - watch
+{{- if .Values.rbac.rules }}
+{{- include "common.tplvalues.render" ( dict "value" .Values.rbac.rules "context" $ ) | nindent 2 }}
+{{- end -}}
+{{- if and (include "common.capabilities.psp.supported" .) .Values.podSecurityPolicy.create }}
+ - apiGroups: ['{{ template "podSecurityPolicy.apiGroup" . }}']
+ resources: ['podsecuritypolicies']
+ verbs: ['use']
+ resourceNames: [{{ include "mongodb.fullname" . }}]
+{{- end -}}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/rolebinding.yaml b/kubernetes/common/mongodb/templates/rolebinding.yaml
new file mode 100644
index 0000000000..c6a76e6455
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/rolebinding.yaml
@@ -0,0 +1,21 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if and .Values.serviceAccount.create .Values.rbac.create }}
+apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }}
+kind: RoleBinding
+metadata:
+ name: {{ include "mongodb.fullname" . }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+roleRef:
+ kind: Role
+ name: {{ include "mongodb.fullname" . }}
+ apiGroup: rbac.authorization.k8s.io
+subjects:
+ - kind: ServiceAccount
+ name: {{ include "mongodb.serviceAccountName" . }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/secrets-ca.yaml b/kubernetes/common/mongodb/templates/secrets-ca.yaml
new file mode 100644
index 0000000000..e1387ae30f
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/secrets-ca.yaml
@@ -0,0 +1,33 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if (include "mongodb.createTlsSecret" .) }}
+{{- $secretName := printf "%s" (include "mongodb.tlsSecretName" .) }}
+{{- $fullname := include "mongodb.fullname" . }}
+{{- $releaseNamespace := .Release.Namespace }}
+{{- $clusterDomain := .Values.clusterDomain }}
+{{- $cn := printf "%s.%s.svc.%s" $fullname .Release.Namespace $clusterDomain }}
+apiVersion: v1
+kind: Secret
+metadata:
+ name: {{ $secretName }}
+ namespace: {{ template "mongodb.namespace" . }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+ {{- if .Values.commonAnnotations }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+type: Opaque
+data:
+ {{- if or .Values.tls.caCert .Values.tls.caKey (not .Values.tls.autoGenerated) }}
+ {{- $ca := buildCustomCert (required "A valid .Values.tls.caCert is required!" .Values.tls.caCert) (required "A valid .Values.tls.caKey is required!" .Values.tls.caKey) }}
+ mongodb-ca-cert: {{ b64enc $ca.Cert }}
+ mongodb-ca-key: {{ b64enc $ca.Key }}
+ {{- else }}
+ {{- $ca := genCA "myMongo-ca" 3650 }}
+ mongodb-ca-cert: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "mongodb-ca-cert" "defaultValue" $ca.Cert "context" $) }}
+ mongodb-ca-key: {{ include "common.secrets.lookup" (dict "secret" $secretName "key" "mongodb-ca-key" "defaultValue" $ca.Key "context" $) }}
+ {{- end }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/secrets.yaml b/kubernetes/common/mongodb/templates/secrets.yaml
new file mode 100644
index 0000000000..004f2f3622
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/secrets.yaml
@@ -0,0 +1,128 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if .Values.auth.enabled }}
+{{- $replicaCount := int .Values.replicaCount }}
+{{- $port := .Values.service.ports.mongodb }}
+{{- $host := include "mongodb.service.nameOverride" . }}
+{{- $hostForURI := printf "%s:%s" (include "mongodb.service.nameOverride" .) (print $port) }}
+{{- if (eq .Values.architecture "replicaset") }}
+ {{- $fullname := include "mongodb.fullname" . }}
+ {{- $releaseNamespace := include "mongodb.namespace" . }}
+ {{- $clusterDomain := .Values.clusterDomain }}
+ {{- $mongoList := list }}
+ {{- $mongoOnlyHostList := list }}
+ {{- range $e, $i := until $replicaCount }}
+ {{- $mongoOnlyHostList = append $mongoList (printf "%s-%d.%s-headless.%s.svc.%s" $fullname $i $fullname $releaseNamespace $clusterDomain) }}
+ {{- $mongoList = append $mongoList (printf "%s-%d.%s-headless.%s.svc.%s:%s" $fullname $i $fullname $releaseNamespace $clusterDomain (print $port)) }}
+ {{- end }}
+ {{- $host = (join "," $mongoOnlyHostList) }}
+ {{- $hostForURI = (join "," $mongoList) }}
+{{- end }}
+
+{{/* Root user section. */}}
+{{- $rootPassword := include "common.secrets.passwords.manage" (dict "secret" (include "mongodb.secretName" .) "key" "mongodb-root-password" "providedValues" (list "auth.rootPassword" ) "context" $) | trimAll "\"" | b64dec }}
+
+{{/* Custom user section. This chart allows creating multiple users */}}
+{{- $customUsers := include "mongodb.customUsers" . }}
+{{- $customDatabases := include "mongodb.customDatabases" . }}
+{{- $customPasswords := include "mongodb.customPasswords" . }}
+{{- $passwords := "" }}
+{{- $passwordList := list -}}
+{{- $customUsersList := list }}
+{{- $customDatabasesList := list }}
+{{- $customPasswordsList := list }}
+{{- if and (not (empty $customUsers)) (not (empty $customDatabases)) }}
+{{- $customUsersList = splitList "," $customUsers }}
+{{- $customDatabasesList = splitList "," $customDatabases }}
+{{- if not (empty $customPasswords) }}
+{{- $passwordList = $customPasswords }}
+{{- $customPasswordsList = splitList "," $customPasswords }}
+{{- else }}
+{{- range $customUsersList }}
+{{- $customPasswordsList = append $customPasswordsList (randAlphaNum 10) }}
+{{- end -}}
+{{- $passwordList = (join "," $customPasswordsList) }}
+{{- end }}
+{{- $passwords = include "common.secrets.passwords.manage" (dict "secret" (include "mongodb.secretName" .) "key" "mongodb-passwords" "providedValues" (list "mongodbPasswords") "context" (set (deepCopy $) "Values" (dict "mongodbPasswords" $passwordList))) | trimAll "\"" | b64dec }}
+{{- end }}
+
+{{- if (include "mongodb.createSecret" .) }}
+apiVersion: v1
+kind: Secret
+metadata:
+ name: {{ include "mongodb.fullname" . }}
+ namespace: {{ template "mongodb.namespace" . }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+ {{- if .Values.commonAnnotations }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+type: Opaque
+data:
+ mongodb-root-password: {{ print $rootPassword | b64enc | quote }}
+ {{- if and (not (empty $customUsers)) (not (empty $customDatabases)) }}
+ mongodb-passwords: {{ print $passwords | b64enc | quote }}
+ {{- end }}
+ {{- if .Values.metrics.username }}
+ mongodb-metrics-password: {{ include "common.secrets.passwords.manage" (dict "secret" (include "mongodb.fullname" .) "key" "mongodb-metrics-password" "providedValues" (list "metrics.password" ) "context" $) }}
+ {{- end }}
+ {{- if eq .Values.architecture "replicaset" }}
+ mongodb-replica-set-key: {{ include "common.secrets.passwords.manage" (dict "secret" (include "mongodb.fullname" .) "key" "mongodb-replica-set-key" "providedValues" (list "auth.replicaSetKey" ) "context" $) }}
+ {{- end }}
+{{- end }}
+{{- if .Values.serviceBindings.enabled }}
+---
+apiVersion: v1
+kind: Secret
+metadata:
+ name: {{ include "common.names.fullname" . }}-svcbind-root
+ namespace: {{ .Release.Namespace | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ {{- if .Values.commonAnnotations }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+type: servicebinding.io/mongodb
+data:
+ provider: {{ print "bitnami" | b64enc | quote }}
+ type: {{ print "mongodb" | b64enc | quote }}
+ host: {{ print $host | b64enc | quote }}
+ port: {{ print $port | b64enc | quote }}
+ username: {{ print .Values.auth.rootUser | b64enc | quote }}
+ password: {{ print $rootPassword | b64enc | quote }}
+ database: {{ print "admin" | b64enc | quote }}
+ uri: {{ printf "mongodb://%s:%s@%s/admin" .Values.auth.rootUser $rootPassword $hostForURI | b64enc | quote }}
+{{- range $e, $i := until (len $customUsersList) }}
+---
+{{- $currentSecret := printf "%s-svcbind-%d" (include "common.names.fullname" $) $i }}
+apiVersion: v1
+kind: Secret
+metadata:
+ name: {{ $currentSecret }}
+ namespace: {{ $.Release.Namespace | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" $.Values.commonLabels "context" $ ) | nindent 4 }}
+ {{- if $.Values.commonAnnotations }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" $.Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+type: servicebinding.io/mongodb
+data:
+ {{- $currentUser := index $customUsersList $i }}
+ {{- $currentDatabase := last $customDatabasesList }}
+ {{- if gt (len $customDatabasesList) $i }}
+ {{- $currentDatabase = index $customDatabasesList $i }}
+ {{- end }}
+ {{- $currentProvidedPassword := index $customPasswordsList $i }}
+ {{- $currentPassword := include "common.secrets.lookup" (dict "secret" $currentSecret "key" "password" "defaultValue" $currentProvidedPassword "context" $) | b64dec }}
+ provider: {{ print "bitnami" | b64enc | quote }}
+ type: {{ print "mongodb" | b64enc | quote }}
+ host: {{ print $host | b64enc | quote }}
+ port: {{ print $port | b64enc | quote }}
+ username: {{ print $currentUser | b64enc | quote }}
+ password: {{ print $currentPassword | b64enc | quote }}
+ database: {{ print $currentDatabase | b64enc | quote }}
+ uri: {{ printf "mongodb://%s:%s@%s/%s" $currentUser $currentPassword $hostForURI $currentDatabase | b64enc | quote }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/serviceaccount.yaml b/kubernetes/common/mongodb/templates/serviceaccount.yaml
new file mode 100644
index 0000000000..6dd53ab83e
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/serviceaccount.yaml
@@ -0,0 +1,20 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if .Values.serviceAccount.create }}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: {{ include "mongodb.serviceAccountName" . }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ {{- if or .Values.serviceAccount.annotations .Values.commonAnnotations }}
+ {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.serviceAccount.annotations .Values.commonAnnotations ) "context" . ) }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }}
+ {{- end }}
+secrets:
+ - name: {{ template "mongodb.fullname" . }}
+automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/servicemonitor.yaml b/kubernetes/common/mongodb/templates/servicemonitor.yaml
new file mode 100644
index 0000000000..8273e4b626
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/servicemonitor.yaml
@@ -0,0 +1,48 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ name: {{ include "mongodb.fullname" . }}
+ namespace: {{ include "mongodb.serviceMonitor.namespace" . }}
+ {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.metrics.serviceMonitor.labels .Values.commonLabels ) "context" . ) }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: metrics
+ {{- if .Values.commonAnnotations }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+ {{- end }}
+spec:
+ {{- if .Values.metrics.serviceMonitor.jobLabel }}
+ jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }}
+ {{- end }}
+ selector:
+ matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 6 }}
+ {{- if .Values.metrics.serviceMonitor.selector }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.selector "context" $) | nindent 6 }}
+ {{- end }}
+ app.kubernetes.io/component: metrics
+ endpoints:
+ - port: http-metrics
+ {{- if .Values.metrics.serviceMonitor.interval }}
+ interval: {{ .Values.metrics.serviceMonitor.interval }}
+ {{- end }}
+ {{- if .Values.metrics.serviceMonitor.scrapeTimeout }}
+ scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }}
+ {{- end }}
+ {{- if .Values.metrics.serviceMonitor.relabelings }}
+ relabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.relabelings "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.metrics.serviceMonitor.metricRelabelings }}
+ metricRelabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.metricRelabelings "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.metrics.serviceMonitor.honorLabels }}
+ honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }}
+ {{- end }}
+ namespaceSelector:
+ matchNames:
+ - "{{ include "mongodb.namespace" . }}"
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/standalone/dep-sts.yaml b/kubernetes/common/mongodb/templates/standalone/dep-sts.yaml
new file mode 100644
index 0000000000..29dd406bca
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/standalone/dep-sts.yaml
@@ -0,0 +1,520 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if not (eq .Values.architecture "replicaset") }}
+apiVersion: {{ if .Values.useStatefulSet }}{{ include "common.capabilities.statefulset.apiVersion" . }}{{- else }}{{ include "common.capabilities.deployment.apiVersion" . }}{{- end }}
+kind: {{ if .Values.useStatefulSet }}StatefulSet{{- else }}Deployment{{- end }}
+metadata:
+ name: {{ include "mongodb.fullname" . }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ {{- $labels := include "common.tplvalues.merge" ( dict "values" ( list .Values.labels .Values.commonLabels ) "context" . ) }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" $labels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+ {{- if or .Values.annotations .Values.commonAnnotations }}
+ {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.annotations .Values.commonAnnotations ) "context" . ) }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }}
+ {{- end }}
+spec:
+ replicas: {{ gt (.Values.replicaCount | int) 1 | ternary 1 .Values.replicaCount }}
+ {{- if .Values.useStatefulSet }}
+ serviceName: {{ include "mongodb.service.nameOverride" . }}
+ {{- end }}
+ {{- if .Values.updateStrategy}}
+ {{- if .Values.useStatefulSet }}
+ updateStrategy:
+ {{- else }}
+ strategy:
+ {{- end }}
+ {{- toYaml .Values.updateStrategy | nindent 4 }}
+ {{- end}}
+ {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.podLabels .Values.commonLabels ) "context" . ) }}
+ selector:
+ matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }}
+ app.kubernetes.io/component: mongodb
+ template:
+ metadata:
+ labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }}
+ app.kubernetes.io/component: mongodb
+ {{- if or (include "mongodb.createConfigmap" .) .Values.podAnnotations }}
+ annotations:
+ {{- if (include "mongodb.createConfigmap" .) }}
+ checksum/configuration: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
+ {{- end }}
+ {{- if .Values.podAnnotations }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }}
+ {{- end }}
+ {{- end }}
+ spec:
+ {{- include "mongodb.imagePullSecrets" . | nindent 6 }}
+ automountServiceAccountToken: {{ .Values.automountServiceAccountToken }}
+ {{- if .Values.hostAliases }}
+ hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.hostAliases "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.schedulerName }}
+ schedulerName: {{ .Values.schedulerName | quote }}
+ {{- end }}
+ serviceAccountName: {{ template "mongodb.serviceAccountName" . }}
+ {{- if .Values.affinity }}
+ affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }}
+ {{- else }}
+ affinity:
+ podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.podAffinityPreset "component" "mongodb" "customLabels" $podLabels "topologyKey" .Values.topologyKey "context" $) | nindent 10 }}
+ podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.podAntiAffinityPreset "component" "mongodb" "customLabels" $podLabels "topologyKey" .Values.topologyKey "context" $) | nindent 10 }}
+ nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.nodeAffinityPreset.type "key" .Values.nodeAffinityPreset.key "values" .Values.nodeAffinityPreset.values) | nindent 10 }}
+ {{- end }}
+ {{- if .Values.nodeSelector }}
+ nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.tolerations }}
+ tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.priorityClassName }}
+ priorityClassName: {{ .Values.priorityClassName }}
+ {{- end }}
+ {{- if .Values.runtimeClassName }}
+ runtimeClassName: {{ .Values.runtimeClassName }}
+ {{- end }}
+ {{- if .Values.podSecurityContext.enabled }}
+ securityContext: {{- omit .Values.podSecurityContext "enabled" | toYaml | nindent 8 }}
+ {{- end }}
+ {{ if .Values.terminationGracePeriodSeconds }}
+ terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }}
+ {{- end }}
+ enableServiceLinks: {{ .Values.enableServiceLinks }}
+ {{- if or .Values.initContainers (and .Values.volumePermissions.enabled .Values.persistence.enabled) .Values.tls.enabled }}
+ initContainers:
+ {{- if .Values.initContainers }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.initContainers "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if and .Values.volumePermissions.enabled .Values.persistence.enabled }}
+ - name: volume-permissions
+ image: {{ include "mongodb.volumePermissions.image" . }}
+ imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
+ command:
+ - /bin/bash
+ args:
+ - -ec
+ - |
+ mkdir -p {{ printf "%s/%s" .Values.persistence.mountPath (default "" .Values.persistence.subPath) }}
+ chown {{ .Values.containerSecurityContext.runAsUser }}:{{ .Values.podSecurityContext.fsGroup }} {{ printf "%s/%s" .Values.persistence.mountPath (default "" .Values.persistence.subPath) }}
+ find {{ printf "%s/%s" .Values.persistence.mountPath (default "" .Values.persistence.subPath) }} -mindepth 1 -maxdepth 1 -not -name ".snapshot" -not -name "lost+found" | xargs -r chown -R {{ .Values.containerSecurityContext.runAsUser }}:{{ .Values.podSecurityContext.fsGroup }}
+ {{- if eq ( toString ( .Values.volumePermissions.securityContext.runAsUser )) "auto" }}
+ securityContext: {{- omit .Values.volumePermissions.securityContext "runAsUser" | toYaml | nindent 12 }}
+ {{- else }}
+ securityContext: {{- .Values.volumePermissions.securityContext | toYaml | nindent 12 }}
+ {{- end }}
+ {{- if .Values.volumePermissions.resources }}
+ resources: {{- toYaml .Values.volumePermissions.resources | nindent 12 }}
+ {{- else if ne .Values.volumePermissions.resourcesPreset "none" }}
+ resources: {{- include "common.resources.preset" (dict "type" .Values.volumePermissions.resourcesPreset) | nindent 12 }}
+ {{- end }}
+ volumeMounts:
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ - name: {{ .Values.persistence.name | default "datadir" }}
+ mountPath: {{ .Values.persistence.mountPath }}
+ {{- end }}
+ {{- if .Values.tls.enabled }}
+ - name: generate-tls-certs
+ image: {{ include "mongodb.tls.image" . }}
+ imagePullPolicy: {{ .Values.tls.image.pullPolicy | quote }}
+ env:
+ - name: MY_POD_NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ - name: MY_POD_HOST_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.hostIP
+ volumeMounts:
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ {{- if (include "mongodb.autoGenerateCerts" .) }}
+ - name: certs-volume
+ mountPath: /certs/CAs
+ {{- else }}
+ - name: mongodb-certs-0
+ mountPath: /certs-0
+ {{- end }}
+ - name: certs
+ mountPath: /certs
+ - name: common-scripts
+ mountPath: /bitnami/scripts
+ command:
+ - /bitnami/scripts/generate-certs.sh
+ args:
+ - -s {{ include "mongodb.service.nameOverride" . }}
+ {{- if .Values.externalAccess.service.loadBalancerIPs }}
+ - -i {{ join "," .Values.externalAccess.service.loadBalancerIPs }}
+ {{- end }}
+ {{- if .Values.tls.extraDnsNames }}
+ - -n {{ join "," .Values.tls.extraDnsNames }}
+ {{- end }}
+ {{- if .Values.tls.resources }}
+ resources: {{- toYaml .Values.tls.resources | nindent 12 }}
+ {{- else if ne .Values.tls.resourcesPreset "none" }}
+ resources: {{- include "common.resources.preset" (dict "type" .Values.tls.resourcesPreset) | nindent 12 }}
+ {{- end }}
+ {{- if .Values.tls.securityContext }}
+ securityContext: {{- toYaml .Values.tls.securityContext | nindent 12 }}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+ containers:
+ - name: mongodb
+ image: {{ include "mongodb.image" . }}
+ imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
+ {{- if .Values.containerSecurityContext.enabled }}
+ securityContext: {{- omit .Values.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+ {{- end }}
+ {{- if .Values.diagnosticMode.enabled }}
+ command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+ {{- else if .Values.command }}
+ command: {{- include "common.tplvalues.render" (dict "value" .Values.command "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if .Values.diagnosticMode.enabled }}
+ args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+ {{- else if .Values.args }}
+ args: {{- include "common.tplvalues.render" (dict "value" .Values.args "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if .Values.lifecycleHooks }}
+ lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.lifecycleHooks "context" $) | nindent 12 }}
+ {{- end }}
+ env:
+ - name: BITNAMI_DEBUG
+ value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }}
+ {{- $customUsers := include "mongodb.customUsers" . -}}
+ {{- $customDatabases := include "mongodb.customDatabases" . -}}
+ {{- if not (empty $customUsers) }}
+ - name: MONGODB_EXTRA_USERNAMES
+ value: {{ $customUsers | quote }}
+ {{- end }}
+ {{- if not (empty $customDatabases) }}
+ - name: MONGODB_EXTRA_DATABASES
+ value: {{ $customDatabases | quote }}
+ {{- end }}
+ {{- if .Values.auth.enabled }}
+ {{- if and (not (empty $customUsers)) (not (empty $customDatabases)) }}
+ - name: MONGODB_EXTRA_PASSWORDS
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-passwords
+ {{- end }}
+ - name: MONGODB_ROOT_USER
+ value: {{ .Values.auth.rootUser | quote }}
+ - name: MONGODB_ROOT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-root-password
+ {{- end }}
+ {{- if and .Values.metrics.enabled (not (empty .Values.metrics.username)) }}
+ - name: MONGODB_METRICS_USERNAME
+ value: {{ .Values.metrics.username | quote }}
+ {{- if .Values.auth.enabled }}
+ - name: MONGODB_METRICS_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-metrics-password
+ {{- end }}
+ {{- end }}
+ - name: ALLOW_EMPTY_PASSWORD
+ value: {{ ternary "no" "yes" .Values.auth.enabled | quote }}
+ - name: MONGODB_SYSTEM_LOG_VERBOSITY
+ value: {{ .Values.systemLogVerbosity | quote }}
+ - name: MONGODB_DISABLE_SYSTEM_LOG
+ value: {{ ternary "yes" "no" .Values.disableSystemLog | quote }}
+ - name: MONGODB_DISABLE_JAVASCRIPT
+ value: {{ ternary "yes" "no" .Values.disableJavascript | quote }}
+ - name: MONGODB_ENABLE_JOURNAL
+ value: {{ ternary "yes" "no" .Values.enableJournal | quote }}
+ - name: MONGODB_PORT_NUMBER
+ value: {{ .Values.containerPorts.mongodb | quote }}
+ - name: MONGODB_ENABLE_IPV6
+ value: {{ ternary "yes" "no" .Values.enableIPv6 | quote }}
+ - name: MONGODB_ENABLE_DIRECTORY_PER_DB
+ value: {{ ternary "yes" "no" .Values.directoryPerDB | quote }}
+ {{- $extraFlags := .Values.extraFlags | join " " -}}
+ {{- if .Values.tls.enabled }}
+ {{- if .Values.tls.mTLS.enabled }}
+ {{- $extraFlags = printf "--tlsCAFile=/certs/mongodb-ca-cert %s" $extraFlags }}
+ {{- end }}
+ {{- $extraFlags = printf "--tlsMode=%s --tlsCertificateKeyFile=/certs/mongodb.pem %s" .Values.tls.mode $extraFlags }}
+ {{- end }}
+ {{- if ne $extraFlags "" }}
+ - name: MONGODB_EXTRA_FLAGS
+ value: {{ $extraFlags | quote }}
+ {{- end }}
+ {{- if .Values.tls.enabled }}
+ - name: MONGODB_CLIENT_EXTRA_FLAGS
+ value: --tls {{ if .Values.tls.mTLS.enabled }}--tlsCertificateKeyFile=/certs/mongodb.pem {{ end }}--tlsCAFile=/certs/mongodb-ca-cert
+ {{- end }}
+ {{- if .Values.extraEnvVars }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.extraEnvVars "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if or .Values.extraEnvVarsCM .Values.extraEnvVarsSecret }}
+ envFrom:
+ {{- if .Values.extraEnvVarsCM }}
+ - configMapRef:
+ name: {{ tpl .Values.extraEnvVarsCM . | quote }}
+ {{- end }}
+ {{- if .Values.extraEnvVarsSecret }}
+ - secretRef:
+ name: {{ tpl .Values.extraEnvVarsSecret . | quote }}
+ {{- end }}
+ {{- end }}
+ ports:
+ - name: mongodb
+ containerPort: {{ .Values.containerPorts.mongodb }}
+ {{- if not .Values.diagnosticMode.enabled }}
+ {{- if .Values.customLivenessProbe }}
+ livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.customLivenessProbe "context" $) | nindent 12 }}
+ {{- else if .Values.livenessProbe.enabled }}
+ livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.livenessProbe "enabled") "context" $) | nindent 12 }}
+ exec:
+ command:
+ - /bitnami/scripts/ping-mongodb.sh
+ {{- end }}
+ {{- end }}
+ {{- if not .Values.diagnosticMode.enabled }}
+ {{- if .Values.customReadinessProbe }}
+ readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.customReadinessProbe "context" $) | nindent 12 }}
+ {{- else if .Values.readinessProbe.enabled }}
+ readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.readinessProbe "enabled") "context" $) | nindent 12 }}
+ exec:
+ command:
+ - /bitnami/scripts/readiness-probe.sh
+ {{- end }}
+ {{- end }}
+ {{- if not .Values.diagnosticMode.enabled }}
+ {{- if .Values.customStartupProbe }}
+ startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.customStartupProbe "context" $) | nindent 12 }}
+ {{- else if .Values.startupProbe.enabled }}
+ startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.startupProbe "enabled") "context" $) | nindent 12 }}
+ exec:
+ command:
+ - /bitnami/scripts/startup-probe.sh
+ {{- end }}
+ {{- end }}
+ {{- if .Values.resources }}
+ resources: {{- toYaml .Values.resources | nindent 12 }}
+ {{- else if ne .Values.resourcesPreset "none" }}
+ resources: {{- include "common.resources.preset" (dict "type" .Values.resourcesPreset) | nindent 12 }}
+ {{- end }}
+ volumeMounts:
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ - name: empty-dir
+ mountPath: /opt/bitnami/mongodb/conf
+ subPath: app-conf-dir
+ - name: empty-dir
+ mountPath: /opt/bitnami/mongodb/tmp
+ subPath: app-tmp-dir
+ - name: empty-dir
+ mountPath: /opt/bitnami/mongodb/logs
+ subPath: app-logs-dir
+ - name: {{ .Values.persistence.name | default "datadir" }}
+ mountPath: {{ .Values.persistence.mountPath }}
+ subPath: {{ .Values.persistence.subPath }}
+ - name: common-scripts
+ mountPath: /bitnami/scripts
+ {{- if or .Values.initdbScriptsConfigMap .Values.initdbScripts }}
+ - name: custom-init-scripts
+ mountPath: /docker-entrypoint-initdb.d
+ {{- end }}
+ {{- if or .Values.configuration .Values.existingConfigmap }}
+ - name: config
+ mountPath: /opt/bitnami/mongodb/conf/mongodb.conf
+ subPath: mongodb.conf
+ {{- end }}
+ {{- if .Values.tls.enabled }}
+ - name: certs
+ mountPath: /certs
+ {{- end }}
+ {{- if .Values.extraVolumeMounts }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.extraVolumeMounts "context" $) | nindent 12 }}
+ {{- end }}
+ {{- if .Values.metrics.enabled }}
+ - name: metrics
+ image: {{ template "mongodb.metrics.image" . }}
+ imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }}
+ {{- if .Values.containerSecurityContext.enabled }}
+ securityContext: {{- omit .Values.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+ {{- end }}
+ {{- if .Values.diagnosticMode.enabled }}
+ command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+ {{- else if .Values.metrics.command }}
+ command: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.command "context" $) | nindent 12 }}
+ {{- else }}
+ command:
+ - /bin/bash
+ - -ec
+ {{- end }}
+ {{- if .Values.diagnosticMode.enabled }}
+ args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+ {{- else if .Values.metrics.args }}
+ args: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.args "context" $) | nindent 12 }}
+ {{- else }}
+ args:
+ - |
+ /bin/mongodb_exporter {{ include "mongodb.exporterArgs" $ }} --mongodb.direct-connect --mongodb.global-conn-pool --web.listen-address ":{{ .Values.metrics.containerPort }}" --mongodb.uri "{{ include "mongodb.mongodb_exporter.uri" . }}" {{ .Values.metrics.extraFlags }}
+ {{- end }}
+ env:
+ {{- if .Values.auth.enabled }}
+ {{- if not .Values.metrics.username }}
+ - name: MONGODB_ROOT_USER
+ value: {{ .Values.auth.rootUser | quote }}
+ - name: MONGODB_ROOT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-root-password
+ {{- else }}
+ - name: MONGODB_METRICS_USERNAME
+ value: {{ .Values.metrics.username | quote }}
+ - name: MONGODB_METRICS_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "mongodb.secretName" . }}
+ key: mongodb-metrics-password
+ {{- end }}
+ {{- end }}
+ volumeMounts:
+ - name: empty-dir
+ mountPath: /tmp
+ subPath: tmp-dir
+ {{- if .Values.tls.enabled }}
+ - name: certs
+ mountPath: /certs
+ {{- end }}
+ {{- if .Values.metrics.extraVolumeMounts }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.metrics.extraVolumeMounts "context" $) | nindent 12 }}
+ {{- end }}
+ ports:
+ - name: metrics
+ containerPort: {{ .Values.metrics.containerPort }}
+ {{- if not .Values.diagnosticMode.enabled }}
+ {{- if .Values.metrics.customLivenessProbe }}
+ livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customLivenessProbe "context" $) | nindent 12 }}
+ {{- else if .Values.metrics.livenessProbe.enabled }}
+ livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.livenessProbe "enabled") "context" $) | nindent 12 }}
+ httpGet:
+ path: /
+ port: metrics
+ {{- end }}
+ {{- if .Values.metrics.customReadinessProbe }}
+ readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customReadinessProbe "context" $) | nindent 12 }}
+ {{- else if .Values.metrics.readinessProbe.enabled }}
+ readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.readinessProbe "enabled") "context" $) | nindent 12 }}
+ httpGet:
+ path: /
+ port: metrics
+ {{- end }}
+ {{- if .Values.metrics.customStartupProbe }}
+ startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.metrics.customStartupProbe "context" $) | nindent 12 }}
+ {{- else if .Values.metrics.startupProbe.enabled }}
+ startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.metrics.startupProbe "enabled") "context" $) | nindent 12 }}
+ tcpSocket:
+ port: metrics
+ {{- end }}
+ {{- end }}
+ {{- if .Values.metrics.resources }}
+ resources: {{- toYaml .Values.metrics.resources | nindent 12 }}
+ {{- else if ne .Values.metrics.resourcesPreset "none" }}
+ resources: {{- include "common.resources.preset" (dict "type" .Values.metrics.resourcesPreset) | nindent 12 }}
+ {{- end }}
+ {{- end }}
+ {{- if .Values.sidecars }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.sidecars "context" $) | nindent 8 }}
+ {{- end }}
+ volumes:
+ - name: empty-dir
+ emptyDir: {}
+ - name: common-scripts
+ configMap:
+ name: {{ printf "%s-common-scripts" (include "mongodb.fullname" .) }}
+ defaultMode: 0550
+ {{- if or .Values.initdbScriptsConfigMap .Values.initdbScripts }}
+ - name: custom-init-scripts
+ configMap:
+ name: {{ template "mongodb.initdbScriptsCM" . }}
+ {{- end }}
+ {{- if or .Values.configuration .Values.existingConfigmap }}
+ - name: config
+ configMap:
+ name: {{ include "mongodb.configmapName" . }}
+ {{- end }}
+ {{- if .Values.extraVolumes }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.extraVolumes "context" $) | nindent 8 }}
+ {{- end }}
+ {{- if .Values.tls.enabled }}
+ - name: certs
+ emptyDir: {}
+ {{- if (include "mongodb.autoGenerateCerts" .) }}
+ - name: certs-volume
+ secret:
+ secretName: {{ template "mongodb.tlsSecretName" . }}
+ items:
+ - key: mongodb-ca-cert
+ path: mongodb-ca-cert
+ mode: 0600
+ - key: mongodb-ca-key
+ path: mongodb-ca-key
+ mode: 0600
+ {{- else }}
+ - name: mongodb-certs-0
+ secret:
+ secretName: {{ include "common.tplvalues.render" ( dict "value" .Values.tls.standalone.existingSecret "context" $) }}
+ defaultMode: 256
+ {{- end }}
+ {{- end }}
+ {{- if not .Values.persistence.enabled }}
+ - name: {{ .Values.persistence.name | default "datadir" }}
+ {{- if .Values.persistence.medium }}
+ emptyDir:
+ medium: {{ .Values.persistence.medium | quote }}
+ {{- else }}
+ emptyDir: {}
+ {{- end }}
+ {{- else if .Values.persistence.existingClaim }}
+ - name: {{ .Values.persistence.name | default "datadir" }}
+ persistentVolumeClaim:
+ claimName: {{ printf "%s" (tpl .Values.persistence.existingClaim .) }}
+ {{- else if not .Values.useStatefulSet }}
+ - name: {{ .Values.persistence.name | default "datadir" }}
+ persistentVolumeClaim:
+ claimName: {{ template "mongodb.fullname" . }}
+ {{- else }}
+ {{- if .Values.persistentVolumeClaimRetentionPolicy.enabled }}
+ persistentVolumeClaimRetentionPolicy:
+ whenDeleted: {{ .Values.persistentVolumeClaimRetentionPolicy.whenDeleted }}
+ whenScaled: {{ .Values.persistentVolumeClaimRetentionPolicy.whenScaled }}
+ {{- end }}
+ volumeClaimTemplates:
+ - metadata:
+ name: {{ .Values.persistence.name | default "datadir" }}
+ {{- if .Values.persistence.annotations }}
+ annotations: {{- include "common.tplvalues.render" (dict "value" .Values.persistence.annotations "context" $) | nindent 10 }}
+ {{- end }}
+ spec:
+ accessModes:
+ {{- range .Values.persistence.accessModes }}
+ - {{ . | quote }}
+ {{- end }}
+ resources:
+ requests:
+ storage: {{ .Values.persistence.size | quote }}
+ {{- if .Values.persistence.volumeClaimTemplates.selector }}
+ selector: {{- include "common.tplvalues.render" (dict "value" .Values.persistence.volumeClaimTemplates.selector "context" $) | nindent 10 }}
+ {{- end }}
+ {{ include "common.storage.class" (dict "persistence" .Values.persistence "global" .Values.global) }}
+ {{- end }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/standalone/pvc.yaml b/kubernetes/common/mongodb/templates/standalone/pvc.yaml
new file mode 100644
index 0000000000..d59bad918f
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/standalone/pvc.yaml
@@ -0,0 +1,31 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) (not (eq .Values.architecture "replicaset")) (not .Values.useStatefulSet) }}
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+ name: {{ include "mongodb.fullname" . }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+ annotations:
+ {{- if .Values.persistence.resourcePolicy }}
+ helm.sh/resource-policy: {{ .Values.persistence.resourcePolicy | quote }}
+ {{- end }}
+ {{- if or .Values.persistence.annotations .Values.commonAnnotations }}
+ {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.persistence.annotations .Values.commonAnnotations ) "context" . ) }}
+ {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }}
+ {{- end }}
+spec:
+ accessModes:
+ {{- range .Values.persistence.accessModes }}
+ - {{ . | quote }}
+ {{- end }}
+ resources:
+ requests:
+ storage: {{ .Values.persistence.size | quote }}
+ {{ include "common.storage.class" (dict "persistence" .Values.persistence "global" .Values.global) }}
+{{- end }}
diff --git a/kubernetes/common/mongodb/templates/standalone/svc.yaml b/kubernetes/common/mongodb/templates/standalone/svc.yaml
new file mode 100644
index 0000000000..5d0d03f3fb
--- /dev/null
+++ b/kubernetes/common/mongodb/templates/standalone/svc.yaml
@@ -0,0 +1,62 @@
+{{- /*
+Copyright VMware, Inc.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if not (eq .Values.architecture "replicaset") }}
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ include "mongodb.service.nameOverride" . }}
+ namespace: {{ include "mongodb.namespace" . | quote }}
+ labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+ {{- if or .Values.service.annotations .Values.commonAnnotations }}
+ {{- $annotations := include "common.tplvalues.merge" ( dict "values" ( list .Values.service.annotations .Values.commonAnnotations ) "context" . ) }}
+ annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $) | nindent 4 }}
+ {{- end }}
+spec:
+ type: {{ .Values.service.type }}
+ {{- if and (eq .Values.service.type "ClusterIP") .Values.service.clusterIP }}
+ clusterIP: {{ .Values.service.clusterIP }}
+ {{- end }}
+ {{- if and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerIP }}
+ loadBalancerIP: {{ .Values.service.loadBalancerIP }}
+ {{- end }}
+ {{- if and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerClass }}
+ loadBalancerClass: {{ .Values.service.loadBalancerClass }}
+ {{- end }}
+ {{- if .Values.service.externalIPs }}
+ externalIPs: {{ toYaml .Values.service.externalIPs | nindent 4 }}
+ {{- end }}
+ {{- if .Values.service.loadBalancerSourceRanges }}
+ loadBalancerSourceRanges: {{- toYaml .Values.service.loadBalancerSourceRanges | nindent 4 }}
+ {{- end }}
+ {{- if (eq .Values.service.type "LoadBalancer") }}
+ allocateLoadBalancerNodePorts: {{ .Values.service.allocateLoadBalancerNodePorts }}
+ {{- end }}
+ {{- if .Values.service.sessionAffinity }}
+ sessionAffinity: {{ .Values.service.sessionAffinity }}
+ {{- end }}
+ {{- if .Values.service.sessionAffinityConfig }}
+ sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.service.sessionAffinityConfig "context" $) | nindent 4 }}
+ {{- end }}
+ {{- if (or (eq .Values.service.type "LoadBalancer") (eq .Values.service.type "NodePort")) }}
+ externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy | quote }}
+ {{- end }}
+ ports:
+ - name: {{ .Values.service.portName | quote }}
+ port: {{ .Values.service.ports.mongodb }}
+ targetPort: mongodb
+ {{- if and (or (eq .Values.service.type "LoadBalancer") (eq .Values.service.type "NodePort")) .Values.service.nodePorts.mongodb }}
+ nodePort: {{ .Values.service.nodePorts.mongodb }}
+ {{- else if eq .Values.service.type "ClusterIP" }}
+ nodePort: null
+ {{- end }}
+ {{- if .Values.service.extraPorts }}
+ {{- include "common.tplvalues.render" (dict "value" .Values.service.extraPorts "context" $) | nindent 4 }}
+ {{- end }}
+ {{- $podLabels := include "common.tplvalues.merge" ( dict "values" ( list .Values.podLabels .Values.commonLabels ) "context" . ) }}
+ selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }}
+ app.kubernetes.io/component: mongodb
+{{- end }}