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

tejaskriya 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 5c7da6d1595 HDDS-13592. Make InfoSubcommand validate all container IDs 
before proceeding (#9001)
5c7da6d1595 is described below

commit 5c7da6d1595bb8b6ec9187216567597b751a42e2
Author: Gargi Jaiswal <[email protected]>
AuthorDate: Tue Sep 16 09:40:25 2025 +0530

    HDDS-13592. Make InfoSubcommand validate all container IDs before 
proceeding (#9001)
---
 .../hdds/scm/cli/container/InfoSubcommand.java     | 31 ++++--------
 .../hdds/scm/cli/container/TestInfoSubCommand.java | 55 +++++++++++++++++-----
 .../src/main/smoketest/admincli/container.robot    |  5 ++
 3 files changed, 57 insertions(+), 34 deletions(-)

diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/hdds/scm/cli/container/InfoSubcommand.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/hdds/scm/cli/container/InfoSubcommand.java
index 34a5c48656f..c48e6251eb5 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/hdds/scm/cli/container/InfoSubcommand.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/hdds/scm/cli/container/InfoSubcommand.java
@@ -65,30 +65,23 @@ public class InfoSubcommand extends ScmSubcommand {
 
   @Override
   public void execute(ScmClient scmClient) throws IOException {
+    // validate all container IDs and fail fast
+    List<Long> containerIDs = containerList.getValidatedIDs();
+
     boolean first = true;
-    multiContainer = containerList.size() > 1;
+    multiContainer = containerIDs.size() > 1;
 
     printHeader();
-    // TODO HDDS-13592: Use ContainerIDParameters#getValidatedIDs to 
automatically handle type conversion and fail fast.
-    for (String id : containerList) {
-      printOutput(scmClient, id, first);
+    for (Long containerID : containerIDs) {
+      if (!first) {
+        printBreak();
+      }
+      printDetails(scmClient, containerID);
       first = false;
     }
     printFooter();
   }
 
-  private void printOutput(ScmClient scmClient, String id, boolean first)
-      throws IOException {
-    long containerID;
-    try {
-      containerID = Long.parseLong(id);
-    } catch (NumberFormatException e) {
-      printError("Invalid container ID: " + id);
-      return;
-    }
-    printDetails(scmClient, containerID, first);
-  }
-
   private void printHeader() {
     if (json && multiContainer) {
       System.out.println("[");
@@ -113,8 +106,7 @@ private void printBreak() {
     }
   }
 
-  private void printDetails(ScmClient scmClient, long containerID,
-      boolean first) throws IOException {
+  private void printDetails(ScmClient scmClient, long containerID) throws 
IOException {
     final ContainerWithPipeline container;
     try {
       container = scmClient.getContainerWithPipeline(containerID);
@@ -131,9 +123,6 @@ private void printDetails(ScmClient scmClient, long 
containerID,
       printError("Unable to retrieve the replica details: " + e.getMessage());
     }
 
-    if (!first) {
-      printBreak();
-    }
     if (json) {
       if (!container.getPipeline().isEmpty()) {
         ContainerWithPipelineAndReplicas wrapper =
diff --git 
a/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/hdds/scm/cli/container/TestInfoSubCommand.java
 
b/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/hdds/scm/cli/container/TestInfoSubCommand.java
index a0bee39530d..8e3d2abe3f1 100644
--- 
a/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/hdds/scm/cli/container/TestInfoSubCommand.java
+++ 
b/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/hdds/scm/cli/container/TestInfoSubCommand.java
@@ -119,14 +119,22 @@ public void testMultipleContainersCanBePassed() throws 
Exception {
     
when(scmClient.getContainerReplicas(anyLong())).thenReturn(getReplicas(true));
     cmd = new InfoSubcommand();
     CommandLine c = new CommandLine(cmd);
-    c.parseArgs("1", "123", "456", "invalid", "789");
+    c.parseArgs("1", "123", "456", "789");
     cmd.execute(scmClient);
     validateMultiOutput();
   }
 
+  @Test
+  public void testMultipleInvalidContainerIdFails() throws Exception {
+    cmd = new InfoSubcommand();
+    CommandLine c = new CommandLine(cmd);
+    c.parseArgs("1", "invalid", "-2", "0.5");
+    validateInvalidContainerIDOutput();
+  }
+
   @Test
   public void testContainersCanBeReadFromStdin() throws IOException {
-    String input = "1\n123\n456\ninvalid\n789\n";
+    String input = "1\n123\n456\n789\n";
     ByteArrayInputStream inContent = new 
ByteArrayInputStream(input.getBytes(DEFAULT_ENCODING));
     System.setIn(inContent);
     cmd = new InfoSubcommand();
@@ -137,23 +145,38 @@ public void testContainersCanBeReadFromStdin() throws 
IOException {
     validateMultiOutput();
   }
 
+  @Test
+  public void testInvalidContainerIdFromStdinFails() throws Exception {
+    String input = "1\ninvalid\n-2\n0.5\n";
+    ByteArrayInputStream inContent = new 
ByteArrayInputStream(input.getBytes(DEFAULT_ENCODING));
+    System.setIn(inContent);
+    cmd = new InfoSubcommand();
+    CommandLine c = new CommandLine(cmd);
+    c.parseArgs("-");
+    validateInvalidContainerIDOutput();
+  }
+
   private void validateMultiOutput() throws UnsupportedEncodingException {
     // Ensure we have a log line for each containerID
     List<String> replica = 
Arrays.stream(outContent.toString(DEFAULT_ENCODING).split("\n"))
         .filter(m -> m.matches("(?s)^Container id: (1|123|456|789).*"))
         .collect(Collectors.toList());
     assertEquals(4, replica.size());
+  }
 
-    Pattern p = Pattern.compile(
-        "^Invalid\\scontainer\\sID:\\sinvalid.*", Pattern.MULTILINE);
-    Matcher m = p.matcher(errContent.toString(DEFAULT_ENCODING));
-    assertTrue(m.find());
+  private void validateInvalidContainerIDOutput() throws Exception {
+    CommandLine.ParameterException ex = assertThrows(
+        CommandLine.ParameterException.class, () -> cmd.execute(scmClient));
+
+    assertThat(ex.getMessage())
+        .isEqualTo("Container IDs must be positive integers. Invalid container 
IDs: invalid -2 0.5");
+    assertThat(outContent.toString(DEFAULT_ENCODING)).isEmpty();
   }
 
   @Test
   public void testContainersCanBeReadFromStdinJson()
       throws IOException {
-    String input = "1\n123\n456\ninvalid\n789\n";
+    String input = "1\n123\n456\n789\n";
     ByteArrayInputStream inContent = new 
ByteArrayInputStream(input.getBytes(DEFAULT_ENCODING));
     System.setIn(inContent);
     cmd = new InfoSubcommand();
@@ -164,12 +187,23 @@ public void testContainersCanBeReadFromStdinJson()
     validateJsonMultiOutput();
   }
 
+  @Test
+  public void testInvalidContainerIdFromStdinJsonFails() throws Exception {
+    String input = "1\ninvalid\n-2\n0.5\n";
+    ByteArrayInputStream inContent = new 
ByteArrayInputStream(input.getBytes(DEFAULT_ENCODING));
+    System.setIn(inContent);
+    cmd = new InfoSubcommand();
+    CommandLine c = new CommandLine(cmd);
+    c.parseArgs("-", "--json");
+    validateInvalidContainerIDOutput();
+  }
+
   @Test
   public void testMultipleContainersCanBePassedJson() throws Exception {
     
when(scmClient.getContainerReplicas(anyLong())).thenReturn(getReplicas(true));
     cmd = new InfoSubcommand();
     CommandLine c = new CommandLine(cmd);
-    c.parseArgs("1", "123", "456", "invalid", "789", "--json");
+    c.parseArgs("1", "123", "456", "789", "--json");
     cmd.execute(scmClient);
 
     validateJsonMultiOutput();
@@ -181,11 +215,6 @@ private void validateJsonMultiOutput() throws 
UnsupportedEncodingException {
         .filter(m -> m.matches("(?s)^.*\"containerInfo\".*"))
         .collect(Collectors.toList());
     assertEquals(4, replica.size());
-
-    Pattern p = Pattern.compile(
-        "^Invalid\\scontainer\\sID:\\sinvalid.*", Pattern.MULTILINE);
-    Matcher m = p.matcher(errContent.toString(DEFAULT_ENCODING));
-    assertTrue(m.find());
   }
 
   private void testReplicaIncludedInOutput(boolean includeIndex)
diff --git a/hadoop-ozone/dist/src/main/smoketest/admincli/container.robot 
b/hadoop-ozone/dist/src/main/smoketest/admincli/container.robot
index e9450c9de59..f0c11b0881c 100644
--- a/hadoop-ozone/dist/src/main/smoketest/admincli/container.robot
+++ b/hadoop-ozone/dist/src/main/smoketest/admincli/container.robot
@@ -93,6 +93,11 @@ Container info
                         Should contain   ${output}   Pipeline id
                         Should contain   ${output}   Datanodes
 
+Container info should fail with invalid container ID
+    ${output} =         Execute And Ignore Error          ozone admin 
container info "${CONTAINER}" -2 0.5 abc
+                        Should contain   ${output}        Container IDs must 
be positive integers.
+                        Should contain   ${output}        Invalid container 
IDs: -2 0.5 abc
+
 Verbose container info
     ${output} =         Execute          ozone admin --verbose container info 
"${CONTAINER}"
                         Should contain   ${output}   Pipeline Info


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

Reply via email to