[Operator] Fix LabelSelectors

LabelSelectors in Kubernetes are immutable. However, the Deployments/StatefulSets
created by the operator used the operator version label as part of the selector,
which is mutable.

Change-Id: Ic3d00b4960fbb03f103ce56e0c39db768c324fd5
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/GerritCluster.java b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/GerritCluster.java
index 1fb8e0e..07c04ff 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/GerritCluster.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/GerritCluster.java
@@ -59,13 +59,22 @@
   public Map<String, String> getLabels(String component, String createdBy) {
     Map<String, String> labels = new HashMap<>();
 
+    labels.putAll(getSelectorLabels(component));
+    labels.put("app.kubernetes.io/version", getClass().getPackage().getImplementationVersion());
+    labels.put("app.kubernetes.io/created-by", createdBy);
+
+    return labels;
+  }
+
+  @JsonIgnore
+  public Map<String, String> getSelectorLabels(String component) {
+    Map<String, String> labels = new HashMap<>();
+
     labels.put("app.kubernetes.io/name", "gerrit");
     labels.put("app.kubernetes.io/instance", getMetadata().getName());
-    labels.put("app.kubernetes.io/version", getClass().getPackage().getImplementationVersion());
     labels.put("app.kubernetes.io/component", component);
     labels.put("app.kubernetes.io/part-of", getMetadata().getName());
     labels.put("app.kubernetes.io/managed-by", "gerrit-operator");
-    labels.put("app.kubernetes.io/created-by", createdBy);
 
     return labels;
   }
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/ServiceDependentResource.java b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/ServiceDependentResource.java
index 0b7660a..9611d00 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/ServiceDependentResource.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/ServiceDependentResource.java
@@ -59,7 +59,7 @@
         .withNewSpec()
         .withType(gerrit.getSpec().getService().getType())
         .withPorts(getServicePorts(gerrit))
-        .withSelector(StatefulSetDependentResource.getLabels(gerritCluster, gerrit))
+        .withSelector(StatefulSetDependentResource.getSelectorLabels(gerritCluster, gerrit))
         .endSpec()
         .build();
   }
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/StatefulSetDependentResource.java b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/StatefulSetDependentResource.java
index 3aea878..f3cfd7b 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/StatefulSetDependentResource.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/StatefulSetDependentResource.java
@@ -85,7 +85,7 @@
         .endRollingUpdate()
         .endUpdateStrategy()
         .withNewSelector()
-        .withMatchLabels(getLabels(gerritCluster, gerrit))
+        .withMatchLabels(getSelectorLabels(gerritCluster, gerrit))
         .endSelector()
         .withNewTemplate()
         .withNewMetadata()
@@ -135,7 +135,7 @@
         .addNewVolumeClaimTemplate()
         .withNewMetadata()
         .withName(SITE_VOLUME_NAME)
-        .withLabels(getLabels(gerritCluster, gerrit))
+        .withLabels(getSelectorLabels(gerritCluster, gerrit))
         .endMetadata()
         .withNewSpec()
         .withAccessModes("ReadWriteOnce")
@@ -150,10 +150,17 @@
     return stsBuilder.build();
   }
 
-  public static Map<String, String> getLabels(GerritCluster gerritCluster, Gerrit gerrit) {
+  private static String getComponentName(Gerrit gerrit) {
+    return String.format("gerrit-statefulset-%s", gerrit.getMetadata().getName());
+  }
+
+  public static Map<String, String> getSelectorLabels(GerritCluster gerritCluster, Gerrit gerrit) {
+    return gerritCluster.getSelectorLabels(getComponentName(gerrit));
+  }
+
+  private static Map<String, String> getLabels(GerritCluster gerritCluster, Gerrit gerrit) {
     return gerritCluster.getLabels(
-        String.format("gerrit-statefulset-%s", gerrit.getMetadata().getName()),
-        GerritReconciler.class.getSimpleName());
+        getComponentName(gerrit), GerritReconciler.class.getSimpleName());
   }
 
   private Set<Volume> getVolumes(Gerrit gerrit, GerritCluster gerritCluster) {
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/ReceiverDeploymentDependentResource.java b/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/ReceiverDeploymentDependentResource.java
index b50fc5a..3bf31a4 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/ReceiverDeploymentDependentResource.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/ReceiverDeploymentDependentResource.java
@@ -81,7 +81,7 @@
         .endRollingUpdate()
         .endStrategy()
         .withNewSelector()
-        .withMatchLabels(getLabels(gerritCluster, receiver))
+        .withMatchLabels(getSelectorLabels(gerritCluster, receiver))
         .endSelector()
         .withNewTemplate()
         .withNewMetadata()
@@ -117,10 +117,18 @@
     return deploymentBuilder.build();
   }
 
+  private static String getComponentName(Receiver receiver) {
+    return String.format("receiver-deployment-%s", receiver.getMetadata().getName());
+  }
+
+  public static Map<String, String> getSelectorLabels(
+      GerritCluster gerritCluster, Receiver receiver) {
+    return gerritCluster.getSelectorLabels(getComponentName(receiver));
+  }
+
   public static Map<String, String> getLabels(GerritCluster gerritCluster, Receiver receiver) {
     return gerritCluster.getLabels(
-        String.format("receiver-deployment-%s", receiver.getMetadata().getName()),
-        ReceiverReconciler.class.getSimpleName());
+        getComponentName(receiver), ReceiverReconciler.class.getSimpleName());
   }
 
   private Set<Volume> getVolumes(Receiver receiver, GerritCluster gerritCluster) {
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/ReceiverServiceDependentResource.java b/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/ReceiverServiceDependentResource.java
index 1bce580..cd11d29 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/ReceiverServiceDependentResource.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/ReceiverServiceDependentResource.java
@@ -59,7 +59,8 @@
         .withNewSpec()
         .withType(receiver.getSpec().getService().getType())
         .withPorts(getServicePorts(receiver))
-        .withSelector(ReceiverDeploymentDependentResource.getLabels(gerritCluster, receiver))
+        .withSelector(
+            ReceiverDeploymentDependentResource.getSelectorLabels(gerritCluster, receiver))
         .endSpec()
         .build();
   }