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

errose28 pushed a commit to branch HDDS-14496-zdu
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/HDDS-14496-zdu by this push:
     new 44fce2c2506 HDDS-15677. Update client side version checks to use 
`isSupportedBy`. (#10611)
44fce2c2506 is described below

commit 44fce2c2506c999ae8f09d6da7940482b6095794
Author: Ethan Rose <[email protected]>
AuthorDate: Wed Jul 15 10:05:44 2026 -0400

    HDDS-15677. Update client side version checks to use `isSupportedBy`. 
(#10611)
---
 .../ozone/admin/om/ListOpenFilesSubCommand.java    |  2 +-
 .../hadoop/ozone/client/io/KeyOutputStream.java    |  2 +-
 .../apache/hadoop/ozone/client/rpc/RpcClient.java  | 75 +++++++++---------
 .../hadoop/ozone/client/rpc/TestRpcClient.java     | 88 ++++++++++++++++++++++
 4 files changed, 124 insertions(+), 43 deletions(-)

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 15265b224b6..bf199a9bd54 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
@@ -103,7 +103,7 @@ public Void call() throws Exception {
   private void execute(OzoneManagerProtocol ozoneManagerClient) throws 
IOException {
     ServiceInfoEx serviceInfoEx = ozoneManagerClient.getServiceInfo();
     final OzoneManagerVersion omVersion = 
RpcClient.getOmVersion(serviceInfoEx);
-    if (omVersion.compareTo(OzoneManagerVersion.HBASE_SUPPORT) < 0) {
+    if (!OzoneManagerVersion.HBASE_SUPPORT.isSupportedBy(omVersion)) {
       System.err.println("Error: This command requires OzoneManager version "
           + OzoneManagerVersion.HBASE_SUPPORT.name() + " or later.");
       return;
diff --git 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/KeyOutputStream.java
 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/KeyOutputStream.java
index a3a1ca28030..ac4acdcc02d 100644
--- 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/KeyOutputStream.java
+++ 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/KeyOutputStream.java
@@ -532,7 +532,7 @@ public void hsync() throws IOException {
         throw new UnsupportedOperationException("The replication factor = "
             + replication.getRequiredNodes() + " <= 1");
       }
-      if (ozoneManagerVersion.compareTo(OzoneManagerVersion.HBASE_SUPPORT) < 
0) {
+      if 
(!OzoneManagerVersion.HBASE_SUPPORT.isSupportedBy(ozoneManagerVersion)) {
         throw new UnsupportedOperationException("Hsync API requires OM version 
"
             + OzoneManagerVersion.HBASE_SUPPORT + " or later. Current OM 
version "
             + ozoneManagerVersion);
diff --git 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
index 73bec4444a6..387f44f77c1 100644
--- 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
+++ 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
@@ -345,24 +345,23 @@ public XceiverClientFactory getXceiverClientManager() {
   }
 
   public static OzoneManagerVersion getOmVersion(ServiceInfoEx info) {
-    OzoneManagerVersion version = OzoneManagerVersion.SOFTWARE_VERSION;
+    OzoneManagerVersion minOMVersion = OzoneManagerVersion.SOFTWARE_VERSION;
     for (ServiceInfo si : info.getServiceInfoList()) {
       if (si.getNodeType() == HddsProtos.NodeType.OM) {
-        OzoneManagerVersion current =
-            OzoneManagerVersion.deserialize(si.getProtobuf().getOMVersion());
-        if (version.compareTo(current) > 0) {
-          version = current;
+        OzoneManagerVersion omVersion = 
OzoneManagerVersion.deserialize(si.getProtobuf().getOMVersion());
+        if (!minOMVersion.isSupportedBy(omVersion)) {
+          minOMVersion = omVersion;
         }
       }
     }
-    LOG.trace("Ozone Manager version is {}", version.name());
-    return version;
+    LOG.trace("Ozone Manager version is {}", minOMVersion);
+    return minOMVersion;
   }
 
   static boolean validateOmVersion(OzoneManagerVersion minimumVersion,
                                    List<ServiceInfo> serviceInfoList) {
     if (minimumVersion == OzoneManagerVersion.UNKNOWN_VERSION) {
-      throw new IllegalArgumentException("Configuration error, expected "
+      throw new IllegalArgumentException("Configuration error, minimum "
           + "OzoneManager version config evaluates to an unknown version.");
     }
     // if expected version is unset or is the default, then any OM would do 
fine
@@ -371,13 +370,12 @@ static boolean validateOmVersion(OzoneManagerVersion 
minimumVersion,
       return true;
     }
 
-    boolean found = false; // At min one OM should be present.
+    // At least one OM must be present, but all OMs must meet the minimum 
version requirement.
+    boolean found = false;
     for (ServiceInfo s: serviceInfoList) {
       if (s.getNodeType() == HddsProtos.NodeType.OM) {
-        OzoneManagerVersion omv =
-            OzoneManagerVersion
-                .deserialize(s.getProtobuf().getOMVersion());
-        if (minimumVersion.compareTo(omv) > 0) {
+        boolean meetsMinVersion = 
minimumVersion.isSupportedBy(s.getProtobuf().getOMVersion());
+        if (!meetsMinVersion) {
           return false;
         } else {
           found = true;
@@ -611,8 +609,7 @@ public void createBucket(
     Objects.requireNonNull(bucketArgs, "bucketArgs == null");
     verifyCountsQuota(bucketArgs.getQuotaInNamespace());
     verifySpaceQuota(bucketArgs.getQuotaInBytes());
-    if (omVersion
-        .compareTo(OzoneManagerVersion.ERASURE_CODED_STORAGE_SUPPORT) < 0) {
+    if 
(!OzoneManagerVersion.ERASURE_CODED_STORAGE_SUPPORT.isSupportedBy(omVersion)) {
       if (bucketArgs.getDefaultReplicationConfig() != null &&
           bucketArgs.getDefaultReplicationConfig().getType()
           == ReplicationType.EC) {
@@ -1280,8 +1277,7 @@ public void setReplicationConfig(
     verifyVolumeName(volumeName);
     verifyBucketName(bucketName);
     Objects.requireNonNull(replicationConfig, "replicationConfig == null");
-    if (omVersion
-        .compareTo(OzoneManagerVersion.ERASURE_CODED_STORAGE_SUPPORT) < 0) {
+    if 
(!OzoneManagerVersion.ERASURE_CODED_STORAGE_SUPPORT.isSupportedBy(omVersion)) {
       if (replicationConfig.getReplicationType()
           == HddsProtos.ReplicationType.EC) {
         throw new IOException("Can not set the default replication of the"
@@ -1413,7 +1409,7 @@ public OzoneOutputStream createKey(
   public OzoneOutputStream rewriteKey(String volumeName, String bucketName, 
String keyName,
       long size, long existingKeyGeneration, ReplicationConfig 
replicationConfig,
       Map<String, String> metadata) throws IOException {
-    if (omVersion.compareTo(OzoneManagerVersion.ATOMIC_REWRITE_KEY) < 0) {
+    if (!OzoneManagerVersion.ATOMIC_REWRITE_KEY.isSupportedBy(omVersion)) {
       throw new IOException("OzoneManager does not support atomic key 
rewrite.");
     }
     Preconditions.checkArgument(existingKeyGeneration > 0,
@@ -1431,7 +1427,7 @@ public OzoneOutputStream createKeyIfNotExists(String 
volumeName,
       String bucketName, String keyName, long size,
       ReplicationConfig replicationConfig, Map<String, String> metadata,
       Map<String, String> tags) throws IOException {
-    if (omVersion.compareTo(OzoneManagerVersion.ATOMIC_REWRITE_KEY) < 0) {
+    if (!OzoneManagerVersion.ATOMIC_REWRITE_KEY.isSupportedBy(omVersion)) {
       throw new IOException(
           "OzoneManager does not support atomic key creation.");
     }
@@ -1448,7 +1444,7 @@ public OzoneOutputStream rewriteKeyIfMatch(String 
volumeName,
       String bucketName, String keyName, long size, String expectedETag,
       ReplicationConfig replicationConfig, Map<String, String> metadata,
       Map<String, String> tags) throws IOException {
-    if (omVersion.compareTo(OzoneManagerVersion.ATOMIC_REWRITE_KEY) < 0) {
+    if (!OzoneManagerVersion.ATOMIC_REWRITE_KEY.isSupportedBy(omVersion)) {
       throw new IOException(
           "OzoneManager does not support conditional key rewrite.");
     }
@@ -1477,7 +1473,7 @@ private OzoneOutputStream openOutputStream(OmKeyArgs 
keyArgs, long size)
 
   private void validateObjectTagsSupport(Map<String, String> tags)
       throws IOException {
-    if (omVersion.compareTo(OzoneManagerVersion.OBJECT_TAG) < 0) {
+    if (!OzoneManagerVersion.OBJECT_TAG.isSupportedBy(omVersion)) {
       if (tags != null && !tags.isEmpty()) {
         throw new IOException("OzoneManager does not support object tags");
       }
@@ -1492,8 +1488,7 @@ private void createKeyPreChecks(String volumeName, String 
bucketName, String key
       HddsClientUtils.verifyKeyName(keyName);
     }
     HddsClientUtils.checkNotNull(keyName);
-    if (omVersion
-        .compareTo(OzoneManagerVersion.ERASURE_CODED_STORAGE_SUPPORT) < 0) {
+    if 
(!OzoneManagerVersion.ERASURE_CODED_STORAGE_SUPPORT.isSupportedBy(omVersion)) {
       if (replicationConfig != null &&
           replicationConfig.getReplicationType()
               == HddsProtos.ReplicationType.EC) {
@@ -1534,7 +1529,7 @@ public OzoneDataStreamOutput 
createStreamKeyIfNotExists(String volumeName,
       String bucketName, String keyName, long size,
       ReplicationConfig replicationConfig, Map<String, String> metadata,
       Map<String, String> tags) throws IOException {
-    if (omVersion.compareTo(OzoneManagerVersion.ATOMIC_REWRITE_KEY) < 0) {
+    if (!OzoneManagerVersion.ATOMIC_REWRITE_KEY.isSupportedBy(omVersion)) {
       throw new IOException(
           "OzoneManager does not support atomic key creation.");
     }
@@ -1552,7 +1547,7 @@ public OzoneDataStreamOutput 
rewriteStreamKeyIfMatch(String volumeName,
       String bucketName, String keyName, long size, String expectedETag,
       ReplicationConfig replicationConfig, Map<String, String> metadata,
       Map<String, String> tags) throws IOException {
-    if (omVersion.compareTo(OzoneManagerVersion.ATOMIC_REWRITE_KEY) < 0) {
+    if (!OzoneManagerVersion.ATOMIC_REWRITE_KEY.isSupportedBy(omVersion)) {
       throw new IOException(
           "OzoneManager does not support conditional key rewrite.");
     }
@@ -1785,7 +1780,7 @@ public List<OzoneKey> listKeys(String volumeName, String 
bucketName,
                                  int maxListResult)
       throws IOException {
 
-    if (omVersion.compareTo(OzoneManagerVersion.LIGHTWEIGHT_LIST_KEYS) >= 0) {
+    if (OzoneManagerVersion.LIGHTWEIGHT_LIST_KEYS.isSupportedBy(omVersion)) {
       List<BasicOmKeyInfo> keys = ozoneManagerClient.listKeysLight(
           volumeName, bucketName, prevKey, keyPrefix, maxListResult).getKeys();
 
@@ -1864,7 +1859,7 @@ public OzoneKeyDetails getS3KeyDetails(String bucketName, 
String keyName)
   public OzoneKeyDetails getS3KeyDetails(String bucketName, String keyName,
                                          int partNumber) throws IOException {
     OmKeyInfo keyInfo;
-    if (omVersion.compareTo(OzoneManagerVersion.S3_PART_AWARE_GET) >= 0) {
+    if (OzoneManagerVersion.S3_PART_AWARE_GET.isSupportedBy(omVersion)) {
       keyInfo = getS3PartKeyInfo(bucketName, keyName, partNumber);
     } else {
       keyInfo = getS3KeyInfo(bucketName, keyName, false);
@@ -1947,7 +1942,7 @@ public OmKeyInfo getKeyInfo(
 
   private OmKeyInfo getKeyInfo(OmKeyArgs keyArgs) throws IOException {
     final OmKeyInfo keyInfo;
-    if (omVersion.compareTo(OzoneManagerVersion.OPTIMIZED_GET_KEY_INFO) >= 0) {
+    if (OzoneManagerVersion.OPTIMIZED_GET_KEY_INFO.isSupportedBy(omVersion)) {
       keyInfo = ozoneManagerClient.getKeyInfo(keyArgs, false)
           .getKeyInfo();
     } else {
@@ -2019,8 +2014,7 @@ public OmMultipartInfo initiateMultipartUpload(String 
volumeName,
     verifyBucketName(bucketName);
     HddsClientUtils.checkNotNull(keyName);
     String ownerName = getRealUserInfo().getShortUserName();
-    if (omVersion
-        .compareTo(OzoneManagerVersion.ERASURE_CODED_STORAGE_SUPPORT) < 0) {
+    if 
(!OzoneManagerVersion.ERASURE_CODED_STORAGE_SUPPORT.isSupportedBy(omVersion)) {
       if (replicationConfig != null && replicationConfig.getReplicationType()
           == HddsProtos.ReplicationType.EC) {
         throw new IOException("Can not set the replication of the file to"
@@ -2029,7 +2023,7 @@ public OmMultipartInfo initiateMultipartUpload(String 
volumeName,
       }
     }
 
-    if (omVersion.compareTo(OzoneManagerVersion.OBJECT_TAG) < 0) {
+    if (!OzoneManagerVersion.OBJECT_TAG.isSupportedBy(omVersion)) {
       if (tags != null && !tags.isEmpty()) {
         throw new IOException("OzoneManager does not support object tags");
       }
@@ -2248,7 +2242,7 @@ public OzoneMultipartUploadList 
listMultipartUploads(String volumeName,
       String bucketName, String prefix, String keyMarker, String 
uploadIdMarker, int maxUploads) throws IOException {
 
     OmMultipartUploadList omMultipartUploadList;
-    if 
(omVersion.compareTo(OzoneManagerVersion.S3_LIST_MULTIPART_UPLOADS_PAGINATION) 
>= 0) {
+    if 
(OzoneManagerVersion.S3_LIST_MULTIPART_UPLOADS_PAGINATION.isSupportedBy(omVersion))
 {
       omMultipartUploadList = 
ozoneManagerClient.listMultipartUploads(volumeName, bucketName, prefix, 
keyMarker,
           uploadIdMarker, maxUploads, true);
     } else {
@@ -2307,7 +2301,7 @@ public OzoneInputStream readFile(String volumeName, 
String bucketName,
         .setLatestVersionLocation(getLatestVersionLocation)
         .build();
     final OmKeyInfo keyInfo;
-    if (omVersion.compareTo(OzoneManagerVersion.OPTIMIZED_GET_KEY_INFO) >= 0) {
+    if (OzoneManagerVersion.OPTIMIZED_GET_KEY_INFO.isSupportedBy(omVersion)) {
       keyInfo = ozoneManagerClient.getKeyInfo(keyArgs, false)
           .getKeyInfo();
       if (!keyInfo.isFile()) {
@@ -2355,8 +2349,7 @@ private OzoneInputStream getInputStreamWithRetryFunction(
   public OzoneOutputStream createFile(String volumeName, String bucketName,
       String keyName, long size, ReplicationConfig replicationConfig,
       boolean overWrite, boolean recursive) throws IOException {
-    if (omVersion
-        .compareTo(OzoneManagerVersion.ERASURE_CODED_STORAGE_SUPPORT) < 0) {
+    if 
(!OzoneManagerVersion.ERASURE_CODED_STORAGE_SUPPORT.isSupportedBy(omVersion)) {
       if (replicationConfig.getReplicationType()
           == HddsProtos.ReplicationType.EC) {
         throw new IOException("Can not set the replication of the file to"
@@ -2435,7 +2428,7 @@ public List<OzoneFileStatusLight> listStatusLight(String 
volumeName,
       String bucketName, String keyName, boolean recursive, String startKey,
       long numEntries, boolean allowPartialPrefixes) throws IOException {
     OmKeyArgs keyArgs = prepareOmKeyArgs(volumeName, bucketName, keyName);
-    if (omVersion.compareTo(OzoneManagerVersion.LIGHTWEIGHT_LIST_STATUS) >= 0) 
{
+    if (OzoneManagerVersion.LIGHTWEIGHT_LIST_STATUS.isSupportedBy(omVersion)) {
       return ozoneManagerClient.listStatusLight(keyArgs, recursive, startKey,
           numEntries, allowPartialPrefixes);
     } else {
@@ -2820,7 +2813,7 @@ public void setTimes(OzoneObj obj, String keyName, long 
mtime, long atime)
   public LeaseKeyInfo recoverLease(String volumeName, String bucketName,
                                    String keyName, boolean force)
       throws IOException {
-    if (omVersion.compareTo(OzoneManagerVersion.HBASE_SUPPORT) < 0) {
+    if (!OzoneManagerVersion.HBASE_SUPPORT.isSupportedBy(omVersion)) {
       throw new UnsupportedOperationException("Lease recovery API requires OM 
version "
           + OzoneManagerVersion.HBASE_SUPPORT + " or later. Current OM version 
"
           + omVersion);
@@ -2830,7 +2823,7 @@ public LeaseKeyInfo recoverLease(String volumeName, 
String bucketName,
 
   @Override
   public void recoverKey(OmKeyArgs args, long clientID) throws IOException {
-    if (omVersion.compareTo(OzoneManagerVersion.HBASE_SUPPORT) < 0) {
+    if (!OzoneManagerVersion.HBASE_SUPPORT.isSupportedBy(omVersion)) {
       throw new UnsupportedOperationException("Lease recovery API requires OM 
version "
           + OzoneManagerVersion.HBASE_SUPPORT + " or later. Current OM version 
"
           + omVersion);
@@ -2841,7 +2834,7 @@ public void recoverKey(OmKeyArgs args, long clientID) 
throws IOException {
   @Override
   public Map<String, String> getObjectTagging(String volumeName, String 
bucketName, String keyName)
       throws IOException {
-    if (omVersion.compareTo(OzoneManagerVersion.S3_OBJECT_TAGGING_API) < 0) {
+    if (!OzoneManagerVersion.S3_OBJECT_TAGGING_API.isSupportedBy(omVersion)) {
       throw new IOException("OzoneManager does not support S3 object tagging 
API");
     }
 
@@ -2859,7 +2852,7 @@ public Map<String, String> getObjectTagging(String 
volumeName, String bucketName
   @Override
   public void putObjectTagging(String volumeName, String bucketName,
                                String keyName, Map<String, String> tags) 
throws IOException {
-    if (omVersion.compareTo(OzoneManagerVersion.S3_OBJECT_TAGGING_API) < 0) {
+    if (!OzoneManagerVersion.S3_OBJECT_TAGGING_API.isSupportedBy(omVersion)) {
       throw new IOException("OzoneManager does not support S3 object tagging 
API");
     }
 
@@ -2878,7 +2871,7 @@ public void putObjectTagging(String volumeName, String 
bucketName,
   @Override
   public void deleteObjectTagging(String volumeName, String bucketName,
                                   String keyName) throws IOException {
-    if (omVersion.compareTo(OzoneManagerVersion.S3_OBJECT_TAGGING_API) < 0) {
+    if (!OzoneManagerVersion.S3_OBJECT_TAGGING_API.isSupportedBy(omVersion)) {
       throw new IOException("OzoneManager does not support S3 object tagging 
API");
     }
 
diff --git 
a/hadoop-ozone/client/src/test/java/org/apache/hadoop/ozone/client/rpc/TestRpcClient.java
 
b/hadoop-ozone/client/src/test/java/org/apache/hadoop/ozone/client/rpc/TestRpcClient.java
index f758638ac91..ca985fc993b 100644
--- 
a/hadoop-ozone/client/src/test/java/org/apache/hadoop/ozone/client/rpc/TestRpcClient.java
+++ 
b/hadoop-ozone/client/src/test/java/org/apache/hadoop/ozone/client/rpc/TestRpcClient.java
@@ -17,13 +17,17 @@
 
 package org.apache.hadoop.ozone.client.rpc;
 
+import static org.apache.hadoop.ozone.client.rpc.RpcClient.getOmVersion;
 import static org.apache.hadoop.ozone.client.rpc.RpcClient.validateOmVersion;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
@@ -181,6 +185,33 @@ private enum ValidateOmVersionTestCases {
         OzoneManagerVersion.SOFTWARE_VERSION,
         OzoneManagerVersion.SOFTWARE_VERSION,
         OzoneManagerVersion.UNKNOWN_VERSION,
+        true),
+
+    // An intermediate expected version is supported only by OMs at or above 
that version.
+    INTERMEDIATE_EXPECTED_ONE_OLDER_OM(
+        OzoneManagerVersion.HBASE_SUPPORT,
+        OzoneManagerVersion.ATOMIC_REWRITE_KEY,
+        null,
+        false),
+    INTERMEDIATE_EXPECTED_ONE_EXACT_OM(
+        OzoneManagerVersion.HBASE_SUPPORT,
+        OzoneManagerVersion.HBASE_SUPPORT,
+        null,
+        true),
+    INTERMEDIATE_EXPECTED_ONE_NEWER_OM(
+        OzoneManagerVersion.HBASE_SUPPORT,
+        OzoneManagerVersion.LIGHTWEIGHT_LIST_STATUS,
+        null,
+        true),
+    INTERMEDIATE_EXPECTED_ONE_NEWER_ONE_OLDER_OM(
+        OzoneManagerVersion.HBASE_SUPPORT,
+        OzoneManagerVersion.LIGHTWEIGHT_LIST_STATUS,
+        OzoneManagerVersion.ATOMIC_REWRITE_KEY,
+        false),
+    INTERMEDIATE_EXPECTED_TWO_NEWER_OM(
+        OzoneManagerVersion.HBASE_SUPPORT,
+        OzoneManagerVersion.LIGHTWEIGHT_LIST_STATUS,
+        OzoneManagerVersion.S3_OBJECT_TAGGING_API,
         true);
 
     private final OzoneManagerVersion expectedVersion;
@@ -228,6 +259,51 @@ public void 
testUnknownVersionShouldNotBeAnExpectedVersion() {
         () -> validateOmVersion(OzoneManagerVersion.UNKNOWN_VERSION, null));
   }
 
+  @Test
+  public void testValidateOmVersionFailsWhenNoOmPresent() {
+    // At least one OM must be present. An empty list should fail validation.
+    assertFalse(validateOmVersion(OzoneManagerVersion.SOFTWARE_VERSION, 
Collections.emptyList()));
+  }
+
+  @Test
+  public void testGetOmVersionWithNoOmDefaultsToSoftwareVersion() {
+    // Default software version should be returned if OM list is empty.
+    assertEquals(OzoneManagerVersion.SOFTWARE_VERSION, 
getOmVersion(serviceInfoEx()));
+  }
+
+  @Test
+  public void testGetOmVersionReturnsSingleOmVersion() {
+    assertEquals(OzoneManagerVersion.HBASE_SUPPORT, 
getOmVersion(serviceInfoEx(om(OzoneManagerVersion.HBASE_SUPPORT))));
+  }
+
+  @Test
+  public void testGetOmVersionReturnsMinimumAcrossOms() {
+    // The lowest version among all OMs is returned, regardless of ordering.
+    assertEquals(OzoneManagerVersion.HBASE_SUPPORT, // version 7
+        getOmVersion(serviceInfoEx(
+            om(OzoneManagerVersion.LIGHTWEIGHT_LIST_STATUS), // version 8
+            om(OzoneManagerVersion.HBASE_SUPPORT)))); // version 7
+    assertEquals(OzoneManagerVersion.DEFAULT_VERSION, // version 0
+        getOmVersion(serviceInfoEx(
+            om(OzoneManagerVersion.DEFAULT_VERSION), // version 0
+            om(OzoneManagerVersion.SOFTWARE_VERSION)))); // largest concrete 
version.
+  }
+
+  @Test
+  public void testGetOmVersionWithFutureOM() {
+    // A future (unknown) OM version must never be returned as the version to 
use, even if it is the only one present.
+    // The client's latest known OM version should be used in this case, which 
should still be less than the future
+    // versions.
+    assertEquals(OzoneManagerVersion.SOFTWARE_VERSION,
+        getOmVersion(serviceInfoEx(
+            om(OzoneManagerVersion.UNKNOWN_VERSION),
+            om(OzoneManagerVersion.SOFTWARE_VERSION))));
+    assertEquals(OzoneManagerVersion.SOFTWARE_VERSION,
+        getOmVersion(serviceInfoEx(
+            om(OzoneManagerVersion.UNKNOWN_VERSION),
+            om(OzoneManagerVersion.UNKNOWN_VERSION))));
+  }
+
   @Test
   public void testCloseTwiceDoesNotWarn() throws IOException {
     RpcClient rpcClient = createRpcClient();
@@ -249,6 +325,18 @@ public void testCloseTwiceDoesNotWarn() throws IOException 
{
     }
   }
 
+  private static ServiceInfo om(OzoneManagerVersion version) {
+    return new ServiceInfo.Builder()
+        .setNodeType(HddsProtos.NodeType.OM)
+        .setHostname("localhost")
+        .setOmVersion(version)
+        .build();
+  }
+
+  private static ServiceInfoEx serviceInfoEx(ServiceInfo... serviceInfos) {
+    return new ServiceInfoEx(Arrays.asList(serviceInfos), null, null);
+  }
+
   private static RpcClient createRpcClient() throws IOException {
     OzoneConfiguration config = new OzoneConfiguration();
     return new RpcClient(config, null) {


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

Reply via email to