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]