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]