Allow cluster domain to be configured in operator

Allow the user to set the cluster domain as part of the operator
deployment. This fixes istio ingress for kubernetes clusters that use a
non-default cluster domain.

Change-Id: Idf53a0d12b0b3a51a9e72d384df8194d52bfa1d1
diff --git a/helm-charts/gerrit-operator/templates/operator.yaml b/helm-charts/gerrit-operator/templates/operator.yaml
index 1f689e2..3b2f320 100644
--- a/helm-charts/gerrit-operator/templates/operator.yaml
+++ b/helm-charts/gerrit-operator/templates/operator.yaml
@@ -68,6 +68,8 @@
           value: {{ .Values.ingress.type }}
         - name: CLUSTER_MODE
           value: "{{ .Values.cluster.mode | toString }}"
+        - name: CLUSTER_DOMAIN
+          value: {{ .Values.clusterDomain | default "cluster.local" }}
         ports:
         - containerPort: 80
         readinessProbe:
diff --git a/helm-charts/gerrit-operator/values.yaml b/helm-charts/gerrit-operator/values.yaml
index 93b41a9..b4356a9 100644
--- a/helm-charts/gerrit-operator/values.yaml
+++ b/helm-charts/gerrit-operator/values.yaml
@@ -12,6 +12,9 @@
   # Which ingress provider to use (options: NONE, INGRESS, ISTIO, AMBASSADOR)
   type: NONE
 
+# What cluster domain to use for generated resources
+clusterDomain: cluster.local
+
 ## Required to use an external/persistent keystore, otherwise a keystore using
 ## self-signed certificates will be generated
 externalKeyStore:
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/Main.java b/operator/src/main/java/com/google/gerrit/k8s/operator/Main.java
index 93af62b..969affd 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/Main.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/Main.java
@@ -30,11 +30,12 @@
   public static void main(String[] args) throws Exception {
     try {
       String getClusterModeEnv = System.getenv("CLUSTER_MODE");
+      String clusterDomain = System.getenv().getOrDefault("CLUSTER_DOMAIN", "cluster.local");
       ClusterMode clusterMode =
           getClusterModeEnv == null
               ? ClusterMode.HIGH_AVAILABILITY
               : ClusterMode.valueOf(getClusterModeEnv.toUpperCase());
-      OperatorContext.createInstance(clusterMode);
+      OperatorContext.createInstance(clusterMode, clusterDomain);
       logger.atInfo().log("Cluster mode: %s", clusterMode);
 
       Injector injector = Guice.createInjector(Stage.PRODUCTION, new OperatorModule(clusterMode));
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/OperatorContext.java b/operator/src/main/java/com/google/gerrit/k8s/operator/OperatorContext.java
index ced0b3c..3ae7d60 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/OperatorContext.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/OperatorContext.java
@@ -20,14 +20,16 @@
   private static OperatorContext instance;
 
   private final ClusterMode clusterMode;
+  private final String clusterDomain;
 
-  private OperatorContext(ClusterMode clusterMode) {
+  private OperatorContext(ClusterMode clusterMode, String clusterDomain) {
     this.clusterMode = clusterMode;
+    this.clusterDomain = clusterDomain;
   }
 
-  public static void createInstance(ClusterMode clusterMode) {
+  public static void createInstance(ClusterMode clusterMode, String clusterDomain) {
     if (instance == null) {
-      instance = new OperatorContext(clusterMode);
+      instance = new OperatorContext(clusterMode, clusterDomain);
     }
   }
 
@@ -37,4 +39,11 @@
     }
     return instance.clusterMode;
   }
+
+  public static String getClusterDomain() {
+    if (instance == null) {
+      throw new UnsupportedOperationException("The Operation Context must be initialised");
+    }
+    return instance.clusterDomain;
+  }
 }
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritAbstractService.java b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritAbstractService.java
index 76663c4..af80a4d 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritAbstractService.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritAbstractService.java
@@ -18,6 +18,7 @@
 import static com.google.gerrit.k8s.operator.gerrit.dependent.GerritStatefulSet.JGROUPS_PORT;
 import static com.google.gerrit.k8s.operator.gerrit.dependent.GerritStatefulSet.SSH_PORT;
 
+import com.google.gerrit.k8s.operator.OperatorContext;
 import com.google.gerrit.k8s.operator.api.model.gerrit.Gerrit;
 import com.google.gerrit.k8s.operator.cluster.GerritClusterLabelFactory;
 import com.google.gerrit.k8s.operator.gerrit.GerritReconciler;
@@ -82,7 +83,8 @@
   }
 
   public String getHostname(String name, String namespace) {
-    return String.format("%s.%s.svc.cluster.local", getName(name), namespace);
+    return String.format(
+        "%s.%s.svc.%s", getName(name), namespace, OperatorContext.getClusterDomain());
   }
 
   public String getUrl(Gerrit gerrit) {
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioServiceEntries.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioServiceEntries.java
index d9d3874..aa57362 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioServiceEntries.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioServiceEntries.java
@@ -18,6 +18,7 @@
 import static com.google.gerrit.k8s.operator.gerrit.dependent.GerritStatefulSet.JGROUPS_PORT;
 import static com.google.gerrit.k8s.operator.gerrit.dependent.GerritStatefulSet.SSH_PORT;
 
+import com.google.gerrit.k8s.operator.OperatorContext;
 import com.google.gerrit.k8s.operator.api.model.network.GerritNetwork;
 import com.google.gerrit.k8s.operator.cluster.GerritClusterLabelFactory;
 import com.google.gerrit.k8s.operator.gerrit.dependent.GerritHeadlessService;
@@ -83,7 +84,8 @@
   }
 
   private String getServiceHost(String podName, String serviceName, String namespace) {
-    return String.format("%s.%s.%s.svc.cluster.local", podName, serviceName, namespace);
+    return String.format(
+        "%s.%s.%s.svc.%s", podName, serviceName, namespace, OperatorContext.getClusterDomain());
   }
 
   @Override
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverService.java b/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverService.java
index 4c2a746..0298417 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverService.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverService.java
@@ -16,6 +16,7 @@
 
 import static com.google.gerrit.k8s.operator.receiver.dependent.ReceiverDeployment.HTTP_PORT;
 
