diff --git a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/TestHddsUtils.java b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/TestHddsUtils.java index 8b2532391ada..36bc8bed95fa 100644 --- a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/TestHddsUtils.java +++ b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/TestHddsUtils.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.OptionalInt; import org.apache.hadoop.fs.CommonConfigurationKeysPublic; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.scm.ScmConfigKeys; @@ -78,6 +79,14 @@ void testGetHostName() { () -> HddsUtils.getHostName("a:b")); } + @Test + void testGetHostPort() { + assertEquals(OptionalInt.of(9876), HddsUtils.getHostPort("0.0.0.0:9876")); + assertEquals(OptionalInt.of(9862), HddsUtils.getHostPort("localhost:9862")); + assertEquals(OptionalInt.of(9862), HddsUtils.getHostPort("[2001:db8::1]:9862")); + assertEquals(OptionalInt.empty(), HddsUtils.getHostPort("localhost")); + } + @Test void testGetHostPortString() { // Hostnames and IPv4 literals are joined with a plain colon. diff --git a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/nssummary/NSSummaryAdmin.java b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/nssummary/NSSummaryAdmin.java index d6f8a636ce73..7fa3046355c1 100644 --- a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/nssummary/NSSummaryAdmin.java +++ b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/nssummary/NSSummaryAdmin.java @@ -27,6 +27,9 @@ import static org.apache.hadoop.hdds.server.http.HttpServer2.HTTPS_SCHEME; import static org.apache.hadoop.hdds.server.http.HttpServer2.HTTP_SCHEME; +import java.util.Optional; +import java.util.OptionalInt; +import org.apache.hadoop.hdds.HddsUtils; import org.apache.hadoop.hdds.cli.AdminSubcommand; import org.apache.hadoop.hdds.cli.HddsVersionProvider; import org.apache.hadoop.hdds.conf.ConfigurationSource; @@ -55,20 +58,6 @@ public class NSSummaryAdmin implements AdminSubcommand { @CommandLine.ParentCommand private OzoneAdmin parent; - /** - * e.g. Input: "0.0.0.0:9891" -> Output: "0.0.0.0" - */ - private String getHostOnly(String host) { - return host.split(":", 2)[0]; - } - - /** - * e.g. Input: "0.0.0.0:9891" -> Output: "9891" - */ - private String getPort(String host) { - return host.split(":", 2)[1]; - } - public String getReconWebAddress() { final OzoneConfiguration conf = parent.getOzoneConf(); final String protocol; @@ -81,21 +70,25 @@ public String getReconWebAddress() { protocol = HTTPS_SCHEME; host = conf.get(OZONE_RECON_HTTPS_ADDRESS_KEY, OZONE_RECON_HTTPS_ADDRESS_DEFAULT); - isHostDefault = getHostOnly(host).equals( - getHostOnly(OZONE_RECON_HTTPS_ADDRESS_DEFAULT)); + isHostDefault = HddsUtils.getHostName(host) + .equals(HddsUtils.getHostName(OZONE_RECON_HTTPS_ADDRESS_DEFAULT)); } else { protocol = HTTP_SCHEME; host = conf.get(OZONE_RECON_HTTP_ADDRESS_KEY, OZONE_RECON_HTTP_ADDRESS_DEFAULT); - isHostDefault = getHostOnly(host).equals( - getHostOnly(OZONE_RECON_HTTP_ADDRESS_DEFAULT)); + isHostDefault = HddsUtils.getHostName(host) + .equals(HddsUtils.getHostName(OZONE_RECON_HTTP_ADDRESS_DEFAULT)); } if (isHostDefault) { // Fallback to : final String rpcHost = conf.get(OZONE_RECON_ADDRESS_KEY, OZONE_RECON_ADDRESS_DEFAULT); - host = getHostOnly(rpcHost) + ":" + getPort(host); + Optional rpcHostName = HddsUtils.getHostName(rpcHost); + OptionalInt port = HddsUtils.getHostPort(host); + if (rpcHostName.isPresent() && port.isPresent()) { + host = HddsUtils.getHostPortString(rpcHostName.get(), port.getAsInt()); + } } return protocol + "://" + host; diff --git a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/DecommissionOMSubcommand.java b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/DecommissionOMSubcommand.java index 3da4c0c043b2..bc1666bf45f2 100644 --- a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/DecommissionOMSubcommand.java +++ b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/DecommissionOMSubcommand.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.concurrent.Callable; import org.apache.commons.lang3.StringUtils; +import org.apache.hadoop.hdds.HddsUtils; import org.apache.hadoop.hdds.cli.HddsVersionProvider; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.ozone.OmUtils; @@ -134,7 +135,7 @@ private void verifyNodeIdAndHostAddress() throws IOException { hostInetAddress = InetAddress.getByName(hostname); InetAddress rpcAddressFromConfig = InetAddress.getByName( - rpcAddrStr.split(":")[0]); + HddsUtils.getHostName(rpcAddrStr).orElse("")); if (!hostInetAddress.equals(rpcAddressFromConfig)) { throw new IOException("OM " + decommNodeId + "'s host address in " + diff --git a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/BaseInsightSubCommand.java b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/BaseInsightSubCommand.java index 3d5ff688e659..4a20da99f4fd 100644 --- a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/BaseInsightSubCommand.java +++ b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/BaseInsightSubCommand.java @@ -33,6 +33,7 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.Optional; +import java.util.OptionalInt; import org.apache.hadoop.hdds.HddsUtils; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.scm.ScmConfigKeys; @@ -105,12 +106,15 @@ private String getComponentAddress(OzoneConfiguration conf, } // Fallback to RPC hostname - if (getHostOnly(address).equals(OZONE_SCM_HTTP_BIND_HOST_DEFAULT)) { + Optional scmBindHost = HddsUtils.getHostName(address); + if (scmBindHost.isPresent() + && scmBindHost.get().equals(OZONE_SCM_HTTP_BIND_HOST_DEFAULT)) { Optional scmHost = HddsUtils.getHostNameFromConfigKeys(conf, ScmConfigKeys.OZONE_SCM_BLOCK_CLIENT_ADDRESS_KEY, ScmConfigKeys.OZONE_SCM_CLIENT_ADDRESS_KEY); - if (scmHost.isPresent()) { - return scmHost.get() + ":" + getPort(address); + OptionalInt scmPort = HddsUtils.getHostPort(address); + if (scmHost.isPresent() && scmPort.isPresent()) { + return HddsUtils.getHostPortString(scmHost.get(), scmPort.getAsInt()); } } return address; @@ -125,11 +129,14 @@ private String getComponentAddress(OzoneConfiguration conf, } // Fallback to RPC hostname - if (getHostOnly(address).equals(OZONE_OM_HTTP_BIND_HOST_DEFAULT)) { + Optional omBindHost = HddsUtils.getHostName(address); + if (omBindHost.isPresent() + && omBindHost.get().equals(OZONE_OM_HTTP_BIND_HOST_DEFAULT)) { Optional omHost = HddsUtils.getHostNameFromConfigKeys(conf, OMConfigKeys.OZONE_OM_ADDRESS_KEY); - if (omHost.isPresent()) { - return omHost.get() + ":" + getPort(address); + OptionalInt omPort = HddsUtils.getHostPort(address); + if (omHost.isPresent() && omPort.isPresent()) { + return HddsUtils.getHostPortString(omHost.get(), omPort.getAsInt()); } } return address; @@ -140,22 +147,6 @@ private String getComponentAddress(OzoneConfiguration conf, } } - /** - * Extract hostname from address string. - * e.g. Input: "0.0.0.0:9876" -> Output: "0.0.0.0" - */ - private String getHostOnly(String address) { - return address.split(":", 2)[0]; - } - - /** - * Extract port from address string. - * e.g. Input: "0.0.0.0:9876" -> Output: "9876" - */ - private String getPort(String address) { - return address.split(":", 2)[1]; - } - public Map createInsightPoints( OzoneConfiguration configuration) { Map insights = new LinkedHashMap<>(); diff --git a/hadoop-ozone/insight/src/test/java/org/apache/hadoop/ozone/insight/TestBaseInsightSubCommand.java b/hadoop-ozone/insight/src/test/java/org/apache/hadoop/ozone/insight/TestBaseInsightSubCommand.java index 9b7e6ef075d0..f37c34cdbfeb 100644 --- a/hadoop-ozone/insight/src/test/java/org/apache/hadoop/ozone/insight/TestBaseInsightSubCommand.java +++ b/hadoop-ozone/insight/src/test/java/org/apache/hadoop/ozone/insight/TestBaseInsightSubCommand.java @@ -99,4 +99,19 @@ public void testFallbackToRpcAddress() { assertEquals("https://om-host:" + OMConfigKeys.OZONE_OM_HTTPS_BIND_PORT_DEFAULT, command.getHost(conf, new Component(Type.OM, null))); } + + @Test + public void testFallbackToIpv6RpcAddress() { + OzoneConfiguration conf = new OzoneConfiguration(); + conf.set(OzoneConfigKeys.OZONE_HTTP_POLICY_KEY, "HTTP_ONLY"); + conf.set(ScmConfigKeys.OZONE_SCM_CLIENT_ADDRESS_KEY, "[2001:db8::1]:9860"); + conf.set(OMConfigKeys.OZONE_OM_ADDRESS_KEY, "[2001:db8::2]:9862"); + + BaseInsightSubCommand command = new BaseInsightSubCommand(); + + assertEquals("http://[2001:db8::1]:" + ScmConfigKeys.OZONE_SCM_HTTP_BIND_PORT_DEFAULT, + command.getHost(conf, new Component(Type.SCM, null))); + assertEquals("http://[2001:db8::2]:" + OMConfigKeys.OZONE_OM_HTTP_BIND_PORT_DEFAULT, + command.getHost(conf, new Component(Type.OM, null))); + } } diff --git a/hadoop-ozone/integration-test-recon/src/test/java/org/apache/hadoop/ozone/recon/ReconEndpointTestUtil.java b/hadoop-ozone/integration-test-recon/src/test/java/org/apache/hadoop/ozone/recon/ReconEndpointTestUtil.java index 603526692088..8759925bac20 100644 --- a/hadoop-ozone/integration-test-recon/src/test/java/org/apache/hadoop/ozone/recon/ReconEndpointTestUtil.java +++ b/hadoop-ozone/integration-test-recon/src/test/java/org/apache/hadoop/ozone/recon/ReconEndpointTestUtil.java @@ -37,7 +37,10 @@ import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; +import java.util.Optional; +import java.util.OptionalInt; import org.apache.commons.io.IOUtils; +import org.apache.hadoop.hdds.HddsUtils; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.server.http.HttpConfig; import org.apache.hadoop.hdfs.web.URLConnectionFactory; @@ -150,34 +153,30 @@ public static String getReconWebAddress(OzoneConfiguration conf) { protocol = HTTPS_SCHEME; host = conf.get(OZONE_RECON_HTTPS_ADDRESS_KEY, OZONE_RECON_HTTPS_ADDRESS_DEFAULT); - isHostDefault = getHostOnly(host).equals( - getHostOnly(OZONE_RECON_HTTPS_ADDRESS_DEFAULT)); + isHostDefault = HddsUtils.getHostName(host) + .equals(HddsUtils.getHostName(OZONE_RECON_HTTPS_ADDRESS_DEFAULT)); } else { protocol = HTTP_SCHEME; host = conf.get(OZONE_RECON_HTTP_ADDRESS_KEY, OZONE_RECON_HTTP_ADDRESS_DEFAULT); - isHostDefault = getHostOnly(host).equals( - getHostOnly(OZONE_RECON_HTTP_ADDRESS_DEFAULT)); + isHostDefault = HddsUtils.getHostName(host) + .equals(HddsUtils.getHostName(OZONE_RECON_HTTP_ADDRESS_DEFAULT)); } if (isHostDefault) { // Fallback to : final String rpcHost = conf.get(OZONE_RECON_ADDRESS_KEY, OZONE_RECON_ADDRESS_DEFAULT); - host = getHostOnly(rpcHost) + ":" + getPort(host); + Optional rpcHostName = HddsUtils.getHostName(rpcHost); + OptionalInt port = HddsUtils.getHostPort(host); + if (rpcHostName.isPresent() && port.isPresent()) { + host = HddsUtils.getHostPortString(rpcHostName.get(), port.getAsInt()); + } } return protocol + "://" + host; } - public static String getHostOnly(String host) { - return host.split(":", 2)[0]; - } - - public static String getPort(String host) { - return host.split(":", 2)[1]; - } - public static boolean isHTTPSEnabled(OzoneConfiguration conf) { return getHttpPolicy(conf) == HttpConfig.Policy.HTTPS_ONLY; }