Persist the Gerrit site in a single volume

So far most of the Gerrit site was stored in an EmptyDir-Volume and only
some parts were each persisted in a dedicated persistent volume. While
providing flexibility this approach would lead to a huge amount of
persistent volumes and could easily cause inconsistencies.

Now the whole Gerrit site except for the repositories are stored in
a single persistent volume. The default volume size is set to 10 Gb, but
can be configured in the helm-charts. This was changed for the gerrit-
master and the gerrit-slave chart.

The gerrit-init script will now check whether a gerrit.war is already
installed in the site, whether it has the same version as in the
container and whether new plugins should be installed or others
uninstalled and will initialize, if one of these conditions is not met.

Change-Id: I08ebd8d0166363ddffd0e182575d900649780ac1
diff --git a/container-images/gerrit-init/tools/gerrit_init.py b/container-images/gerrit-init/tools/gerrit_init.py
index c280683..85e34b7 100755
--- a/container-images/gerrit-init/tools/gerrit_init.py
+++ b/container-images/gerrit-init/tools/gerrit_init.py
@@ -15,7 +15,7 @@
 # limitations under the License.
 
 import argparse
-import os.path
+import os
 import subprocess
 import sys
 import time
@@ -32,15 +32,69 @@
   config = GitConfigParser(gerrit_config_path)
   return config.get_boolean("container.slave", False)
 
-def initialize_gerrit(gerrit_site_path, plugins):
+def get_gerrit_version(gerrit_war_path):
+  command = "java -jar %s version" % gerrit_war_path
+  version_process = subprocess.run(
+    command.split(),
+    stdout=subprocess.PIPE)
+  return version_process.stdout.decode().strip()
+
+def get_installed_plugins(gerrit_site_path):
+  plugin_path = os.path.join(gerrit_site_path, "plugins")
+  installed_plugins = set()
+
+  if os.path.exists(plugin_path):
+    for f in os.listdir(plugin_path):
+      if os.path.isfile(os.path.join(plugin_path, f)) and f.endswith(".jar"):
+        installed_plugins.add(os.path.splitext(f)[0])
+
+  return installed_plugins
+
+def remove_unwanted_plugins(gerrit_site_path, wanted_plugins):
+  installed_plugins = get_installed_plugins(gerrit_site_path)
+  for plugin in installed_plugins.difference(wanted_plugins):
+    print("%s: Removing plugin %s." % (time.ctime(), plugin))
+    os.remove(os.path.join(gerrit_site_path, "plugins", "%s.jar" % plugin))
+
+def needs_init(gerrit_site_path, wanted_plugins):
+  installed_war_path = os.path.join(gerrit_site_path, "bin", "gerrit.war")
+  if not os.path.exists(installed_war_path):
+    print("%s: Gerrit is not yet installed. Initializing new site." % time.ctime())
+    return True
+
+  installed_version = get_gerrit_version(installed_war_path)
+  provided_version = get_gerrit_version("/var/war/gerrit.war")
+  if installed_version != provided_version:
+    print((
+      "%s: New Gerrit version was provided (current: %s; new: %s). "
+      "Reinitializing site.") % (
+        time.ctime(),
+        installed_version,
+        provided_version))
+    return True
+
+  installed_plugins = get_installed_plugins(gerrit_site_path)
+  if wanted_plugins.difference(installed_plugins):
+    print("%s: Reininitializing site to install additional plugins." % time.ctime())
+    return True
+
+  print("%s: No initialization required." % time.ctime())
+  return False
+
+def initialize_gerrit(gerrit_site_path, wanted_plugins):
+  remove_unwanted_plugins(gerrit_site_path, wanted_plugins)
+
+  if not needs_init(gerrit_site_path, wanted_plugins):
+    return
+
   if os.path.exists(os.path.join(gerrit_site_path, "etc/gerrit.config")):
     print("%s: Existing gerrit.config found." % time.ctime())
     ensure_database_connection(gerrit_site_path)
   else:
     print("%s: No gerrit.config found. Initializing default site." % time.ctime())
 
-  if plugins:
-    plugin_options = ' '.join(['--install-plugin %s' % plugin for plugin in plugins])
+  if wanted_plugins:
+    plugin_options = ' '.join(['--install-plugin %s' % plugin for plugin in wanted_plugins])
   else:
     plugin_options = ''
 
@@ -76,9 +130,9 @@
     "-p",
     "--plugin",
     help="Gerrit plugin to be installed. Can be used multiple times.",
-    dest="plugins",
+    dest="wanted_plugins",
     action="append",
-    default=None)
+    default=list())
   args = parser.parse_args()
 
-  initialize_gerrit(args.site, args.plugins)
+  initialize_gerrit(args.site, set(args.wanted_plugins))
diff --git a/helm-charts/gerrit-master/README.md b/helm-charts/gerrit-master/README.md
index 40a405f..6cb5149 100644
--- a/helm-charts/gerrit-master/README.md
+++ b/helm-charts/gerrit-master/README.md
@@ -136,33 +136,30 @@
 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-init`          |
-| `gerritMaster.images.gerritMaster`            | Image name of the Gerrit master container image                                                 | `k8s-gerrit/gerrit-master`        |
-| `gerritMaster.replicas`                       | Number of replica pods to deploy                                                                | `1`                               |
-| `gerritMaster.maxSurge`                       | Max. percentage or number of pods allowed to be scheduled above the desired number              | `25%`                             |
-| `gerritMaster.maxUnavailable`                 | Max. percentage or number of pods allowed to be unavailable at a time                           | `100%`                            |
-| `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.maxBodySize`            | Maximum request body size allowed (Set to 0 for an unlimited request body size)                 | `50m`                             |
-| `gerritMaster.ingress.additionalAnnotations`  | Additional annotations 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-init`          |
+| `gerritMaster.images.gerritMaster`           | Image name of the Gerrit master container image                                                 | `k8s-gerrit/gerrit-master`        |
+| `gerritMaster.replicas`                      | Number of replica pods to deploy                                                                | `1`                               |
+| `gerritMaster.maxSurge`                      | Max. percentage or number of pods allowed to be scheduled above the desired number              | `25%`                             |
+| `gerritMaster.maxUnavailable`                | Max. percentage or number of pods allowed to be unavailable at a time                           | `100%`                            |
+| `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.persistence.enabled`           | Whether to persist the Gerrit site                                                              | `true`                            |
+| `gerritMaster.persistence.size`              | Storage size for persisted Gerrit site                                                          | `10Gi`                            |
+| `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.additionalAnnotations` | Additional annotations 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 b3120ea..45d79d9 100644
--- a/helm-charts/gerrit-master/templates/gerrit-master.deployment.yaml
+++ b/helm-charts/gerrit-master/templates/gerrit-master.deployment.yaml
@@ -40,8 +40,8 @@
         - |
           rm -f /var/gerrit/logs/gerrit.pid
         volumeMounts:
-        - name: gerrit-logs
-          mountPath: "/var/gerrit/logs"
+        - name: gerrit-site
+          mountPath: "/var/gerrit"
       - name: gerrit-init
         image: {{ template "registry" . }}{{ .Values.gerritMaster.images.gerritInit }}:{{ .Values.images.version }}
         imagePullPolicy: {{ .Values.images.imagePullPolicy }}
@@ -61,23 +61,19 @@
           mkdir -p /var/gerrit/etc
           symlink_config_to_site
 
-          if [ ! -f /var/gerrit/bin/gerrit.sh ]; then
-            /var/tools/gerrit_init.py \
-              -s /var/gerrit \
-              -p replication \
-              -p commit-message-length-validator \
-              -p download-commands \
-              -p reviewnotes
+          /var/tools/gerrit_init.py \
+            -s /var/gerrit \
+            -p replication \
+            -p commit-message-length-validator \
+            -p download-commands \
+            -p reviewnotes
 
