|
@@ -19,9 +19,11 @@
|
|
package org.apache.hadoop.hdds.scm.cli;
|
|
package org.apache.hadoop.hdds.scm.cli;
|
|
|
|
|
|
import org.apache.hadoop.hdds.cli.HddsVersionProvider;
|
|
import org.apache.hadoop.hdds.cli.HddsVersionProvider;
|
|
|
|
+import org.apache.hadoop.hdds.protocol.DatanodeDetails;
|
|
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
|
|
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
|
|
import org.apache.hadoop.hdds.scm.client.ScmClient;
|
|
import org.apache.hadoop.hdds.scm.client.ScmClient;
|
|
import picocli.CommandLine;
|
|
import picocli.CommandLine;
|
|
|
|
+
|
|
import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeState.DEAD;
|
|
import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeState.DEAD;
|
|
import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeState.DECOMMISSIONED;
|
|
import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeState.DECOMMISSIONED;
|
|
import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeState.DECOMMISSIONING;
|
|
import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeState.DECOMMISSIONING;
|
|
@@ -29,7 +31,11 @@ import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeState.HEALTHY
|
|
import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeState.STALE;
|
|
import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeState.STALE;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
|
|
+import java.util.Collection;
|
|
|
|
+import java.util.Collections;
|
|
|
|
+import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
+import java.util.TreeSet;
|
|
import java.util.concurrent.Callable;
|
|
import java.util.concurrent.Callable;
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -55,6 +61,10 @@ public class TopologySubcommand implements Callable<Void> {
|
|
stateArray.add(DECOMMISSIONED);
|
|
stateArray.add(DECOMMISSIONED);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @CommandLine.Option(names = {"-o", "--order"},
|
|
|
|
+ description = "Print Topology ordered by network location")
|
|
|
|
+ private boolean order;
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public Void call() throws Exception {
|
|
public Void call() throws Exception {
|
|
try (ScmClient scmClient = parent.createScmClient()) {
|
|
try (ScmClient scmClient = parent.createScmClient()) {
|
|
@@ -64,17 +74,51 @@ public class TopologySubcommand implements Callable<Void> {
|
|
if (nodes != null && nodes.size() > 0) {
|
|
if (nodes != null && nodes.size() > 0) {
|
|
// show node state
|
|
// show node state
|
|
System.out.println("State = " + state.toString());
|
|
System.out.println("State = " + state.toString());
|
|
- // format "hostname/ipAddress networkLocation"
|
|
|
|
- nodes.forEach(node -> {
|
|
|
|
- System.out.print(node.getNodeID().getHostName() + "/" +
|
|
|
|
- node.getNodeID().getIpAddress());
|
|
|
|
- System.out.println(" " +
|
|
|
|
- (node.getNodeID().getNetworkLocation() != null ?
|
|
|
|
- node.getNodeID().getNetworkLocation() : "NA"));
|
|
|
|
- });
|
|
|
|
|
|
+ if (order) {
|
|
|
|
+ printOrderedByLocation(nodes);
|
|
|
|
+ } else {
|
|
|
|
+ printNodesWithLocation(nodes);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // Format
|
|
|
|
+ // Location: rack1
|
|
|
|
+ // ipAddress(hostName)
|
|
|
|
+ private void printOrderedByLocation(List<HddsProtos.Node> nodes) {
|
|
|
|
+ HashMap<String, TreeSet<DatanodeDetails>> tree =
|
|
|
|
+ new HashMap<>();
|
|
|
|
+ for (HddsProtos.Node node : nodes) {
|
|
|
|
+ String location = node.getNodeID().getNetworkLocation();
|
|
|
|
+ if (location != null && !tree.containsKey(location)) {
|
|
|
|
+ tree.put(location, new TreeSet<>());
|
|
|
|
+ }
|
|
|
|
+ tree.get(location).add(DatanodeDetails.getFromProtoBuf(node.getNodeID()));
|
|
|
|
+ }
|
|
|
|
+ ArrayList<String> locations = new ArrayList<>(tree.keySet());
|
|
|
|
+ Collections.sort(locations);
|
|
|
|
+
|
|
|
|
+ locations.forEach(location -> {
|
|
|
|
+ System.out.println("Location: " + location);
|
|
|
|
+ tree.get(location).forEach(node -> {
|
|
|
|
+ System.out.println(" " + node.getIpAddress() + "(" + node.getHostName()
|
|
|
|
+ + ")");
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ // Format "ipAddress(hostName) networkLocation"
|
|
|
|
+ private void printNodesWithLocation(Collection<HddsProtos.Node> nodes) {
|
|
|
|
+ nodes.forEach(node -> {
|
|
|
|
+ System.out.print(" " + node.getNodeID().getIpAddress() + "(" +
|
|
|
|
+ node.getNodeID().getHostName() + ")");
|
|
|
|
+ System.out.println(" " +
|
|
|
|
+ (node.getNodeID().getNetworkLocation() != null ?
|
|
|
|
+ node.getNodeID().getNetworkLocation() : "NA"));
|
|
|
|
+ });
|
|
|
|
+ }
|
|
}
|
|
}
|