This is an automated email from the ASF dual-hosted git repository. pdallig pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/zeppelin.git
The following commit(s) were added to refs/heads/master by this push: new ed251f4b48 better pod name (#4348) ed251f4b48 is described below commit ed251f4b48215f372f437f4490d7f07680793b7b Author: Philipp Dallig <philipp.dal...@gmail.com> AuthorDate: Fri May 13 13:19:50 2022 +0200 better pod name (#4348) --- .../launcher/K8sRemoteInterpreterProcess.java | 3 +- .../zeppelin/interpreter/launcher/K8sUtils.java | 37 +++++++++++++++++++++- .../interpreter/launcher/K8sUtilsTest.java | 19 ++++++++++- 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/zeppelin-plugins/launcher/k8s-standard/src/main/java/org/apache/zeppelin/interpreter/launcher/K8sRemoteInterpreterProcess.java b/zeppelin-plugins/launcher/k8s-standard/src/main/java/org/apache/zeppelin/interpreter/launcher/K8sRemoteInterpreterProcess.java index 26f27fc3cf..a39b0bbb61 100644 --- a/zeppelin-plugins/launcher/k8s-standard/src/main/java/org/apache/zeppelin/interpreter/launcher/K8sRemoteInterpreterProcess.java +++ b/zeppelin-plugins/launcher/k8s-standard/src/main/java/org/apache/zeppelin/interpreter/launcher/K8sRemoteInterpreterProcess.java @@ -117,8 +117,7 @@ public class K8sRemoteInterpreterProcess extends RemoteInterpreterManagedProcess this.properties = properties; this.portForward = portForward; this.sparkImage = sparkImage; - this.podName = interpreterGroupName.toLowerCase() + "-" - + RandomStringUtils.randomAlphabetic(6).toLowerCase(); + this.podName = K8sUtils.generateK8sName(interpreterGroupId, true); this.timeoutDuringPending = timeoutDuringPending; } diff --git a/zeppelin-plugins/launcher/k8s-standard/src/main/java/org/apache/zeppelin/interpreter/launcher/K8sUtils.java b/zeppelin-plugins/launcher/k8s-standard/src/main/java/org/apache/zeppelin/interpreter/launcher/K8sUtils.java index 6c155dee37..01cdf91619 100644 --- a/zeppelin-plugins/launcher/k8s-standard/src/main/java/org/apache/zeppelin/interpreter/launcher/K8sUtils.java +++ b/zeppelin-plugins/launcher/k8s-standard/src/main/java/org/apache/zeppelin/interpreter/launcher/K8sUtils.java @@ -27,10 +27,12 @@ import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; -import io.fabric8.kubernetes.client.Config; +import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; import org.apache.zeppelin.conf.ZeppelinConfiguration; +import io.fabric8.kubernetes.client.Config; + public class K8sUtils { private static final long K = 1024; @@ -139,4 +141,37 @@ public class K8sUtils { byte[] encoded = Files.readAllBytes(Paths.get(path)); return new String(encoded, encoding); } + + private static final String ZEPPELIN = "zeppelin"; + /** + * Generates a name for a Kubernetes object + * + * See https://kubernetes.io/docs/concepts/overview/working-with-objects/names/ for allowed names + * + * @param baseName parts of the name can be removed and some parts can be added to generate a permitted Kubernetes name + * @param randomSuffix flag to add a random suffix + * @return a validate Kubernetes name + */ + public static String generateK8sName(String baseName, boolean randomSuffix) { + String result = ZEPPELIN; + if (StringUtils.isNotBlank(baseName)) { + // all to lowerCase + result = baseName.toLowerCase(); + // Remove all disallowed values + result = result.replaceAll("[^a-z0-9\\.-]", ""); + // Remove all multiple dots + result = result.replaceAll("\\.+", "."); + if (result.isEmpty() || !Character.isLetterOrDigit(result.charAt(0))) { + result = ZEPPELIN + result; + } + // 253 - 7 (suffix) = 246 + if (result.length() > 246 - ZEPPELIN.length()) { + result = result.substring(0, 246 - ZEPPELIN.length()); + } + if (!Character.isLetterOrDigit(result.charAt(result.length() - 1))) { + result = result + ZEPPELIN; + } + } + return randomSuffix ? result + "-" + RandomStringUtils.randomAlphabetic(6).toLowerCase() : result; + } } diff --git a/zeppelin-plugins/launcher/k8s-standard/src/test/java/org/apache/zeppelin/interpreter/launcher/K8sUtilsTest.java b/zeppelin-plugins/launcher/k8s-standard/src/test/java/org/apache/zeppelin/interpreter/launcher/K8sUtilsTest.java index 1815a1f459..0d495e9bdc 100644 --- a/zeppelin-plugins/launcher/k8s-standard/src/test/java/org/apache/zeppelin/interpreter/launcher/K8sUtilsTest.java +++ b/zeppelin-plugins/launcher/k8s-standard/src/test/java/org/apache/zeppelin/interpreter/launcher/K8sUtilsTest.java @@ -18,8 +18,9 @@ package org.apache.zeppelin.interpreter.launcher; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import org.apache.commons.lang3.RandomStringUtils; import org.junit.Test; public class K8sUtilsTest { @@ -45,4 +46,20 @@ public class K8sUtilsTest { public void testExceptionNoValidNumber() { K8sUtils.calculateMemoryWithDefaultOverhead("NoValidNumber10000000Tb"); } + + @Test + public void testGenerateK8sName() { + assertEquals("zeppelin", K8sUtils.generateK8sName("", false)); + assertEquals("zeppelin", K8sUtils.generateK8sName(null, false)); + assertEquals("test", K8sUtils.generateK8sName("test", false)); + assertEquals("test", K8sUtils.generateK8sName("!test", false)); + assertEquals("zeppelin", K8sUtils.generateK8sName("!", false)); + assertEquals("zeppelin.test", K8sUtils.generateK8sName(".test", false)); + assertEquals("zeppelin.test", K8sUtils.generateK8sName("...test", false)); + assertEquals("zeppelin.test.zeppelin", K8sUtils.generateK8sName(".test.", false)); + assertEquals("zeppelin.test.zeppelin", K8sUtils.generateK8sName("...test....", false)); + assertEquals("test", K8sUtils.generateK8sName("Test", false)); + + assertEquals(253 - "zeppelin".length() , K8sUtils.generateK8sName(RandomStringUtils.randomAlphabetic(260), true).length()); + } }