-            symlink_config_to_site
-          fi
+          symlink_config_to_site
 
           /var/tools/validate_db.py -s /var/gerrit
         volumeMounts:
         - name: gerrit-site
           mountPath: "/var/gerrit"
-        - name: gerrit-db
-          mountPath: "/var/gerrit/db"
         - name: git-filesystem
           mountPath: "/var/gerrit/git"
         - name: gerrit-config
@@ -101,12 +97,8 @@
         volumeMounts:
         - name: gerrit-site
           mountPath: "/var/gerrit"
-        - name: gerrit-db
-          mountPath: "/var/gerrit/db"
         - name: git-filesystem
           mountPath: "/var/gerrit/git"
-        - name: gerrit-logs
-          mountPath: "/var/gerrit/logs"
         - name: gerrit-config
           mountPath: "/var/config/gerrit.config"
           subPath: gerrit.config
@@ -135,24 +127,15 @@
 {{ toYaml .Values.gerritMaster.readinessProbe | indent 10 }}
       volumes:
       - name: gerrit-site
-        emptyDir: {}
-      - name: gerrit-db
-        {{ if .Values.gerritMaster.h2Database.persistence.enabled -}}
+        {{ if .Values.gerritMaster.persistence.enabled -}}
         persistentVolumeClaim:
-          claimName: {{ .Release.Name }}-gerrit-master-db-pvc
+          claimName: {{ .Release.Name }}-gerrit-master-pvc
         {{ else -}}
         emptyDir: {}
         {{- end }}
       - name: git-filesystem
         persistentVolumeClaim:
           claimName: {{ .Release.Name }}-git-filesystem-pvc
-      - name: gerrit-logs
-        {{ if .Values.gerritMaster.logging.persistence.enabled -}}
-        persistentVolumeClaim:
-          claimName: {{ .Release.Name }}-gerrit-master-logs-pvc
-        {{ else -}}
-        emptyDir: {}
-        {{- end }}
       - name: gerrit-config
         configMap:
           name: {{ .Release.Name }}-gerrit-master-configmap
diff --git a/helm-charts/gerrit-master/templates/gerrit-master.storage.yaml b/helm-charts/gerrit-master/templates/gerrit-master.storage.yaml
index 3d4db07..2dc4f56 100644
--- a/helm-charts/gerrit-master/templates/gerrit-master.storage.yaml
+++ b/helm-charts/gerrit-master/templates/gerrit-master.storage.yaml
@@ -1,8 +1,8 @@
-{{ if .Values.gerritMaster.logging.persistence.enabled -}}
+{{ if .Values.gerritMaster.persistence.enabled -}}
 kind: PersistentVolumeClaim
 apiVersion: v1
 metadata:
-  name: {{ .Release.Name }}-gerrit-master-logs-pvc
+  name: {{ .Release.Name }}-gerrit-master-pvc
   labels:
     app: gerrit-master
     chart: {{ template "gerrit-master.chart" . }}
@@ -13,25 +13,6 @@
   - ReadWriteOnce
   resources:
     requests:
