You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by xy...@apache.org on 2019/06/06 03:13:46 UTC

[hadoop] branch trunk updated: HDDS-1612. Add 'scmcli printTopology' shell command to print datanode topology. Contributed by Sammi Chen.(#910)

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

xyao pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/hadoop.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 73954c1  HDDS-1612. Add 'scmcli printTopology' shell command to print datanode topology. Contributed by Sammi Chen.(#910)
73954c1 is described below

commit 73954c1dd98dd9f0aa535aeefcd1484d09fd75dc
Author: Sammi Chen <sa...@apache.org>
AuthorDate: Thu Jun 6 11:13:39 2019 +0800

    HDDS-1612. Add 'scmcli printTopology' shell command to print datanode topology. Contributed by Sammi Chen.(#910)
---
 .../hadoop/hdds/protocol/DatanodeDetails.java      |  2 +
 hadoop-hdds/common/src/main/proto/hdds.proto       |  1 +
 .../org/apache/hadoop/hdds/scm/cli/SCMCLI.java     |  3 +-
 .../hadoop/hdds/scm/cli/TopologySubcommand.java    | 80 ++++++++++++++++++++++
 4 files changed, 85 insertions(+), 1 deletion(-)

diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/protocol/DatanodeDetails.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/protocol/DatanodeDetails.java
index be6f44c..34de028 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/protocol/DatanodeDetails.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/protocol/DatanodeDetails.java
@@ -212,6 +212,8 @@ public class DatanodeDetails extends NodeImpl implements
     if (certSerialId != null) {
       builder.setCertSerialId(certSerialId);
     }
+    builder.setNetworkLocation(getNetworkLocation());
+
     for (Port port : ports) {
       builder.addPorts(HddsProtos.Port.newBuilder()
           .setName(port.getName().toString())
diff --git a/hadoop-hdds/common/src/main/proto/hdds.proto b/hadoop-hdds/common/src/main/proto/hdds.proto
index ddde7ea..2d5cb03 100644
--- a/hadoop-hdds/common/src/main/proto/hdds.proto
+++ b/hadoop-hdds/common/src/main/proto/hdds.proto
@@ -34,6 +34,7 @@ message DatanodeDetailsProto {
     required string hostName = 3;      // hostname
     repeated Port ports = 4;
     optional string certSerialId = 5;   // Certificate serial id.
+    optional string networkLocation = 6; // Network topology location
 }
 
 /**
diff --git a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/SCMCLI.java b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/SCMCLI.java
index 5013a74..1a19a3c 100644
--- a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/SCMCLI.java
+++ b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/SCMCLI.java
@@ -84,7 +84,8 @@ import picocli.CommandLine.Option;
         CreateSubcommand.class,
         CloseSubcommand.class,
         ListPipelinesSubcommand.class,
-        ClosePipelineSubcommand.class
+        ClosePipelineSubcommand.class,
+        TopologySubcommand.class
     },
     mixinStandardHelpOptions = true)
 public class SCMCLI extends GenericCli {
diff --git a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/TopologySubcommand.java b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/TopologySubcommand.java
new file mode 100644
index 0000000..6deccd1
--- /dev/null
+++ b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/TopologySubcommand.java
@@ -0,0 +1,80 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hdds.scm.cli;
+
+import org.apache.hadoop.hdds.cli.HddsVersionProvider;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
+import org.apache.hadoop.hdds.scm.client.ScmClient;
+import picocli.CommandLine;
+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.DECOMMISSIONING;
+import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeState.HEALTHY;
+import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeState.STALE;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+/**
+ * Handler of printTopology command.
+ */
+@CommandLine.Command(
+    name = "printTopology",
+    description = "Print a tree of the network topology as reported by SCM",
+    mixinStandardHelpOptions = true,
+    versionProvider = HddsVersionProvider.class)
+public class TopologySubcommand implements Callable<Void> {
+
+  @CommandLine.ParentCommand
+  private SCMCLI parent;
+
+  private static List<HddsProtos.NodeState> stateArray = new ArrayList<>();
+
+  static {
+    stateArray.add(HEALTHY);
+    stateArray.add(STALE);
+    stateArray.add(DEAD);
+    stateArray.add(DECOMMISSIONING);
+    stateArray.add(DECOMMISSIONED);
+  }
+
+  @Override
+  public Void call() throws Exception {
+    try (ScmClient scmClient = parent.createScmClient()) {
+      for (HddsProtos.NodeState state : stateArray) {
+        List<HddsProtos.Node> nodes = scmClient.queryNode(state,
+            HddsProtos.QueryScope.CLUSTER, "");
+        if (nodes != null && nodes.size() > 0) {
+          // show node state
+          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"));
+          });
+        }
+      }
+      return null;
+    }
+  }
+}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org