You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@heron.apache.org by sa...@apache.org on 2022/05/01 19:35:37 UTC

[incubator-heron] 04/07: [K8s] Added support for Network File System.

This is an automated email from the ASF dual-hosted git repository.

saadurrahman pushed a commit to branch saadurrahman/3821-Remove-Deprecated-Volumes-K8s-dev
in repository https://gitbox.apache.org/repos/asf/incubator-heron.git

commit c13f0eedcd40dc2fe1826b9193f76ea67a488877
Author: Saad Ur Rahman <sa...@apache.org>
AuthorDate: Sun May 1 15:25:43 2022 -0400

    [K8s] Added support for Network File System.
---
 .../apache/heron/scheduler/kubernetes/Volumes.java | 42 ++++++++++++++++++++--
 .../heron/scheduler/kubernetes/VolumesTests.java   | 31 ++++++++++++++++
 2 files changed, 71 insertions(+), 2 deletions(-)

diff --git a/heron/schedulers/src/java/org/apache/heron/scheduler/kubernetes/Volumes.java b/heron/schedulers/src/java/org/apache/heron/scheduler/kubernetes/Volumes.java
index 6dba3bf8547..8423ce79e20 100644
--- a/heron/schedulers/src/java/org/apache/heron/scheduler/kubernetes/Volumes.java
+++ b/heron/schedulers/src/java/org/apache/heron/scheduler/kubernetes/Volumes.java
@@ -41,6 +41,7 @@ final class Volumes {
   private Volumes() {
     volumes.put(VolumeType.EmptyDir, new EmptyDirVolumeFactory());
     volumes.put(VolumeType.HostPath, new HostPathVolumeFactory());
+    volumes.put(VolumeType.NetworkFileSystem, new NetworkFileSystemVolumeFactory());
   }
 
   static Volumes get() {
@@ -72,7 +73,7 @@ final class Volumes {
     /**
      * Generates an <code>Empty Directory</code> <code>V1 Volume</code>.
      * @param volumeName The name of the volume to generate.
-     * @param configs A map of configurations.
+     * @param configs    A map of configurations.
      * @return A fully configured <code>Empty Directory</code> volume.
      */
     @Override
@@ -106,7 +107,7 @@ final class Volumes {
     /**
      * Generates an <code>Host Path</code> <code>V1 Volume</code>.
      * @param volumeName The name of the volume to generate.
-     * @param configs A map of configurations.
+     * @param configs    A map of configurations.
      * @return A fully configured <code>Host Path</code> volume.
      */
     @Override
@@ -133,4 +134,41 @@ final class Volumes {
       return volume;
     }
   }
+
+  static class NetworkFileSystemVolumeFactory implements VolumeFactory {
+
+    /**
+     * Generates an <code>Network File System</code> <code>V1 Volume</code>.
+     *
+     * @param volumeName The name of the volume to generate.
+     * @param configs    A map of configurations.
+     * @return A fully configured <code>Network File System</code> volume.
+     */
+    @Override
+    public V1Volume create(String volumeName,
+                           Map<KubernetesConstants.VolumeConfigKeys, String> configs) {
+      final V1Volume volume = new V1VolumeBuilder()
+          .withName(volumeName)
+          .withNewNfs()
+          .endNfs()
+          .build();
+
+      for (Map.Entry<KubernetesConstants.VolumeConfigKeys, String> config : configs.entrySet()) {
+        switch (config.getKey()) {
+          case server:
+            volume.getNfs().setServer(config.getValue());
+            break;
+          case pathOnNFS:
+            volume.getNfs().setPath(config.getValue());
+            break;
+          case readOnly:
+            volume.getNfs().setReadOnly(Boolean.parseBoolean(config.getValue()));
+            break;
+          default:
+            break;
+        }
+      }
+      return volume;
+    }
+  }
 }
diff --git a/heron/schedulers/tests/java/org/apache/heron/scheduler/kubernetes/VolumesTests.java b/heron/schedulers/tests/java/org/apache/heron/scheduler/kubernetes/VolumesTests.java
index 7e638a839d1..10bb4739bdf 100644
--- a/heron/schedulers/tests/java/org/apache/heron/scheduler/kubernetes/VolumesTests.java
+++ b/heron/schedulers/tests/java/org/apache/heron/scheduler/kubernetes/VolumesTests.java
@@ -86,4 +86,35 @@ public class VolumesTests {
 
     Assert.assertEquals("Volume Factory Host Path", expectedVolume, actualVolume);
   }
+
+  @Test
+  public void testNetworkFileSystem() {
+    final String volumeName = "volume-name-nfs";
+    final String server = "nfs.server.address";
+    final String pathOnNFS = "path.on.host";
+    final String readOnly = "true";
+    final String path = "/path/to/mount";
+    final String subPath = "/sub/path/to/mount";
+    final Map<KubernetesConstants.VolumeConfigKeys, String> config =
+        ImmutableMap.<KubernetesConstants.VolumeConfigKeys, String>builder()
+            .put(KubernetesConstants.VolumeConfigKeys.server, server)
+            .put(KubernetesConstants.VolumeConfigKeys.readOnly, readOnly)
+            .put(KubernetesConstants.VolumeConfigKeys.pathOnNFS, pathOnNFS)
+            .put(KubernetesConstants.VolumeConfigKeys.path, path)
+            .put(KubernetesConstants.VolumeConfigKeys.subPath, subPath)
+            .build();
+    final V1Volume expectedVolume = new V1VolumeBuilder()
+        .withName(volumeName)
+        .withNewNfs()
+          .withServer(server)
+          .withPath(pathOnNFS)
+          .withReadOnly(Boolean.parseBoolean(readOnly))
+        .endNfs()
+        .build();
+
+    final V1Volume actualVolume = Volumes.get()
+        .create(Volumes.VolumeType.NetworkFileSystem, volumeName, config);
+
+    Assert.assertEquals("Volume Factory Network File System", expectedVolume, actualVolume);
+  }
 }