Allow to persist H2 databases of Gerrit master

If using a H2-database for Gerrit, it was not persisted, leading to
data-loss, if the pod was restarted.

This change adds the option to persist the H2 databases stored in the
<Gerrit site>/db-directory.

Change-Id: I918898bed7e9e8b464fc5b2dc322362386ae9cea
diff --git a/helm-charts/gerrit-master/README.md b/helm-charts/gerrit-master/README.md
index c6e2405..1ae4497 100644
--- a/helm-charts/gerrit-master/README.md
+++ b/helm-charts/gerrit-master/README.md
@@ -146,27 +146,29 @@
 is mandatory, if access to Gerrit is required!
 ***
 
-| Parameter                                  | Description                                                                                     | Default                           |
-|--------------------------------------------|-------------------------------------------------------------------------------------------------|-----------------------------------|
-| `gerritMaster.images.gerritInit`           | Image name of the Gerrit init container image                                                   | `k8s-gerrit/gerrit-slave-init`    |
-| `gerritMaster.images.gerritMaster`         | Image name of the Gerrit master container image                                                 | `k8s-gerrit/gerrit-master`        |
-| `gerritMaster.resources`                   | Configure the amount of resources the pod requests/is allowed                                   | `requests.cpu: 1`                 |
-|                                            |                                                                                                 | `requests.memory: 5Gi`            |
-|                                            |                                                                                                 | `limits.cpu: 1`                   |
-|                                            |                                                                                                 | `limits.memory: 6Gi`              |
-| `gerritMaster.logging.persistence.enabled` | Whether to persist logs                                                                         | `true`                            |
-| `gerritMaster.logging.persistence.size`    | Storage size for persisted logs                                                                 | `1Gi`                             |
-| `gerritMaster.service.type`                | Which kind of Service to deploy                                                                 | `NodePort`                        |
-| `gerritMaster.service.http.port`           | Port over which to expose HTTP                                                                  | `80`                              |
-| `gerritMaster.ingress.host`                | REQUIRED: Host name to use for the Ingress (required for Ingress)                               | `nil`                             |
-| `gerritMaster.ingress.alias`               | Optional: ALias host name for the Ingress                                                       | `nil`                             |
-| `gerritMaster.ingress.tls.enabled`         | Whether to enable TLS termination in the Ingress                                                | `false`                           |
-| `gerritMaster.ingress.tls.cert`            | Public SSL server certificate                                                                   | `-----BEGIN CERTIFICATE-----`     |
-| `gerritMaster.ingress.tls.key`             | Private SSL server certificate                                                                  | `-----BEGIN RSA PRIVATE KEY-----` |
-| `gerritMaster.keystore`                    | base64-encoded Java keystore (`cat keystore.jks | base64`) to be used by Gerrit, when using SSL | `nil`                             |
-| `gerritMaster.config.gerrit`               | The contents of the gerrit.config                                                               | [see here](#Gerrit-config-files)  |
-| `gerritMaster.config.secure`               | The contents of the secure.config                                                               | [see here](#Gerrit-config-files)  |
-| `gerritMaster.config.replication`          | The contents of the replication.config                                                          | [see here](#Gerrit-config-files)  |
+| Parameter                                     | Description                                                                                     | Default                           |
+|-----------------------------------------------|-------------------------------------------------------------------------------------------------|-----------------------------------|
+| `gerritMaster.images.gerritInit`              | Image name of the Gerrit init container image                                                   | `k8s-gerrit/gerrit-slave-init`    |
+| `gerritMaster.images.gerritMaster`            | Image name of the Gerrit master container image                                                 | `k8s-gerrit/gerrit-master`        |
+| `gerritMaster.resources`                      | Configure the amount of resources the pod requests/is allowed                                   | `requests.cpu: 1`                 |
+|                                               |                                                                                                 | `requests.memory: 5Gi`            |
+|                                               |                                                                                                 | `limits.cpu: 1`                   |
+|                                               |                                                                                                 | `limits.memory: 6Gi`              |
+| `gerritMaster.logging.persistence.enabled`    | Whether to persist logs                                                                         | `true`                            |
+| `gerritMaster.logging.persistence.size`       | Storage size for persisted logs                                                                 | `1Gi`                             |
+| `gerritMaster.h2Database.persistence.enabled` | Whether to persist h2 databases                                                                 | `true`                            |
+| `gerritMaster.h2Database.persistence.size`    | Storage size for persisted h2 databases                                                         | `1Gi`                             |
+| `gerritMaster.service.type`                   | Which kind of Service to deploy                                                                 | `NodePort`                        |
+| `gerritMaster.service.http.port`              | Port over which to expose HTTP                                                                  | `80`                              |
+| `gerritMaster.ingress.host`                   | REQUIRED: Host name to use for the Ingress (required for Ingress)                               | `nil`                             |
+| `gerritMaster.ingress.alias`                  | Optional: ALias host name for the Ingress                                                       | `nil`                             |
+| `gerritMaster.ingress.tls.enabled`            | Whether to enable TLS termination in the Ingress                                                | `false`                           |
+| `gerritMaster.ingress.tls.cert`               | Public SSL server certificate                                                                   | `-----BEGIN CERTIFICATE-----`     |
+| `gerritMaster.ingress.tls.key`                | Private SSL server certificate                                                                  | `-----BEGIN RSA PRIVATE KEY-----` |
+| `gerritMaster.keystore`                       | base64-encoded Java keystore (`cat keystore.jks | base64`) to be used by Gerrit, when using SSL | `nil`                             |
+| `gerritMaster.config.gerrit`                  | The contents of the gerrit.config                                                               | [see here](#Gerrit-config-files)  |
+| `gerritMaster.config.secure`                  | The contents of the secure.config                                                               | [see here](#Gerrit-config-files)  |
+| `gerritMaster.config.replication`             | The contents of the replication.config                                                          | [see here](#Gerrit-config-files)  |
 
 ### Gerrit config files
 
diff --git a/helm-charts/gerrit-master/templates/gerrit-master.deployment.yaml b/helm-charts/gerrit-master/templates/gerrit-master.deployment.yaml
index 356e779..d4b5e90 100644
--- a/helm-charts/gerrit-master/templates/gerrit-master.deployment.yaml
+++ b/helm-charts/gerrit-master/templates/gerrit-master.deployment.yaml
@@ -78,6 +78,8 @@
         ports:
         - containerPort: 8080
         volumeMounts:
+        - name: gerrit-db
+          mountPath: "/var/gerrit/db"
         - name: git-filesystem
           mountPath: "/var/gerrit/git"
         - name: gerrit-logs
@@ -99,6 +101,13 @@
         resources:
 {{ toYaml .Values.gerritMaster.resources | indent 10 }}
       volumes:
+      - name: gerrit-db
+        {{ if .Values.gerritMaster.h2Database.persistence.enabled -}}
+        persistentVolumeClaim:
+          claimName: {{ .Release.Name }}-gerrit-master-db-pvc
+        {{ else -}}
+        emptyDir: {}
+        {{- end }}
       - name: git-filesystem
         persistentVolumeClaim:
           claimName: {{ .Release.Name }}-git-filesystem-pvc
diff --git a/helm-charts/gerrit-master/templates/gerrit-master.storage.yaml b/helm-charts/gerrit-master/templates/gerrit-master.storage.yaml
index 70f70f5..3d4db07 100644
--- a/helm-charts/gerrit-master/templates/gerrit-master.storage.yaml
+++ b/helm-charts/gerrit-master/templates/gerrit-master.storage.yaml
@@ -15,4 +15,23 @@
     requests:
       storage: {{ .Values.gerritMaster.logging.persistence.size }}
   storageClassName: {{ .Values.storageClasses.default.name }}
+{{- end }}
+---
+{{ if .Values.gerritMaster.h2Database.persistence.enabled -}}
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+  name: {{ .Release.Name }}-gerrit-master-db-pvc
+  labels:
+    app: gerrit-master
+    chart: {{ template "gerrit-master.chart" . }}
+    heritage: {{ .Release.Service }}
+    release: {{ .Release.Name }}
+spec:
+  accessModes:
+  - ReadWriteOnce
+  resources:
+    requests:
+      storage: {{ .Values.gerritMaster.h2Database.persistence.size }}
+  storageClassName: {{ .Values.storageClasses.default.name }}
 {{- end }}
\ No newline at end of file
diff --git a/helm-charts/gerrit-master/values.yaml b/helm-charts/gerrit-master/values.yaml
index a6cfa9a..30a9cc3 100644
--- a/helm-charts/gerrit-master/values.yaml
+++ b/helm-charts/gerrit-master/values.yaml
@@ -89,6 +89,11 @@
     http:
       port: 80
 
+  h2Database:
+    persistence:
+      enabled: true
+      size: 1Gi
+
   ingress:
     host:
     # Provide a second host name used as an alias. Leave empty, if no alias is
diff --git a/helm-charts/gerrit-slave/README.md b/helm-charts/gerrit-slave/README.md
index 8041dc5..44e4cef 100644
--- a/helm-charts/gerrit-slave/README.md
+++ b/helm-charts/gerrit-slave/README.md
@@ -195,27 +195,29 @@
 is mandatory, if access to the Gerrit slave is required!
 ***
 
-| Parameter                                 | Description                                                                                                              | Default                           |
-|-------------------------------------------|--------------------------------------------------------------------------------------------------------------------------|-----------------------------------|
-| `gerritMaster.images.gerritInit`          | Image name of the Gerrit init container image                                                                            | `k8s-gerrit/gerrit-slave-init`    |
-| `gerritMaster.images.gerritSlave`         | Image name of the Gerrit slave container image                                                                           | `k8s-gerrit/gerrit-slave`         |
-| `gerritSlave.initializeTestSite.enabled`  | Enable the initialization of a site. USE ONLY for testing, if you do not plan to replicate repositories or the database. | `true`                            |
-| `gerritSlave.resources`                   | Configure the amount of resources the pod requests/is allowed                                                            | `requests.cpu: 1`                 |
-|                                           |                                                                                                                          | `requests.memory: 5Gi`            |
-|                                           |                                                                                                                          | `limits.cpu: 1`                   |
-|                                           |                                                                                                                          | `limits.memory: 6Gi`              |
-| `gerritSlave.logging.persistence.enabled` | Whether to persist logs                                                                                                  | `true`                            |
-| `gerritSlave.logging.persistence.size`    | Storage size for persisted logs                                                                                          | `1Gi`                             |
-| `gerritSlave.service.type`                | Which kind of Service to deploy                                                                                          | `NodePort`                        |
-| `gerritSlave.service.http.port`           | Port over which to expose HTTP                                                                                           | `80`                              |
-| `gerritSlave.ingress.host`                | REQUIRED: Host name to use for the Ingress (required for Ingress)                                                        | `nil`                             |
-| `gerritSlave.ingress.alias`               | Optional: Alias host name for the Ingress                                                                                | `nil`                             |
-| `gerritSlave.ingress.tls.enabled`         | Whether to enable TLS termination in the Ingress                                                                         | `false`                           |
-| `gerritSlave.ingress.tls.cert`            | Public SSL server certificate                                                                                            | `-----BEGIN CERTIFICATE-----`     |
-| `gerritSlave.ingress.tls.key`             | Private SSL server certificate                                                                                           | `-----BEGIN RSA PRIVATE KEY-----` |
-| `gerritSlave.keystore`                    | base64-encoded Java keystore (`cat keystore.jks | base64`) to be used by Gerrit, when using SSL                          | `nil`                             |
-| `gerritSlave.config.gerrit`               | The contents of the gerrit.config                                                                                        | [see here](#Gerrit-config-files)  |
-| `gerritSlave.config.secure`               | The contents of the secure.config                                                                                        | [see here](#Gerrit-config-files)  |
+| Parameter                                    | Description                                                                                                              | Default                           |
+|----------------------------------------------|--------------------------------------------------------------------------------------------------------------------------|-----------------------------------|
+| `gerritMaster.images.gerritInit`             | Image name of the Gerrit init container image                                                                            | `k8s-gerrit/gerrit-slave-init`    |
+| `gerritMaster.images.gerritSlave`            | Image name of the Gerrit slave container image                                                                           | `k8s-gerrit/gerrit-slave`         |
+| `gerritSlave.initializeTestSite.enabled`     | Enable the initialization of a site. USE ONLY for testing, if you do not plan to replicate repositories or the database. | `true`                            |
+| `gerritSlave.resources`                      | Configure the amount of resources the pod requests/is allowed                                                            | `requests.cpu: 1`                 |
+|                                              |                                                                                                                          | `requests.memory: 5Gi`            |
+|                                              |                                                                                                                          | `limits.cpu: 1`                   |
+|                                              |                                                                                                                          | `limits.memory: 6Gi`              |
+| `gerritSlave.logging.persistence.enabled`    | Whether to persist logs                                                                                                  | `true`                            |
+| `gerritSlave.logging.persistence.size`       | Storage size for persisted logs                                                                                          | `1Gi`                             |
+| `gerritSlave.h2Database.persistence.enabled` | Whether to persist h2 databases                                                                                          | `true`                            |
+| `gerritSlave.h2Database.persistence.size`    | Storage size for persisted h2 databases                                                                                  | `1Gi`                             |
+| `gerritSlave.service.type`                   | Which kind of Service to deploy                                                                                          | `NodePort`                        |
+| `gerritSlave.service.http.port`              | Port over which to expose HTTP                                                                                           | `80`                              |
+| `gerritSlave.ingress.host`                   | REQUIRED: Host name to use for the Ingress (required for Ingress)                                                        | `nil`                             |
+| `gerritSlave.ingress.alias`                  | Optional: Alias host name for the Ingress                                                                                | `nil`                             |
+| `gerritSlave.ingress.tls.enabled`            | Whether to enable TLS termination in the Ingress                                                                         | `false`                           |
+| `gerritSlave.ingress.tls.cert`               | Public SSL server certificate                                                                                            | `-----BEGIN CERTIFICATE-----`     |
+| `gerritSlave.ingress.tls.key`                | Private SSL server certificate                                                                                           | `-----BEGIN RSA PRIVATE KEY-----` |
+| `gerritSlave.keystore`                       | base64-encoded Java keystore (`cat keystore.jks | base64`) to be used by Gerrit, when using SSL                          | `nil`                             |
+| `gerritSlave.config.gerrit`                  | The contents of the gerrit.config                                                                                        | [see here](#Gerrit-config-files)  |
+| `gerritSlave.config.secure`                  | The contents of the secure.config                                                                                        | [see here](#Gerrit-config-files)  |
 
 ### Gerrit config files
 
diff --git a/helm-charts/gerrit-slave/templates/gerrit-slave.deployment.yaml b/helm-charts/gerrit-slave/templates/gerrit-slave.deployment.yaml
index 145996a..238c8bb 100644
--- a/helm-charts/gerrit-slave/templates/gerrit-slave.deployment.yaml
+++ b/helm-charts/gerrit-slave/templates/gerrit-slave.deployment.yaml
@@ -46,6 +46,8 @@
               name: {{ .Release.Name }}-gerrit-slave-configmap
               key: test-mode
         volumeMounts:
+        - name: gerrit-db
+          mountPath: "/var/gerrit/db"
         - name: git-filesystem
           mountPath: "/var/gerrit/git"
         - name: gerrit-logs
@@ -115,6 +117,8 @@
         ports:
         - containerPort: 8080
         volumeMounts:
+        - name: gerrit-db
+          mountPath: "/var/gerrit/db"
         - name: git-filesystem
           mountPath: "/var/gerrit/git"
         - name: gerrit-logs
@@ -133,6 +137,13 @@
         resources:
 {{ toYaml .Values.gerritSlave.resources | indent 10 }}
       volumes:
+      - name: gerrit-db
+        {{ if .Values.gerritSlave.h2Database.persistence.enabled -}}
+        persistentVolumeClaim:
+          claimName: {{ .Release.Name }}-gerrit-slave-db-pvc
+        {{ else -}}
+        emptyDir: {}
+        {{- end }}
       - name: git-filesystem
         persistentVolumeClaim:
           claimName: {{ .Release.Name }}-git-filesystem-pvc
diff --git a/helm-charts/gerrit-slave/templates/gerrit-slave.storage.yaml b/helm-charts/gerrit-slave/templates/gerrit-slave.storage.yaml
index 2f1d2ce..83cbba0 100644
--- a/helm-charts/gerrit-slave/templates/gerrit-slave.storage.yaml
+++ b/helm-charts/gerrit-slave/templates/gerrit-slave.storage.yaml
@@ -15,4 +15,23 @@
     requests:
       storage: {{ .Values.gerritSlave.logging.persistence.size }}
   storageClassName: {{ .Values.storageClasses.default.name }}
+{{- end }}
+---
+{{ if .Values.gerritSlave.h2Database.persistence.enabled -}}
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+  name: {{ .Release.Name }}-gerrit-slave-db-pvc
+  labels:
+    app: gerrit-slave
+    chart: {{ template "gerrit-slave.chart" . }}
+    heritage: {{ .Release.Service }}
+    release: {{ .Release.Name }}
+spec:
+  accessModes:
+  - ReadWriteOnce
+  resources:
+    requests:
+      storage: {{ .Values.gerritSlave.h2Database.persistence.size }}
+  storageClassName: {{ .Values.storageClasses.default.name }}
 {{- end }}
\ No newline at end of file
diff --git a/helm-charts/gerrit-slave/values.yaml b/helm-charts/gerrit-slave/values.yaml
index 43c804e..06a77f3 100644
--- a/helm-charts/gerrit-slave/values.yaml
+++ b/helm-charts/gerrit-slave/values.yaml
@@ -174,6 +174,11 @@
       enabled: true
       size: 1Gi
 
+  h2Database:
+    persistence:
+      enabled: true
+      size: 1Gi
+
   service:
     type: NodePort
     http: