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

licheng pushed a commit to branch HDDS-2823
in repository https://gitbox.apache.org/repos/asf/hadoop-ozone.git


The following commit(s) were added to refs/heads/HDDS-2823 by this push:
     new 1c2a950  HDDS-4115. CLI command to show current SCM leader and 
follower status. (#1346)
1c2a950 is described below

commit 1c2a9502783c677dc24679f879f11782e7a201c1
Author: Rui Wang <[email protected]>
AuthorDate: Mon Sep 28 23:57:11 2020 -0700

    HDDS-4115. CLI command to show current SCM leader and follower status. 
(#1346)
    
    * HDDS-4115. CLI command to show current SCM leader and follower status.
    
    * fixup! address comments.
    
    * fixup! fix style
    
    * fixup! fix style
    
    * fixup! add cli command description
    
    * fixup! 1. use `ozone admin scm roles` 2. fix acceptance test
    
    * fixup! fix checkstyle
    
    * fixup! address comments
---
 .../java/org/apache/hadoop/hdds/scm/ScmInfo.java   | 32 ++++++++-
 .../apache/hadoop/hdds/scm/client/ScmClient.java   |  5 +-
 ...inerLocationProtocolClientSideTranslatorPB.java |  4 +-
 .../interface-client/src/main/proto/hdds.proto     |  1 +
 .../apache/hadoop/hdds/scm/ha/SCMHAManager.java    |  6 ++
 .../hadoop/hdds/scm/ha/SCMHAManagerImpl.java       | 11 +++
 ...inerLocationProtocolServerSideTranslatorPB.java |  2 +-
 .../hdds/scm/server/SCMClientProtocolServer.java   |  3 +-
 .../hdds/scm/server/StorageContainerManager.java   |  4 ++
 .../hadoop/hdds/scm/ha/MockSCMHAManager.java       |  9 +++
 .../hdds/scm/cli/ContainerOperationClient.java     |  4 ++
 .../dist/src/main/smoketest/admincli/scmha.robot   | 28 ++++++++
 .../apache/hadoop/ozone/shell/TestScmAdminHA.java  | 79 ++++++++++++++++++++++
 .../org/apache/hadoop/ozone/admin/OzoneAdmin.java  |  2 +
 .../admin/scm/GetScmRatisRolesSubcommand.java      | 46 +++++++++++++
 .../apache/hadoop/ozone/admin/scm/ScmAdmin.java    | 60 ++++++++++++++++
 .../hadoop/ozone/admin/scm/package-info.java       | 22 ++++++
 17 files changed, 312 insertions(+), 6 deletions(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmInfo.java 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmInfo.java
index 6236feb..b9d823e 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmInfo.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmInfo.java
@@ -18,6 +18,9 @@
 
 package org.apache.hadoop.hdds.scm;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * ScmInfo wraps the result returned from SCM#getScmInfo which
  * contains clusterId and the SCM Id.
@@ -25,6 +28,7 @@ package org.apache.hadoop.hdds.scm;
 public final class ScmInfo {
   private String clusterId;
   private String scmId;
+  private List<String> peerRoles;
 
   /**
    * Builder for ScmInfo.
@@ -32,6 +36,11 @@ public final class ScmInfo {
   public static class Builder {
     private String clusterId;
     private String scmId;
+    private List<String> peerRoles;
+
+    public Builder() {
+      peerRoles = new ArrayList<>();
+    }
 
     /**
      * sets the cluster id.
@@ -53,14 +62,25 @@ public final class ScmInfo {
       return this;
     }
 
+    /**
+     * Set peer address in Scm HA.
+     * @param roles ratis peer address in the format of [ip|hostname]:port
+     * @return  Builder for scmInfo
+     */
+    public Builder setRatisPeerRoles(List<String> roles) {
+      peerRoles.addAll(roles);
+      return this;
+    }
+
     public ScmInfo build() {
-      return new ScmInfo(clusterId, scmId);
+      return new ScmInfo(clusterId, scmId, peerRoles);
     }
   }
 
-  private ScmInfo(String clusterId, String scmId) {
+  private ScmInfo(String clusterId, String scmId, List<String> peerRoles) {
     this.clusterId = clusterId;
     this.scmId = scmId;
+    this.peerRoles = peerRoles;
   }
 
   /**
@@ -78,4 +98,12 @@ public final class ScmInfo {
   public String getScmId() {
     return scmId;
   }
+
+  /**
+   * Gets the list of peer roles (currently address) in Scm HA.
+   * @return List of peer address
+   */
+  public List<String> getRatisPeerRoles() {
+    return peerRoles;
+  }
 }
diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/client/ScmClient.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/client/ScmClient.java
index e4369fa..7c3c94c 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/client/ScmClient.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/client/ScmClient.java
@@ -246,5 +246,8 @@ public interface ScmClient extends Closeable {
    */
   boolean getReplicationManagerStatus() throws IOException;
 
-
+  /**
+   * returns the list of ratis peer roles. Currently only include peer address.
+   */
+  List<String> getScmRatisRoles() throws IOException;
 }
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java
index 0733940..cf88869 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java
@@ -444,7 +444,9 @@ public final class 
StorageContainerLocationProtocolClientSideTranslatorPB
         .getGetScmInfoResponse();
     ScmInfo.Builder builder = new ScmInfo.Builder()
         .setClusterId(resp.getClusterId())
-        .setScmId(resp.getScmId());
+        .setScmId(resp.getScmId())
+        .setRatisPeerRoles(resp.getPeerRolesList());
+
     return builder.build();
 
   }
diff --git a/hadoop-hdds/interface-client/src/main/proto/hdds.proto 
b/hadoop-hdds/interface-client/src/main/proto/hdds.proto
index de43907..acd2068 100644
--- a/hadoop-hdds/interface-client/src/main/proto/hdds.proto
+++ b/hadoop-hdds/interface-client/src/main/proto/hdds.proto
@@ -201,6 +201,7 @@ message GetScmInfoRequestProto {
 message GetScmInfoResponseProto {
     required string clusterId = 1;
     required string scmId = 2;
+    repeated string peerRoles = 3;
 }
 
 
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHAManager.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHAManager.java
index ade0ad9..dc68b41 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHAManager.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHAManager.java
@@ -17,6 +17,7 @@
 
 package org.apache.hadoop.hdds.scm.ha;
 
+import java.util.List;
 import org.apache.ratis.protocol.NotLeaderException;
 import org.apache.ratis.protocol.RaftPeer;
 
@@ -53,6 +54,11 @@ public interface SCMHAManager {
   void shutdown() throws IOException;
 
   /**
+   * Returns roles of ratis peers.
+   */
+  List<String> getRatisRoles();
+
+  /**
    * Returns NotLeaderException with useful info.
    */
   NotLeaderException triggerNotLeaderException();
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHAManagerImpl.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHAManagerImpl.java
index 8bb9457..e2aa04f 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHAManagerImpl.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHAManagerImpl.java
@@ -18,6 +18,8 @@
 package org.apache.hadoop.hdds.scm.ha;
 
 import com.google.common.base.Preconditions;
+import java.util.List;
+import java.util.stream.Collectors;
 import org.apache.hadoop.hdds.conf.ConfigurationSource;
 import org.apache.ratis.protocol.NotLeaderException;
 import org.apache.ratis.protocol.RaftGroupMemberId;
@@ -145,6 +147,15 @@ public class SCMHAManagerImpl implements SCMHAManager {
     ratisServer.stop();
   }
 
+  @Override
+  public List<String> getRatisRoles() {
+    return getRatisServer()
+            .getRaftPeers()
+            .stream()
+            .map(peer -> peer.getAddress() == null ? "" : peer.getAddress())
+            .collect(Collectors.toList());
+  }
+
   /**
    * {@inheritDoc}
    */
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
index d07cc56..198cd1b 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
@@ -441,8 +441,8 @@ public final class 
StorageContainerLocationProtocolServerSideTranslatorPB
     return HddsProtos.GetScmInfoResponseProto.newBuilder()
         .setClusterId(scmInfo.getClusterId())
         .setScmId(scmInfo.getScmId())
+        .addAllPeerRoles(scmInfo.getRatisPeerRoles())
         .build();
-
   }
 
   public InSafeModeResponseProto inSafeMode(
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
index 594527a..3ad31d7 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
@@ -488,7 +488,8 @@ public class SCMClientProtocolServer implements
       ScmInfo.Builder builder =
           new ScmInfo.Builder()
               .setClusterId(scm.getScmStorageConfig().getClusterID())
-              .setScmId(scm.getScmStorageConfig().getScmId());
+              .setScmId(scm.getScmStorageConfig().getScmId())
+              .setRatisPeerRoles(scm.getScmHAManager().getRatisRoles());
       return builder.build();
     } catch (Exception ex) {
       auditSuccess = false;
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java
index f54e15c..768ca09 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java
@@ -1168,4 +1168,8 @@ public final class StorageContainerManager extends 
ServiceRuntimeInfoImpl
     }
     return map;
   }
+
+  public SCMHAManager getScmHAManager() {
+    return scmHAManager;
+  }
 }
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/MockSCMHAManager.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/MockSCMHAManager.java
index ce48c11..e31e7e1 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/MockSCMHAManager.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/MockSCMHAManager.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.hdds.scm.ha;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.EnumMap;
 import java.util.List;
 import java.util.Map;
@@ -107,6 +108,14 @@ public final class MockSCMHAManager implements 
SCMHAManager {
     ratisServer.stop();
   }
 
+  @Override
+  public List<String> getRatisRoles() {
+    return Arrays.asList(
+        "180.3.14.5:9865",
+        "180.3.14.21:9865",
+        "180.3.14.145:9865");
+  }
+
   /**
    * {@inheritDoc}
    */
diff --git 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java
 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java
index 96cd530..0383642 100644
--- 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java
+++ 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java
@@ -508,4 +508,8 @@ public class ContainerOperationClient implements ScmClient {
     return storageContainerLocationClient.getReplicationManagerStatus();
   }
 
+  @Override
+  public List<String> getScmRatisRoles() throws IOException {
+    return storageContainerLocationClient.getScmInfo().getRatisPeerRoles();
+  }
 }
diff --git a/hadoop-ozone/dist/src/main/smoketest/admincli/scmha.robot 
b/hadoop-ozone/dist/src/main/smoketest/admincli/scmha.robot
new file mode 100644
index 0000000..31a990f
--- /dev/null
+++ b/hadoop-ozone/dist/src/main/smoketest/admincli/scmha.robot
@@ -0,0 +1,28 @@
+# 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
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# 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.
+
+*** Settings ***
+Documentation       Smoketest ozone cluster startup
+Library             OperatingSystem
+Library             BuiltIn
+Resource            ../commonlib.robot
+Test Timeout        5 minutes
+
+*** Variables ***
+
+*** Test Cases ***
+Run scm roles
+    ${output} =         Execute          ozone admin scm roles
+                        Should contain   ${output}  []
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestScmAdminHA.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestScmAdminHA.java
new file mode 100644
index 0000000..63a8e71
--- /dev/null
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestScmAdminHA.java
@@ -0,0 +1,79 @@
+/*
+ * 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
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  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.ozone.shell;
+
+import java.net.InetSocketAddress;
+import java.util.UUID;
+import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.hdds.scm.ScmConfigKeys;
+import org.apache.hadoop.ozone.MiniOzoneCluster;
+import org.apache.hadoop.ozone.admin.OzoneAdmin;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * This class tests ozone admin scm commands.
+ */
+public class TestScmAdminHA {
+  private static OzoneAdmin ozoneAdmin;
+  private static OzoneConfiguration conf;
+  private static String omServiceId;
+  private static int numOfOMs;
+  private static String clusterId;
+  private static String scmId;
+  private static MiniOzoneCluster cluster;
+
+  @BeforeClass
+  public static void init() throws Exception {
+    ozoneAdmin = new OzoneAdmin();
+    conf = new OzoneConfiguration();
+
+    // Init HA cluster
+    omServiceId = "om-service-test1";
+    numOfOMs = 3;
+    clusterId = UUID.randomUUID().toString();
+    scmId = UUID.randomUUID().toString();
+    cluster = MiniOzoneCluster.newHABuilder(conf)
+        .setClusterId(clusterId)
+        .setScmId(scmId)
+        .setOMServiceId(omServiceId)
+        .setNumOfOzoneManagers(numOfOMs)
+        .build();
+    conf.setQuietMode(false);
+    // enable ratis for Scm.
+    conf.setBoolean(ScmConfigKeys.DFS_CONTAINER_RATIS_ENABLED_KEY, true);
+    cluster.waitForClusterToBeReady();
+  }
+
+  @AfterClass
+  public static void shutdown() {
+    if (cluster != null) {
+      cluster.shutdown();
+    }
+  }
+
+  @Test
+  public void testGetRatisRoles() {
+    InetSocketAddress address =
+        cluster.getStorageContainerManager().getClientRpcAddress();
+    String hostPort = address.getHostName() + ":" + address.getPort();
+    String[] args = {"--scm", hostPort, "scm", "roles"};
+    ozoneAdmin.execute(args);
+  }
+}
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/OzoneAdmin.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/OzoneAdmin.java
index 81f8f64..76ba42f 100644
--- 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/OzoneAdmin.java
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/OzoneAdmin.java
@@ -35,6 +35,7 @@ import 
org.apache.hadoop.hdds.scm.cli.datanode.DatanodeCommands;
 import org.apache.hadoop.hdds.scm.cli.pipeline.PipelineCommands;
 import org.apache.hadoop.hdds.scm.client.ScmClient;
 import org.apache.hadoop.ozone.admin.om.OMAdmin;
+import org.apache.hadoop.ozone.admin.scm.ScmAdmin;
 import org.apache.hadoop.util.NativeCodeLoader;
 
 import org.apache.commons.lang3.StringUtils;
@@ -56,6 +57,7 @@ import picocli.CommandLine.Option;
     versionProvider = HddsVersionProvider.class,
     subcommands = {
         OMAdmin.class,
+        ScmAdmin.class,
         SafeModeCommands.class,
         ContainerCommands.class,
         PipelineCommands.class,
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
new file mode 100644
index 0000000..cf2310c
--- /dev/null
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/scm/GetScmRatisRolesSubcommand.java
@@ -0,0 +1,46 @@
+/*
+ * 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
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  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.ozone.admin.scm;
+
+import java.util.List;
+import java.util.concurrent.Callable;
+import org.apache.hadoop.hdds.cli.HddsVersionProvider;
+import org.apache.hadoop.hdds.scm.client.ScmClient;
+import picocli.CommandLine;
+
+/**
+ * Handler of scm status command.
+ */
[email protected](
+    name = "roles",
+    description = "List all SCMs and their respective Ratis server roles",
+    mixinStandardHelpOptions = true,
+    versionProvider = HddsVersionProvider.class)
+public class GetScmRatisRolesSubcommand implements Callable<Void> {
+
+  @CommandLine.ParentCommand
+  private ScmAdmin parent;
+
+  @Override
+  public Void call() throws Exception {
+    ScmClient scmClient = parent.createScmClient();
+    List<String> roles = scmClient.getScmRatisRoles();
+    System.out.println(roles);
+    return null;
+  }
+}
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/scm/ScmAdmin.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/scm/ScmAdmin.java
new file mode 100644
index 0000000..2605a6d
--- /dev/null
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/scm/ScmAdmin.java
@@ -0,0 +1,60 @@
+/*
+ * 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
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  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.ozone.admin.scm;
+
+import org.apache.hadoop.hdds.cli.GenericCli;
+import org.apache.hadoop.hdds.cli.HddsVersionProvider;
+import org.apache.hadoop.hdds.scm.client.ScmClient;
+import org.apache.hadoop.ozone.admin.OzoneAdmin;
+import picocli.CommandLine;
+import picocli.CommandLine.Model.CommandSpec;
+import picocli.CommandLine.Spec;
+
+/**
+ * Subcommand for admin operations related to SCM.
+ */
[email protected](
+    name = "scm",
+    description = "Ozone Storage Container Manager specific admin operations",
+    mixinStandardHelpOptions = true,
+    versionProvider = HddsVersionProvider.class,
+    subcommands = {
+        GetScmRatisRolesSubcommand.class
+    })
+public class ScmAdmin extends GenericCli {
+
+  @CommandLine.ParentCommand
+  private OzoneAdmin parent;
+
+  @Spec
+  private CommandSpec spec;
+
+  public OzoneAdmin getParent() {
+    return parent;
+  }
+
+  @Override
+  public Void call() throws Exception {
+    GenericCli.missingSubcommand(spec);
+    return null;
+  }
+
+  public ScmClient createScmClient() {
+    return parent.createScmClient();
+  }
+}
diff --git 
a/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/scm/package-info.java
 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/scm/package-info.java
new file mode 100644
index 0000000..ec15a33
--- /dev/null
+++ 
b/hadoop-ozone/tools/src/main/java/org/apache/hadoop/ozone/admin/scm/package-info.java
@@ -0,0 +1,22 @@
+/**
+ * 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.
+ */
+
+/**
+ * SCM related Admin tools.
+ */
+package org.apache.hadoop.ozone.admin.scm;


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

Reply via email to