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 9ab718fb64 HDDS-6668. Implement JSON output for scm roles CLI (#5038)
9ab718fb64 is described below

commit 9ab718fb6451779f98d7526610a8c6ede76b7966
Author: Tejaskriya <[email protected]>
AuthorDate: Fri Jul 14 03:26:45 2023 +0530

    HDDS-6668. Implement JSON output for scm roles CLI (#5038)
---
 .../dist/src/main/smoketest/admincli/scmrole.robot |  7 +++-
 .../admin/scm/GetScmRatisRolesSubcommand.java      | 47 ++++++++++++++++++++--
 2 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/hadoop-ozone/dist/src/main/smoketest/admincli/scmrole.robot 
b/hadoop-ozone/dist/src/main/smoketest/admincli/scmrole.robot
index b7bb96aef7..2972754856 100644
--- a/hadoop-ozone/dist/src/main/smoketest/admincli/scmrole.robot
+++ b/hadoop-ozone/dist/src/main/smoketest/admincli/scmrole.robot
@@ -25,4 +25,9 @@ Test Timeout        5 minutes
 *** Test Cases ***
 Run scm roles
     ${output} =         Execute          ozone admin scm roles
-                        Should Match Regexp   ${output}  [scm:9894(:LEADER|)]
\ No newline at end of file
+                        Should Match Regexp   ${output}  [scm:9894(:LEADER|)]
+
+List scm roles as JSON
+    ${output} =         Execute          ozone admin scm roles --json
+    ${leader} =         Execute          echo '${output}' | jq -r '.[] | 
select(.raftPeerRole == "LEADER")'
+                        Should Not Be Equal       ${leader}       ${EMPTY}
\ No newline at end of file
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/scm/GetScmRatisRolesSubcommand.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/scm/GetScmRatisRolesSubcommand.java
index 16fbc68a19..480133e59b 100644
--- 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/scm/GetScmRatisRolesSubcommand.java
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/scm/GetScmRatisRolesSubcommand.java
@@ -18,12 +18,19 @@
 package org.apache.hadoop.ozone.admin.scm;
 
 import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+
 import org.apache.hadoop.hdds.cli.HddsVersionProvider;
 import org.apache.hadoop.hdds.scm.cli.ScmSubcommand;
 import org.apache.hadoop.hdds.scm.client.ScmClient;
+import org.apache.hadoop.hdds.server.JsonUtils;
 import picocli.CommandLine;
 
+import static java.lang.System.err;
+
 /**
  * Handler of scm status command.
  */
@@ -38,11 +45,45 @@ public class GetScmRatisRolesSubcommand extends 
ScmSubcommand {
   @CommandLine.ParentCommand
   private ScmAdmin parent;
 
+  @CommandLine.Option(names = { "--json" },
+      defaultValue = "false",
+      description = "Format output as JSON")
+  private boolean json;
+
   @Override
   protected void execute(ScmClient scmClient) throws IOException {
-    List<String> roles = scmClient.getScmRatisRoles();
-    for (String role: roles) {
-      System.out.println(role);
+    List<String> ratisRoles = scmClient.getScmRatisRoles();
+    if (json) {
+      Map<String, Map<String, String>> scmRoles = parseScmRoles(ratisRoles);
+      System.out.print(
+          JsonUtils.toJsonStringWithDefaultPrettyPrinter(scmRoles));
+    } else {
+      for (String role: ratisRoles) {
+        System.out.println(role);
+      }
+    }
+  }
+
+  private Map<String, Map<String, String>> parseScmRoles(
+      List<String> ratisRoles) {
+    Map<String, Map<String, String>> allRoles = new HashMap<>();
+    for (String role : ratisRoles) {
+      Map<String, String> roleDetails = new HashMap<>();
+      String[] roles = role.split(":");
+      if (roles.length < 2) {
+        err.println("Invalid response received for ScmRatisRoles.");
+        return Collections.emptyMap();
+      }
+      // In case, there is no ratis, there is no ratis role.
+      // This will just print the hostname with ratis port as the address
+      roleDetails.put("address", roles[0].concat(":").concat(roles[1]));
+      if (roles.length == 5) {
+        roleDetails.put("raftPeerRole", roles[2]);
+        roleDetails.put("ID", roles[3]);
+        roleDetails.put("InetAddress", roles[4]);
+      }
+      allRoles.put(roles[0], roleDetails);
     }
+    return allRoles;
   }
 }


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

Reply via email to