Don't store logs on shared volume

Thee logs were stored on a NFS volume. This was a historic artifact,
when logs still needed to be accessed by multiple pods. Since
shared storage is usually more expensive and harder to maintain,
the logs should rather be stored on block storage.

Now, the logs will be stored as follows:
- Gerrit: in the PV containing the Gerrit Site
- Git GC: No persisted logs. Logs will be posted to stdout.
- Receiver: No persisted logs. Logs will be posted to stdout.

BREAKING CHANGE: This will break any setup using the Gerrit Operator
and relying on logs being stored in the NFS volume.

Change-Id: If17368d0bee1769666c05daa3282cbb6572a156e
diff --git a/container-images/gerrit-init/Dockerfile b/container-images/gerrit-init/Dockerfile
index 70da7aa..53ef808 100644
--- a/container-images/gerrit-init/Dockerfile
+++ b/container-images/gerrit-init/Dockerfile
@@ -20,7 +20,6 @@
 COPY config/* /var/config/
 
 RUN mkdir -p /var/mnt/git \
-  && mkdir -p /var/mnt/logs \
   && chown -R gerrit:users /var/mnt
 
 USER gerrit
diff --git a/container-images/gerrit-init/tools/gerrit-initializer/initializer/tasks/init.py b/container-images/gerrit-init/tools/gerrit-initializer/initializer/tasks/init.py
index 4931984..f5cb3f2 100755
--- a/container-images/gerrit-init/tools/gerrit-initializer/initializer/tasks/init.py
+++ b/container-images/gerrit-init/tools/gerrit-initializer/initializer/tasks/init.py
@@ -103,12 +103,16 @@
         LOG.info("No initialization required.")
         return False
 
-    def _ensure_symlink(self, src, target):
-        if not os.path.exists(src):
-            raise FileNotFoundError(f"Unable to find mounted dir: {src}")
+    def _symlink(self, src, target, required=True):
+        if os.path.islink(target) and not os.path.exists(os.readlink(target)):
+            LOG.warn(f"Removing broken symlink {target}")
+            os.unlink(target)
 
-        if os.path.islink(target) and os.path.realpath(target) == src:
-            return
+        if not os.path.exists(src):
+            if required:
+                raise FileNotFoundError(f"Unable to find mounted dir: {src}")
+            else:
+                return
 
         if os.path.exists(target):
             if os.path.isdir(target) and not os.path.islink(target):
@@ -119,16 +123,15 @@
         os.symlink(src, target)
 
     def _symlink_mounted_site_components(self):
-        self._ensure_symlink(f"{MNT_PATH}/git", f"{self.site}/git")
-        self._ensure_symlink(f"{MNT_PATH}/logs", f"{self.site}/logs")
+        self._symlink(f"{MNT_PATH}/git", f"{self.site}/git")
 
         mounted_shared_dir = f"{MNT_PATH}/shared"
         if not self.is_replica and os.path.exists(mounted_shared_dir):
-            self._ensure_symlink(mounted_shared_dir, f"{self.site}/shared")
+            self._symlink(mounted_shared_dir, f"{self.site}/shared")
 
         index_type = self.gerrit_config.get("index.type", default=IndexType.LUCENE.name)
         if IndexType[index_type.upper()] is IndexType.ELASTICSEARCH:
-            self._ensure_symlink(f"{MNT_PATH}/index", f"{self.site}/index")
+            self._symlink(f"{MNT_PATH}/index", f"{self.site}/index")
 
         data_dir = f"{self.site}/data"
         if os.path.exists(data_dir):
@@ -147,7 +150,7 @@
                 abs_path = os.path.join(data_dir, file_or_dir)
                 abs_mounted_path = os.path.join(mounted_data_dir, file_or_dir)
                 if os.path.isdir(abs_mounted_path):
-                    self._ensure_symlink(abs_mounted_path, abs_path)
+                    self._symlink(abs_mounted_path, abs_path)
 
     def _symlink_configuration(self):
         etc_dir = f"{self.site}/etc"
@@ -160,7 +163,7 @@
                     if os.path.isfile(
                         os.path.join(f"{MNT_PATH}/etc/{config_type}", file_or_dir)
                     ):
-                        self._ensure_symlink(
+                        self._symlink(
                             os.path.join(f"{MNT_PATH}/etc/{config_type}", file_or_dir),
                             os.path.join(etc_dir, file_or_dir),
                         )
@@ -176,6 +179,11 @@
                 os.remove(full_path)
 
     def execute(self):
+        # Required for migration away from NFS-based log storage, when using the
+        # Gerrit-Operator and to provide backwards compatibility for the helm-
+        # charts
+        self._symlink(f"{MNT_PATH}/logs", f"{self.site}/logs", required=False)
+
         if not self.is_replica:
             self._symlink_mounted_site_components()
         elif not NoteDbValidator(MNT_PATH).check():
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/api/model/cluster/GerritCluster.java b/operator/src/main/java/com/google/gerrit/k8s/operator/api/model/cluster/GerritCluster.java
index ec4adba..36c0fd9 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/api/model/cluster/GerritCluster.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/api/model/cluster/GerritCluster.java
@@ -142,20 +142,6 @@
   }
 
   @JsonIgnore
-  public static VolumeMount getLogsVolumeMount() {
-    return getLogsVolumeMount("/var/mnt/logs");
-  }
-
-  @JsonIgnore
-  public static VolumeMount getLogsVolumeMount(String mountPath) {
-    return new VolumeMountBuilder()
-        .withName(SHARED_VOLUME_NAME)
-        .withSubPathExpr("logs/$(POD_NAME)")
-        .withMountPath(mountPath)
-        .build();
-  }
-
-  @JsonIgnore
   public static Volume getNfsImapdConfigVolume() {
     return new VolumeBuilder()
         .withName(NFS_IDMAPD_CONFIG_VOLUME_NAME)
@@ -193,7 +179,6 @@
       ContainerImageConfig imageConfig,
       List<VolumeMount> additionalVolumeMounts) {
     List<VolumeMount> volumeMounts = new ArrayList<>();
-    volumeMounts.add(getLogsVolumeMount());
     volumeMounts.add(getGitRepositoriesVolumeMount());
 
     volumeMounts.addAll(additionalVolumeMounts);
@@ -219,7 +204,6 @@
         .withImage(imageConfig.getBusyBox().getBusyBoxImage())
         .withCommand(List.of("sh", "-c"))
         .withArgs(args.toString().trim())
-        .withEnv(getPodNameEnvVar())
         .withVolumeMounts(volumeMounts)
         .build();
   }
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritStatefulSet.java b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritStatefulSet.java
index 6cc91b1..ca918a8 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritStatefulSet.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritStatefulSet.java
@@ -296,7 +296,6 @@
       volumeMounts.add(GerritCluster.getHAShareVolumeMount());
     }
     volumeMounts.add(GerritCluster.getGitRepositoriesVolumeMount());
-    volumeMounts.add(GerritCluster.getLogsVolumeMount());
     volumeMounts.add(
         new VolumeMountBuilder()
             .withName("gerrit-config")
@@ -351,7 +350,12 @@
             .withMountPath("/fluent-bit/etc/")
             .build());
 
-    volumeMounts.add(GerritCluster.getLogsVolumeMount());
+    volumeMounts.add(
+        new VolumeMountBuilder()
+            .withName(SITE_VOLUME_NAME)
+            .withSubPath("logs")
+            .withMountPath("/var/mnt/logs")
+            .build());
 
     return volumeMounts;
   }
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/gitgc/dependent/GitGarbageCollectionCronJob.java b/operator/src/main/java/com/google/gerrit/k8s/operator/gitgc/dependent/GitGarbageCollectionCronJob.java
index fc1bddb..24364d7 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/gitgc/dependent/GitGarbageCollectionCronJob.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/gitgc/dependent/GitGarbageCollectionCronJob.java
@@ -122,7 +122,6 @@
   private Container buildGitGcContainer(GitGarbageCollection gitGc, GerritCluster gerritCluster) {
     List<VolumeMount> volumeMounts = new ArrayList<>();
     volumeMounts.add(GerritCluster.getGitRepositoriesVolumeMount("/var/gerrit/git"));
-    volumeMounts.add(GerritCluster.getLogsVolumeMount("/var/log/git"));
 
     if (gerritCluster.getSpec().getStorage().getStorageClasses().getNfsWorkaround().isEnabled()
         && gerritCluster
@@ -146,7 +145,6 @@
                     .getGerritImages()
                     .getFullImageName("git-gc"))
             .withResources(gitGc.getSpec().getResources())
-            .withEnv(GerritCluster.getPodNameEnvVar())
             .withVolumeMounts(volumeMounts);
 
     ArrayList<String> args = new ArrayList<>();
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverDeployment.java b/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverDeployment.java
index 9f5fc0c..f1102ae 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverDeployment.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverDeployment.java
@@ -106,7 +106,6 @@
                 .getContainerImages()
                 .getGerritImages()
                 .getFullImageName("apache-git-http-backend"))
-        .withEnv(GerritCluster.getPodNameEnvVar())
         .withPorts(getContainerPorts(receiver))
         .withResources(receiver.getSpec().getResources())
         .withReadinessProbe(receiver.getSpec().getReadinessProbe())
@@ -163,7 +162,6 @@
   private Set<VolumeMount> getVolumeMounts(Receiver receiver, boolean isInitContainer) {
     Set<VolumeMount> volumeMounts = new HashSet<>();
     volumeMounts.add(GerritCluster.getGitRepositoriesVolumeMount("/var/gerrit/git"));
-    volumeMounts.add(GerritCluster.getLogsVolumeMount("/var/log/apache2"));
 
     volumeMounts.add(
         new VolumeMountBuilder()
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_all_default.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_all_default.yaml
index ebc04e6..7d8b8e1 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_all_default.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_all_default.yaml
@@ -65,18 +65,10 @@
               limits:
                 cpu: 100m
                 memory: 256Mi
-            env:
-            - name: POD_NAME
-              valueFrom:
-                fieldRef:
-                  fieldPath: metadata.name
             volumeMounts:
             - name: shared
               subPath: git
               mountPath: /var/gerrit/git
-            - name: shared
-              subPathExpr: "logs/$(POD_NAME)"
-              mountPath: /var/log/git
           volumes:
           - name: shared
             persistentVolumeClaim:
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_all_nfs_workaround.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_all_nfs_workaround.yaml
index ac30455..38d4c74 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_all_nfs_workaround.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_all_nfs_workaround.yaml
@@ -62,17 +62,9 @@
             - sh
             - -c
             args:
-            - chown -R 1000:100 /var/mnt/logs /var/mnt/git
-            env:
-            - name: POD_NAME
-              valueFrom:
-                fieldRef:
-                  fieldPath: metadata.name
+            - chown -R 1000:100 /var/mnt/git
             volumeMounts:
             - name: shared
-              subPathExpr: "logs/$(POD_NAME)"
-              mountPath: /var/mnt/logs
-            - name: shared
               subPath: git
               mountPath: /var/mnt/git
             - name: nfs-config
@@ -89,18 +81,10 @@
               limits:
                 cpu: 100m
                 memory: 256Mi
-            env:
-            - name: POD_NAME
-              valueFrom:
-                fieldRef:
-                  fieldPath: metadata.name
             volumeMounts:
             - name: shared
               subPath: git
               mountPath: /var/gerrit/git
-            - name: shared
-              subPathExpr: "logs/$(POD_NAME)"
-              mountPath: /var/log/git
             - name: nfs-config
               subPath: idmapd.conf
               mountPath: /etc/idmapd.conf
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_all_options_enabled.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_all_options_enabled.yaml
index b9780f5..e093502 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_all_options_enabled.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_all_options_enabled.yaml
@@ -69,18 +69,10 @@
             - -B
             - -R
             - -P
-            env:
-            - name: POD_NAME
-              valueFrom:
-                fieldRef:
-                  fieldPath: metadata.name
             volumeMounts:
             - name: shared
               subPath: git
               mountPath: /var/gerrit/git
-            - name: shared
-              subPathExpr: "logs/$(POD_NAME)"
-              mountPath: /var/log/git
           volumes:
           - name: shared
             persistentVolumeClaim:
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_selected_default.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_selected_default.yaml
index 68d68ca..a87a216 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_selected_default.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_selected_default.yaml
@@ -70,18 +70,10 @@
             - test
             - -p
             - example
-            env:
-            - name: POD_NAME
-              valueFrom:
-                fieldRef:
-                  fieldPath: metadata.name
             volumeMounts:
             - name: shared
               subPath: git
               mountPath: /var/gerrit/git
-            - name: shared
-              subPathExpr: "logs/$(POD_NAME)"
-              mountPath: /var/log/git
           volumes:
           - name: shared
             persistentVolumeClaim:
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_selected_options_enabled.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_selected_options_enabled.yaml
index 7458352..d4519df 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_selected_options_enabled.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/gitgc/dependent/cronjob_selected_options_enabled.yaml
@@ -73,18 +73,10 @@
             - -B
             - -R
             - -P
-            env:
-            - name: POD_NAME
-              valueFrom:
-                fieldRef:
-                  fieldPath: metadata.name
             volumeMounts:
             - name: shared
               subPath: git
               mountPath: /var/gerrit/git
-            - name: shared
-              subPathExpr: "logs/$(POD_NAME)"
-              mountPath: /var/log/git
           volumes:
           - name: shared
             persistentVolumeClaim:
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/receiver/dependent/deployment.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/receiver/dependent/deployment.yaml
index 4857152..2257380 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/receiver/dependent/deployment.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/receiver/dependent/deployment.yaml
@@ -65,11 +65,6 @@
       - name: apache-git-http-backend
         imagePullPolicy: Always
         image: docker.io/k8sgerrit/apache-git-http-backend:latest
-        env:
-        - name: POD_NAME
-          valueFrom:
-            fieldRef:
-              fieldPath: metadata.name
         ports:
         - name: http
           containerPort: 80
@@ -100,9 +95,6 @@
           failureThreshold: 3
 
         volumeMounts:
-        - name: shared
-          subPathExpr: "logs/$(POD_NAME)"
-          mountPath: /var/log/apache2
         - name: apache-credentials
           mountPath: /var/apache/credentials/.htpasswd
           subPath: .htpasswd
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/receiver/dependent/deployment_minimal.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/receiver/dependent/deployment_minimal.yaml
index 92d0752..53b3c87 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/receiver/dependent/deployment_minimal.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/receiver/dependent/deployment_minimal.yaml
@@ -43,11 +43,6 @@
       - name: apache-git-http-backend
         imagePullPolicy: Always
         image: docker.io/k8sgerrit/apache-git-http-backend:latest
-        env:
-        - name: POD_NAME
-          valueFrom:
-            fieldRef:
-              fieldPath: metadata.name
         ports:
         - name: http
           containerPort: 80
@@ -61,9 +56,6 @@
             port: 80
 
         volumeMounts:
-        - name: shared
-          subPathExpr: "logs/$(POD_NAME)"
-          mountPath: /var/log/apache2
         - name: apache-credentials
           mountPath: /var/apache/credentials/.htpasswd
           subPath: .htpasswd