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 cbad1202d09 HDDS-13406. Standardize option for OM address for `ozone 
admin om` (#8918)
cbad1202d09 is described below

commit cbad1202d09a6953ec19ee31c5db138affea3eb9
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Mon Nov 17 10:14:28 2025 +0100

    HDDS-13406. Standardize option for OM address for `ozone admin om` (#8918)
---
 .../apache/hadoop/hdds/cli/AbstractSubcommand.java |  11 ++
 .../org/apache/hadoop/hdds/cli/GenericCli.java     |   1 +
 .../hadoop/hdds/cli/GenericParentCommand.java      |   5 +
 hadoop-hdds/docs/content/tools/Admin.md            |  33 ++--
 .../ozone/admin/om/CancelPrepareSubCommand.java    |  19 +--
 .../ozone/admin/om/DecommissionOMSubcommand.java   |  16 +-
 .../hadoop/ozone/admin/om/FetchKeySubCommand.java  |  12 +-
 .../admin/om/FinalizationStatusSubCommand.java     |  28 +--
 .../ozone/admin/om/FinalizeUpgradeSubCommand.java  |  25 +--
 .../ozone/admin/om/GetServiceRolesSubcommand.java  |  18 +-
 .../ozone/admin/om/ListOpenFilesSubCommand.java    |  41 ++---
 .../org/apache/hadoop/ozone/admin/om/OMAdmin.java  |  33 ++--
 .../hadoop/ozone/admin/om/OmAddressOptions.java    | 189 +++++++++++++++++++++
 .../hadoop/ozone/admin/om/PrepareSubCommand.java   |  24 +--
 .../ozone/admin/om/TransferOmLeaderSubCommand.java |  20 +--
 .../ozone/admin/om/UpdateRangerSubcommand.java     |  31 +---
 .../ozone/admin/om/snapshot/DefragSubCommand.java  |  26 +--
 .../admin/om/snapshot/SnapshotSubCommand.java      |   8 -
 .../ozone/om/snapshot/TestSnapshotDefragAdmin.java |   4 +-
 pom.xml                                            |   6 +-
 20 files changed, 321 insertions(+), 229 deletions(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/AbstractSubcommand.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/AbstractSubcommand.java
index b7f7170c2ae..08d271d7f12 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/AbstractSubcommand.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/AbstractSubcommand.java
@@ -17,9 +17,11 @@
 
 package org.apache.hadoop.hdds.cli;
 
+import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.function.Supplier;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.ratis.util.MemoizedSupplier;
 import picocli.CommandLine;
 
@@ -66,6 +68,7 @@ static GenericParentCommand 
findRootCommand(CommandLine.Model.CommandSpec spec)
   private static class NoParentCommand implements GenericParentCommand {
 
     private final OzoneConfiguration conf = new OzoneConfiguration();
+    private UserGroupInformation user;
 
     @Override
     public boolean isVerbose() {
@@ -77,6 +80,14 @@ public OzoneConfiguration getOzoneConf() {
       return conf;
     }
 
+    @Override
+    public UserGroupInformation getUser() throws IOException {
+      if (user == null) {
+        user = UserGroupInformation.getCurrentUser();
+      }
+      return user;
+    }
+
     @Override
     public void printError(Throwable t) {
       t.printStackTrace();
diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/GenericCli.java 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/GenericCli.java
index 23e2c3cd102..10bb8c4c43c 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/GenericCli.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/GenericCli.java
@@ -110,6 +110,7 @@ public OzoneConfiguration getOzoneConf() {
     return config;
   }
 
+  @Override
   public UserGroupInformation getUser() throws IOException {
     if (user == null) {
       user = UserGroupInformation.getCurrentUser();
diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/GenericParentCommand.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/GenericParentCommand.java
index 68cf45e1786..80b7b4eeffa 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/GenericParentCommand.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/GenericParentCommand.java
@@ -17,7 +17,9 @@
 
 package org.apache.hadoop.hdds.cli;
 
+import java.io.IOException;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.security.UserGroupInformation;
 
 /**
  * Interface to access the higher level parameters.
@@ -29,5 +31,8 @@ public interface GenericParentCommand {
   /** Returns a cached configuration, i.e. it is created only once, subsequent 
calls return the same instance. */
   OzoneConfiguration getOzoneConf();
 
+  /** Returns a cached {@link UserGroupInformation} instance. */
+  UserGroupInformation getUser() throws IOException;
+
   void printError(Throwable t);
 }
diff --git a/hadoop-hdds/docs/content/tools/Admin.md 
b/hadoop-hdds/docs/content/tools/Admin.md
index c2f6093180a..6dd480d43c3 100644
--- a/hadoop-hdds/docs/content/tools/Admin.md
+++ b/hadoop-hdds/docs/content/tools/Admin.md
@@ -115,7 +115,7 @@ Client ID           Creation time   Hsync'ed        Open 
File Path
 111726338152071171     1704808626588   No              
/volume-lof/buck1/-9223372036854774527/key2
 
 To get the next batch of open keys, run:
-  ozone admin om lof -id=om-service-test1 --length=3 
--prefix=/volume-lof/buck1 
--start=/-9223372036854775552/-9223372036854775040/-9223372036854774527/key2/111726338152071171
+  ozone admin om lof --service-id=om-service-test1 --length=3 
--prefix=/volume-lof/buck1 
--start=/-9223372036854775552/-9223372036854775040/-9223372036854774527/key2/111726338152071171
 ```
 
 - In JSON, list open files (keys) under bucket `/volumelof/buck1` with a batch 
size of 3:
@@ -183,21 +183,24 @@ This command only works on Ozone Manager HA clusters.
 
 ```bash
 $ ozone admin om snapshot defrag --help
-Usage: ozone admin om snapshot defrag [-hV] [--no-wait] [--node-id=<nodeId>]
-                                      [-id=<omServiceId>]
+Usage: ozone admin om snapshot defrag [-hV] [--no-wait] [--verbose]
+                                      [--node-id=<nodeId>]
+                                      [--service-id=<serviceID>]
 Triggers the Snapshot Defragmentation Service to run immediately. This command
-manually initiates the snapshot defragmentation process which compacts
-snapshot data and removes fragmentation to improve storage efficiency. This
-command works only on OzoneManager HA cluster.
-  -h, --help                Show this help message and exit.
-      --no-wait             Do not wait for the defragmentation task to
-                              complete. The command will return immediately
-                              after triggering the task.
-      --node-id=<nodeId>    NodeID of the OM to trigger snapshot
-                              defragmentation on.
-  -id, --service-id=<omServiceId>
-                            Ozone Manager Service ID
-  -V, --version             Print version information and exit.
+manually initiates the snapshot defragmentation process which compacts snapshot
+data and removes fragmentation to improve storage efficiency. This command
+works only on OzoneManager HA cluster.
+  -h, --help               Show this help message and exit.
+      --no-wait            Do not wait for the defragmentation task to
+                             complete. The command will return immediately
+                             after triggering the task.
+      --node-id=<nodeId>   NodeID of the OM to trigger snapshot defragmentation
+                             on.
+      --service-id, --om-service-id=<serviceID>
+                           Ozone Manager Service ID.
+  -V, --version            Print version information and exit.
+      --verbose            More verbose output. Show the stack trace of the
+                             errors.
 ```
 
 ### Example usages
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/CancelPrepareSubCommand.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/CancelPrepareSubCommand.java
index a62cc7f2594..e208c8cc927 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/CancelPrepareSubCommand.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/CancelPrepareSubCommand.java
@@ -32,22 +32,17 @@
     versionProvider = HddsVersionProvider.class
 )
 public class CancelPrepareSubCommand implements Callable<Void> {
-  @CommandLine.ParentCommand
-  private OMAdmin parent;
 
-  @CommandLine.Option(
-      names = {"-id", "--service-id"},
-      description = "Ozone Manager Service ID",
-      required = false
-  )
-  private String omServiceId;
+  @CommandLine.Mixin
+  private OmAddressOptions.OptionalServiceIdMixin omServiceOption;
 
   @Override
   public Void call() throws Exception {
-    OzoneManagerProtocol client = parent.createOmClient(omServiceId);
-    client.cancelOzoneManagerPrepare();
-    System.out.println("Cancel prepare succeeded, cluster can now accept " +
-        "write requests.");
+    try (OzoneManagerProtocol client = omServiceOption.newClient()) {
+      client.cancelOzoneManagerPrepare();
+      System.out.println("Cancel prepare succeeded, cluster can now accept " +
+          "write requests.");
+    }
     return null;
   }
 }
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/DecommissionOMSubcommand.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/DecommissionOMSubcommand.java
index 889038db63c..832c00d94dc 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/DecommissionOMSubcommand.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/DecommissionOMSubcommand.java
@@ -42,7 +42,7 @@
  */
 @CommandLine.Command(
     name = "decommission",
-    customSynopsis = "ozone admin om decommission -id=<om-service-id> " +
+    customSynopsis = "ozone admin om decommission --service-id=<om-service-id> 
" +
         "-nodeid=<decommission-om-node-id> " +
         "-hostname=<decommission-om-node-address> [options]",
     description = "Decommission an OzoneManager. Ensure that the node being " +
@@ -64,10 +64,8 @@ public class DecommissionOMSubcommand implements 
Callable<Void> {
   @CommandLine.ParentCommand
   private OMAdmin parent;
 
-  @CommandLine.Option(names = {"-id", "--service-id"},
-      description = "OM Service ID",
-      required = true)
-  private String omServiceId;
+  @CommandLine.Mixin
+  private OmAddressOptions.MandatoryServiceIdMixin omServiceOption;
 
   @CommandLine.Option(names = {"-nodeid", "--nodeid"},
       description = "NodeID of the OM to be decommissioned.",
@@ -106,7 +104,7 @@ public Void call() throws IOException {
     // leader.
     try (OMAdminProtocolClientSideImpl omAdminProtocolClient =
              OMAdminProtocolClientSideImpl.createProxyForOMHA(ozoneConf, user,
-                 omServiceId)) {
+                 omServiceOption.getServiceID())) {
       OMNodeDetails decommNodeDetails = new OMNodeDetails.Builder()
           .setOMNodeId(decommNodeId)
           .setHostAddress(hostInetAddress.getHostAddress())
@@ -127,7 +125,7 @@ public Void call() throws IOException {
    */
   private void verifyNodeIdAndHostAddress() throws IOException {
     String rpcAddrKey = ConfUtils.addKeySuffixes(OZONE_OM_ADDRESS_KEY,
-        omServiceId, decommNodeId);
+        omServiceOption.getServiceID(), decommNodeId);
     String rpcAddrStr = OmUtils.getOmRpcAddress(ozoneConf, rpcAddrKey);
     if (rpcAddrStr == null || rpcAddrStr.isEmpty()) {
       throw new IOException("There is no OM corresponding to " + decommNodeId
@@ -152,7 +150,7 @@ private void verifyNodeIdAndHostAddress() throws 
IOException {
    */
   private void verifyConfigUpdatedOnAllOMs() throws IOException {
     String decommNodesKey = ConfUtils.addKeySuffixes(
-        OZONE_OM_DECOMMISSIONED_NODES_KEY, omServiceId);
+        OZONE_OM_DECOMMISSIONED_NODES_KEY, omServiceOption.getServiceID());
     Collection<String> decommNodes =
         OmUtils.getDecommissionedNodeIds(ozoneConf, decommNodesKey);
     if (!decommNodes.contains(decommNodeId)) {
@@ -165,7 +163,7 @@ private void verifyConfigUpdatedOnAllOMs() throws 
IOException {
     // decommissioned node is either removed from ozone.om.nodes config or
     // added to ozone.om.decommissioned.nodes
     List<OMNodeDetails> activeOMNodeDetails = OmUtils.getAllOMHAAddresses(
-        ozoneConf, omServiceId, false);
+        ozoneConf, omServiceOption.getServiceID(), false);
     if (activeOMNodeDetails.isEmpty()) {
       throw new IOException("Cannot decommission OM " + decommNodeId + " as " +
           "it is the only node in the ring.");
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FetchKeySubCommand.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FetchKeySubCommand.java
index 1497c266f56..21988604878 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FetchKeySubCommand.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FetchKeySubCommand.java
@@ -34,19 +34,13 @@
     versionProvider = HddsVersionProvider.class
 )
 public class FetchKeySubCommand implements Callable<Void> {
-  @CommandLine.ParentCommand
-  private OMAdmin parent;
 
-  @CommandLine.Option(
-      names = {"-id", "--service-id"},
-      description = "Ozone Manager Service ID",
-      required = false
-  )
-  private String omServiceId;
+  @CommandLine.Mixin
+  private OmAddressOptions.OptionalServiceIdMixin omServiceOption;
 
   @Override
   public Void call() throws Exception {
-    try (OzoneManagerProtocol client = parent.createOmClient(omServiceId)) {
+    try (OzoneManagerProtocol client = omServiceOption.newClient()) {
       UUID uuid = client.refetchSecretKey();
       System.out.println("Current Secret Key ID: " + uuid);
     }
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizationStatusSubCommand.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizationStatusSubCommand.java
index dcde6618967..ef739454b65 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizationStatusSubCommand.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizationStatusSubCommand.java
@@ -35,29 +35,17 @@
 )
 public class FinalizationStatusSubCommand implements Callable<Void> {
 
-  @CommandLine.ParentCommand
-  private OMAdmin parent;
-
-  @CommandLine.Option(
-      names = {"-id", "--service-id"},
-      description = "Ozone Manager Service ID"
-  )
-  private String omServiceId;
-
-  @CommandLine.Option(
-      names = {"-host", "--service-host"},
-      description = "Ozone Manager Host"
-  )
-  private String omHost;
+  @CommandLine.Mixin
+  private OmAddressOptions.OptionalServiceIdOrHostMixin omAddressOptions;
 
   @Override
   public Void call() throws Exception {
-    OzoneManagerProtocol client =
-        parent.createOmClient(omServiceId, omHost, false);
-    String upgradeClientID = "Upgrade-Client-" + UUID.randomUUID().toString();
-    UpgradeFinalization.StatusAndMessages progress =
-        client.queryUpgradeFinalizationProgress(upgradeClientID, false, true);
-    System.out.println(progress.status());
+    String upgradeClientID = "Upgrade-Client-" + UUID.randomUUID();
+    try (OzoneManagerProtocol client = omAddressOptions.newClient()) {
+      UpgradeFinalization.StatusAndMessages progress =
+          client.queryUpgradeFinalizationProgress(upgradeClientID, false, 
true);
+      System.out.println(progress.status());
+    }
     return null;
   }
 }
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizeUpgradeSubCommand.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizeUpgradeSubCommand.java
index 45dbaf55e4a..cc1f0b8b93e 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizeUpgradeSubCommand.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizeUpgradeSubCommand.java
@@ -56,20 +56,8 @@
 )
 public class FinalizeUpgradeSubCommand implements Callable<Void> {
 
-  @CommandLine.ParentCommand
-  private OMAdmin parent;
-
-  @CommandLine.Option(
-      names = {"-id", "--service-id"},
-      description = "Ozone Manager Service ID"
-  )
-  private String omServiceId;
-
-  @CommandLine.Option(
-      names = {"-host", "--service-host"},
-      description = "Ozone Manager Host"
-  )
-  private String omHost;
+  @CommandLine.Mixin
+  private OmAddressOptions.OptionalServiceIdOrHostMixin omAddressOptions;
 
   @CommandLine.Option(
       names = {"--takeover"},
@@ -80,11 +68,8 @@ public class FinalizeUpgradeSubCommand implements 
Callable<Void> {
 
   @Override
   public Void call() throws Exception {
-    boolean forceHA = false;
-    OzoneManagerProtocol client =
-        parent.createOmClient(omServiceId, omHost, forceHA);
-    String upgradeClientID = "Upgrade-Client-" + UUID.randomUUID().toString();
-    try {
+    String upgradeClientID = "Upgrade-Client-" + UUID.randomUUID();
+    try (OzoneManagerProtocol client = omAddressOptions.newClient()) {
       UpgradeFinalization.StatusAndMessages finalizationResponse =
           client.finalizeUpgrade(upgradeClientID);
       if (isFinalized(finalizationResponse.status())) {
@@ -98,10 +83,10 @@ public Void call() throws Exception {
         );
         throw new IOException("Exiting...");
       }
+      monitorAndWaitFinalization(client, upgradeClientID);
     } catch (UpgradeException e) {
       handleInvalidRequestAfterInitiatingFinalization(force, e);
     }
-    monitorAndWaitFinalization(client, upgradeClientID);
     return null;
   }
 
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/GetServiceRolesSubcommand.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/GetServiceRolesSubcommand.java
index 7d2f6962727..9b4da46e880 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/GetServiceRolesSubcommand.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/GetServiceRolesSubcommand.java
@@ -43,13 +43,8 @@
     versionProvider = HddsVersionProvider.class)
 public class GetServiceRolesSubcommand implements Callable<Void> {
 
-  @CommandLine.ParentCommand
-  private OMAdmin parent;
-
-  @CommandLine.Option(names = {"-id", "--service-id"},
-      description = "OM Service ID",
-      required = false)
-  private String omServiceId;
+  @CommandLine.Mixin
+  private OmAddressOptions.OptionalServiceIdMixin omServiceOption;
 
   @CommandLine.Option(names = { "--json" },
       defaultValue = "false",
@@ -61,8 +56,6 @@ public class GetServiceRolesSubcommand implements 
Callable<Void> {
        description = "Format output as Table")
   private boolean table;
 
-  private OzoneManagerProtocol ozoneManagerClient;
-
   private static final String OM_ROLES_TITLE = "Ozone Manager Roles";
 
   private static final List<String> OM_ROLES_HEADER = Arrays.asList(
@@ -70,8 +63,7 @@ public class GetServiceRolesSubcommand implements 
Callable<Void> {
 
   @Override
   public Void call() throws Exception {
-    try {
-      ozoneManagerClient =  parent.createOmClient(omServiceId);
+    try (OzoneManagerProtocol ozoneManagerClient = 
omServiceOption.newClient()) {
       if (json) {
         printOmServerRolesAsJson(ozoneManagerClient.getServiceList());
       } else if (table) {
@@ -90,10 +82,6 @@ public Void call() throws Exception {
       } else {
         printOmServerRoles(ozoneManagerClient.getServiceList());
       }
-    } finally {
-      if (ozoneManagerClient != null) {
-        ozoneManagerClient.close();
-      }
     }
     return null;
   }
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/ListOpenFilesSubCommand.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/ListOpenFilesSubCommand.java
index d299098db63..c5477e0cb0e 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/ListOpenFilesSubCommand.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/ListOpenFilesSubCommand.java
@@ -21,7 +21,6 @@
 import java.time.Instant;
 import java.util.List;
 import java.util.concurrent.Callable;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.hdds.cli.HddsVersionProvider;
 import org.apache.hadoop.hdds.server.JsonUtils;
 import org.apache.hadoop.ozone.OzoneConsts;
@@ -49,20 +48,8 @@ public class ListOpenFilesSubCommand implements 
Callable<Void> {
   @CommandLine.ParentCommand
   private OMAdmin parent;
 
-  @CommandLine.Option(
-      names = {"--service-id", "--om-service-id"},
-      description = "Ozone Manager Service ID",
-      required = false
-  )
-  private String omServiceId;
-
-  @CommandLine.Option(
-      names = {"--service-host"},
-      description = "Ozone Manager Host. If OM HA is enabled, use --service-id 
instead. "
-          + "If you must use --service-host with OM HA, this must point 
directly to the leader OM. "
-          + "This option is required when --service-id is not provided or when 
HA is not enabled."
-  )
-  private String omHost;
+  @CommandLine.Mixin
+  private OmAddressOptions.OptionalServiceIdOrHostMixin omAddressOptions;
 
   @CommandLine.Option(names = { "--json" },
       defaultValue = "false",
@@ -106,20 +93,20 @@ public class ListOpenFilesSubCommand implements 
Callable<Void> {
 
   @Override
   public Void call() throws Exception {
-
-    if (StringUtils.isEmpty(omServiceId) && StringUtils.isEmpty(omHost)) {
-      System.err.println("Error: Please specify --service-id or 
--service-host");
-      return null;
+    try (OzoneManagerProtocol omClient = omAddressOptions.newClient()) {
+      execute(omClient);
     }
 
-    OzoneManagerProtocol ozoneManagerClient =
-        parent.createOmClient(omServiceId, omHost, false);
+    return null;
+  }
+
+  private void execute(OzoneManagerProtocol ozoneManagerClient) throws 
IOException {
     ServiceInfoEx serviceInfoEx = ozoneManagerClient.getServiceInfo();
     final OzoneManagerVersion omVersion = 
RpcClient.getOmVersion(serviceInfoEx);
     if (omVersion.compareTo(OzoneManagerVersion.HBASE_SUPPORT) < 0) {
       System.err.println("Error: This command requires OzoneManager version "
           + OzoneManagerVersion.HBASE_SUPPORT.name() + " or later.");
-      return null;
+      return;
     }
 
     ListOpenFilesResult res =
@@ -138,8 +125,6 @@ public Void call() throws Exception {
       // Human friendly output
       printOpenKeysList(res);
     }
-
-    return null;
   }
 
   private void printOpenKeysListAsJson(ListOpenFilesResult res)
@@ -237,13 +222,7 @@ private String getMessageString(ListOpenFilesResult res, 
List<OpenKeySession> op
    * @return the command to get the next batch of open keys
    */
   private String getCmdForNextBatch(String lastElementFullPath) {
-    String nextBatchCmd = "ozone admin om lof";
-    if (omServiceId != null && !omServiceId.isEmpty()) {
-      nextBatchCmd += " -id=" + omServiceId;
-    }
-    if (omHost != null && !omHost.isEmpty()) {
-      nextBatchCmd += " -host=" + omHost;
-    }
+    String nextBatchCmd = "ozone admin om lof " + omAddressOptions;
     if (json) {
       nextBatchCmd += " --json";
     }
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/OMAdmin.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/OMAdmin.java
index e096a55b95c..b81dd0f7ce5 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/OMAdmin.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/OMAdmin.java
@@ -20,6 +20,7 @@
 import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_ADDRESS_KEY;
 import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_SERVICE_IDS_KEY;
 
+import java.io.IOException;
 import java.util.Collection;
 import org.apache.hadoop.hdds.cli.AdminSubcommand;
 import org.apache.hadoop.hdds.cli.HddsVersionProvider;
@@ -37,6 +38,7 @@
 import org.apache.hadoop.ozone.om.protocolPB.OmTransport;
 import 
org.apache.hadoop.ozone.om.protocolPB.OzoneManagerProtocolClientSideTranslatorPB;
 import org.apache.hadoop.ozone.om.protocolPB.OzoneManagerProtocolPB;
+import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.ratis.protocol.ClientId;
 import org.kohsuke.MetaInfServices;
 import picocli.CommandLine;
@@ -88,29 +90,32 @@ public ClientProtocol createClient(String omServiceId) 
throws Exception {
   }
 
   public OzoneManagerProtocolClientSideTranslatorPB createOmClient(
-      String omServiceID
+      String omServiceID,
+      String omHost,
+      boolean forceHA
   ) throws Exception {
-    return createOmClient(omServiceID, null, true);
+    return createOmClient(parent.getOzoneConf(), parent.getUser(), 
omServiceID, omHost, forceHA);
   }
 
-  public OzoneManagerProtocolClientSideTranslatorPB createOmClient(
+  public static OzoneManagerProtocolClientSideTranslatorPB createOmClient(
+      OzoneConfiguration conf,
+      UserGroupInformation ugi,
       String omServiceID,
       String omHost,
       boolean forceHA
-  ) throws Exception {
-    OzoneConfiguration conf = parent.getOzoneConf();
+  ) throws IOException {
     if (omHost != null && !omHost.isEmpty()) {
       omServiceID = null;
       conf.set(OZONE_OM_ADDRESS_KEY, omHost);
     } else if (omServiceID == null || omServiceID.isEmpty()) {
-      omServiceID = getTheOnlyConfiguredOmServiceIdOrThrow();
+      omServiceID = getTheOnlyConfiguredOmServiceIdOrThrow(conf);
     }
     RPC.setProtocolEngine(conf, OzoneManagerProtocolPB.class,
         ProtobufRpcEngine.class);
     String clientId = ClientId.randomId().toString();
     if (!forceHA || (forceHA && OmUtils.isOmHAServiceId(conf, omServiceID))) {
       OmTransport omTransport = new Hadoop3OmTransportFactory()
-          .createOmTransport(conf, parent.getUser(), omServiceID);
+          .createOmTransport(conf, ugi, omServiceID);
       return new OzoneManagerProtocolClientSideTranslatorPB(omTransport,
           clientId);
     } else {
@@ -122,19 +127,17 @@ public OzoneManagerProtocolClientSideTranslatorPB 
createOmClient(
     }
   }
 
-  private String getTheOnlyConfiguredOmServiceIdOrThrow() {
-    if (getConfiguredServiceIds().size() != 1) {
+  private static String 
getTheOnlyConfiguredOmServiceIdOrThrow(OzoneConfiguration conf) {
+    Collection<String> configuredServiceIds = getConfiguredServiceIds(conf);
+    if (configuredServiceIds.size() != 1) {
       throw new IllegalArgumentException("There is no Ozone Manager service ID 
"
           + "specified, but there are either zero, or more than one service ID"
           + "configured.");
     }
-    return getConfiguredServiceIds().iterator().next();
+    return configuredServiceIds.iterator().next();
   }
 
-  private Collection<String> getConfiguredServiceIds() {
-    OzoneConfiguration conf = parent.getOzoneConf();
-    Collection<String> omServiceIds =
-        conf.getTrimmedStringCollection(OZONE_OM_SERVICE_IDS_KEY);
-    return omServiceIds;
+  private static Collection<String> getConfiguredServiceIds(OzoneConfiguration 
conf) {
+    return conf.getTrimmedStringCollection(OZONE_OM_SERVICE_IDS_KEY);
   }
 }
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/OmAddressOptions.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/OmAddressOptions.java
new file mode 100644
index 00000000000..b5336ec8940
--- /dev/null
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/OmAddressOptions.java
@@ -0,0 +1,189 @@
+/*
+ * 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.om;
+
+import static org.apache.hadoop.ozone.admin.om.OMAdmin.createOmClient;
+
+import java.io.IOException;
+import java.util.Objects;
+import org.apache.hadoop.hdds.cli.AbstractMixin;
+import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol;
+import picocli.CommandLine;
+
+/** Defines command-line options for OM address, whether service or single 
host. */
+public final class OmAddressOptions {
+
+  /** Base class for service ID mixins. */
+  protected abstract static class AbstractServiceIdMixin extends AbstractMixin 
{
+    protected abstract ServiceIdOptions addressOptions();
+
+    public String getServiceID() {
+      ServiceIdOptions opts = addressOptions();
+      return opts != null ? opts.getServiceID() : null;
+    }
+
+    public OzoneManagerProtocol newClient() throws IOException {
+      return createOmClient(
+          getOzoneConf(),
+          rootCommand().getUser(),
+          getServiceID(),
+          null,
+          true);
+    }
+
+    @Override
+    public String toString() {
+      return Objects.toString(addressOptions(), "");
+    }
+  }
+
+  /** Adds host to mixin. */
+  protected abstract static class AbstractServiceIdOrHostMixin extends 
AbstractServiceIdMixin {
+    @Override
+    protected abstract ServiceIdAndHostOptions addressOptions();
+
+    public String getHost() {
+      ServiceIdAndHostOptions opts = addressOptions();
+      return opts != null ? opts.getHost() : null;
+    }
+
+    @Override
+    public OzoneManagerProtocol newClient() throws IOException {
+      return createOmClient(
+          getOzoneConf(),
+          rootCommand().getUser(),
+          getServiceID(),
+          getHost(),
+          false);
+    }
+  }
+
+  /** Optionally specify OM service ID. */
+  public static class OptionalServiceIdMixin extends AbstractServiceIdMixin {
+    @CommandLine.ArgGroup // exclusive=true, multiplicity=0..1
+    private ServiceIdOptions opts;
+
+    @Override
+    protected ServiceIdOptions addressOptions() {
+      return opts;
+    }
+  }
+
+  /** Require OM service ID. */
+  public static class MandatoryServiceIdMixin extends AbstractServiceIdMixin {
+    @CommandLine.ArgGroup(multiplicity = "1") // exclusive=true
+    private ServiceIdOptions opts;
+
+    @Override
+    protected ServiceIdOptions addressOptions() {
+      return opts;
+    }
+  }
+
+  /** Optionally specify OM service ID or host. */
+  public static class OptionalServiceIdOrHostMixin extends 
AbstractServiceIdOrHostMixin {
+    @CommandLine.ArgGroup // exclusive=true, multiplicity=0..1
+    private ServiceIdAndHostOptions opts;
+
+    @Override
+    protected ServiceIdAndHostOptions addressOptions() {
+      return opts;
+    }
+  }
+
+  /** Require OM service ID or host. */
+  public static class MandatoryServiceIdOrHostMixin extends 
AbstractServiceIdOrHostMixin {
+    @CommandLine.ArgGroup(multiplicity = "1") // exclusive=true
+    private ServiceIdAndHostOptions opts;
+
+    @Override
+    protected ServiceIdAndHostOptions addressOptions() {
+      return opts;
+    }
+  }
+
+  /** Options for OM service ID. */
+  protected static class ServiceIdOptions {
+    @CommandLine.Option(
+        names = {"--service-id", "--om-service-id"},
+        description = "Ozone Manager Service ID.",
+        required = true
+    )
+    private String serviceID;
+
+    /** For backward compatibility. */
+    @CommandLine.Option(
+        names = {"-id"},
+        hidden = true,
+        required = true
+    )
+    @Deprecated
+    @SuppressWarnings("DeprecatedIsStillUsed")
+    private String deprecatedID;
+
+    public String getServiceID() {
+      if (serviceID != null) {
+        return serviceID;
+      }
+      return deprecatedID;
+    }
+
+    @Override
+    public String toString() {
+      String value = getServiceID();
+      return value != null && !value.isEmpty() ? "--om-service-id " + value : 
"";
+    }
+  }
+
+  /** Add options for OM host. */
+  protected static class ServiceIdAndHostOptions extends ServiceIdOptions {
+    @CommandLine.Option(
+        names = {"--service-host"},
+        description = "Ozone Manager Host.",
+        required = true
+    )
+    private String host;
+
+    /** For backward compatibility. */
+    @CommandLine.Option(
+        names = {"-host"},
+        hidden = true,
+        required = true
+    )
+    @Deprecated
+    @SuppressWarnings("DeprecatedIsStillUsed")
+    private String deprecatedHost;
+
+    public String getHost() {
+      return host != null ? host : deprecatedHost;
+    }
+
+    @Override
+    public String toString() {
+      final String serviceOpt = super.toString();
+      final String hostValue = getHost();
+      return (hostValue != null && !hostValue.isEmpty())
+          ? serviceOpt + " --service-host " + hostValue
+          : serviceOpt;
+    }
+  }
+
+  private OmAddressOptions() {
+    // no instances
+  }
+}
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/PrepareSubCommand.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/PrepareSubCommand.java
index fd6b2ec0a41..a0eabd4b7d1 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/PrepareSubCommand.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/PrepareSubCommand.java
@@ -36,7 +36,7 @@
 import picocli.CommandLine;
 
 /**
- * Handler of ozone admin om finalizeUpgrade command.
+ * Handler of ozone admin om prepare command.
  */
 @CommandLine.Command(
     name = "prepare",
@@ -53,12 +53,8 @@ public class PrepareSubCommand implements Callable<Void> {
   @CommandLine.ParentCommand
   private OMAdmin parent;
 
-  @CommandLine.Option(
-      names = {"-id", "--service-id"},
-      description = "Ozone Manager Service ID",
-      required = true
-  )
-  private String omServiceId;
+  @CommandLine.Mixin
+  private OmAddressOptions.MandatoryServiceIdMixin omServiceOption;
 
   @CommandLine.Option(
       names = {"-tawt", "--transaction-apply-wait-timeout"},
@@ -97,7 +93,13 @@ public class PrepareSubCommand implements Callable<Void> {
 
   @Override
   public Void call() throws Exception {
-    OzoneManagerProtocol client = parent.createOmClient(omServiceId);
+    try (OzoneManagerProtocol client = omServiceOption.newClient()) {
+      execute(client);
+    }
+    return null;
+  }
+
+  private void execute(OzoneManagerProtocol client) throws Exception {
     long prepareTxnId = client.prepareOzoneManager(txnApplyWaitTimeSeconds,
         txnApplyCheckIntervalSeconds);
     System.out.println("Ozone Manager Prepare Request successfully returned " +
@@ -105,7 +107,7 @@ public Void call() throws Exception {
 
     Map<String, Boolean> omPreparedStatusMap = new HashMap<>();
     Set<String> omHosts = getOmHostsFromConfig(
-        parent.getParent().getOzoneConf(), omServiceId);
+        parent.getParent().getOzoneConf(), omServiceOption.getServiceID());
     omHosts.forEach(h -> omPreparedStatusMap.put(h, false));
     Duration pTimeout = Duration.of(prepareTimeOut, ChronoUnit.SECONDS);
     Duration pInterval = Duration.of(prepareCheckInterval, ChronoUnit.SECONDS);
@@ -122,7 +124,7 @@ public Void call() throws Exception {
         if (!e.getValue()) {
           String omHost = e.getKey();
           try (OzoneManagerProtocol singleOmClient =
-                    parent.createOmClient(omServiceId, omHost, false)) {
+                    parent.createOmClient(omServiceOption.getServiceID(), 
omHost, false)) {
             PrepareStatusResponse response =
                 singleOmClient.getOzoneManagerPrepareStatus(prepareTxnId);
             PrepareStatus status = response.getStatus();
@@ -165,8 +167,6 @@ public Void call() throws Exception {
       System.out.println("No new write requests will be allowed until " +
           "preparation is cancelled or upgrade/downgrade is done.");
     }
-
-    return null;
   }
 
 }
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/TransferOmLeaderSubCommand.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/TransferOmLeaderSubCommand.java
index c676b87bf3c..069e10c1343 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/TransferOmLeaderSubCommand.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/TransferOmLeaderSubCommand.java
@@ -33,14 +33,8 @@
 )
 public class TransferOmLeaderSubCommand implements Callable<Void> {
 
-  @CommandLine.ParentCommand
-  private OMAdmin parent;
-
-  @CommandLine.Option(
-      names = {"-id", "--service-id"},
-      description = "Ozone Manager Service ID."
-  )
-  private String omServiceId;
+  @CommandLine.Mixin
+  private OmAddressOptions.OptionalServiceIdMixin omServiceOption;
 
   @CommandLine.ArgGroup(multiplicity = "1")
   private TransferOption configGroup;
@@ -59,14 +53,14 @@ static class TransferOption {
 
   @Override
   public Void call() throws Exception {
-    OzoneManagerProtocol client =
-        parent.createOmClient(omServiceId, null, true);
     if (configGroup.isRandom) {
       configGroup.omNodeId = "";
     }
-    client.transferLeadership(configGroup.omNodeId);
-    System.out.println("Transfer leadership successfully to " +
-        (configGroup.isRandom ? "random node" : configGroup.omNodeId) + ".");
+    try (OzoneManagerProtocol client = omServiceOption.newClient()) {
+      client.transferLeadership(configGroup.omNodeId);
+      System.out.println("Transfer leadership successfully to " +
+          (configGroup.isRandom ? "random node" : configGroup.omNodeId) + ".");
+    }
     return null;
   }
 }
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/UpdateRangerSubcommand.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/UpdateRangerSubcommand.java
index 22f59e64a67..fdca290aada 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/UpdateRangerSubcommand.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/UpdateRangerSubcommand.java
@@ -18,7 +18,6 @@
 package org.apache.hadoop.ozone.admin.om;
 
 import java.util.concurrent.Callable;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.hdds.cli.HddsVersionProvider;
 import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol;
 import picocli.CommandLine;
@@ -39,24 +38,8 @@
     versionProvider = HddsVersionProvider.class)
 public class UpdateRangerSubcommand implements Callable<Void> {
 
-  @CommandLine.ParentCommand
-  private OMAdmin parent;
-
-  @CommandLine.Option(
-      names = {"-id", "--service-id", "--om-service-id"},
-      description = "Ozone Manager Service ID"
-  )
-  private String omServiceId;
-
-  @CommandLine.Option(
-      names = {"-host", "--service-host"},
-      description = "Ozone Manager Host. If OM HA is enabled, use -id instead. 
"
-          + "If insists on using -host with OM HA, this must point directly "
-          + "to the leader OM. "
-          + "This option is required when -id is not provided or "
-          + "when HA is not enabled."
-  )
-  private String omHost;
+  @CommandLine.Mixin
+  private OmAddressOptions.OptionalServiceIdOrHostMixin omAddressOptions;
 
   @CommandLine.Option(names = {"--no-wait"},
       description = "Do not wait for task completion. Exit immediately "
@@ -65,15 +48,7 @@ public class UpdateRangerSubcommand implements 
Callable<Void> {
 
   @Override
   public Void call() throws Exception {
-
-    if (StringUtils.isEmpty(omServiceId) && StringUtils.isEmpty(omHost)) {
-      System.err.println("Error: Please specify -id or -host");
-      return null;
-    }
-
-    boolean forceHA = false;
-    try (OzoneManagerProtocol client = parent.createOmClient(
-        omServiceId, omHost, forceHA)) {
+    try (OzoneManagerProtocol client = omAddressOptions.newClient()) {
 
       boolean res = client.triggerRangerBGSync(noWait);
 
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/snapshot/DefragSubCommand.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/snapshot/DefragSubCommand.java
index 6062353d60b..2f6d35260cd 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/snapshot/DefragSubCommand.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/snapshot/DefragSubCommand.java
@@ -19,9 +19,10 @@
 
 import java.io.IOException;
 import java.util.concurrent.Callable;
+import org.apache.hadoop.hdds.cli.AbstractSubcommand;
 import org.apache.hadoop.hdds.cli.HddsVersionProvider;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
-import org.apache.hadoop.ozone.admin.om.OMAdmin;
+import org.apache.hadoop.ozone.admin.om.OmAddressOptions;
 import org.apache.hadoop.ozone.om.helpers.OMNodeDetails;
 import org.apache.hadoop.ozone.om.protocolPB.OMAdminProtocolClientSideImpl;
 import org.apache.hadoop.security.UserGroupInformation;
@@ -40,16 +41,10 @@
     mixinStandardHelpOptions = true,
     versionProvider = HddsVersionProvider.class
 )
-public class DefragSubCommand implements Callable<Void> {
+public class DefragSubCommand extends AbstractSubcommand implements 
Callable<Void> {
 
-  @CommandLine.ParentCommand
-  private SnapshotSubCommand parent;
-
-  @CommandLine.Option(
-      names = {"-id", "--service-id"},
-      description = "Ozone Manager Service ID"
-  )
-  private String omServiceId;
+  @CommandLine.Mixin
+  private OmAddressOptions.OptionalServiceIdMixin omServiceOption;
 
   @CommandLine.Option(
       names = {"--node-id"},
@@ -68,11 +63,9 @@ public class DefragSubCommand implements Callable<Void> {
 
   @Override
   public Void call() throws Exception {
-    // Navigate up to get OMAdmin
-    OMAdmin omAdmin = getOMAdmin();
-    OzoneConfiguration conf = omAdmin.getParent().getOzoneConf();
+    OzoneConfiguration conf = getOzoneConf();
     OMNodeDetails omNodeDetails = OMNodeDetails.getOMNodeDetailsFromConf(
-        conf, omServiceId, nodeId);
+        conf, omServiceOption.getServiceID(), nodeId);
 
     if (omNodeDetails == null) {
       System.err.println("Error: OMNodeDetails could not be determined with 
given " +
@@ -113,9 +106,4 @@ protected void execute(OMAdminProtocolClientSideImpl 
omAdminProtocolClient)
       }
     }
   }
-
-  private OMAdmin getOMAdmin() {
-    // The parent hierarchy is: DefragSubCommand -> SnapshotSubCommand -> 
OMAdmin
-    return parent.getParent();
-  }
 }
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/snapshot/SnapshotSubCommand.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/snapshot/SnapshotSubCommand.java
index 48ca9e365ff..7aa2e3edb78 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/snapshot/SnapshotSubCommand.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/snapshot/SnapshotSubCommand.java
@@ -17,7 +17,6 @@
 
 package org.apache.hadoop.ozone.admin.om.snapshot;
 
-import org.apache.hadoop.ozone.admin.om.OMAdmin;
 import picocli.CommandLine;
 
 /**
@@ -31,11 +30,4 @@
     }
 )
 public class SnapshotSubCommand {
-
-  @CommandLine.ParentCommand
-  private OMAdmin parent;
-
-  public OMAdmin getParent() {
-    return parent;
-  }
 }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDefragAdmin.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDefragAdmin.java
index dff56a35d16..5153caf5a23 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDefragAdmin.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDefragAdmin.java
@@ -179,7 +179,7 @@ private void executeDefragCommand(String nodeId, boolean 
noWait) throws Exceptio
             "om",
             "snapshot",
             "defrag",
-            "-id", omServiceId,
+            "--service-id", omServiceId,
             "--node-id", nodeId,
             "--no-wait"
         };
@@ -188,7 +188,7 @@ private void executeDefragCommand(String nodeId, boolean 
noWait) throws Exceptio
             "om",
             "snapshot",
             "defrag",
-            "-id", omServiceId,
+            "--service-id", omServiceId,
             "--node-id", nodeId
         };
       }
diff --git a/pom.xml b/pom.xml
index b960a94ac6a..d2ec8243145 100644
--- a/pom.xml
+++ b/pom.xml
@@ -183,7 +183,11 @@
     <os-maven-plugin.version>1.7.1</os-maven-plugin.version>
     <ozone.release>Katmai</ozone.release>
     <ozone.version>2.2.0-SNAPSHOT</ozone.version>
-    <picocli.version>4.7.7</picocli.version>
+    <!--
+      4.7.6: https://github.com/remkop/picocli/issues/2309
+      4.7.7: https://github.com/remkop/picocli/issues/2407
+    -->
+    <picocli.version>4.7.5</picocli.version>
     <plexus-archiver.version>4.2.2</plexus-archiver.version>
     <pmd.version>3.26.0</pmd.version>
     <!-- Enable Reproducible Builds mode -->


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


Reply via email to