+import com.google.gerrit.k8s.operator.OperatorContext;
 import com.google.gerrit.k8s.operator.api.model.receiver.Receiver;
 import com.google.gerrit.k8s.operator.cluster.GerritClusterLabelFactory;
 import com.google.gerrit.k8s.operator.receiver.ReceiverReconciler;
@@ -76,7 +77,8 @@
   }
 
   public static String getHostname(String receiverName, String namespace) {
-    return String.format("%s.%s.svc.cluster.local", getName(receiverName), namespace);
+    return String.format(
+        "%s.%s.svc.%s", getName(receiverName), namespace, OperatorContext.getClusterDomain());
   }
 
   private static List<ServicePort> getServicePorts(Receiver receiver) {
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/cluster/dependent/GerritClusterGerritsTest.java b/operator/src/test/java/com/google/gerrit/k8s/operator/cluster/dependent/GerritClusterGerritsTest.java
index f28a30b..4b10745 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/cluster/dependent/GerritClusterGerritsTest.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/cluster/dependent/GerritClusterGerritsTest.java
@@ -42,7 +42,7 @@
       String expectedGerritMaintenanceOutputFile)
       throws ConfigInvalidException {
 
-    OperatorContext.createInstance(Constants.ClusterMode.HIGH_AVAILABILITY);
+    OperatorContext.createInstance(Constants.ClusterMode.HIGH_AVAILABILITY, "cluster.local");
     GerritCluster gerritCluster =
         ReconcilerUtils.loadYaml(GerritCluster.class, this.getClass(), inputFile);
     ClusterManagedGerrit clusterManagedGerrit = new ClusterManagedGerrit();
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/indexer/dependent/GerritIndexerTest.java b/operator/src/test/java/com/google/gerrit/k8s/operator/indexer/dependent/GerritIndexerTest.java
index 91b9314..21579e7 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/indexer/dependent/GerritIndexerTest.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/indexer/dependent/GerritIndexerTest.java
@@ -60,7 +60,7 @@
 
   @BeforeAll
   public void setup() throws Exception {
-    OperatorContext.createInstance(ClusterMode.HIGH_AVAILABILITY);
+    OperatorContext.createInstance(ClusterMode.HIGH_AVAILABILITY, "cluster.local");
     kubernetesServer.before();
   }
 
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritClusterIstioTest.java b/operator/src/test/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritClusterIstioTest.java
index 47e1eab..b2bb58a 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritClusterIstioTest.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritClusterIstioTest.java
@@ -32,7 +32,7 @@
   @MethodSource("provideYamlManifests")
   public void expectedGerritClusterIstioComponentsCreated(
       String inputFile, String expectedGatewayOutputFile, String expectedVirtualServiceOutputFile) {
-    OperatorContext.createInstance(ClusterMode.HIGH_AVAILABILITY);
+    OperatorContext.createInstance(ClusterMode.HIGH_AVAILABILITY, "cluster.local");
     GerritNetwork gerritNetwork =
         ReconcilerUtils.loadYaml(GerritNetwork.class, this.getClass(), inputFile);
     GerritClusterIstioGateway gatewayDependent = new GerritClusterIstioGateway();
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/server/AdmissionWebhookAbstractTest.java b/operator/src/test/java/com/google/gerrit/k8s/operator/server/AdmissionWebhookAbstractTest.java
index 95cbce6..49ee9ea 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/server/AdmissionWebhookAbstractTest.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/server/AdmissionWebhookAbstractTest.java
@@ -73,7 +73,7 @@
 
     kubernetesServer.before();
 
-    OperatorContext.createInstance(getClusterMode());
+    OperatorContext.createInstance(getClusterMode(), "cluster.local");
     server.registerWebhook(new GerritClusterAdmissionWebhook(getClusterMode()));
     server.registerWebhook(new GerritAdmissionWebhook(getClusterMode()));
     server.start();
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/test/AbstractGerritOperatorE2ETest.java b/operator/src/test/java/com/google/gerrit/k8s/operator/test/AbstractGerritOperatorE2ETest.java
index dd45f78..e79f536 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/test/AbstractGerritOperatorE2ETest.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/test/AbstractGerritOperatorE2ETest.java
@@ -89,7 +89,7 @@
 
     client.resource(receiverCredentials).inNamespace(operator.getNamespace()).createOrReplace();
 
-    OperatorContext.createInstance(Constants.ClusterMode.HIGH_AVAILABILITY);
+    OperatorContext.createInstance(Constants.ClusterMode.HIGH_AVAILABILITY, "cluster.local");
 
     gerritCluster = new TestGerritCluster(client, operator.getNamespace());
     gerritCluster.setIngressType(getIngressType());