diff options
-rw-r--r-- | config-provisioning/src/test/java/com/yahoo/config/provision/HostNameTest.java | 35 | ||||
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/net/HostName.java | 42 |
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; + } + +} |