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 053bb5f044388e30673e78d8afc2bfb880468201 Author: Saad Ur Rahman <[email protected]> AuthorDate: Sun May 1 15:14:40 2022 -0400 [K8s] Added support for Host Path. --- .../apache/heron/scheduler/kubernetes/Volumes.java | 34 ++++++++++++++++++++ .../heron/scheduler/kubernetes/VolumesTests.java | 36 +++++++++++++++++++--- 2 files changed, 66 insertions(+), 4 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 3b597338031..6dba3bf8547 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 @@ -40,6 +40,7 @@ final class Volumes { private Volumes() { volumes.put(VolumeType.EmptyDir, new EmptyDirVolumeFactory()); + volumes.put(VolumeType.HostPath, new HostPathVolumeFactory()); } static Volumes get() { @@ -99,4 +100,37 @@ final class Volumes { return volume; } } + + static class HostPathVolumeFactory implements VolumeFactory { + + /** + * 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. + * @return A fully configured <code>Host Path</code> volume. + */ + @Override + public V1Volume create(String volumeName, + Map<KubernetesConstants.VolumeConfigKeys, String> configs) { + final V1Volume volume = new V1VolumeBuilder() + .withName(volumeName) + .withNewHostPath() + .endHostPath() + .build(); + + for (Map.Entry<KubernetesConstants.VolumeConfigKeys, String> config : configs.entrySet()) { + switch (config.getKey()) { + case type: + volume.getHostPath().setType(config.getValue()); + break; + case pathOnHost: + volume.getHostPath().setPath(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 316947f9267..7e638a839d1 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 @@ -38,7 +38,7 @@ public class VolumesTests { final String sizeLimit = "1Gi"; final String path = "/path/to/mount"; final String subPath = "/sub/path/to/mount"; - final Map<KubernetesConstants.VolumeConfigKeys, String> configEmptyDir = + final Map<KubernetesConstants.VolumeConfigKeys, String> config = ImmutableMap.<KubernetesConstants.VolumeConfigKeys, String>builder() .put(KubernetesConstants.VolumeConfigKeys.sizeLimit, sizeLimit) .put(KubernetesConstants.VolumeConfigKeys.medium, medium) @@ -48,14 +48,42 @@ public class VolumesTests { final V1Volume expectedVolume = new V1VolumeBuilder() .withName(volumeName) .withNewEmptyDir() - .withMedium(medium) - .withNewSizeLimit(sizeLimit) + .withMedium(medium) + .withNewSizeLimit(sizeLimit) .endEmptyDir() .build(); final V1Volume actualVolume = Volumes.get() - .create(Volumes.VolumeType.EmptyDir, volumeName, configEmptyDir); + .create(Volumes.VolumeType.EmptyDir, volumeName, config); Assert.assertEquals("Volume Factory Empty Directory", expectedVolume, actualVolume); } + + @Test + public void testHostPath() { + final String volumeName = "volume-name-host-path"; + final String type = "DirectoryOrCreate"; + final String pathOnHost = "path.on.host"; + 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.type, type) + .put(KubernetesConstants.VolumeConfigKeys.pathOnHost, pathOnHost) + .put(KubernetesConstants.VolumeConfigKeys.path, path) + .put(KubernetesConstants.VolumeConfigKeys.subPath, subPath) + .build(); + final V1Volume expectedVolume = new V1VolumeBuilder() + .withName(volumeName) + .withNewHostPath() + .withNewType(type) + .withNewPath(pathOnHost) + .endHostPath() + .build(); + + final V1Volume actualVolume = Volumes.get() + .create(Volumes.VolumeType.HostPath, volumeName, config); + + Assert.assertEquals("Volume Factory Host Path", expectedVolume, actualVolume); + } }
