This is an automated email from the ASF dual-hosted git repository.

adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new ea74fada9cd HDDS-15777. Make admin CLI subcommands parse IPv6 RPC 
addresses correctly (#10885)
ea74fada9cd is described below

commit ea74fada9cdd39b89f8765ccd4b3b00919c5e07d
Author: psy-ns <[email protected]>
AuthorDate: Sat Aug 1 23:17:18 2026 +0530

    HDDS-15777. Make admin CLI subcommands parse IPv6 RPC addresses correctly 
(#10885)
---
 .../java/org/apache/hadoop/hdds/TestHddsUtils.java |  9 ++++++
 .../ozone/admin/nssummary/NSSummaryAdmin.java      | 31 ++++++++-----------
 .../ozone/admin/om/DecommissionOMSubcommand.java   |  3 +-
 .../ozone/insight/BaseInsightSubCommand.java       | 35 ++++++++--------------
 .../ozone/insight/TestBaseInsightSubCommand.java   | 15 ++++++++++
 .../hadoop/ozone/recon/ReconEndpointTestUtil.java  | 25 ++++++++--------
 6 files changed, 63 insertions(+), 55 deletions(-)

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 8b2532391ad..36bc8bed95f 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 d6f8a636ce7..7fa3046355c 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 <Recon RPC host name>:<Recon http(s) address port>
       final String rpcHost =
           conf.get(OZONE_RECON_ADDRESS_KEY, OZONE_RECON_ADDRESS_DEFAULT);
-      host = getHostOnly(rpcHost) + ":" + getPort(host);
+      Optional<String> 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 3da4c0c043b..bc1666bf45f 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 3d5ff688e65..4a20da99f4f 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<String> scmBindHost = HddsUtils.getHostName(address);
+      if (scmBindHost.isPresent()
+          && scmBindHost.get().equals(OZONE_SCM_HTTP_BIND_HOST_DEFAULT)) {
         Optional<String> 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<String> omBindHost = HddsUtils.getHostName(address);
+      if (omBindHost.isPresent()
+          && omBindHost.get().equals(OZONE_OM_HTTP_BIND_HOST_DEFAULT)) {
         Optional<String> 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<String, InsightPoint> createInsightPoints(
       OzoneConfiguration configuration) {
     Map<String, InsightPoint> 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 9b7e6ef075d..f37c34cdbfe 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 60352669208..8759925bac2 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 <Recon RPC host name>:<Recon http(s) address port>
       final String rpcHost =
           conf.get(OZONE_RECON_ADDRESS_KEY, OZONE_RECON_ADDRESS_DEFAULT);
-      host = getHostOnly(rpcHost) + ":" + getPort(host);
+      Optional<String> 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;
   }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to