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

siddhant 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 de53086f13 HDDS-5541. Namespace summary endpoint can carry basic 
information on the entity as well. (#4042)
de53086f13 is described below

commit de53086f1327994b381bab3a8d0cf9b6bc53acad
Author: devmadhuu <[email protected]>
AuthorDate: Wed Jan 11 15:47:08 2023 +0530

    HDDS-5541. Namespace summary endpoint can carry basic information on the 
entity as well. (#4042)
---
 .../org/apache/hadoop/hdds/client/BlockID.java     |   5 +
 .../hadoop/hdds/client/ContainerBlockID.java       |   3 +
 .../ozone/recon/TestReconWithOzoneManagerFSO.java  |  14 +-
 .../hadoop/ozone/recon/api/NSSummaryEndpoint.java  |   6 +-
 .../recon/api/handlers/BucketEntityHandler.java    |  36 +++-
 .../ozone/recon/api/handlers/BucketHandler.java    |   4 +
 .../recon/api/handlers/DirectoryEntityHandler.java |  26 ++-
 .../ozone/recon/api/handlers/FSOBucketHandler.java |  20 ++
 .../ozone/recon/api/handlers/KeyEntityHandler.java |  23 ++-
 .../recon/api/handlers/LegacyBucketHandler.java    |  14 ++
 .../recon/api/handlers/RootEntityHandler.java      |  30 ++-
 .../recon/api/handlers/UnknownEntityHandler.java   |   8 +-
 .../recon/api/handlers/VolumeEntityHandler.java    |  32 ++-
 .../ozone/recon/api/types/BucketObjectDBInfo.java  | 168 +++++++++++++++
 ...mespaceSummaryResponse.java => CountStats.java} |  70 ++-----
 .../ozone/recon/api/types/KeyObjectDBInfo.java     | 154 ++++++++++++++
 .../recon/api/types/NamespaceSummaryResponse.java  | 138 +++++++++----
 .../hadoop/ozone/recon/api/types/ObjectDBInfo.java | 140 +++++++++++++
 .../ozone/recon/api/types/VolumeObjectDBInfo.java  |  78 +++++++
 .../recon/api/TestNSSummaryEndpointWithFSO.java    |  61 ++----
 .../recon/api/TestNSSummaryEndpointWithLegacy.java |  62 ++----
 .../hadoop/ozone/recon/common/CommonUtils.java     | 225 +++++++++++++++++++++
 22 files changed, 1086 insertions(+), 231 deletions(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/BlockID.java 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/BlockID.java
index 1a979f1eb2..3b39817bab 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/BlockID.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/BlockID.java
@@ -16,6 +16,7 @@
  */
 package org.apache.hadoop.hdds.client;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 
@@ -84,6 +85,7 @@ public class BlockID {
     sb.append(" bcsId: ").append(blockCommitSequenceId);
   }
 
+  @JsonIgnore
   public ContainerProtos.DatanodeBlockID getDatanodeBlockIDProtobuf() {
     return ContainerProtos.DatanodeBlockID.newBuilder().
         setContainerID(containerBlockID.getContainerID())
@@ -91,18 +93,21 @@ public class BlockID {
         .setBlockCommitSequenceId(blockCommitSequenceId).build();
   }
 
+  @JsonIgnore
   public static BlockID getFromProtobuf(
       ContainerProtos.DatanodeBlockID blockID) {
     return new BlockID(blockID.getContainerID(),
         blockID.getLocalID(), blockID.getBlockCommitSequenceId());
   }
 
+  @JsonIgnore
   public HddsProtos.BlockID getProtobuf() {
     return HddsProtos.BlockID.newBuilder()
         .setContainerBlockID(containerBlockID.getProtobuf())
         .setBlockCommitSequenceId(blockCommitSequenceId).build();
   }
 
+  @JsonIgnore
   public static BlockID getFromProtobuf(HddsProtos.BlockID blockID) {
     return new BlockID(
         ContainerBlockID.getFromProtobuf(blockID.getContainerBlockID()),
diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/ContainerBlockID.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/ContainerBlockID.java
index 94a1c87d41..5798036385 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/ContainerBlockID.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/client/ContainerBlockID.java
@@ -16,6 +16,7 @@
  */
 package org.apache.hadoop.hdds.client;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 
 import java.util.Objects;
@@ -52,11 +53,13 @@ public class ContainerBlockID {
         .append(" locID: ").append(localID);
   }
 
+  @JsonIgnore
   public HddsProtos.ContainerBlockID getProtobuf() {
     return HddsProtos.ContainerBlockID.newBuilder().
         setContainerID(containerID).setLocalID(localID).build();
   }
 
+  @JsonIgnore
   public static ContainerBlockID getFromProtobuf(
       HddsProtos.ContainerBlockID containerBlockID) {
     return new ContainerBlockID(containerBlockID.getContainerID(),
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManagerFSO.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManagerFSO.java
index a893ee5813..7af632830b 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManagerFSO.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/recon/TestReconWithOzoneManagerFSO.java
@@ -128,8 +128,10 @@ public class TestReconWithOzoneManagerFSO {
     NamespaceSummaryResponse entity =
             (NamespaceSummaryResponse) basicInfo.getEntity();
     Assert.assertSame(entity.getEntityType(), EntityType.DIRECTORY);
-    Assert.assertEquals(1, entity.getNumTotalKey());
-    Assert.assertEquals(0, entity.getNumTotalDir());
+    Assert.assertEquals(1, entity.getCountStats().getNumTotalKey());
+    Assert.assertEquals(0, entity.getCountStats().getNumTotalDir());
+    Assert.assertEquals(-1, entity.getCountStats().getNumVolume());
+    Assert.assertEquals(-1, entity.getCountStats().getNumBucket());
     for (int i = 0; i < 10; i++) {
       Assert.assertNotNull(impl.getOMMetadataManagerInstance()
               .getVolumeTable().get("/vol" + i));
@@ -149,10 +151,10 @@ public class TestReconWithOzoneManagerFSO {
             (NamespaceSummaryResponse) rootBasicRes.getEntity();
     Assert.assertSame(EntityType.ROOT, rootBasicEntity.getEntityType());
     // one additional dummy volume at creation
-    Assert.assertEquals(13, rootBasicEntity.getNumVolume());
-    Assert.assertEquals(12, rootBasicEntity.getNumBucket());
-    Assert.assertEquals(12, rootBasicEntity.getNumTotalDir());
-    Assert.assertEquals(12, rootBasicEntity.getNumTotalKey());
+    Assert.assertEquals(13, rootBasicEntity.getCountStats().getNumVolume());
+    Assert.assertEquals(12, rootBasicEntity.getCountStats().getNumBucket());
+    Assert.assertEquals(12, rootBasicEntity.getCountStats().getNumTotalDir());
+    Assert.assertEquals(12, rootBasicEntity.getCountStats().getNumTotalKey());
   }
 
   /**
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/NSSummaryEndpoint.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/NSSummaryEndpoint.java
index aa2699f8bb..5b104c4611 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/NSSummaryEndpoint.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/NSSummaryEndpoint.java
@@ -80,8 +80,10 @@ public class NSSummaryEndpoint {
     NamespaceSummaryResponse namespaceSummaryResponse;
     if (!isInitializationComplete()) {
       namespaceSummaryResponse =
-          new NamespaceSummaryResponse(EntityType.UNKNOWN);
-      namespaceSummaryResponse.setStatus(ResponseStatus.INITIALIZING);
+          NamespaceSummaryResponse.newBuilder()
+              .setEntityType(EntityType.UNKNOWN)
+              .setStatus(ResponseStatus.INITIALIZING)
+              .build();
       return Response.ok(namespaceSummaryResponse).build();
     }
 
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/BucketEntityHandler.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/BucketEntityHandler.java
index 36f1636af0..7ad961195e 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/BucketEntityHandler.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/BucketEntityHandler.java
@@ -19,12 +19,15 @@ package org.apache.hadoop.ozone.recon.api.handlers;
 
 import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager;
 import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
+import org.apache.hadoop.ozone.recon.api.types.BucketObjectDBInfo;
+import org.apache.hadoop.ozone.recon.api.types.CountStats;
 import org.apache.hadoop.ozone.recon.api.types.NamespaceSummaryResponse;
 import org.apache.hadoop.ozone.recon.api.types.EntityType;
 import org.apache.hadoop.ozone.recon.api.types.DUResponse;
 import org.apache.hadoop.ozone.recon.api.types.QuotaUsageResponse;
 import org.apache.hadoop.ozone.recon.api.types.FileSizeDistributionResponse;
 import org.apache.hadoop.ozone.recon.api.types.NSSummary;
+import org.apache.hadoop.ozone.recon.api.types.ResponseStatus;
 import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager;
 import org.apache.hadoop.ozone.recon.spi.ReconNamespaceSummaryManager;
 
@@ -49,16 +52,37 @@ public class BucketEntityHandler extends EntityHandler {
   @Override
   public NamespaceSummaryResponse getSummaryResponse()
           throws IOException {
-    NamespaceSummaryResponse namespaceSummaryResponse =
-            new NamespaceSummaryResponse(EntityType.BUCKET);
+
     String[] names = getNames();
     assert (names.length == 2);
     long bucketObjectId = getBucketHandler().getBucketObjectId(names);
-    namespaceSummaryResponse
-      .setNumTotalDir(getTotalDirCount(bucketObjectId));
-    namespaceSummaryResponse.setNumTotalKey(getTotalKeyCount(bucketObjectId));
 
-    return namespaceSummaryResponse;
+    CountStats countStats = new CountStats(
+        -1, -1,
+        getTotalDirCount(bucketObjectId), getTotalKeyCount(bucketObjectId));
+    return NamespaceSummaryResponse.newBuilder()
+        .setEntityType(EntityType.BUCKET)
+        .setCountStats(countStats)
+        .setObjectDBInfo(getBucketObjDbInfo(names))
+        .setStatus(ResponseStatus.OK)
+        .build();
+  }
+
+  private BucketObjectDBInfo getBucketObjDbInfo(String[] names)
+      throws IOException {
+    String volName = names[0];
+    String bucketName = names[1];
+    String bucketKey = getOmMetadataManager().
+        getBucketKey(volName, bucketName);
+    if (null == bucketKey) {
+      return new BucketObjectDBInfo();
+    }
+    OmBucketInfo omBucketInfo = getOmMetadataManager()
+        .getBucketTable().getSkipCache(bucketKey);
+    if (null == omBucketInfo) {
+      return new BucketObjectDBInfo();
+    }
+    return new BucketObjectDBInfo(omBucketInfo);
   }
 
   @Override
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/BucketHandler.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/BucketHandler.java
index 0f7b98b23b..7377441556 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/BucketHandler.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/BucketHandler.java
@@ -19,6 +19,7 @@ package org.apache.hadoop.ozone.recon.api.handlers;
 
 import org.apache.hadoop.hdds.scm.container.ContainerManager;
 import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager;
+import org.apache.hadoop.ozone.om.helpers.OmDirectoryInfo;
 import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
 import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
 import org.apache.hadoop.ozone.om.helpers.BucketLayout;
@@ -92,6 +93,9 @@ public abstract class BucketHandler {
   public abstract OmKeyInfo getKeyInfo(String[] names)
       throws IOException;
 
+  public abstract OmDirectoryInfo getDirInfo(String[] names)
+      throws IOException;
+
   /**
    * Fixing the existing path and appending the next level entity to it.
    * @param path
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/DirectoryEntityHandler.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/DirectoryEntityHandler.java
index 0cfa6f1b47..fc7022e2da 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/DirectoryEntityHandler.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/DirectoryEntityHandler.java
@@ -18,8 +18,11 @@
 package org.apache.hadoop.ozone.recon.api.handlers;
 
 import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager;
+import org.apache.hadoop.ozone.om.helpers.OmDirectoryInfo;
+import org.apache.hadoop.ozone.recon.api.types.CountStats;
 import org.apache.hadoop.ozone.recon.api.types.NamespaceSummaryResponse;
 import org.apache.hadoop.ozone.recon.api.types.EntityType;
+import org.apache.hadoop.ozone.recon.api.types.ObjectDBInfo;
 import org.apache.hadoop.ozone.recon.api.types.ResponseStatus;
 import org.apache.hadoop.ozone.recon.api.types.DUResponse;
 import org.apache.hadoop.ozone.recon.api.types.NSSummary;
@@ -55,13 +58,24 @@ public class DirectoryEntityHandler extends EntityHandler {
           throws IOException {
     // path should exist so we don't need any extra verification/null check
     long dirObjectId = getBucketHandler().getDirObjectId(getNames());
-    NamespaceSummaryResponse namespaceSummaryResponse =
-            new NamespaceSummaryResponse(EntityType.DIRECTORY);
-    namespaceSummaryResponse
-        .setNumTotalDir(getTotalDirCount(dirObjectId));
-    namespaceSummaryResponse.setNumTotalKey(getTotalKeyCount(dirObjectId));
+    CountStats countStats = new CountStats(
+        -1, -1,
+        getTotalDirCount(dirObjectId), getTotalKeyCount(dirObjectId));
+    return NamespaceSummaryResponse.newBuilder()
+        .setEntityType(EntityType.DIRECTORY)
+        .setCountStats(countStats)
+        .setObjectDBInfo(getDirectoryObjDbInfo(getNames()))
+        .setStatus(ResponseStatus.OK)
+        .build();
+  }
 
-    return namespaceSummaryResponse;
+  private ObjectDBInfo getDirectoryObjDbInfo(String[] names)
+      throws IOException {
+    OmDirectoryInfo omDirectoryInfo = getBucketHandler().getDirInfo(names);
+    if (null == omDirectoryInfo) {
+      return new ObjectDBInfo();
+    }
+    return new ObjectDBInfo(omDirectoryInfo);
   }
 
   @Override
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/FSOBucketHandler.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/FSOBucketHandler.java
index f75a2ec0a1..147e785a4b 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/FSOBucketHandler.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/FSOBucketHandler.java
@@ -17,6 +17,7 @@
  */
 package org.apache.hadoop.ozone.recon.api.handlers;
 
+import com.google.common.base.Preconditions;
 import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager;
 import org.apache.hadoop.hdds.utils.db.Table;
 import org.apache.hadoop.hdds.utils.db.TableIterator;
@@ -276,4 +277,23 @@ public class FSOBucketHandler extends BucketHandler {
         parentObjectId, fileName);
     return getOmMetadataManager().getFileTable().getSkipCache(ozoneKey);
   }
+
+  @Override
+  public OmDirectoryInfo getDirInfo(String[] names) throws IOException {
+    String path = OM_KEY_PREFIX;
+    path += String.join(OM_KEY_PREFIX, names);
+    Preconditions.checkArgument(
+        names.length >= 3,
+        "Path should be a directory: %s", path);
+    long parentObjectId = getDirObjectId(names, names.length - 1);
+    String dirKey = getOmMetadataManager().getOzonePathKey(
+        getVolumeObjectId(names),
+        getBucketObjectId(names),
+        parentObjectId,
+        names[names.length - 1]);
+    OmDirectoryInfo dirInfo = getOmMetadataManager()
+        .getDirectoryTable().getSkipCache(dirKey);
+    return dirInfo;
+  }
+
 }
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/KeyEntityHandler.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/KeyEntityHandler.java
index 4ed771b589..a687bf3d0b 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/KeyEntityHandler.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/KeyEntityHandler.java
@@ -19,8 +19,11 @@ package org.apache.hadoop.ozone.recon.api.handlers;
 
 import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager;
 import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
+import org.apache.hadoop.ozone.recon.api.types.CountStats;
+import org.apache.hadoop.ozone.recon.api.types.KeyObjectDBInfo;
 import org.apache.hadoop.ozone.recon.api.types.NamespaceSummaryResponse;
 import org.apache.hadoop.ozone.recon.api.types.EntityType;
+import org.apache.hadoop.ozone.recon.api.types.ObjectDBInfo;
 import org.apache.hadoop.ozone.recon.api.types.ResponseStatus;
 import org.apache.hadoop.ozone.recon.api.types.DUResponse;
 import org.apache.hadoop.ozone.recon.api.types.QuotaUsageResponse;
@@ -46,10 +49,24 @@ public class KeyEntityHandler extends EntityHandler {
   @Override
   public NamespaceSummaryResponse getSummaryResponse()
           throws IOException {
-    NamespaceSummaryResponse namespaceSummaryResponse =
-            new NamespaceSummaryResponse(EntityType.KEY);
+    CountStats countStats = new CountStats(
+        -1, -1,
+        -1, 0);
+    return NamespaceSummaryResponse.newBuilder()
+        .setEntityType(EntityType.KEY)
+        .setCountStats(countStats)
+        .setObjectDBInfo(getKeyDbObjectInfo(getNames()))
+        .setStatus(ResponseStatus.OK)
+        .build();
+  }
 
-    return namespaceSummaryResponse;
+  private ObjectDBInfo getKeyDbObjectInfo(String[] names)
+      throws IOException {
+    OmKeyInfo omKeyInfo = getBucketHandler().getKeyInfo(names);
+    if (null == omKeyInfo) {
+      return new KeyObjectDBInfo();
+    }
+    return new KeyObjectDBInfo(omKeyInfo);
   }
 
   @Override
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/LegacyBucketHandler.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/LegacyBucketHandler.java
index 7436652110..162fbc2e93 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/LegacyBucketHandler.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/LegacyBucketHandler.java
@@ -17,11 +17,13 @@
  */
 package org.apache.hadoop.ozone.recon.api.handlers;
 
+import com.google.common.base.Preconditions;
 import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager;
 import org.apache.hadoop.hdds.utils.db.Table;
 import org.apache.hadoop.hdds.utils.db.TableIterator;
 import org.apache.hadoop.ozone.om.helpers.BucketLayout;
 import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
+import org.apache.hadoop.ozone.om.helpers.OmDirectoryInfo;
 import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
 import org.apache.hadoop.ozone.om.helpers.OzoneFSUtils;
 import org.apache.hadoop.ozone.recon.api.types.DUResponse;
@@ -322,4 +324,16 @@ public class LegacyBucketHandler extends BucketHandler {
         getOmMetadataManager().getKeyTable(getBucketLayout());
     return keyTable;
   }
+
+  @Override
+  public OmDirectoryInfo getDirInfo(String[] names) throws IOException {
+    String path = OM_KEY_PREFIX;
+    path += String.join(OM_KEY_PREFIX, names);
+    Preconditions.checkArgument(
+        names.length >= 3,
+        "Path should be a directory: %s", path);
+    return OmDirectoryInfo.newBuilder()
+        .setName(names[2])
+        .build();
+  }
 }
\ No newline at end of file
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/RootEntityHandler.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/RootEntityHandler.java
index 12b19b88ce..72f0b0a08b 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/RootEntityHandler.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/RootEntityHandler.java
@@ -18,14 +18,19 @@
 package org.apache.hadoop.ozone.recon.api.handlers;
 
 import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager;
+import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
+import org.apache.hadoop.ozone.om.helpers.OmPrefixInfo;
 import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
 import org.apache.hadoop.ozone.recon.ReconConstants;
+import org.apache.hadoop.ozone.recon.api.types.CountStats;
 import org.apache.hadoop.ozone.recon.api.types.NamespaceSummaryResponse;
 import org.apache.hadoop.ozone.recon.api.types.EntityType;
 import org.apache.hadoop.ozone.recon.api.types.DUResponse;
+import org.apache.hadoop.ozone.recon.api.types.ObjectDBInfo;
 import org.apache.hadoop.ozone.recon.api.types.QuotaUsageResponse;
 import org.apache.hadoop.ozone.recon.api.types.FileSizeDistributionResponse;
+import org.apache.hadoop.ozone.recon.api.types.ResponseStatus;
 import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager;
 import org.apache.hadoop.ozone.recon.spi.ReconNamespaceSummaryManager;
 import org.apache.hadoop.hdds.scm.container.placement.metrics.SCMNodeStat;
@@ -49,12 +54,9 @@ public class RootEntityHandler extends EntityHandler {
   @Override
   public NamespaceSummaryResponse getSummaryResponse()
           throws IOException {
-    NamespaceSummaryResponse namespaceSummaryResponse =
-            new NamespaceSummaryResponse(EntityType.ROOT);
+
     List<OmVolumeArgs> volumes = listVolumes();
-    namespaceSummaryResponse.setNumVolume(volumes.size());
     List<OmBucketInfo> allBuckets = listBucketsUnderVolume(null);
-    namespaceSummaryResponse.setNumBucket(allBuckets.size());
     int totalNumDir = 0;
     long totalNumKey = 0L;
     for (OmBucketInfo bucket : allBuckets) {
@@ -62,11 +64,25 @@ public class RootEntityHandler extends EntityHandler {
       totalNumDir += getTotalDirCount(bucketObjectId);
       totalNumKey += getTotalKeyCount(bucketObjectId);
     }
+    CountStats countStats = new CountStats(
+        volumes.size(), allBuckets.size(), totalNumDir, totalNumKey);
 
-    namespaceSummaryResponse.setNumTotalDir(totalNumDir);
-    namespaceSummaryResponse.setNumTotalKey(totalNumKey);
+    return NamespaceSummaryResponse.newBuilder()
+        .setEntityType(EntityType.ROOT)
+        .setCountStats(countStats)
+        .setObjectDBInfo(getPrefixObjDbInfo())
+        .setStatus(ResponseStatus.OK)
+        .build();
+  }
 
-    return namespaceSummaryResponse;
+  private ObjectDBInfo getPrefixObjDbInfo()
+      throws IOException {
+    OmPrefixInfo omPrefixInfo = getOmMetadataManager().getPrefixTable()
+        .getSkipCache(OzoneConsts.OM_KEY_PREFIX);
+    if (null == omPrefixInfo) {
+      return new ObjectDBInfo();
+    }
+    return new ObjectDBInfo(omPrefixInfo);
   }
 
   @Override
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/UnknownEntityHandler.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/UnknownEntityHandler.java
index c1d5dfe4ad..b5a5bd9a0b 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/UnknownEntityHandler.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/UnknownEntityHandler.java
@@ -44,11 +44,9 @@ public class UnknownEntityHandler extends EntityHandler {
   @Override
   public NamespaceSummaryResponse getSummaryResponse()
           throws IOException {
-    NamespaceSummaryResponse namespaceSummaryResponse =
-            new NamespaceSummaryResponse(EntityType.UNKNOWN);
-    namespaceSummaryResponse.setStatus(ResponseStatus.PATH_NOT_FOUND);
-
-    return namespaceSummaryResponse;
+    return NamespaceSummaryResponse.newBuilder()
+        .setEntityType(EntityType.UNKNOWN)
+        .setStatus(ResponseStatus.PATH_NOT_FOUND).build();
   }
 
   @Override
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/VolumeEntityHandler.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/VolumeEntityHandler.java
index e8c4c03bc0..8c9ae62c0a 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/VolumeEntityHandler.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/handlers/VolumeEntityHandler.java
@@ -21,11 +21,14 @@ import 
org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager;
 import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
 import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
 import org.apache.hadoop.ozone.recon.ReconConstants;
+import org.apache.hadoop.ozone.recon.api.types.CountStats;
 import org.apache.hadoop.ozone.recon.api.types.NamespaceSummaryResponse;
 import org.apache.hadoop.ozone.recon.api.types.EntityType;
 import org.apache.hadoop.ozone.recon.api.types.DUResponse;
 import org.apache.hadoop.ozone.recon.api.types.QuotaUsageResponse;
 import org.apache.hadoop.ozone.recon.api.types.FileSizeDistributionResponse;
+import org.apache.hadoop.ozone.recon.api.types.ResponseStatus;
+import org.apache.hadoop.ozone.recon.api.types.VolumeObjectDBInfo;
 import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager;
 import org.apache.hadoop.ozone.recon.spi.ReconNamespaceSummaryManager;
 
@@ -48,11 +51,9 @@ public class VolumeEntityHandler extends EntityHandler {
   @Override
   public NamespaceSummaryResponse getSummaryResponse()
           throws IOException {
-    NamespaceSummaryResponse namespaceSummaryResponse =
-            new NamespaceSummaryResponse(EntityType.VOLUME);
+
     String[] names = getNames();
     List<OmBucketInfo> buckets = listBucketsUnderVolume(names[0]);
-    namespaceSummaryResponse.setNumBucket(buckets.size());
     int totalDir = 0;
     long totalKey = 0L;
 
@@ -63,10 +64,29 @@ public class VolumeEntityHandler extends EntityHandler {
       totalKey += getTotalKeyCount(bucketObjectId);
     }
 
-    namespaceSummaryResponse.setNumTotalDir(totalDir);
-    namespaceSummaryResponse.setNumTotalKey(totalKey);
+    CountStats countStats = new CountStats(
+        -1, buckets.size(), totalDir, totalKey);
+
+    return NamespaceSummaryResponse.newBuilder()
+        .setEntityType(EntityType.VOLUME)
+        .setCountStats(countStats)
+        .setObjectDBInfo(getVolumeObjDbInfo(names))
+        .setStatus(ResponseStatus.OK)
+        .build();
+  }
 
-    return namespaceSummaryResponse;
+  private VolumeObjectDBInfo getVolumeObjDbInfo(String[] names)
+      throws IOException {
+    String dbVolumeKey = getOmMetadataManager().getVolumeKey(names[0]);
+    if (null == dbVolumeKey) {
+      return new VolumeObjectDBInfo();
+    }
+    OmVolumeArgs volumeArgs =
+        getOmMetadataManager().getVolumeTable().getSkipCache(dbVolumeKey);
+    if (null == volumeArgs) {
+      return new VolumeObjectDBInfo();
+    }
+    return new VolumeObjectDBInfo(volumeArgs);
   }
 
   @Override
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/BucketObjectDBInfo.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/BucketObjectDBInfo.java
new file mode 100644
index 0000000000..ef2ae7dddf
--- /dev/null
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/BucketObjectDBInfo.java
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.ozone.recon.api.types;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.hadoop.hdds.client.DefaultReplicationConfig;
+import org.apache.hadoop.hdds.protocol.StorageType;
+import org.apache.hadoop.ozone.om.helpers.BucketEncryptionKeyInfo;
+import org.apache.hadoop.ozone.om.helpers.BucketLayout;
+import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
+
+
+/**
+ * Encapsulates the low level bucket info.
+ */
+public class BucketObjectDBInfo extends ObjectDBInfo {
+  @JsonProperty("volumeName")
+  private String volumeName;
+
+  @JsonProperty("storageType")
+  private StorageType storageType;
+
+  @JsonProperty("versioning")
+  private boolean isVersioningEnabled;
+
+  @JsonProperty("usedBytes")
+  private String usedBytes;
+
+  @JsonProperty("encryptionInfo")
+  private BucketEncryptionKeyInfo bekInfo;
+
+  @JsonProperty("replicationConfigInfo")
+  private DefaultReplicationConfig defaultReplicationConfig;
+
+  @JsonProperty("sourceVolume")
+  private String sourceVolume;
+
+  @JsonProperty("sourceBucket")
+  private String sourceBucket;
+
+  @JsonProperty("bucketLayout")
+  private BucketLayout bucketLayout;
+
+  @JsonProperty("owner")
+  private String owner;
+
+  public BucketObjectDBInfo() {
+
+  }
+
+  public BucketObjectDBInfo(OmBucketInfo omBucketInfo) {
+    super.setMetadata(omBucketInfo.getMetadata());
+    super.setName(omBucketInfo.getBucketName());
+    super.setQuotaInBytes(omBucketInfo.getQuotaInBytes());
+    super.setQuotaInNamespace(omBucketInfo.getQuotaInNamespace());
+    super.setUsedNamespace(omBucketInfo.getUsedNamespace());
+    super.setCreationTime(omBucketInfo.getCreationTime());
+    super.setModificationTime(omBucketInfo.getModificationTime());
+    super.setAcls(omBucketInfo.getAcls());
+    this.volumeName = omBucketInfo.getVolumeName();
+    this.sourceBucket = omBucketInfo.getSourceBucket();
+    this.sourceVolume = omBucketInfo.getSourceVolume();
+    this.isVersioningEnabled = omBucketInfo.getIsVersionEnabled();
+    this.storageType = omBucketInfo.getStorageType();
+    this.defaultReplicationConfig = omBucketInfo.getDefaultReplicationConfig();
+    this.bucketLayout = omBucketInfo.getBucketLayout();
+    this.owner = omBucketInfo.getOwner();
+    this.bekInfo = omBucketInfo.getEncryptionKeyInfo();
+  }
+
+  public String getVolumeName() {
+    return volumeName;
+  }
+
+  public void setVolumeName(String volumeName) {
+    this.volumeName = volumeName;
+  }
+
+  public StorageType getStorageType() {
+    return storageType;
+  }
+
+  public void setStorageType(StorageType storageType) {
+    this.storageType = storageType;
+  }
+
+  public String getUsedBytes() {
+    return usedBytes;
+  }
+
+  public void setUsedBytes(String usedBytes) {
+    this.usedBytes = usedBytes;
+  }
+
+  public BucketEncryptionKeyInfo getBekInfo() {
+    return bekInfo;
+  }
+
+  public void setBekInfo(BucketEncryptionKeyInfo bekInfo) {
+    this.bekInfo = bekInfo;
+  }
+
+  public DefaultReplicationConfig getDefaultReplicationConfig() {
+    return defaultReplicationConfig;
+  }
+
+  public void setDefaultReplicationConfig(
+      DefaultReplicationConfig defaultReplicationConfig) {
+    this.defaultReplicationConfig = defaultReplicationConfig;
+  }
+
+  public String getSourceVolume() {
+    return sourceVolume;
+  }
+
+  public void setSourceVolume(String sourceVolume) {
+    this.sourceVolume = sourceVolume;
+  }
+
+  public String getSourceBucket() {
+    return sourceBucket;
+  }
+
+  public void setSourceBucket(String sourceBucket) {
+    this.sourceBucket = sourceBucket;
+  }
+
+  public boolean isVersioningEnabled() {
+    return isVersioningEnabled;
+  }
+
+  public void setVersioningEnabled(boolean versioningEnabled) {
+    isVersioningEnabled = versioningEnabled;
+  }
+
+  public BucketLayout getBucketLayout() {
+    return bucketLayout;
+  }
+
+  public void setBucketLayout(BucketLayout bucketLayout) {
+    this.bucketLayout = bucketLayout;
+  }
+
+  public String getOwner() {
+    return owner;
+  }
+
+  public void setOwner(String owner) {
+    this.owner = owner;
+  }
+
+}
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/NamespaceSummaryResponse.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/CountStats.java
similarity index 59%
copy from 
hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/NamespaceSummaryResponse.java
copy to 
hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/CountStats.java
index 2a2d9f6de7..1d88831d80 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/NamespaceSummaryResponse.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/CountStats.java
@@ -17,16 +17,13 @@
  */
 
 package org.apache.hadoop.ozone.recon.api.types;
-import com.fasterxml.jackson.annotation.JsonProperty;
 
-/**
- * HTTP Response wrapped for a 'summary' request.
- */
-public class NamespaceSummaryResponse {
-  /** The namespace the request path is on. */
-  @JsonProperty("type")
-  private EntityType entityType;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
+/** Count stats which tells the number of
+ * volumes/buckets/dir/files etc.
+ * */
+public class CountStats {
   /** Total number of volumes under root, -1 for other types. */
   @JsonProperty("numVolume")
   private int numVolume;
@@ -43,64 +40,27 @@ public class NamespaceSummaryResponse {
   @JsonProperty("numKey")
   private long numTotalKey;
 
-  /** Path Status. */
-  @JsonProperty("status")
-  private ResponseStatus status;
-
-  public NamespaceSummaryResponse(EntityType entityType) {
-    this.entityType = entityType;
-    this.numVolume = -1;
-    this.numBucket = -1;
-    this.numTotalDir = -1;
-    this.numTotalKey = 0;
-    this.status = ResponseStatus.OK;
-  }
-
-  public EntityType getEntityType() {
-    return this.entityType;
+  public CountStats(int numVolume, int numBucket,
+                    int numTotalDir, long numTotalKey) {
+    this.numVolume = numVolume;
+    this.numBucket = numBucket;
+    this.numTotalDir = numTotalDir;
+    this.numTotalKey = numTotalKey;
   }
 
   public int getNumVolume() {
-    return this.numVolume;
+    return numVolume;
   }
 
   public int getNumBucket() {
-    return this.numBucket;
+    return numBucket;
   }
 
   public int getNumTotalDir() {
-    return this.numTotalDir;
+    return numTotalDir;
   }
 
   public long getNumTotalKey() {
-    return this.numTotalKey;
-  }
-
-  public ResponseStatus getStatus() {
-    return this.status;
-  }
-
-  public void setEntityType(EntityType entityType) {
-    this.entityType = entityType;
-  }
-
-  public void setNumVolume(int numVolume) {
-    this.numVolume = numVolume;
-  }
-
-  public void setNumBucket(int numBucket) {
-    this.numBucket = numBucket;
-  }
-
-  public void setNumTotalDir(int numTotalDir) {
-    this.numTotalDir = numTotalDir;
-  }
-
-  public void setNumTotalKey(long numTotalKey) {
-    this.numTotalKey = numTotalKey;
-  }
-
-  public void setStatus(ResponseStatus status) {
-    this.status = status;
+    return numTotalKey;
   }
 }
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/KeyObjectDBInfo.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/KeyObjectDBInfo.java
new file mode 100644
index 0000000000..f8cba210a5
--- /dev/null
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/KeyObjectDBInfo.java
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.ozone.recon.api.types;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.hadoop.fs.FileEncryptionInfo;
+import org.apache.hadoop.hdds.client.ReplicationConfig;
+import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
+import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup;
+
+import java.util.List;
+
+/**
+ * Encapsulates the low level key info.
+ */
+public class KeyObjectDBInfo extends ObjectDBInfo {
+  /** volume name from om db. */
+  @JsonProperty("volumeName")
+  private String volumeName;
+  @JsonProperty("bucketName")
+  private String bucketName;
+  @JsonProperty("keyName")
+  private String keyName;
+  @JsonProperty("dataSize")
+  private long dataSize;
+  @JsonProperty("keyLocationVersions")
+  private List<OmKeyLocationInfoGroup> keyLocationVersions;
+  @JsonProperty("replicationConfig")
+  private ReplicationConfig replicationConfig;
+  @JsonProperty("encInfo")
+  private FileEncryptionInfo encInfo;
+
+  /**
+   * Support OFS use-case to identify if the key is a file or a directory.
+   */
+  private boolean isFile;
+
+  /**
+   * Represents leaf node name. This also will be used when the keyName is
+   * created on a FileSystemOptimized(FSO) bucket. For example, the user given
+   * keyName is "a/b/key1" then the fileName stores "key1".
+   */
+  private String fileName;
+
+  public KeyObjectDBInfo() {
+
+  }
+
+  public KeyObjectDBInfo(OmKeyInfo omKeyInfo) {
+    super.setName(omKeyInfo.getKeyName());
+    super.setCreationTime(omKeyInfo.getCreationTime());
+    super.setModificationTime(omKeyInfo.getModificationTime());
+    super.setAcls(omKeyInfo.getAcls());
+    super.setMetadata(omKeyInfo.getMetadata());
+    this.setVolumeName(omKeyInfo.getVolumeName());
+    this.setBucketName(omKeyInfo.getBucketName());
+    this.setKeyName(omKeyInfo.getKeyName());
+    this.setDataSize(omKeyInfo.getDataSize());
+    this.setKeyLocationVersions(omKeyInfo.getKeyLocationVersions());
+    this.setReplicationConfig(omKeyInfo.getReplicationConfig());
+    this.setEncInfo(omKeyInfo.getFileEncryptionInfo());
+    this.setFileName(omKeyInfo.getFileName());
+    this.setFile(omKeyInfo.isFile());
+  }
+
+  public String getVolumeName() {
+    return volumeName;
+  }
+
+  public void setVolumeName(String volumeName) {
+    this.volumeName = volumeName;
+  }
+
+  public String getBucketName() {
+    return bucketName;
+  }
+
+  public void setBucketName(String bucketName) {
+    this.bucketName = bucketName;
+  }
+
+  public String getKeyName() {
+    return keyName;
+  }
+
+  public void setKeyName(String keyName) {
+    this.keyName = keyName;
+  }
+
+  public long getDataSize() {
+    return dataSize;
+  }
+
+  public void setDataSize(long dataSize) {
+    this.dataSize = dataSize;
+  }
+
+  public List<OmKeyLocationInfoGroup> getKeyLocationVersions() {
+    return keyLocationVersions;
+  }
+
+  public void setKeyLocationVersions(
+      List<OmKeyLocationInfoGroup> keyLocationVersions) {
+    this.keyLocationVersions = keyLocationVersions;
+  }
+
+  public ReplicationConfig getReplicationConfig() {
+    return replicationConfig;
+  }
+
+  public void setReplicationConfig(ReplicationConfig replicationConfig) {
+    this.replicationConfig = replicationConfig;
+  }
+
+  public boolean isFile() {
+    return isFile;
+  }
+
+  public void setFile(boolean file) {
+    isFile = file;
+  }
+
+  public String getFileName() {
+    return fileName;
+  }
+
+  public void setFileName(String fileName) {
+    this.fileName = fileName;
+  }
+
+  public FileEncryptionInfo getEncInfo() {
+    return encInfo;
+  }
+
+  public void setEncInfo(FileEncryptionInfo encInfo) {
+    this.encInfo = encInfo;
+  }
+}
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/NamespaceSummaryResponse.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/NamespaceSummaryResponse.java
index 2a2d9f6de7..5ccfd98873 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/NamespaceSummaryResponse.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/NamespaceSummaryResponse.java
@@ -18,62 +18,67 @@
 
 package org.apache.hadoop.ozone.recon.api.types;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.Preconditions;
+import org.apache.commons.lang3.StringUtils;
 
 /**
  * HTTP Response wrapped for a 'summary' request.
  */
 public class NamespaceSummaryResponse {
+  /** Path for metadata summary. */
+  @JsonProperty("path")
+  private String path;
+
   /** The namespace the request path is on. */
   @JsonProperty("type")
   private EntityType entityType;
 
-  /** Total number of volumes under root, -1 for other types. */
-  @JsonProperty("numVolume")
-  private int numVolume;
-
-  /** Total number of buckets for root/volume, -1 for other types. */
-  @JsonProperty("numBucket")
-  private int numBucket;
+  /** Count stats which tells the number of volumes/buckets/dir/files etc. */
+  @JsonProperty("countStats")
+  private CountStats countStats;
 
-  /** Total number of directories for all types except key, -1 for key. */
-  @JsonProperty("numDir")
-  private int numTotalDir;
-
-  /** Total number of keys. */
-  @JsonProperty("numKey")
-  private long numTotalKey;
+  @JsonProperty("objectInfo")
+  private ObjectDBInfo objectDBInfo;
 
   /** Path Status. */
   @JsonProperty("status")
   private ResponseStatus status;
 
-  public NamespaceSummaryResponse(EntityType entityType) {
-    this.entityType = entityType;
-    this.numVolume = -1;
-    this.numBucket = -1;
-    this.numTotalDir = -1;
-    this.numTotalKey = 0;
-    this.status = ResponseStatus.OK;
+  /**
+   * Returns new builder class that builds a NamespaceSummaryResponse.
+   *
+   * @return Builder
+   */
+  public static NamespaceSummaryResponse.Builder newBuilder() {
+    return new NamespaceSummaryResponse.Builder();
   }
 
-  public EntityType getEntityType() {
-    return this.entityType;
+  public NamespaceSummaryResponse(Builder b) {
+    this.path = b.path;
+    this.entityType = b.entityType;
+    this.countStats = b.countStats;
+    this.objectDBInfo = b.objectDBInfo;
+    this.status = b.status;
   }
 
-  public int getNumVolume() {
-    return this.numVolume;
+  public String getPath() {
+    return path;
   }
 
-  public int getNumBucket() {
-    return this.numBucket;
+  public void setPath(String path) {
+    this.path = path;
   }
 
-  public int getNumTotalDir() {
-    return this.numTotalDir;
+  public CountStats getCountStats() {
+    return countStats;
   }
 
-  public long getNumTotalKey() {
-    return this.numTotalKey;
+  public void setCountStats(CountStats countStats) {
+    this.countStats = countStats;
+  }
+
+  public EntityType getEntityType() {
+    return this.entityType;
   }
 
   public ResponseStatus getStatus() {
@@ -84,23 +89,72 @@ public class NamespaceSummaryResponse {
     this.entityType = entityType;
   }
 
-  public void setNumVolume(int numVolume) {
-    this.numVolume = numVolume;
+  public void setStatus(ResponseStatus status) {
+    this.status = status;
   }
 
-  public void setNumBucket(int numBucket) {
-    this.numBucket = numBucket;
+  public ObjectDBInfo getObjectDBInfo() {
+    return objectDBInfo;
   }
 
-  public void setNumTotalDir(int numTotalDir) {
-    this.numTotalDir = numTotalDir;
+  public void setObjectDBInfo(ObjectDBInfo objectDBInfo) {
+    this.objectDBInfo = objectDBInfo;
   }
 
-  public void setNumTotalKey(long numTotalKey) {
-    this.numTotalKey = numTotalKey;
+  /**
+   * Builder for NamespaceSummaryResponse.
+   */
+  @SuppressWarnings("checkstyle:hiddenfield")
+  public static final class Builder {
+    private String path;
+    private EntityType entityType;
+    private CountStats countStats;
+    private ObjectDBInfo objectDBInfo;
+    private ResponseStatus status;
+
+
+    public Builder() {
+      // Default values
+      this.path = StringUtils.EMPTY;
+      this.entityType = EntityType.ROOT;
+    }
+
+    public NamespaceSummaryResponse.Builder setPath(String path) {
+      this.path = path;
+      return this;
+    }
+
+    public NamespaceSummaryResponse.Builder setEntityType(
+        EntityType entityType) {
+      this.entityType = entityType;
+      return this;
+    }
+
+    public NamespaceSummaryResponse.Builder setCountStats(
+        CountStats countStats) {
+      this.countStats = countStats;
+      return this;
+    }
+
+    public NamespaceSummaryResponse.Builder setObjectDBInfo(
+        ObjectDBInfo objectDBInfo) {
+      this.objectDBInfo = objectDBInfo;
+      return this;
+    }
+
+    public NamespaceSummaryResponse.Builder setStatus(
+        ResponseStatus status) {
+      this.status = status;
+      return this;
+    }
+
+    public NamespaceSummaryResponse build() {
+      Preconditions.checkNotNull(this.path);
+      Preconditions.checkNotNull(this.entityType);
+      Preconditions.checkNotNull(this.status);
+
+      return new NamespaceSummaryResponse(this);
+    }
   }
 
-  public void setStatus(ResponseStatus status) {
-    this.status = status;
-  }
 }
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ObjectDBInfo.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ObjectDBInfo.java
new file mode 100644
index 0000000000..acd034a486
--- /dev/null
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ObjectDBInfo.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.ozone.recon.api.types;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.hadoop.ozone.OzoneAcl;
+import org.apache.hadoop.ozone.om.helpers.OmDirectoryInfo;
+import org.apache.hadoop.ozone.om.helpers.OmPrefixInfo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Encapsulates the low level DB info common to volume or bucket or dir.
+ */
+public class ObjectDBInfo {
+  @JsonProperty("metadata")
+  private Map<String, String> metadata;
+
+  @JsonProperty("name")
+  private String name;
+
+  @JsonProperty("quotaInBytes")
+  private long quotaInBytes;
+
+  @JsonProperty("quotaInNamespace")
+  private long quotaInNamespace;
+
+  @JsonProperty("usedNamespace")
+  private long usedNamespace;
+
+  @JsonProperty("creationTime")
+  private long creationTime;
+
+  @JsonProperty("modificationTime")
+  private long modificationTime;
+
+  @JsonProperty("acls")
+  private List<OzoneAcl> acls;
+
+  public ObjectDBInfo() {
+
+  }
+
+  public ObjectDBInfo(OmDirectoryInfo omDirectoryInfo) {
+    this.setName(omDirectoryInfo.getName());
+    this.setCreationTime(omDirectoryInfo.getCreationTime());
+    this.setModificationTime(omDirectoryInfo.getModificationTime());
+    this.setAcls(omDirectoryInfo.getAcls());
+    this.setMetadata(omDirectoryInfo.getMetadata());
+  }
+
+  public ObjectDBInfo(OmPrefixInfo omPrefixInfo) {
+    this.setName(omPrefixInfo.getName());
+    this.setAcls(omPrefixInfo.getAcls());
+    this.setMetadata(omPrefixInfo.getMetadata());
+  }
+
+
+  public Map<String, String> getMetadata() {
+    return metadata;
+  }
+
+  public void setMetadata(Map<String, String> metadata) {
+    this.metadata = metadata;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public long getQuotaInBytes() {
+    return quotaInBytes;
+  }
+
+  public void setQuotaInBytes(long quotaInBytes) {
+    this.quotaInBytes = quotaInBytes;
+  }
+
+  public long getQuotaInNamespace() {
+    return quotaInNamespace;
+  }
+
+  public void setQuotaInNamespace(long quotaInNamespace) {
+    this.quotaInNamespace = quotaInNamespace;
+  }
+
+  public long getUsedNamespace() {
+    return usedNamespace;
+  }
+
+  public void setUsedNamespace(long usedNamespace) {
+    this.usedNamespace = usedNamespace;
+  }
+
+  public long getCreationTime() {
+    return creationTime;
+  }
+
+  public void setCreationTime(long creationTime) {
+    this.creationTime = creationTime;
+  }
+
+  public long getModificationTime() {
+    return modificationTime;
+  }
+
+  public void setModificationTime(long modificationTime) {
+    this.modificationTime = modificationTime;
+  }
+
+  public List<OzoneAcl> getAcls() {
+    return acls;
+  }
+
+  public void setAcls(List<OzoneAcl> acls) {
+    this.acls = acls;
+  }
+
+}
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/VolumeObjectDBInfo.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/VolumeObjectDBInfo.java
new file mode 100644
index 0000000000..7bb759ca49
--- /dev/null
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/VolumeObjectDBInfo.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.ozone.recon.api.types;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
+
+/**
+ * Encapsulates the low level volume info.
+ */
+public class VolumeObjectDBInfo extends ObjectDBInfo {
+  @JsonProperty("admin")
+  private String admin;
+
+  @JsonProperty("owner")
+  private String owner;
+
+  @JsonProperty("volume")
+  private String volume;
+
+  public VolumeObjectDBInfo() {
+
+  }
+
+  public VolumeObjectDBInfo(OmVolumeArgs omVolumeArgs) {
+    super.setMetadata(omVolumeArgs.getMetadata());
+    super.setName(omVolumeArgs.getVolume());
+    super.setQuotaInBytes(omVolumeArgs.getQuotaInBytes());
+    super.setQuotaInNamespace(omVolumeArgs.getQuotaInNamespace());
+    super.setUsedNamespace(omVolumeArgs.getUsedNamespace());
+    super.setCreationTime(omVolumeArgs.getCreationTime());
+    super.setModificationTime(omVolumeArgs.getModificationTime());
+    super.setAcls(omVolumeArgs.getAcls());
+    this.setAdmin(omVolumeArgs.getAdminName());
+    this.setOwner(omVolumeArgs.getOwnerName());
+    this.setVolume(omVolumeArgs.getVolume());
+  }
+
+  public String getAdmin() {
+    return admin;
+  }
+
+  public void setAdmin(String admin) {
+    this.admin = admin;
+  }
+
+  public String getOwner() {
+    return owner;
+  }
+
+  public void setOwner(String owner) {
+    this.owner = owner;
+  }
+
+  public String getVolume() {
+    return volume;
+  }
+
+  public void setVolume(String volume) {
+    this.volume = volume;
+  }
+}
diff --git 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestNSSummaryEndpointWithFSO.java
 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestNSSummaryEndpointWithFSO.java
index 13cb13d78d..be85ca85b7 100644
--- 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestNSSummaryEndpointWithFSO.java
+++ 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestNSSummaryEndpointWithFSO.java
@@ -44,12 +44,11 @@ import org.apache.hadoop.ozone.recon.ReconConstants;
 import org.apache.hadoop.ozone.recon.ReconTestInjector;
 import org.apache.hadoop.ozone.recon.api.handlers.BucketHandler;
 import org.apache.hadoop.ozone.recon.api.handlers.EntityHandler;
-import org.apache.hadoop.ozone.recon.api.types.NamespaceSummaryResponse;
 import org.apache.hadoop.ozone.recon.api.types.DUResponse;
-import org.apache.hadoop.ozone.recon.api.types.EntityType;
 import org.apache.hadoop.ozone.recon.api.types.FileSizeDistributionResponse;
 import org.apache.hadoop.ozone.recon.api.types.ResponseStatus;
 import org.apache.hadoop.ozone.recon.api.types.QuotaUsageResponse;
+import org.apache.hadoop.ozone.recon.common.CommonUtils;
 import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager;
 import org.apache.hadoop.ozone.recon.scm.ReconNodeManager;
 import org.apache.hadoop.ozone.recon.scm.ReconStorageContainerManagerFacade;
@@ -115,6 +114,7 @@ public class TestNSSummaryEndpointWithFSO {
   private ReconOMMetadataManager reconOMMetadataManager;
   private NSSummaryEndpoint nsSummaryEndpoint;
   private OzoneConfiguration ozoneConfiguration;
+  private CommonUtils commonUtils;
 
   private static final String TEST_PATH_UTILITY =
           "/vol1/buck1/a/b/c/d/e/file1.txt";
@@ -382,6 +382,7 @@ public class TestNSSummaryEndpointWithFSO {
         new NSSummaryTaskWithFSO(reconNamespaceSummaryManager,
             reconOMMetadataManager, ozoneConfiguration);
     nSSummaryTaskWithFso.reprocessWithFSO(reconOMMetadataManager);
+    commonUtils = new CommonUtils();
   }
 
   @Test
@@ -397,80 +398,48 @@ public class TestNSSummaryEndpointWithFSO {
   @Test
   public void testGetBasicInfoRoot() throws Exception {
     // Test root basics
-    Response rootResponse = nsSummaryEndpoint.getBasicInfo(ROOT_PATH);
-    NamespaceSummaryResponse rootResponseObj =
-        (NamespaceSummaryResponse) rootResponse.getEntity();
-    Assert.assertEquals(EntityType.ROOT, rootResponseObj.getEntityType());
-    Assert.assertEquals(2, rootResponseObj.getNumVolume());
-    Assert.assertEquals(4, rootResponseObj.getNumBucket());
-    Assert.assertEquals(5, rootResponseObj.getNumTotalDir());
-    Assert.assertEquals(10, rootResponseObj.getNumTotalKey());
+    commonUtils.testNSSummaryBasicInfoRoot(
+        nsSummaryEndpoint, reconOMMetadataManager);
   }
 
   @Test
   public void testGetBasicInfoVol() throws Exception {
     // Test volume basics
-    Response volResponse = nsSummaryEndpoint.getBasicInfo(VOL_PATH);
-    NamespaceSummaryResponse volResponseObj =
-            (NamespaceSummaryResponse) volResponse.getEntity();
-    Assert.assertEquals(EntityType.VOLUME, volResponseObj.getEntityType());
-    Assert.assertEquals(2, volResponseObj.getNumBucket());
-    Assert.assertEquals(4, volResponseObj.getNumTotalDir());
-    Assert.assertEquals(6, volResponseObj.getNumTotalKey());
+    commonUtils.testNSSummaryBasicInfoVolume(nsSummaryEndpoint);
   }
 
   @Test
   public void testGetBasicInfoBucketOne() throws Exception {
     // Test bucket 1's basics
-    Response bucketOneResponse =
-            nsSummaryEndpoint.getBasicInfo(BUCKET_ONE_PATH);
-    NamespaceSummaryResponse bucketOneObj =
-            (NamespaceSummaryResponse) bucketOneResponse.getEntity();
-    Assert.assertEquals(EntityType.BUCKET, bucketOneObj.getEntityType());
-    Assert.assertEquals(4, bucketOneObj.getNumTotalDir());
-    Assert.assertEquals(4, bucketOneObj.getNumTotalKey());
+    commonUtils.testNSSummaryBasicInfoBucketOne(
+        BucketLayout.FILE_SYSTEM_OPTIMIZED,
+        nsSummaryEndpoint);
   }
 
   @Test
   public void testGetBasicInfoBucketTwo() throws Exception {
     // Test bucket 2's basics
-    Response bucketTwoResponse =
-            nsSummaryEndpoint.getBasicInfo(BUCKET_TWO_PATH);
-    NamespaceSummaryResponse bucketTwoObj =
-            (NamespaceSummaryResponse) bucketTwoResponse.getEntity();
-    Assert.assertEquals(EntityType.BUCKET, bucketTwoObj.getEntityType());
-    Assert.assertEquals(0, bucketTwoObj.getNumTotalDir());
-    Assert.assertEquals(2, bucketTwoObj.getNumTotalKey());
+    commonUtils.testNSSummaryBasicInfoBucketTwo(
+        BucketLayout.FILE_SYSTEM_OPTIMIZED,
+        nsSummaryEndpoint);
   }
 
   @Test
   public void testGetBasicInfoDir() throws Exception {
     // Test intermediate directory basics
-    Response dirOneResponse = nsSummaryEndpoint.getBasicInfo(DIR_ONE_PATH);
-    NamespaceSummaryResponse dirOneObj =
-            (NamespaceSummaryResponse) dirOneResponse.getEntity();
-    Assert.assertEquals(EntityType.DIRECTORY, dirOneObj.getEntityType());
-    Assert.assertEquals(3, dirOneObj.getNumTotalDir());
-    Assert.assertEquals(3, dirOneObj.getNumTotalKey());
+    commonUtils.testNSSummaryBasicInfoDir(nsSummaryEndpoint);
   }
 
   @Test
   public void testGetBasicInfoNoPath() throws Exception {
     // Test invalid path
-    Response invalidResponse = nsSummaryEndpoint.getBasicInfo(INVALID_PATH);
-    NamespaceSummaryResponse invalidObj =
-            (NamespaceSummaryResponse) invalidResponse.getEntity();
-    Assert.assertEquals(ResponseStatus.PATH_NOT_FOUND,
-        invalidObj.getStatus());
+    commonUtils.testNSSummaryBasicInfoNoPath(nsSummaryEndpoint);
   }
 
   @Test
   public void testGetBasicInfoKey() throws Exception {
     // Test key
-    Response keyResponse = nsSummaryEndpoint.getBasicInfo(KEY_PATH);
-    NamespaceSummaryResponse keyResObj =
-            (NamespaceSummaryResponse) keyResponse.getEntity();
-    Assert.assertEquals(EntityType.KEY, keyResObj.getEntityType());
+    commonUtils.testNSSummaryBasicInfoKey(nsSummaryEndpoint);
   }
 
   @Test
diff --git 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestNSSummaryEndpointWithLegacy.java
 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestNSSummaryEndpointWithLegacy.java
index c7c69623e2..31f1bed674 100644
--- 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestNSSummaryEndpointWithLegacy.java
+++ 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestNSSummaryEndpointWithLegacy.java
@@ -45,12 +45,11 @@ import org.apache.hadoop.ozone.recon.ReconConstants;
 import org.apache.hadoop.ozone.recon.ReconTestInjector;
 import org.apache.hadoop.ozone.recon.api.handlers.BucketHandler;
 import org.apache.hadoop.ozone.recon.api.handlers.EntityHandler;
-import org.apache.hadoop.ozone.recon.api.types.NamespaceSummaryResponse;
 import org.apache.hadoop.ozone.recon.api.types.DUResponse;
-import org.apache.hadoop.ozone.recon.api.types.EntityType;
 import org.apache.hadoop.ozone.recon.api.types.FileSizeDistributionResponse;
 import org.apache.hadoop.ozone.recon.api.types.ResponseStatus;
 import org.apache.hadoop.ozone.recon.api.types.QuotaUsageResponse;
+import org.apache.hadoop.ozone.recon.common.CommonUtils;
 import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager;
 import org.apache.hadoop.ozone.recon.scm.ReconNodeManager;
 import org.apache.hadoop.ozone.recon.scm.ReconStorageContainerManagerFacade;
@@ -116,6 +115,7 @@ public class TestNSSummaryEndpointWithLegacy {
   private ReconOMMetadataManager reconOMMetadataManager;
   private NSSummaryEndpoint nsSummaryEndpoint;
   private OzoneConfiguration conf;
+  private CommonUtils commonUtils;
 
   private static final String TEST_PATH_UTILITY =
       "/vol1/buck1/a/b/c/d/e/file1.txt";
@@ -383,6 +383,7 @@ public class TestNSSummaryEndpointWithLegacy {
         new NSSummaryTaskWithLegacy(reconNamespaceSummaryManager, 
                                     reconOMMetadataManager, conf);
     nsSummaryTaskWithLegacy.reprocessWithLegacy(reconOMMetadataManager);
+    commonUtils = new CommonUtils();
   }
 
   @Test
@@ -397,81 +398,48 @@ public class TestNSSummaryEndpointWithLegacy {
 
   @Test
   public void testGetBasicInfoRoot() throws Exception {
-    // Test root basics
-    Response rootResponse = nsSummaryEndpoint.getBasicInfo(ROOT_PATH);
-    NamespaceSummaryResponse rootResponseObj =
-        (NamespaceSummaryResponse) rootResponse.getEntity();
-    Assert.assertEquals(EntityType.ROOT, rootResponseObj.getEntityType());
-    Assert.assertEquals(2, rootResponseObj.getNumVolume());
-    Assert.assertEquals(4, rootResponseObj.getNumBucket());
-    Assert.assertEquals(5, rootResponseObj.getNumTotalDir());
-    Assert.assertEquals(10, rootResponseObj.getNumTotalKey());
+    commonUtils.testNSSummaryBasicInfoRoot(
+        nsSummaryEndpoint, reconOMMetadataManager);
   }
 
   @Test
   public void testGetBasicInfoVol() throws Exception {
     // Test volume basics
-    Response volResponse = nsSummaryEndpoint.getBasicInfo(VOL_PATH);
-    NamespaceSummaryResponse volResponseObj =
-        (NamespaceSummaryResponse) volResponse.getEntity();
-    Assert.assertEquals(EntityType.VOLUME, volResponseObj.getEntityType());
-    Assert.assertEquals(2, volResponseObj.getNumBucket());
-    Assert.assertEquals(4, volResponseObj.getNumTotalDir());
-    Assert.assertEquals(6, volResponseObj.getNumTotalKey());
+    commonUtils.testNSSummaryBasicInfoVolume(nsSummaryEndpoint);
   }
 
   @Test
   public void testGetBasicInfoBucketOne() throws Exception {
     // Test bucket 1's basics
-    Response bucketOneResponse =
-        nsSummaryEndpoint.getBasicInfo(BUCKET_ONE_PATH);
-    NamespaceSummaryResponse bucketOneObj =
-        (NamespaceSummaryResponse) bucketOneResponse.getEntity();
-    Assert.assertEquals(EntityType.BUCKET, bucketOneObj.getEntityType());
-    Assert.assertEquals(4, bucketOneObj.getNumTotalDir());
-    Assert.assertEquals(4, bucketOneObj.getNumTotalKey());
+    commonUtils.testNSSummaryBasicInfoBucketOne(
+        BucketLayout.LEGACY,
+        nsSummaryEndpoint);
   }
 
   @Test
   public void testGetBasicInfoBucketTwo() throws Exception {
     // Test bucket 2's basics
-    Response bucketTwoResponse =
-        nsSummaryEndpoint.getBasicInfo(BUCKET_TWO_PATH);
-    NamespaceSummaryResponse bucketTwoObj =
-        (NamespaceSummaryResponse) bucketTwoResponse.getEntity();
-    Assert.assertEquals(EntityType.BUCKET, bucketTwoObj.getEntityType());
-    Assert.assertEquals(0, bucketTwoObj.getNumTotalDir());
-    Assert.assertEquals(2, bucketTwoObj.getNumTotalKey());
+    commonUtils.testNSSummaryBasicInfoBucketTwo(
+        BucketLayout.LEGACY,
+        nsSummaryEndpoint);
   }
 
   @Test
   public void testGetBasicInfoDir() throws Exception {
     // Test intermediate directory basics
-    Response dirOneResponse = nsSummaryEndpoint.getBasicInfo(DIR_ONE_PATH);
-    NamespaceSummaryResponse dirOneObj =
-        (NamespaceSummaryResponse) dirOneResponse.getEntity();
-    Assert.assertEquals(EntityType.DIRECTORY, dirOneObj.getEntityType());
-    Assert.assertEquals(3, dirOneObj.getNumTotalDir());
-    Assert.assertEquals(3, dirOneObj.getNumTotalKey());
+    commonUtils.testNSSummaryBasicInfoDir(nsSummaryEndpoint);
   }
 
   @Test
   public void testGetBasicInfoNoPath() throws Exception {
     // Test invalid path
-    Response invalidResponse = nsSummaryEndpoint.getBasicInfo(INVALID_PATH);
-    NamespaceSummaryResponse invalidObj =
-        (NamespaceSummaryResponse) invalidResponse.getEntity();
-    Assert.assertEquals(ResponseStatus.PATH_NOT_FOUND,
-        invalidObj.getStatus());
+    commonUtils.testNSSummaryBasicInfoNoPath(nsSummaryEndpoint);
   }
 
   @Test
   public void testGetBasicInfoKey() throws Exception {
     // Test key
-    Response keyResponse = nsSummaryEndpoint.getBasicInfo(KEY_PATH);
-    NamespaceSummaryResponse keyResObj =
-        (NamespaceSummaryResponse) keyResponse.getEntity();
-    Assert.assertEquals(EntityType.KEY, keyResObj.getEntityType());
+    commonUtils.testNSSummaryBasicInfoKey(nsSummaryEndpoint);
   }
 
   @Test
diff --git 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/common/CommonUtils.java
 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/common/CommonUtils.java
new file mode 100644
index 0000000000..fe1b29c94f
--- /dev/null
+++ 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/common/CommonUtils.java
@@ -0,0 +1,225 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.ozone.recon.common;
+
+import org.apache.hadoop.hdds.protocol.StorageType;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
+import org.apache.hadoop.ozone.OzoneAcl;
+import org.apache.hadoop.ozone.OzoneConsts;
+import org.apache.hadoop.ozone.om.helpers.BucketLayout;
+import org.apache.hadoop.ozone.om.helpers.OmPrefixInfo;
+import org.apache.hadoop.ozone.recon.api.NSSummaryEndpoint;
+import org.apache.hadoop.ozone.recon.api.types.BucketObjectDBInfo;
+import org.apache.hadoop.ozone.recon.api.types.EntityType;
+import org.apache.hadoop.ozone.recon.api.types.KeyObjectDBInfo;
+import org.apache.hadoop.ozone.recon.api.types.NamespaceSummaryResponse;
+import org.apache.hadoop.ozone.recon.api.types.ResponseStatus;
+import org.apache.hadoop.ozone.recon.api.types.VolumeObjectDBInfo;
+import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager;
+import org.apache.hadoop.ozone.security.acl.IAccessAuthorizer;
+import org.junit.Assert;
+
+import javax.ws.rs.core.Response;
+
+import java.util.Collections;
+import java.util.HashMap;
+
+import static org.apache.hadoop.ozone.OzoneAcl.AclScope.ACCESS;
+
+/**
+ * This is a utility class for common code for test cases.
+ */
+public class CommonUtils {
+  private static final String ROOT_PATH = "/";
+  private static final String VOL_PATH = "/vol";
+  private static final String BUCKET_ONE_PATH = "/vol/bucket1";
+  private static final String BUCKET_TWO_PATH = "/vol/bucket2";
+  private static final String DIR_ONE_PATH = "/vol/bucket1/dir1";
+  private static final String INVALID_PATH = "/vol/path/not/found";
+  private static final String KEY_PATH = "/vol/bucket2/file4";
+
+  private OmPrefixInfo getOmPrefixInfoForTest(
+      String path,
+      IAccessAuthorizer.ACLIdentityType identityType,
+      String identityString,
+      IAccessAuthorizer.ACLType aclType,
+      OzoneAcl.AclScope scope) {
+    return new OmPrefixInfo(path,
+        Collections.singletonList(new OzoneAcl(
+            identityType, identityString,
+            aclType, scope)), new HashMap<>(), 10, 100);
+  }
+
+  public void testNSSummaryBasicInfoRoot(
+      NSSummaryEndpoint nsSummaryEndpoint,
+      ReconOMMetadataManager reconOMMetadataManager) throws Exception {
+    String username = "myuser";
+    OmPrefixInfo omPrefixInfo = getOmPrefixInfoForTest(ROOT_PATH,
+        IAccessAuthorizer.ACLIdentityType.USER,
+        username,
+        IAccessAuthorizer.ACLType.WRITE,
+        ACCESS);
+    omPrefixInfo.getMetadata().put("key", "value");
+    reconOMMetadataManager.getPrefixTable()
+        .put(OzoneConsts.OM_KEY_PREFIX, omPrefixInfo);
+    // Test root basics
+    Response rootResponse = nsSummaryEndpoint.getBasicInfo(ROOT_PATH);
+    NamespaceSummaryResponse rootResponseObj =
+        (NamespaceSummaryResponse) rootResponse.getEntity();
+    Assert.assertEquals(EntityType.ROOT, rootResponseObj.getEntityType());
+    Assert.assertEquals(2, rootResponseObj.getCountStats().getNumVolume());
+    Assert.assertEquals(4, rootResponseObj.getCountStats().getNumBucket());
+    Assert.assertEquals(5, rootResponseObj.getCountStats().getNumTotalDir());
+    Assert.assertEquals(10, rootResponseObj.getCountStats().getNumTotalKey());
+    Assert.assertEquals(IAccessAuthorizer.ACLIdentityType.USER,
+        rootResponseObj.getObjectDBInfo().getAcls().get(0).getType());
+    Assert.assertEquals(IAccessAuthorizer.ACLType.WRITE.toString(),
+        rootResponseObj.getObjectDBInfo().getAcls().get(0)
+            .getAclList().get(0).toString());
+    Assert.assertEquals(username,
+        rootResponseObj.getObjectDBInfo().getAcls().get(0).getName());
+    Assert.assertEquals("value",
+        rootResponseObj.getObjectDBInfo().getMetadata().get("key"));
+    Assert.assertEquals(ACCESS,
+        rootResponseObj.getObjectDBInfo().getAcls().get(0).getAclScope());
+  }
+
+  public void testNSSummaryBasicInfoVolume(
+      NSSummaryEndpoint nsSummaryEndpoint) throws Exception {
+    Response volResponse = nsSummaryEndpoint.getBasicInfo(VOL_PATH);
+    NamespaceSummaryResponse volResponseObj =
+        (NamespaceSummaryResponse) volResponse.getEntity();
+    Assert.assertEquals(EntityType.VOLUME,
+        volResponseObj.getEntityType());
+    Assert.assertEquals(2,
+        volResponseObj.getCountStats().getNumBucket());
+    Assert.assertEquals(4,
+        volResponseObj.getCountStats().getNumTotalDir());
+    Assert.assertEquals(6,
+        volResponseObj.getCountStats().getNumTotalKey());
+    Assert.assertEquals("TestUser",
+        ((VolumeObjectDBInfo) volResponseObj.
+            getObjectDBInfo()).getAdmin());
+    Assert.assertEquals("TestUser",
+        ((VolumeObjectDBInfo) volResponseObj.
+            getObjectDBInfo()).getOwner());
+    Assert.assertEquals("vol",
+        volResponseObj.getObjectDBInfo().getName());
+    Assert.assertEquals(2097152,
+        volResponseObj.getObjectDBInfo().getQuotaInBytes());
+    Assert.assertEquals(-1,
+        volResponseObj.getObjectDBInfo().getQuotaInNamespace());
+  }
+
+  public void testNSSummaryBasicInfoBucketOne(BucketLayout bucketLayout,
+      NSSummaryEndpoint nsSummaryEndpoint) throws Exception {
+    Response bucketOneResponse =
+        nsSummaryEndpoint.getBasicInfo(BUCKET_ONE_PATH);
+    NamespaceSummaryResponse bucketOneObj =
+        (NamespaceSummaryResponse) bucketOneResponse.getEntity();
+    Assert.assertEquals(EntityType.BUCKET, bucketOneObj.getEntityType());
+    Assert.assertEquals(4, bucketOneObj.getCountStats().getNumTotalDir());
+    Assert.assertEquals(4, bucketOneObj.getCountStats().getNumTotalKey());
+    Assert.assertEquals("vol",
+        ((BucketObjectDBInfo) bucketOneObj.getObjectDBInfo()).getVolumeName());
+    Assert.assertEquals(StorageType.DISK,
+        ((BucketObjectDBInfo)
+            bucketOneObj.getObjectDBInfo()).getStorageType());
+    Assert.assertEquals(bucketLayout,
+        ((BucketObjectDBInfo)
+            bucketOneObj.getObjectDBInfo()).getBucketLayout());
+    Assert.assertEquals("bucket1",
+        ((BucketObjectDBInfo) bucketOneObj.getObjectDBInfo()).getName());
+  }
+
+  public void testNSSummaryBasicInfoBucketTwo(
+        BucketLayout bucketLayout,
+        NSSummaryEndpoint nsSummaryEndpoint) throws Exception {
+    Response bucketTwoResponse =
+        nsSummaryEndpoint.getBasicInfo(BUCKET_TWO_PATH);
+    NamespaceSummaryResponse bucketTwoObj =
+        (NamespaceSummaryResponse) bucketTwoResponse.getEntity();
+    Assert.assertEquals(EntityType.BUCKET, bucketTwoObj.getEntityType());
+    Assert.assertEquals(0, bucketTwoObj.getCountStats().getNumTotalDir());
+    Assert.assertEquals(2, bucketTwoObj.getCountStats().getNumTotalKey());
+    Assert.assertEquals("vol",
+        ((BucketObjectDBInfo) bucketTwoObj.getObjectDBInfo()).getVolumeName());
+    Assert.assertEquals(StorageType.DISK,
+        ((BucketObjectDBInfo)
+            bucketTwoObj.getObjectDBInfo()).getStorageType());
+    Assert.assertEquals(bucketLayout,
+        ((BucketObjectDBInfo)
+            bucketTwoObj.getObjectDBInfo()).getBucketLayout());
+    Assert.assertEquals("bucket2",
+        ((BucketObjectDBInfo) bucketTwoObj.getObjectDBInfo()).getName());
+  }
+
+  public void testNSSummaryBasicInfoDir(
+      NSSummaryEndpoint nsSummaryEndpoint) throws Exception {
+    Response dirOneResponse = nsSummaryEndpoint.getBasicInfo(DIR_ONE_PATH);
+    NamespaceSummaryResponse dirOneObj =
+        (NamespaceSummaryResponse) dirOneResponse.getEntity();
+    Assert.assertEquals(EntityType.DIRECTORY, dirOneObj.getEntityType());
+    Assert.assertEquals(3,
+        dirOneObj.getCountStats().getNumTotalDir());
+    Assert.assertEquals(3,
+        dirOneObj.getCountStats().getNumTotalKey());
+    Assert.assertEquals("dir1",
+        dirOneObj.getObjectDBInfo().getName());
+    Assert.assertEquals(0,
+        dirOneObj.getObjectDBInfo().getMetadata().size());
+    Assert.assertEquals(0,
+        dirOneObj.getObjectDBInfo().getQuotaInBytes());
+    Assert.assertEquals(0,
+        dirOneObj.getObjectDBInfo().getQuotaInNamespace());
+    Assert.assertEquals(0,
+        dirOneObj.getObjectDBInfo().getUsedNamespace());
+  }
+
+  public void testNSSummaryBasicInfoNoPath(
+      NSSummaryEndpoint nsSummaryEndpoint) throws Exception {
+    Response invalidResponse = nsSummaryEndpoint
+        .getBasicInfo(INVALID_PATH);
+    NamespaceSummaryResponse invalidObj =
+        (NamespaceSummaryResponse) invalidResponse.getEntity();
+    Assert.assertEquals(ResponseStatus.PATH_NOT_FOUND,
+        invalidObj.getStatus());
+    Assert.assertEquals(null, invalidObj.getCountStats());
+    Assert.assertEquals(null, invalidObj.getObjectDBInfo());
+  }
+
+  public void testNSSummaryBasicInfoKey(
+      NSSummaryEndpoint nsSummaryEndpoint) throws Exception {
+    Response keyResponse = nsSummaryEndpoint.getBasicInfo(KEY_PATH);
+    NamespaceSummaryResponse keyResObj =
+        (NamespaceSummaryResponse) keyResponse.getEntity();
+    Assert.assertEquals(EntityType.KEY, keyResObj.getEntityType());
+    Assert.assertEquals("vol",
+        ((KeyObjectDBInfo) keyResObj.getObjectDBInfo()).getVolumeName());
+    Assert.assertEquals("bucket2",
+        ((KeyObjectDBInfo) keyResObj.getObjectDBInfo()).getBucketName());
+    Assert.assertEquals("file4",
+        ((KeyObjectDBInfo) keyResObj.getObjectDBInfo()).getKeyName());
+    Assert.assertEquals(2049,
+        ((KeyObjectDBInfo) keyResObj.getObjectDBInfo()).getDataSize());
+    Assert.assertEquals(HddsProtos.ReplicationType.STAND_ALONE,
+        ((KeyObjectDBInfo) keyResObj.getObjectDBInfo()).
+            getReplicationConfig().getReplicationType());
+  }
+}


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

Reply via email to