aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-provisioning/src/test/java/com/yahoo/config/provision/HostNameTest.java35
-rw-r--r--vespajlib/src/main/java/com/yahoo/net/HostName.java42
2 files changed, 77 insertions, 0 deletions
diff --git a/config-provisioning/src/test/java/com/yahoo/config/provision/HostNameTest.java b/config-provisioning/src/test/java/com/yahoo/config/provision/HostNameTest.java
new file mode 100644
index 00000000000..da01920cc57
--- /dev/null
+++ b/config-provisioning/src/test/java/com/yahoo/config/provision/HostNameTest.java
@@ -0,0 +1,35 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.config.provision;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertThrows;
+
+/**
+ * @author jonmv
+ */
+public class HostNameTest {
+
+ @Test
+ public void testNames() {
+ HostName.of("name-123.0.321-eman");
+ HostName.of(("." + "a".repeat(32)).repeat(2).substring(1, 65));
+ HostName.of("123");
+
+ assertThrows(IllegalArgumentException.class, () -> HostName.of("_"));
+ assertThrows(IllegalArgumentException.class, () -> HostName.of("-"));
+ assertThrows(IllegalArgumentException.class, () -> HostName.of("."));
+ assertThrows(IllegalArgumentException.class, () -> HostName.of("-foo"));
+ assertThrows(IllegalArgumentException.class, () -> HostName.of("foo-"));
+ assertThrows(IllegalArgumentException.class, () -> HostName.of(".foo"));
+ assertThrows(IllegalArgumentException.class, () -> HostName.of("foo."));
+ assertThrows(IllegalArgumentException.class, () -> HostName.of("foo..bar"));
+ assertThrows(IllegalArgumentException.class, () -> HostName.of("foo.-.bar"));
+ assertThrows(IllegalArgumentException.class, () -> HostName.of("foo/"));
+ assertThrows(IllegalArgumentException.class, () -> HostName.of("foo%"));
+ assertThrows(IllegalArgumentException.class, () -> HostName.of(("." + "a".repeat(32)).repeat(2).substring(1, 66)));
+ assertThrows(IllegalArgumentException.class, () -> HostName.of("a".repeat(64)));
+ }
+
+}
+
diff --git a/vespajlib/src/main/java/com/yahoo/net/HostName.java b/vespajlib/src/main/java/com/yahoo/net/HostName.java
new file mode 100644
index 00000000000..7446771f57c
--- /dev/null
+++ b/vespajlib/src/main/java/com/yahoo/net/HostName.java
@@ -0,0 +1,42 @@
+package com.yahoo.net;
+
+import java.util.Optional;
+
+/**
+ * This class has utilities for getting the hostname of the system running the JVM.
+ * Detection of the hostname is now done before starting any Vespa
+ * programs and provided in the environment variable VESPA_HOSTNAME;
+ * if that variable isn't set a default of "localhost" is always returned.
+ *
+ * @author arnej
+ */
+public class HostName {
+
+ private static String preferredHostName = null;
+
+ /**
+ * Return a public and fully qualified hostname for localhost that
+ * resolves to an IP address on a network interface.
+ *
+ * @return the preferred name of localhost
+ */
+ public static synchronized String getLocalhost() {
+ if (preferredHostName == null) {
+ preferredHostName = getPreferredHostName();
+ }
+ return preferredHostName;
+ }
+
+ static private String getPreferredHostName() {
+ Optional<String> vespaHostEnv = Optional.ofNullable(System.getenv("VESPA_HOSTNAME"));
+ if (vespaHostEnv.isPresent() && ! vespaHostEnv.get().trim().isEmpty()) {
+ return vespaHostEnv.get().trim();
+ }
+ return "localhost";
+ }
+
+ public static void setHostNameForTestingOnly(String hostName) {
+ preferredHostName = hostName;
+ }
+
+}