-      storage: {{ .Values.gerritMaster.logging.persistence.size }}
+      storage: {{ .Values.gerritMaster.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 e253904..ee533b1 100644
--- a/helm-charts/gerrit-master/values.yaml
+++ b/helm-charts/gerrit-master/values.yaml
@@ -85,6 +85,10 @@
       cpu: 1
       memory: 6Gi
 
+  persistence:
+    enabled: true
+    size: 10Gi
+
   livenessProbe:
     initialDelaySeconds: 30
     periodSeconds: 5
@@ -93,21 +97,11 @@
     initialDelaySeconds: 5
     periodSeconds: 1
 
-  logging:
-    persistence:
-      enabled: true
-      size: 1Gi
-
   service:
     type: NodePort
     http:
       port: 80
 
-  h2Database:
-    persistence:
-      enabled: true
-      size: 1Gi
-
   ingress:
     host:
     # The maximum body size to allow for requests. Use "0" to allow unlimited
diff --git a/helm-charts/gerrit-slave/README.md b/helm-charts/gerrit-slave/README.md
index 19f6064..1569c12 100644
--- a/helm-charts/gerrit-slave/README.md
+++ b/helm-charts/gerrit-slave/README.md
@@ -176,32 +176,30 @@
 is mandatory, if access to the Gerrit slave is required!
 ***
 
-| Parameter                                    | Description                                                                                                              | Default                           |
-|----------------------------------------------|--------------------------------------------------------------------------------------------------------------------------|-----------------------------------|
-| `gerritSlave.images.gerritInit`              | Image name of the Gerrit init container image                                                                            | `k8s-gerrit/gerrit-init`          |
-| `gerritSlave.images.gerritSlave`             | Image name of the Gerrit slave container image                                                                           | `k8s-gerrit/gerrit-slave`         |
-| `gerritSlave.replicas`                       | Number of pod replicas to deploy                                                                                         | `1`                               |
-| `gerritSlave.maxSurge`                       | Max. percentage or number of pods allowed to be scheduled above the desired number                                       | `25%`                             |
-| `gerritSlave.maxUnavailable`                 | Max. percentage or number of pods allowed to be unavailable at a time                                                    | `100%`                            |
-| `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.additionalAnnotations`  | Additional annotations 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                           |
+|---------------------------------------------|--------------------------------------------------------------------------------------------------------------------------|-----------------------------------|
+| `gerritSlave.images.gerritInit`             | Image name of the Gerrit init container image                                                                            | `k8s-gerrit/gerrit-init`          |
+| `gerritSlave.images.gerritSlave`            | Image name of the Gerrit slave container image                                                                           | `k8s-gerrit/gerrit-slave`         |
+| `gerritSlave.replicas`                      | Number of pod replicas to deploy                                                                                         | `1`                               |
+| `gerritSlave.maxSurge`                      | Max. percentage or number of pods allowed to be scheduled above the desired number                                       | `25%`                             |
+| `gerritSlave.maxUnavailable`                | Max. percentage or number of pods allowed to be unavailable at a time                                                    | `100%`                            |
+| `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.persistence.enabled`           | Whether to persist the Gerrit site                                                                                       | `true`                            |
+| `gerritSlave.persistence.size`              | Storage size for persisted Gerrit site                                                                                   | `10Gi`                            |
+| `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.additionalAnnotations` | Additional annotations 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 34982e4..03bb99f 100644
--- a/helm-charts/gerrit-slave/templates/gerrit-slave.deployment.yaml
+++ b/helm-charts/gerrit-slave/templates/gerrit-slave.deployment.yaml
@@ -40,10 +40,10 @@
         - |
           rm -f /var/gerrit/logs/gerrit.pid
         volumeMounts:
-        - name: gerrit-logs
-          mountPath: "/var/gerrit/logs"
+        - name: gerrit-site
+          mountPath: "/var/gerrit"
       {{ if not .Values.gerritSlave.initializeTestSite.enabled -}}
-      # Initialize the emptyDir containing the whole Gerrit-site with defaults
+      # Initialize the volume containing the whole Gerrit-site with defaults
       # Not needed, when running in test mode, since then the configured site will
       # be initialized
       - name: populate-gerrit-site-volume
@@ -54,16 +54,12 @@
         - -ce
         args:
         - |
-          if [ ! -f /var/gerrit/bin/gerrit.sh ]; then
-            /var/tools/gerrit_init.py \
-              -s /var/gerrit \
-              -p singleusergroup
-          fi
+          /var/tools/gerrit_init.py \
+            -s /var/gerrit \
+            -p singleusergroup
         volumeMounts:
         - name: gerrit-site
           mountPath: "/var/gerrit"
-        - name: gerrit-db
-          mountPath: "/var/gerrit/db"
       {{- end }}
       # Wait for database to be ready and, if configured, run initialization
       # taking the given Gerrit configuration and persisted volumes into account.
@@ -87,21 +83,19 @@
           symlink_config_to_site
 
           {{ if .Values.gerritSlave.initializeTestSite.enabled -}}
-          if [ ! -f /var/gerrit/bin/gerrit.sh ]; then
-            /var/tools/gerrit_init.py \
-              -s /var/gerrit \
-              -p singleusergroup
+          /var/tools/gerrit_init.py \
+            -s /var/gerrit \
+            -p singleusergroup
 
-            symlink_config_to_site
-          fi
+          symlink_config_to_site
           {{- end }}
 
           /var/tools/validate_db.py -s /var/gerrit
         volumeMounts:
         - name: gerrit-site
           mountPath: "/var/gerrit"
-        - name: gerrit-db
-          mountPath: "/var/gerrit/db"
+        - name: git-filesystem
+          mountPath: "/var/gerrit/git"
         - name: gerrit-config
           mountPath: "/var/config/gerrit.config"
           subPath: gerrit.config
@@ -122,12 +116,8 @@
         volumeMounts:
         - name: gerrit-site
           mountPath: "/var/gerrit"
-        - name: gerrit-db
-          mountPath: "/var/gerrit/db"
         - name: git-filesystem
           mountPath: "/var/gerrit/git"
-        - name: gerrit-logs
-          mountPath: "/var/gerrit/logs"
         - name: gerrit-config
           mountPath: "/var/config/gerrit.config"
           subPath: gerrit.config
@@ -143,24 +133,15 @@
 {{ toYaml .Values.gerritSlave.resources | indent 10 }}
       volumes:
       - name: gerrit-site
-        emptyDir: {}
-      - name: gerrit-db
-        {{ if .Values.gerritSlave.h2Database.persistence.enabled -}}
+        {{ if .Values.gerritSlave.persistence.enabled -}}
         persistentVolumeClaim:
-          claimName: {{ .Release.Name }}-gerrit-slave-db-pvc
+          claimName: {{ .Release.Name }}-gerrit-slave-pvc
         {{ else -}}
         emptyDir: {}
         {{- end }}
       - name: git-filesystem
         persistentVolumeClaim:
           claimName: {{ .Release.Name }}-git-filesystem-pvc
-      - name: gerrit-logs
-        {{ if .Values.gerritSlave.logging.persistence.enabled -}}
-        persistentVolumeClaim:
-          claimName: {{ .Release.Name }}-gerrit-slave-logs-pvc
-        {{ else -}}
-        emptyDir: {}
-        {{- end }}
       - name: gerrit-config
         configMap:
           name: {{ .Release.Name }}-gerrit-slave-configmap
diff --git a/helm-charts/gerrit-slave/templates/gerrit-slave.storage.yaml b/helm-charts/gerrit-slave/templates/gerrit-slave.storage.yaml
index 83cbba0..b45c874 100644
--- a/helm-charts/gerrit-slave/templates/gerrit-slave.storage.yaml
+++ b/helm-charts/gerrit-slave/templates/gerrit-slave.storage.yaml
@@ -1,8 +1,8 @@
-{{ if .Values.gerritSlave.logging.persistence.enabled -}}
+{{ if .Values.gerritSlave.persistence.enabled -}}
 kind: PersistentVolumeClaim
 apiVersion: v1
 metadata:
-  name: {{ .Release.Name }}-gerrit-slave-logs-pvc
+  name: {{ .Release.Name }}-gerrit-slave-pvc
   labels:
     app: gerrit-slave
     chart: {{ template "gerrit-slave.chart" . }}
@@ -13,25 +13,6 @@
   - ReadWriteOnce
   resources:
     requests:
-      storage: {{ .Values.gerritSlave.logging.persistence.size }}
+      storage: {{ .Values.gerritSlave.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 f88d2a9..abd3fdb 100644
--- a/helm-charts/gerrit-slave/values.yaml
+++ b/helm-charts/gerrit-slave/values.yaml
@@ -162,15 +162,9 @@
       cpu: 1
       memory: 6Gi
 
-  logging:
-    persistence:
-      enabled: true
-      size: 1Gi
-
-  h2Database:
-    persistence:
-      enabled: true
-      size: 1Gi
+  persistence:
+    enabled: true
+    size: 10Gi
 
   service:
     type: NodePort
diff --git a/tests/container-images/gerrit-init/test_container_integration_gerrit_init_h2.py b/tests/container-images/gerrit-init/test_container_integration_gerrit_init_h2.py
index f109b9a..e997296 100644
--- a/tests/container-images/gerrit-init/test_container_integration_gerrit_init_h2.py
+++ b/tests/container-images/gerrit-init/test_container_integration_gerrit_init_h2.py
@@ -23,10 +23,18 @@
 import utils
 
 @pytest.fixture(scope="class")
-def container_run_default(request, docker_client, gerrit_init_image):
+def container_run_default(
+    request, docker_client, gerrit_init_image, tmp_path_factory):
+  tmp_site_dir = tmp_path_factory.mktemp('gerrit_site')
   container_run = docker_client.containers.run(
     image=gerrit_init_image.id,
     user="gerrit",
+    volumes={
+      tmp_site_dir: {
+        "bind": "/var/gerrit",
+        "mode": "rw"
+      }
+    },
     detach=True,
     auto_remove=True
   )
@@ -41,13 +49,21 @@
 
   return container_run
 
-@pytest.fixture(scope="function")
-def container_run_endless(request, docker_client, gerrit_init_image):
+@pytest.fixture(scope="class")
+def container_run_endless(
+    request, docker_client, gerrit_init_image, tmp_path_factory):
+  tmp_site_dir = tmp_path_factory.mktemp('gerrit_site')
   container_run = docker_client.containers.run(
     image=gerrit_init_image.id,
     entrypoint="/bin/bash",
     command=["-c", "tail -f /dev/null"],
     user="gerrit",
+    volumes={
+      tmp_site_dir: {
+        "bind": "/var/gerrit",
+        "mode": "rw"
+      }
+    },
     detach=True,
     auto_remove=True
   )
@@ -82,7 +98,7 @@
     assert container_run_default.attrs["State"]["ExitCode"] == 0
 
 @pytest.mark.incremental
-class TestGerritInitEmptySiteEndlessRun(object):
+class TestGerritInitPluginInstallation(object):
   def test_gerrit_init_plugins_are_installed(self, container_run_endless):
     exit_code, _ = container_run_endless.exec_run(
       "/var/tools/gerrit_init.py -s /var/gerrit -p replication -p reviewnotes")
@@ -92,3 +108,33 @@
       "test -f /var/gerrit/plugins/reviewnotes.jar'"
     exit_code, _ = container_run_endless.exec_run(cmd)
     assert exit_code == 0
+
+  def test_gerrit_init_plugins_are_added_in_existing_site(
+      self, container_run_endless):
+    exit_code, _ = container_run_endless.exec_run(
+      "/var/tools/gerrit_init.py -s /var/gerrit -p replication -p reviewnotes -p hooks")
+    assert exit_code == 0
+
+
+    cmd = "/bin/bash -c '" + \
+      "test -f /var/gerrit/plugins/replication.jar && " + \
+      "test -f /var/gerrit/plugins/reviewnotes.jar && " + \
+      "test -f /var/gerrit/plugins/hooks.jar'"
+    exit_code, _ = container_run_endless.exec_run(cmd)
+    assert exit_code == 0
+
+  def test_gerrit_init_plugins_are_installed_in_existing_site(
+      self, container_run_endless):
+    exit_code, _ = container_run_endless.exec_run(
+      "/var/tools/gerrit_init.py -s /var/gerrit -p download-commands")
+    assert exit_code == 0
+
+    cmd = "/bin/bash -c '" + \
+      "test -f /var/gerrit/plugins/download-commands.jar'"
+    exit_code, _ = container_run_endless.exec_run(cmd)
+    assert exit_code == 0
+
+    cmd = "/bin/bash -c '" + \
+      "test -f /var/gerrit/plugins/reviewnotes.jar'"
+    exit_code, _ = container_run_endless.exec_run(cmd)
+    assert exit_code == 1