You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ozone.apache.org by "sadanand48 (via GitHub)" <gi...@apache.org> on 2023/07/11 17:20:32 UTC

[GitHub] [ozone] sadanand48 commented on a diff in pull request #5038: HDDS-6668. scm roles CLI should provide JSON output option

sadanand48 commented on code in PR #5038:
URL: https://github.com/apache/ozone/pull/5038#discussion_r1260039801


##########
hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/scm/GetScmRatisRolesSubcommand.java:
##########
@@ -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) {

Review Comment:
   although this would work for now, I feel a better way to solve this is by creating an Object that would capture these variables and then print it right away as  a json.
   Adding a new API like List<SCMRole> getScmRatisRoles() and directly print the object. I see OM is using a similar  way using OMRoleInfo.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@ozone.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@ozone.apache.org
For additional commands, e-mail: issues-help@ozone.apache.org