Allow to configure additional ConfigMaps for Gerrit pods

Some plugins may require to persist additional configuration outside
of $SITE/etc (e.g. the saml plugin).

This change allows to configure additional ConfigMaps that load files
into a subdirectory in the $SITE/data directory. A limitation of this
change is, that the pod has to be restarted, if the ConfigMap changes.
This could be improved in the future by using a sidecar that watches
for changes in the ConfigMaps.

Change-Id: I06c63cf3e3e77d245388a095d6b81d3dd20ead35
diff --git a/helm-charts/gerrit-replica/README.md b/helm-charts/gerrit-replica/README.md
index 843dfac..e2a74ce 100644
--- a/helm-charts/gerrit-replica/README.md
+++ b/helm-charts/gerrit-replica/README.md
@@ -347,30 +347,34 @@
 is mandatory, if access to the Gerrit replica is required!
 ***
 
-| Parameter                                     | Description                                                                                         | Default                                                                         |
-|-----------------------------------------------|-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------|
-| `gerritReplica.images.gerritInit`             | Image name of the Gerrit init container image                                                       | `k8s-gerrit/gerrit-init`                                                        |
-| `gerritReplica.images.gerritReplica`          | Image name of the Gerrit replica container image                                                    | `k8s-gerrit/gerrit-replica`                                                     |
-| `gerritReplica.replicas`                      | Number of pod replicas to deploy                                                                    | `1`                                                                             |
-| `gerritReplica.maxSurge`                      | Max. percentage or number of pods allowed to be scheduled above the desired number                  | `25%`                                                                           |
-| `gerritReplica.maxUnavailable`                | Max. percentage or number of pods allowed to be unavailable at a time                               | `100%`                                                                          |
-| `gerritReplica.livenessProbe`                 | Configuration of the liveness probe timings                                                         | `{initialDelaySeconds: 60, periodSeconds: 5}`                                   |
-| `gerritReplica.readinessProbe`                | Configuration of the readiness probe timings                                                        | `{initialDelaySeconds: 10, periodSeconds: 10}`                                  |
-| `gerritReplica.startupProbe`                  | Configuration of the startup probe timings                                                          | `{initialDelaySeconds: 10, periodSeconds: 5}`                                   |
-| `gerritReplica.resources`                     | Configure the amount of resources the pod requests/is allowed                                       | `requests.cpu: 1`                                                               |
-|                                               |                                                                                                     | `requests.memory: 5Gi`                                                          |
-|                                               |                                                                                                     | `limits.cpu: 1`                                                                 |
-|                                               |                                                                                                     | `limits.memory: 6Gi`                                                            |
-| `gerritReplica.networkPolicy.ingress`         | Custom ingress-network policy for gerrit-replica pods                                               | `nil`                                                                           |
-| `gerritReplica.networkPolicy.egress`          | Custom egress-network policy for gerrit-replica pods                                                | `nil`                                                                           |
-| `gerritReplica.service.type`                  | Which kind of Service to deploy                                                                     | `NodePort`                                                                      |
-| `gerritReplica.service.http.port`             | Port over which to expose HTTP                                                                      | `80`                                                                            |
-| `gerritReplica.service.ssh.enabled`           | Whether to enable SSH for the Gerrit replica                                                        | `false`                                                                         |
-| `gerritReplica.service.ssh.port`              | Port for SSH                                                                                        | `29418`                                                                         |
-| `gerritReplica.service.ssh.rsaKey`            | Private SSH key in RSA format                                                                       | `-----BEGIN RSA PRIVATE KEY-----`                                               |
-| `gerritReplica.keystore`                      | base64-encoded Java keystore (`cat keystore.jks | base64`) to be used by Gerrit, when using SSL     | `nil`                                                                           |
-| `gerritReplica.etc.config`                    | Map of config files (e.g. `gerrit.config`) that will be mounted to `$GERRIT_SITE/etc`by a ConfigMap | `{gerrit.config: ..., replication.config: ...}`[see here](#Gerrit-config-files) |
-| `gerritReplica.etc.secret`                    | Map of config files (e.g. `secure.config`) that will be mounted to `$GERRIT_SITE/etc`by a Secret    | `{secure.config: ...}` [see here](#Gerrit-config-files)                         |
+| Parameter                                      | Description                                                                                         | Default                                                                         |
+|------------------------------------------------|-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------|
+| `gerritReplica.images.gerritInit`              | Image name of the Gerrit init container image                                                       | `k8s-gerrit/gerrit-init`                                                        |
+| `gerritReplica.images.gerritReplica`           | Image name of the Gerrit replica container image                                                    | `k8s-gerrit/gerrit-replica`                                                     |
+| `gerritReplica.replicas`                       | Number of pod replicas to deploy                                                                    | `1`                                                                             |
+| `gerritReplica.maxSurge`                       | Max. percentage or number of pods allowed to be scheduled above the desired number                  | `25%`                                                                           |
+| `gerritReplica.maxUnavailable`                 | Max. percentage or number of pods allowed to be unavailable at a time                               | `100%`                                                                          |
+| `gerritReplica.livenessProbe`                  | Configuration of the liveness probe timings                                                         | `{initialDelaySeconds: 60, periodSeconds: 5}`                                   |
+| `gerritReplica.readinessProbe`                 | Configuration of the readiness probe timings                                                        | `{initialDelaySeconds: 10, periodSeconds: 10}`                                  |
+| `gerritReplica.startupProbe`                   | Configuration of the startup probe timings                                                          | `{initialDelaySeconds: 10, periodSeconds: 5}`                                   |
+| `gerritReplica.resources`                      | Configure the amount of resources the pod requests/is allowed                                       | `requests.cpu: 1`                                                               |
+|                                                |                                                                                                     | `requests.memory: 5Gi`                                                          |
+|                                                |                                                                                                     | `limits.cpu: 1`                                                                 |
+|                                                |                                                                                                     | `limits.memory: 6Gi`                                                            |
+| `gerritReplica.networkPolicy.ingress`          | Custom ingress-network policy for gerrit-replica pods                                               | `nil`                                                                           |
+| `gerritReplica.networkPolicy.egress`           | Custom egress-network policy for gerrit-replica pods                                                | `nil`                                                                           |
+| `gerritReplica.service.type`                   | Which kind of Service to deploy                                                                     | `NodePort`                                                                      |
+| `gerritReplica.service.http.port`              | Port over which to expose HTTP                                                                      | `80`                                                                            |
+| `gerritReplica.service.ssh.enabled`            | Whether to enable SSH for the Gerrit replica                                                        | `false`                                                                         |
+| `gerritReplica.service.ssh.port`               | Port for SSH                                                                                        | `29418`                                                                         |
+| `gerritReplica.service.ssh.rsaKey`             | Private SSH key in RSA format                                                                       | `-----BEGIN RSA PRIVATE KEY-----`                                               |
+| `gerritReplica.keystore`                       | base64-encoded Java keystore (`cat keystore.jks | base64`) to be used by Gerrit, when using SSL     | `nil`                                                                           |
+| `gerritReplica.etc.config`                     | Map of config files (e.g. `gerrit.config`) that will be mounted to `$GERRIT_SITE/etc`by a ConfigMap | `{gerrit.config: ..., replication.config: ...}`[see here](#Gerrit-config-files) |
+| `gerritReplica.etc.secret`                     | Map of config files (e.g. `secure.config`) that will be mounted to `$GERRIT_SITE/etc`by a Secret    | `{secure.config: ...}` [see here](#Gerrit-config-files)                         |
+| `gerritReplica.additionalConfigMaps`           | Allows to mount additional ConfigMaps into a subdirectory of `$SITE/data`                           | `[]`                                                                            |
+| `gerritReplica.additionalConfigMaps[*].name`   | Name of the ConfigMap                                                                               | `nil`                                                                           |
+| `gerritReplica.additionalConfigMaps[*].subDir` | Subdirectory under `$SITE/data` into which the files should be symlinked                            | `nil`                                                                           |
+| `gerritReplica.additionalConfigMaps[*].data`   | Data of the ConfigMap. If not set, secret has to be created manually                                | `nil`                                                                           |
 
 ### Gerrit config files
 
diff --git a/helm-charts/gerrit-replica/templates/gerrit-replica.configmap.yaml b/helm-charts/gerrit-replica/templates/gerrit-replica.configmap.yaml
index 12d591e..b95d77b 100644
--- a/helm-charts/gerrit-replica/templates/gerrit-replica.configmap.yaml
+++ b/helm-charts/gerrit-replica/templates/gerrit-replica.configmap.yaml
@@ -1,3 +1,5 @@
+{{- $root := . -}}
+
 apiVersion: v1
 kind: ConfigMap
 metadata:
@@ -50,3 +52,19 @@
     installAsLibrary:
 {{ toYaml .Values.gerritReplica.plugins.installAsLibrary | indent 6 }}
     {{- end }}
+{{- range .Values.gerritReplica.additionalConfigMaps -}}
+{{- if .data }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name:  {{ $root.Release.Name }}-{{ .name }}
+  labels:
+    app: gerrit-replica
+    chart: {{ template "gerrit-replica.chart" $root }}
+    heritage: {{ $root.Release.Service }}
+    release: {{ $root.Release.Name }}
+data:
+{{ toYaml .data | indent 2 }}
+{{- end }}
+{{- end }}
diff --git a/helm-charts/gerrit-replica/templates/gerrit-replica.deployment.yaml b/helm-charts/gerrit-replica/templates/gerrit-replica.deployment.yaml
index a0ab62d..8e95dec 100644
--- a/helm-charts/gerrit-replica/templates/gerrit-replica.deployment.yaml
+++ b/helm-charts/gerrit-replica/templates/gerrit-replica.deployment.yaml
@@ -1,3 +1,5 @@
+{{- $root := . -}}
+
 apiVersion: apps/v1
 kind: Deployment
 metadata:
@@ -70,6 +72,14 @@
           [ ! -L /var/gerrit/git ] && rm -rf /var/gerrit/git
           [ ! -L /var/gerrit/logs ] && rm -rf /var/gerrit/logs
           rm -f /var/gerrit/logs/gerrit.pid
+
+          if [ -d /var/gerrit/data ]; then
+            for link in $(find /var/gerrit/data -type l); do
+              if [[ $(readlink -f $link) == /var/mnt/data/* ]]; then
+                unlink $link
+              fi
+            done
+          fi
         volumeMounts:
         - name: gerrit-site
           mountPath: "/var/gerrit"
@@ -125,6 +135,16 @@
           mkdir -p /var/gerrit/etc
           symlink_config_to_site
 
+          mkdir -p /var/gerrit/data
+          if [ -d /var/mnt/data ]; then
+            {{- range .Values.gerritReplica.additionalConfigMaps }}
+            for file in $(find /var/mnt/data/{{ .subDir }} -type f); do
+              mkdir -p /var/gerrit/data/{{ .subDir }}
+              ln -sf $file /var/gerrit/data/{{ .subDir }}/$(basename $file)
+            done
+            {{- end }}
+          fi
+
           if [ ! -d /var/gerrit/git ]; then
             ln -sf /var/mnt/git /var/gerrit/
           fi
@@ -166,6 +186,10 @@
           mountPath: "/var/mnt/etc/config"
         - name: gerrit-replica-secure-config
           mountPath: "/var/mnt/etc/secret"
+        {{- range .Values.gerritReplica.additionalConfigMaps }}
+        - name: {{ .name }}
+          mountPath: "/var/mnt/data/{{ .subDir }}"
+        {{- end }}
       containers:
       - name: gerrit-replica
         image: {{ template "registry" . }}{{ .Values.gerritReplica.images.gerritReplica }}:{{ .Values.images.version }}
@@ -203,6 +227,10 @@
           mountPath: "/var/mnt/etc/config"
         - name: gerrit-replica-secure-config
           mountPath: "/var/mnt/etc/secret"
+        {{- range .Values.gerritReplica.additionalConfigMaps }}
+        - name: {{ .name }}
+          mountPath: "/var/mnt/data/{{ .subDir }}"
+        {{- end }}
         livenessProbe:
           httpGet:
             path: /config/server/healthcheck~status
@@ -314,3 +342,8 @@
         secret:
           secretName: {{ .Release.Name }}-promtail-secret
       {{- end }}
+      {{- range .Values.gerritReplica.additionalConfigMaps }}
+      - name: {{ .name }}
+        configMap:
+          name: {{ if .data }}{{ $root.Release.Name }}-{{ .name }}{{ else }}{{ .name }}{{ end }}
+      {{- end }}
diff --git a/helm-charts/gerrit-replica/values.yaml b/helm-charts/gerrit-replica/values.yaml
index aa97ffd..b138214 100644
--- a/helm-charts/gerrit-replica/values.yaml
+++ b/helm-charts/gerrit-replica/values.yaml
@@ -342,3 +342,9 @@
         # Only needed, if SSL is enabled.
         #[httpd]
         #  sslKeyPassword = gerrit
+
+  additionalConfigMaps:
+    # - name:
+    #   subDir:
+    #   data:
+    #     file.txt: test
diff --git a/helm-charts/gerrit/README.md b/helm-charts/gerrit/README.md
index dc12a04..d49dafd 100644
--- a/helm-charts/gerrit/README.md
+++ b/helm-charts/gerrit/README.md
@@ -232,39 +232,43 @@
 future.
 ***
 
-| Parameter                           | Description                                                                                         | Default                                                                                  |
-|-------------------------------------|-----------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------|
-| `gerrit.images.gerritInit`          | Image name of the Gerrit init container image                                                       | `k8s-gerrit/gerrit-init`                                                                 |
-| `gerrit.images.gerrit`              | Image name of the Gerrit container image                                                            | `k8s-gerrit/gerrit`                                                                      |
-| `gerrit.replicas`                   | Number of replica pods to deploy                                                                    | `1`                                                                                      |
-| `gerrit.updatePartition`            | Number of pods to update simultaneously                                                             | `1`                                                                                      |
-| `gerrit.resources`                  | Configure the amount of resources the pod requests/is allowed                                       | `requests.cpu: 1`                                                                        |
-|                                     |                                                                                                     | `requests.memory: 5Gi`                                                                   |
-|                                     |                                                                                                     | `limits.cpu: 1`                                                                          |
-|                                     |                                                                                                     | `limits.memory: 6Gi`                                                                     |
-| `gerrit.persistence.enabled`        | Whether to persist the Gerrit site                                                                  | `true`                                                                                   |
-| `gerrit.persistence.size`           | Storage size for persisted Gerrit site                                                              | `10Gi`                                                                                   |
-| `gerrit.livenessProbe`              | Configuration of the liveness probe timings                                                         | `{initialDelaySeconds: 30, periodSeconds: 5}`                                            |
-| `gerrit.readinessProbe`             | Configuration of the readiness probe timings                                                        | `{initialDelaySeconds: 5, periodSeconds: 1}`                                             |
-| `gerrit.startupProbe`               | Configuration of the startup probe timings                                                          | `{initialDelaySeconds: 10, periodSeconds: 5}`                                            |
-| `gerrit.networkPolicy.ingress`      | Custom ingress-network policy for gerrit pods                                                       | `nil`                                                                                    |
-| `gerrit.networkPolicy.egress`       | Custom egress-network policy for gerrit pods                                                        | `nil`                                                                                    |
-| `gerrit.service.type`               | Which kind of Service to deploy                                                                     | `NodePort`                                                                               |
-| `gerrit.service.http.port`          | Port over which to expose HTTP                                                                      | `80`                                                                                     |
-| `gerrit.service.ssh.enabled`        | Whether to enable SSH                                                                               | `false`                                                                                  |
-| `gerrit.service.ssh.port`           | Port over which to expose SSH                                                                       | `29418`                                                                                  |
-| `gerrit.service.ssh.rsaKey`         | Private SSH key in RSA format                                                                       | `-----BEGIN RSA PRIVATE KEY-----`                                                        |
-| `gerrit.keystore`                   | base64-encoded Java keystore (`cat keystore.jks | base64`) to be used by Gerrit, when using SSL     | `nil`                                                                                    |
-| `gerrit.index.type`                 | Index type used by Gerrit (either `lucene` or `elasticsearch`)                                      | `lucene`                                                                                 |
-| `gerrit.plugins.packaged`           | List of Gerrit plugins that are packaged into the Gerrit-war-file to install                        | `["commit-message-length-validator", "download-commands", "replication", "reviewnotes"]` |
-| `gerrit.plugins.downloaded`         | List of Gerrit plugins that will be downloaded                                                      | `nil`                                                                                    |
-| `gerrit.plugins.downloaded[0].name` | Name of plugin                                                                                      | `nil`                                                                                    |
-| `gerrit.plugins.downloaded[0].url`  | Download url of plugin                                                                              | `nil`                                                                                    |
-| `gerrit.plugins.downloaded[0].sha1` | SHA1 sum of plugin jar used to ensure file integrity and version (optional)                         | `nil`                                                                                    |
-| `gerrit.plugins.cache.enabled`      | Whether to cache downloaded plugins                                                                 | `false`                                                                                  |
-| `gerrit.plugins.cache.size`         | Size of the volume used to store cached plugins                                                     | `1Gi`                                                                                    |
-| `gerrit.etc.config`                 | Map of config files (e.g. `gerrit.config`) that will be mounted to `$GERRIT_SITE/etc`by a ConfigMap | `{gerrit.config: ..., replication.config: ...}`[see here](#Gerrit-config-files)          |
-| `gerrit.etc.secret`                 | Map of config files (e.g. `secure.config`) that will be mounted to `$GERRIT_SITE/etc`by a Secret    | `{secure.config: ...}` [see here](#Gerrit-config-files)                                  |
+| Parameter                               | Description                                                                                         | Default                                                                                  |
+|-----------------------------------------|-----------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------|
+| `gerrit.images.gerritInit`              | Image name of the Gerrit init container image                                                       | `k8s-gerrit/gerrit-init`                                                                 |
+| `gerrit.images.gerrit`                  | Image name of the Gerrit container image                                                            | `k8s-gerrit/gerrit`                                                                      |
+| `gerrit.replicas`                       | Number of replica pods to deploy                                                                    | `1`                                                                                      |
+| `gerrit.updatePartition`                | Number of pods to update simultaneously                                                             | `1`                                                                                      |
+| `gerrit.resources`                      | Configure the amount of resources the pod requests/is allowed                                       | `requests.cpu: 1`                                                                        |
+|                                         |                                                                                                     | `requests.memory: 5Gi`                                                                   |
+|                                         |                                                                                                     | `limits.cpu: 1`                                                                          |
+|                                         |                                                                                                     | `limits.memory: 6Gi`                                                                     |
+| `gerrit.persistence.enabled`            | Whether to persist the Gerrit site                                                                  | `true`                                                                                   |
+| `gerrit.persistence.size`               | Storage size for persisted Gerrit site                                                              | `10Gi`                                                                                   |
+| `gerrit.livenessProbe`                  | Configuration of the liveness probe timings                                                         | `{initialDelaySeconds: 30, periodSeconds: 5}`                                            |
+| `gerrit.readinessProbe`                 | Configuration of the readiness probe timings                                                        | `{initialDelaySeconds: 5, periodSeconds: 1}`                                             |
+| `gerrit.startupProbe`                   | Configuration of the startup probe timings                                                          | `{initialDelaySeconds: 10, periodSeconds: 5}`                                            |
+| `gerrit.networkPolicy.ingress`          | Custom ingress-network policy for gerrit pods                                                       | `nil`                                                                                    |
+| `gerrit.networkPolicy.egress`           | Custom egress-network policy for gerrit pods                                                        | `nil`                                                                                    |
+| `gerrit.service.type`                   | Which kind of Service to deploy                                                                     | `NodePort`                                                                               |
+| `gerrit.service.http.port`              | Port over which to expose HTTP                                                                      | `80`                                                                                     |
+| `gerrit.service.ssh.enabled`            | Whether to enable SSH                                                                               | `false`                                                                                  |
+| `gerrit.service.ssh.port`               | Port over which to expose SSH                                                                       | `29418`                                                                                  |
+| `gerrit.service.ssh.rsaKey`             | Private SSH key in RSA format                                                                       | `-----BEGIN RSA PRIVATE KEY-----`                                                        |
+| `gerrit.keystore`                       | base64-encoded Java keystore (`cat keystore.jks | base64`) to be used by Gerrit, when using SSL     | `nil`                                                                                    |
+| `gerrit.index.type`                     | Index type used by Gerrit (either `lucene` or `elasticsearch`)                                      | `lucene`                                                                                 |
+| `gerrit.plugins.packaged`               | List of Gerrit plugins that are packaged into the Gerrit-war-file to install                        | `["commit-message-length-validator", "download-commands", "replication", "reviewnotes"]` |
+| `gerrit.plugins.downloaded`             | List of Gerrit plugins that will be downloaded                                                      | `nil`                                                                                    |
+| `gerrit.plugins.downloaded[0].name`     | Name of plugin                                                                                      | `nil`                                                                                    |
+| `gerrit.plugins.downloaded[0].url`      | Download url of plugin                                                                              | `nil`                                                                                    |
+| `gerrit.plugins.downloaded[0].sha1`     | SHA1 sum of plugin jar used to ensure file integrity and version (optional)                         | `nil`                                                                                    |
+| `gerrit.plugins.cache.enabled`          | Whether to cache downloaded plugins                                                                 | `false`                                                                                  |
+| `gerrit.plugins.cache.size`             | Size of the volume used to store cached plugins                                                     | `1Gi`                                                                                    |
+| `gerrit.etc.config`                     | Map of config files (e.g. `gerrit.config`) that will be mounted to `$GERRIT_SITE/etc`by a ConfigMap | `{gerrit.config: ..., replication.config: ...}`[see here](#Gerrit-config-files)          |
+| `gerrit.etc.secret`                     | Map of config files (e.g. `secure.config`) that will be mounted to `$GERRIT_SITE/etc`by a Secret    | `{secure.config: ...}` [see here](#Gerrit-config-files)                                  |
+| `gerrit.additionalConfigMaps`           | Allows to mount additional ConfigMaps into a subdirectory of `$SITE/data`                           | `[]`                                                                                     |
+| `gerrit.additionalConfigMaps[*].name`   | Name of the ConfigMap                                                                               | `nil`                                                                                    |
+| `gerrit.additionalConfigMaps[*].subDir` | Subdirectory under `$SITE/data` into which the files should be symlinked                            | `nil`                                                                                    |
+| `gerrit.additionalConfigMaps[*].data`   | Data of the ConfigMap. If not set, secret has to be created manually                                | `nil`                                                                                    |
 
 ### Gerrit config files
 
diff --git a/helm-charts/gerrit/templates/gerrit.configmap.yaml b/helm-charts/gerrit/templates/gerrit.configmap.yaml
index b4ec036..1375c79 100644
--- a/helm-charts/gerrit/templates/gerrit.configmap.yaml
+++ b/helm-charts/gerrit/templates/gerrit.configmap.yaml
@@ -1,3 +1,5 @@
+{{- $root := . -}}
+
 apiVersion: v1
 kind: ConfigMap
 metadata:
@@ -50,3 +52,19 @@
     installAsLibrary:
 {{ toYaml .Values.gerrit.plugins.installAsLibrary | indent 6 }}
     {{- end }}
+{{- range .Values.gerrit.additionalConfigMaps -}}
+{{- if .data }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name:  {{ $root.Release.Name }}-{{ .name }}
+  labels:
+    app: gerrit
+    chart: {{ template "gerrit.chart" $root }}
+    heritage: {{ $root.Release.Service }}
+    release: {{ $root.Release.Name }}
+data:
+{{ toYaml .data | indent 2 }}
+{{- end }}
+{{- end }}
diff --git a/helm-charts/gerrit/templates/gerrit.stateful-set.yaml b/helm-charts/gerrit/templates/gerrit.stateful-set.yaml
index 4334e60..aaaa8e4 100644
--- a/helm-charts/gerrit/templates/gerrit.stateful-set.yaml
+++ b/helm-charts/gerrit/templates/gerrit.stateful-set.yaml
@@ -1,3 +1,5 @@
+{{- $root := . -}}
+
 apiVersion: apps/v1
 kind: StatefulSet
 metadata:
@@ -49,6 +51,14 @@
             [ ! -L /var/gerrit/$dir ] && rm -rf /var/gerrit/$dir
           done
           rm -f /var/gerrit/logs/gerrit.pid
+
+          if [ -d /var/gerrit/data ]; then
+            for link in $(find /var/gerrit/data -type l); do
+              if [[ $(readlink -f $link) == /var/mnt/data/* ]]; then
+                unlink $link
+              fi
+            done
+          fi
         volumeMounts:
         - name: gerrit-site
           mountPath: "/var/gerrit"
@@ -69,6 +79,16 @@
           mkdir -p /var/gerrit/etc
           symlink_config_to_site
 
+          mkdir -p /var/gerrit/data
+          if [ -d /var/mnt/data ]; then
+            {{- range .Values.gerrit.additionalConfigMaps }}
+            for file in $(find /var/mnt/data/{{ .subDir }} -type f); do
+              mkdir -p /var/gerrit/data/{{ .subDir }}
+              ln -sf $file /var/gerrit/data/{{ .subDir }}/$(basename $file)
+            done
+            {{- end }}
+          fi
+
           for dir in git {{ if eq .Values.gerrit.index.type "elasticsearch" }}index{{ end }}; do
             if [ ! -d /var/gerrit/$dir ]; then
               ln -sf /var/mnt/$dir /var/gerrit/
@@ -123,6 +143,10 @@
           subPath: ca.crt
           mountPath: "/var/config/ca.crt"
         {{- end }}
+        {{- range .Values.gerrit.additionalConfigMaps }}
+        - name: {{ .name }}
+          mountPath: "/var/mnt/data/{{ .subDir }}"
+        {{- end }}
       containers:
       - name: gerrit
         image: {{ template "registry" . }}{{ .Values.gerrit.images.gerrit }}:{{ .Values.images.version }}
@@ -147,6 +171,10 @@
           mountPath: "/var/mnt/etc/config"
         - name: gerrit-secure-config
           mountPath: "/var/mnt/etc/secret"
+        {{- range .Values.gerrit.additionalConfigMaps }}
+        - name: {{ .name }}
+          mountPath: "/var/mnt/data/{{ .subDir }}"
+        {{- end }}
         resources:
 {{ toYaml .Values.gerrit.resources | indent 10 }}
         livenessProbe:
@@ -200,6 +228,11 @@
         secret:
           secretName: {{ .Release.Name }}-tls-ca
       {{- end }}
+      {{- range .Values.gerrit.additionalConfigMaps }}
+      - name: {{ .name }}
+        configMap:
+          name: {{ if .data }}{{ $root.Release.Name }}-{{ .name }}{{ else }}{{ .name }}{{ end }}
+      {{- end }}
   volumeClaimTemplates:
   {{ if .Values.gerrit.persistence.enabled -}}
   - metadata:
diff --git a/helm-charts/gerrit/values.yaml b/helm-charts/gerrit/values.yaml
index cc43bcf..96aa839 100644
--- a/helm-charts/gerrit/values.yaml
+++ b/helm-charts/gerrit/values.yaml
@@ -258,3 +258,9 @@
         # [remote "replica"]
         # username = git
         # password = secret
+
+  additionalConfigMaps:
+    # - name:
+    #   subDir:
+    #   data:
+    #     file.txt: test