Configure which plugins are mandatory for the chosen Gerrit setup

Change-Id: I9a9c56d0acdb70c810c38023ff4321709df876ef
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/config/GerritConfigBuilder.java b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/config/GerritConfigBuilder.java
index 83dc274..304a894 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/config/GerritConfigBuilder.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/config/GerritConfigBuilder.java
@@ -63,6 +63,7 @@
     requiredOptions.addAll(gerritSection(gerrit));
     requiredOptions.addAll(httpdSection(gerrit));
     requiredOptions.addAll(indexSection(gerrit));
+    requiredOptions.addAll(pluginsSection(gerrit));
     requiredOptions.addAll(sshdSection(gerrit));
     requiredOptions.addAll(eventsBrokerSection(gerrit));
     requiredOptions.addAll(webSessionBrokerSection(gerrit));
@@ -202,6 +203,41 @@
     return requiredOptions;
   }
 
+  private static List<RequiredOption<?>> pluginsSection(Gerrit gerrit) {
+    List<RequiredOption<?>> requiredOptions = new ArrayList<>();
+    Set<String> mandatoryPlugins = new HashSet<>();
+    mandatoryPlugins.add("healthcheck");
+    if (gerrit.getSpec().isHighlyAvailablePrimary()) {
+      mandatoryPlugins.add("high-availability");
+    }
+    if (gerrit.getSpec().getIndex().getType() == IndexType.ELASTICSEARCH) {
+      mandatoryPlugins.add("index-elasticsearch");
+    }
+    RefDatabase refDb = gerrit.getSpec().getRefdb().getDatabase();
+    switch (refDb) {
+      case NONE:
+        break;
+      case ZOOKEEPER:
+        mandatoryPlugins.add("zookeeper-refdb");
+        break;
+      case SPANNER:
+        mandatoryPlugins.add("spanner-refdb");
+        break;
+      default:
+        throw new IllegalStateException("Unknown refdb database type: " + refDb);
+    }
+    if (gerrit.getSpec().getEventsBroker().getBrokerType() == EventsBrokerConfig.BrokerType.KAFKA) {
+      mandatoryPlugins.add("events-kafka");
+    }
+    if (OperatorContext.getClusterMode() == Constants.ClusterMode.MULTISITE) {
+      mandatoryPlugins.add("multi-site");
+      mandatoryPlugins.add("pull-replication");
+      mandatoryPlugins.add("websession-broker");
+    }
+    requiredOptions.add(new RequiredOption<Set<String>>("plugins", "mandatory", mandatoryPlugins));
+    return requiredOptions;
+  }
+
   private static List<RequiredOption<?>> sshdSection(Gerrit gerrit) {
     List<RequiredOption<?>> requiredOptions = new ArrayList<>();
     requiredOptions.add(sshListenAddress(gerrit));
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/gerrit/dependent/gerrit_configmap_es_primary.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/gerrit/dependent/gerrit_configmap_es_primary.yaml
index 8701209..840c770 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/gerrit/dependent/gerrit_configmap_es_primary.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/gerrit/dependent/gerrit_configmap_es_primary.yaml
@@ -27,6 +27,11 @@
         canonicalWebUrl = https://example.com/
     [httpd]
         listenUrl = proxy-https://*:8080/
+    [plugins]
+        mandatory = healthcheck
+        mandatory = high-availability
+        mandatory = index-elasticsearch
+        mandatory = zookeeper-refdb
     [sshd]
         listenAddress = *:29418
         advertisedAddress = example.com:29418
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/gerrit/dependent/gerrit_configmap_ha_primary.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/gerrit/dependent/gerrit_configmap_ha_primary.yaml
index 1e7b3b3..8067da1 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/gerrit/dependent/gerrit_configmap_ha_primary.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/gerrit/dependent/gerrit_configmap_ha_primary.yaml
@@ -23,6 +23,10 @@
         canonicalWebUrl = https://example.com/
     [httpd]
         listenUrl = proxy-https://*:8080/
+    [plugins]
+        mandatory = healthcheck
+        mandatory = high-availability
+        mandatory = zookeeper-refdb
     [sshd]
         listenAddress = *:29418
         advertisedAddress = example.com:29418
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/gerrit/dependent/gerrit_configmap_single_primary.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/gerrit/dependent/gerrit_configmap_single_primary.yaml
index 86f8361..574810e 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/gerrit/dependent/gerrit_configmap_single_primary.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/gerrit/dependent/gerrit_configmap_single_primary.yaml
@@ -20,6 +20,8 @@
         canonicalWebUrl = https://example.com/
     [httpd]
         listenUrl = proxy-https://*:8080/
+    [plugins]
+        mandatory = healthcheck
     [sshd]
         listenAddress = *:29418
         advertisedAddress = example.com:29418
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/indexer/dependent/indexer.configmap.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/indexer/dependent/indexer.configmap.yaml
index c953951..0b2133d 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/indexer/dependent/indexer.configmap.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/indexer/dependent/indexer.configmap.yaml
@@ -30,5 +30,8 @@
       serverId = gerrit/gerrit
       installModule = com.gerritforge.gerrit.globalrefdb.validation.LibModule
       installDbModule = com.ericsson.gerrit.plugins.highavailability.ValidationModule
+    [plugins]
+      mandatory = healthcheck
+      mandatory = high-availability
     [sshd]
       listenAddress = *:29418
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/indexer/dependent/indexer_es.configmap.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/indexer/dependent/indexer_es.configmap.yaml
index afac617..454316e 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/indexer/dependent/indexer_es.configmap.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/indexer/dependent/indexer_es.configmap.yaml
@@ -34,5 +34,9 @@
       installModule = com.gerritforge.gerrit.globalrefdb.validation.LibModule
       installDbModule = com.ericsson.gerrit.plugins.highavailability.ValidationModule
       installIndexModule=com.google.gerrit.elasticsearch.ElasticIndexModule
+    [plugins]
+      mandatory = healthcheck
+      mandatory = high-availability
+      mandatory = index-elasticsearch
     [sshd]
       listenAddress = *:29418