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]