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

arafat2198 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 c32da04e4b5 HDDS-14621. [Recon] Populate Missing Fields in 
/clusterState StorageReport (#9754)
c32da04e4b5 is described below

commit c32da04e4b5c24b991475d9b995d18aacf82c36c
Author: Priyesh Karatha <[email protected]>
AuthorDate: Wed Feb 18 13:27:31 2026 +0530

    HDDS-14621. [Recon] Populate Missing Fields in /clusterState StorageReport 
(#9754)
---
 .../static/swagger-resources/recon-api.yaml        | 57 ++++++++++++++++-
 .../ozone/recon/api/ClusterStateEndpoint.java      | 58 ++++++++++++-----
 .../recon/api/types/ClusterStateResponse.java      |  8 +--
 ...torageReport.java => ClusterStorageReport.java} | 51 ++++-----------
 .../recon/api/types/DatanodeStorageReport.java     |  8 +--
 .../ozone/recon/api/TestClusterStateEndpoint.java  | 74 +++++++++++++++++++++-
 .../hadoop/ozone/recon/api/TestEndpoints.java      |  4 +-
 7 files changed, 189 insertions(+), 71 deletions(-)

diff --git 
a/hadoop-hdds/docs/themes/ozonedoc/static/swagger-resources/recon-api.yaml 
b/hadoop-hdds/docs/themes/ozonedoc/static/swagger-resources/recon-api.yaml
index 964efb87aff..ebaf5e50820 100644
--- a/hadoop-hdds/docs/themes/ozonedoc/static/swagger-resources/recon-api.yaml
+++ b/hadoop-hdds/docs/themes/ozonedoc/static/swagger-resources/recon-api.yaml
@@ -1764,9 +1764,15 @@ components:
             - 0
             - 100
             - 40
-    StorageReport:
+    DataNodeStorageReport:
       type: object
       properties:
+        datanodeUuid:
+          type: string
+          example: 841be80f-0454-47df-b676
+        hostName:
+          type: string
+          example: ozone-datanode-1
         capacity:
           type: number
           example: 270429917184
@@ -1779,6 +1785,51 @@ components:
         committed:
           type: number
           example: 27007111
+        minimumFreeSpace:
+          type: number
+          example: 20480
+        reserved:
+          type: number
+          example: 31457280
+        filesystemCapacity:
+          type: number
+          example: 270461374464
+        filesystemUsed:
+          type: number
+          example: 390262784
+        filesystemAvailable:
+          type: number
+          example: 270071111680
+      ClusterStorageReport:
+        type: object
+        properties:
+          capacity:
+            type: number
+            example: 270429917184
+          used:
+            type: number
+            example: 358805504
+          remaining:
+            type: number
+            example: 270071111680
+          committed:
+            type: number
+            example: 27007111
+          minimumFreeSpace:
+            type: number
+            example: 20480
+          reserved:
+            type: number
+            example: 31457280
+          filesystemCapacity:
+            type: number
+            example: 270461374464
+          filesystemUsed:
+            type: number
+            example: 390262784
+          filesystemAvailable:
+            type: number
+            example: 270071111680
     ClusterState:
       type: object
       properties:
@@ -1806,7 +1857,7 @@ components:
           type: integer
           example: 4
         storageReport:
-          $ref: "#/components/schemas/StorageReport"
+          $ref: "#/components/schemas/ClusterStorageReport"
         containers:
           type: integer
           example: 26
@@ -1857,7 +1908,7 @@ components:
                 type: number
                 example: 1605738400544
               storageReport:
-                $ref: "#/components/schemas/StorageReport"
+                $ref: "#/components/schemas/DataNodeStorageReport"
               pipelines:
                 type: array
                 items:
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ClusterStateEndpoint.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ClusterStateEndpoint.java
index 864483c9578..05037e3166f 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ClusterStateEndpoint.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/ClusterStateEndpoint.java
@@ -36,13 +36,15 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.hdds.fs.SpaceUsageSource;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.hdds.scm.container.placement.metrics.SCMNodeStat;
+import org.apache.hadoop.hdds.scm.node.DatanodeInfo;
 import org.apache.hadoop.hdds.scm.node.NodeStatus;
 import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager;
 import org.apache.hadoop.ozone.recon.api.types.ClusterStateResponse;
+import org.apache.hadoop.ozone.recon.api.types.ClusterStorageReport;
 import org.apache.hadoop.ozone.recon.api.types.ContainerStateCounts;
-import org.apache.hadoop.ozone.recon.api.types.DatanodeStorageReport;
 import org.apache.hadoop.ozone.recon.persistence.ContainerHealthSchemaManager;
 import org.apache.hadoop.ozone.recon.scm.ReconContainerManager;
 import org.apache.hadoop.ozone.recon.scm.ReconNodeManager;
@@ -51,13 +53,12 @@
 import org.apache.hadoop.ozone.recon.tasks.GlobalStatsValue;
 import org.apache.hadoop.ozone.recon.tasks.OmTableInsightTask;
 import org.apache.ozone.recon.schema.ContainerSchemaDefinition;
-import org.apache.ozone.recon.schema.generated.tables.daos.GlobalStatsDao;
 import 
org.apache.ozone.recon.schema.generated.tables.pojos.UnhealthyContainers;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Endpoint to fetch current state of ozone cluster.
+ * Endpoint to fetch the current state of the ozone cluster.
  */
 @Path("/clusterState")
 @Produces(MediaType.APPLICATION_JSON)
@@ -67,17 +68,15 @@ public class ClusterStateEndpoint {
       LoggerFactory.getLogger(ClusterStateEndpoint.class);
   public static final int MISSING_CONTAINER_COUNT_LIMIT = 1001;
 
-  private ReconNodeManager nodeManager;
-  private ReconPipelineManager pipelineManager;
-  private ReconContainerManager containerManager;
-  private GlobalStatsDao globalStatsDao;
-  private ReconGlobalStatsManager reconGlobalStatsManager;
-  private OzoneConfiguration ozoneConfiguration;
+  private final ReconNodeManager nodeManager;
+  private final ReconPipelineManager pipelineManager;
+  private final ReconContainerManager containerManager;
+  private final ReconGlobalStatsManager reconGlobalStatsManager;
+  private final OzoneConfiguration ozoneConfiguration;
   private final ContainerHealthSchemaManager containerHealthSchemaManager;
 
   @Inject
   ClusterStateEndpoint(OzoneStorageContainerManager reconSCM,
-                       GlobalStatsDao globalStatsDao,
                        ReconGlobalStatsManager reconGlobalStatsManager,
                        ContainerHealthSchemaManager
                            containerHealthSchemaManager,
@@ -87,14 +86,13 @@ public class ClusterStateEndpoint {
     this.pipelineManager = (ReconPipelineManager) 
reconSCM.getPipelineManager();
     this.containerManager =
         (ReconContainerManager) reconSCM.getContainerManager();
-    this.globalStatsDao = globalStatsDao;
     this.reconGlobalStatsManager = reconGlobalStatsManager;
     this.containerHealthSchemaManager = containerHealthSchemaManager;
     this.ozoneConfiguration = ozoneConfiguration;
   }
 
   /**
-   * Return a summary report on current cluster state.
+   * Return a summary report on the current cluster state.
    * @return {@link Response}
    */
   @GET
@@ -119,18 +117,48 @@ public Response getClusterState() {
         this.containerManager.getContainerStateCount(
             HddsProtos.LifeCycleState.DELETED));
 
-    int healthyDatanodes =
+    int healthyDataNodes =
         nodeManager.getNodeCount(NodeStatus.inServiceHealthy()) +
             nodeManager.getNodeCount(NodeStatus.inServiceHealthyReadOnly());
 
     SCMNodeStat stats = nodeManager.getStats();
+    long fsCapacity = 0;
+    long fsUsed = 0;
+    long fsAvailable = 0;
+    List<DatanodeInfo> dataNodes = nodeManager.getAllNodes();
+    if (dataNodes == null || dataNodes.isEmpty()) {
+      LOG.warn("No dataNodes available for filesystem usage calculation");
+    } else {
+      int reportedNodes = 0;
+      int totalNodes = dataNodes.size();
+      for (DatanodeInfo datanode : dataNodes) {
+        SpaceUsageSource.Fixed fsUsage = 
nodeManager.getTotalFilesystemUsage(datanode);
+        if (fsUsage != null) {
+          fsCapacity += fsUsage.getCapacity();
+          fsAvailable += fsUsage.getAvailable();
+          fsUsed += fsUsage.getUsedSpace();
+          reportedNodes++;
+        } else {
+          LOG.debug("DataNode {} has not reported filesystem usage",
+              datanode.getUuidString());
+        }
+      }
+      if (reportedNodes < totalNodes) {
+        LOG.warn("Filesystem usage incomplete: {}/{} dataNodes reported",
+            reportedNodes, totalNodes);
+      }
+    }
 
-    DatanodeStorageReport storageReport = DatanodeStorageReport.newBuilder()
+    ClusterStorageReport storageReport = ClusterStorageReport.newBuilder()
         .setCapacity(stats.getCapacity().get())
         .setCommitted(stats.getCommitted().get())
         .setUsed(stats.getScmUsed().get())
         .setMinimumFreeSpace(stats.getFreeSpaceToSpare().get())
         .setRemaining(stats.getRemaining().get())
+        .setReserved(stats.getReserved().get())
+        .setFilesystemUsed(fsUsed)
+        .setFilesystemCapacity(fsCapacity)
+        .setFilesystemAvailable(fsAvailable)
         .build();
 
     ClusterStateResponse.Builder builder = ClusterStateResponse.newBuilder();
@@ -197,7 +225,7 @@ public Response getClusterState() {
         .setContainers(containerStateCounts.getTotalContainerCount())
         .setMissingContainers(containerStateCounts.getMissingContainerCount())
         .setTotalDatanodes(nodeManager.getAllNodeCount())
-        .setHealthyDatanodes(healthyDatanodes)
+        .setHealthyDatanodes(healthyDataNodes)
         .setOpenContainers(containerStateCounts.getOpenContainersCount())
         .setDeletedContainers(containerStateCounts.getDeletedContainersCount())
         .setScmServiceId(ozoneConfiguration.get(OZONE_SCM_SERVICE_IDS_KEY))
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ClusterStateResponse.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ClusterStateResponse.java
index 0cf2ffaa18a..bb5e323cfe9 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ClusterStateResponse.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ClusterStateResponse.java
@@ -46,7 +46,7 @@ public final class ClusterStateResponse {
    * Storage Report of the cluster.
    */
   @JsonProperty("storageReport")
-  private DatanodeStorageReport storageReport;
+  private ClusterStorageReport storageReport;
 
   /**
    * Total count of containers in the cluster.
@@ -142,7 +142,7 @@ public static final class Builder {
     private int pipelines;
     private int totalDatanodes;
     private int healthyDatanodes;
-    private DatanodeStorageReport storageReport;
+    private ClusterStorageReport storageReport;
     private int containers;
     private int missingContainers;
     private int openContainers;
@@ -186,7 +186,7 @@ public Builder setHealthyDatanodes(int healthyDatanodes) {
       return this;
     }
 
-    public Builder setStorageReport(DatanodeStorageReport storageReport) {
+    public Builder setStorageReport(ClusterStorageReport storageReport) {
       this.storageReport = storageReport;
       return this;
     }
@@ -263,7 +263,7 @@ public int getHealthyDatanodes() {
     return healthyDatanodes;
   }
 
-  public DatanodeStorageReport getStorageReport() {
+  public ClusterStorageReport getStorageReport() {
     return storageReport;
   }
 
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DatanodeStorageReport.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ClusterStorageReport.java
similarity index 82%
copy from 
hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DatanodeStorageReport.java
copy to 
hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ClusterStorageReport.java
index 390228d983f..b0987c1d874 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DatanodeStorageReport.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/ClusterStorageReport.java
@@ -17,16 +17,13 @@
 
 package org.apache.hadoop.ozone.recon.api.types;
 
-import java.util.Objects;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Metadata object that contains storage report of a Datanode.
+ * Metadata object that contains the storage report of the cluster.
  */
-public final class DatanodeStorageReport {
-  private String datanodeUuid;
-  private String hostName;
+public final class ClusterStorageReport {
   private long capacity;
   private long used;
   private long remaining;
@@ -37,12 +34,10 @@ public final class DatanodeStorageReport {
   private long filesystemUsed;
   private long filesystemAvailable;
 
-  public DatanodeStorageReport() {
+  public ClusterStorageReport() {
   }
 
-  private DatanodeStorageReport(Builder builder) {
-    this.datanodeUuid = builder.datanodeUuid;
-    this.hostName = builder.hostName;
+  private ClusterStorageReport(Builder builder) {
     this.capacity = builder.capacity;
     this.used = builder.used;
     this.remaining = builder.remaining;
@@ -55,14 +50,6 @@ private DatanodeStorageReport(Builder builder) {
     builder.validate();
   }
 
-  public String getDatanodeUuid() {
-    return datanodeUuid;
-  }
-
-  public String getHostName() {
-    return hostName;
-  }
-
   public long getCapacity() {
     return capacity;
   }
@@ -87,10 +74,6 @@ public long getReserved() {
     return reserved;
   }
 
-  public static Builder newBuilder() {
-    return new Builder();
-  }
-
   public long getFilesystemCapacity() {
     return filesystemCapacity;
   }
@@ -103,12 +86,14 @@ public long getFilesystemAvailable() {
     return filesystemAvailable;
   }
 
+  public static Builder newBuilder() {
+    return new Builder();
+  }
+
   /**
    * Builder class for DataNodeStorage Report.
    */
   public static final class Builder {
-    private String datanodeUuid = "";
-    private String hostName = "";
     private long capacity = 0;
     private long used = 0;
     private long remaining = 0;
@@ -125,16 +110,6 @@ public static final class Builder {
     private Builder() {
     }
 
-    public Builder setDatanodeUuid(String datanodeUuid) {
-      this.datanodeUuid = datanodeUuid;
-      return this;
-    }
-
-    public Builder setHostName(String hostName) {
-      this.hostName = hostName;
-      return this;
-    }
-
     public Builder setCapacity(long capacity) {
       this.capacity = capacity;
       return this;
@@ -181,8 +156,6 @@ public Builder setFilesystemAvailable(long 
filesystemAvailable) {
     }
 
     public void validate() {
-      Objects.requireNonNull(hostName, "hostName cannot be null");
-
       if (capacity < 0) {
         throw new IllegalArgumentException("capacity cannot be negative");
       }
@@ -218,13 +191,13 @@ public void validate() {
 
       // Logical consistency checks
       if (used + remaining > capacity) {
-        LOG.warn("Inconsistent storage report for {}: used({}) + remaining({}) 
> capacity({})",
-            hostName, used, remaining, capacity);
+        LOG.warn("Inconsistent storage report for cluster: " +
+            "used({}) + remaining({}) > capacity({})", used, remaining, 
capacity);
       }
     }
 
-    public DatanodeStorageReport build() {
-      return new DatanodeStorageReport(this);
+    public ClusterStorageReport build() {
+      return new ClusterStorageReport(this);
     }
   }
 }
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DatanodeStorageReport.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DatanodeStorageReport.java
index 390228d983f..20140e7d843 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DatanodeStorageReport.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DatanodeStorageReport.java
@@ -87,10 +87,6 @@ public long getReserved() {
     return reserved;
   }
 
-  public static Builder newBuilder() {
-    return new Builder();
-  }
-
   public long getFilesystemCapacity() {
     return filesystemCapacity;
   }
@@ -103,6 +99,10 @@ public long getFilesystemAvailable() {
     return filesystemAvailable;
   }
 
+  public static Builder newBuilder() {
+    return new Builder();
+  }
+
   /**
    * Builder class for DataNodeStorage Report.
    */
diff --git 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestClusterStateEndpoint.java
 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestClusterStateEndpoint.java
index e7250ca952d..6e187095c92 100644
--- 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestClusterStateEndpoint.java
+++ 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestClusterStateEndpoint.java
@@ -23,6 +23,11 @@
 import static 
org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getTestReconOmMetadataManager;
 import static 
org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.initializeNewOmMetadataManager;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -30,29 +35,35 @@
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.Collections;
 import java.util.concurrent.TimeoutException;
 import javax.ws.rs.core.Response;
 import org.apache.hadoop.hdds.client.RatisReplicationConfig;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.hdds.fs.SpaceUsageSource;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.hdds.scm.container.ContainerInfo;
 import 
org.apache.hadoop.hdds.scm.container.common.helpers.ContainerWithPipeline;
+import org.apache.hadoop.hdds.scm.container.placement.metrics.SCMNodeStat;
+import org.apache.hadoop.hdds.scm.node.DatanodeInfo;
+import org.apache.hadoop.hdds.scm.node.NodeStatus;
 import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
 import org.apache.hadoop.hdds.scm.pipeline.PipelineID;
 import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager;
 import org.apache.hadoop.ozone.recon.ReconTestInjector;
 import org.apache.hadoop.ozone.recon.api.types.ClusterStateResponse;
+import org.apache.hadoop.ozone.recon.api.types.ClusterStorageReport;
 import org.apache.hadoop.ozone.recon.persistence.AbstractReconSqlDBTest;
 import org.apache.hadoop.ozone.recon.persistence.ContainerHealthSchemaManager;
 import org.apache.hadoop.ozone.recon.recovery.ReconOMMetadataManager;
 import org.apache.hadoop.ozone.recon.scm.ReconContainerManager;
+import org.apache.hadoop.ozone.recon.scm.ReconNodeManager;
 import org.apache.hadoop.ozone.recon.scm.ReconPipelineManager;
 import org.apache.hadoop.ozone.recon.scm.ReconStorageContainerManagerFacade;
 import org.apache.hadoop.ozone.recon.spi.ReconGlobalStatsManager;
 import org.apache.hadoop.ozone.recon.spi.StorageContainerServiceProvider;
 import org.apache.hadoop.ozone.recon.spi.impl.OzoneManagerServiceProviderImpl;
 import 
org.apache.hadoop.ozone.recon.spi.impl.StorageContainerServiceProviderImpl;
-import org.apache.ozone.recon.schema.generated.tables.daos.GlobalStatsDao;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.io.TempDir;
@@ -109,12 +120,11 @@ public void setUp() throws Exception {
                                                     
ozoneStorageContainerManager.getPipelineManager();
     ContainerHealthSchemaManager containerHealthSchemaManager =
         reconTestInjector.getInstance(ContainerHealthSchemaManager.class);
-    GlobalStatsDao globalStatsDao = getDao(GlobalStatsDao.class);
     ReconGlobalStatsManager reconGlobalStatsManager = 
         reconTestInjector.getInstance(ReconGlobalStatsManager.class);
     conf = mock(OzoneConfiguration.class);
     clusterStateEndpoint =
-        new ClusterStateEndpoint(ozoneStorageContainerManager, globalStatsDao, 
+        new ClusterStateEndpoint(ozoneStorageContainerManager,
             reconGlobalStatsManager, containerHealthSchemaManager, conf);
     pipeline = getRandomPipeline();
     pipelineID = pipeline.getId();
@@ -161,6 +171,64 @@ public void testScmAndOmServiceId() {
     assertEquals("omServiceId", clusterStateResponse.getOmServiceId());
   }
 
+  @Test
+  public void testStorageReportIsClusterStorageReport() {
+    OzoneStorageContainerManager mockScm = 
mock(OzoneStorageContainerManager.class);
+    ReconNodeManager mockNodeManager = mock(ReconNodeManager.class);
+    ReconPipelineManager mockPipelineManager = 
mock(ReconPipelineManager.class);
+    ReconContainerManager mockContainerManager = 
mock(ReconContainerManager.class);
+    ContainerHealthSchemaManager mockContainerHealthSchemaManager =
+        mock(ContainerHealthSchemaManager.class);
+    ReconGlobalStatsManager mockGlobalStatsManager =
+        mock(ReconGlobalStatsManager.class);
+    OzoneConfiguration mockConf = mock(OzoneConfiguration.class);
+    DatanodeInfo mockDatanode = mock(DatanodeInfo.class);
+
+    when(mockScm.getScmNodeManager()).thenReturn(mockNodeManager);
+    when(mockScm.getPipelineManager()).thenReturn(mockPipelineManager);
+    when(mockScm.getContainerManager()).thenReturn(mockContainerManager);
+
+    
when(mockPipelineManager.getPipelines()).thenReturn(Collections.emptyList());
+    
when(mockContainerManager.getContainers()).thenReturn(Collections.emptyList());
+    
when(mockContainerManager.getContainerStateCount(HddsProtos.LifeCycleState.OPEN))
+        .thenReturn(0);
+    
when(mockContainerManager.getContainerStateCount(HddsProtos.LifeCycleState.DELETED))
+        .thenReturn(0);
+    when(mockContainerHealthSchemaManager.getUnhealthyContainers(
+        any(), anyLong(), any(), 
anyInt())).thenReturn(Collections.emptyList());
+
+    SCMNodeStat scmNodeStat = new SCMNodeStat(
+        1000L, 400L, 600L, 300L, 50L, 20L);
+    when(mockNodeManager.getStats()).thenReturn(scmNodeStat);
+    
when(mockNodeManager.getNodeCount(NodeStatus.inServiceHealthy())).thenReturn(1);
+    when(mockNodeManager.getNodeCount(NodeStatus.inServiceHealthyReadOnly()))
+        .thenReturn(0);
+    when(mockNodeManager.getAllNodeCount()).thenReturn(1);
+    
when(mockNodeManager.getAllNodes()).thenReturn(Collections.singletonList(mockDatanode));
+    when(mockNodeManager.getTotalFilesystemUsage(mockDatanode))
+        .thenReturn(new SpaceUsageSource.Fixed(2000L, 1500L, 500L));
+
+    ClusterStateEndpoint endpoint = new ClusterStateEndpoint(
+        mockScm, mockGlobalStatsManager, mockContainerHealthSchemaManager, 
mockConf);
+
+    ClusterStateResponse response =
+        (ClusterStateResponse) endpoint.getClusterState().getEntity();
+
+    assertNotNull(response.getStorageReport());
+    assertInstanceOf(ClusterStorageReport.class, response.getStorageReport());
+
+    ClusterStorageReport report = response.getStorageReport();
+    assertEquals(1000L, report.getCapacity());
+    assertEquals(400L, report.getUsed());
+    assertEquals(600L, report.getRemaining());
+    assertEquals(300L, report.getCommitted());
+    assertEquals(50L, report.getMinimumFreeSpace());
+    assertEquals(20L, report.getReserved());
+    assertEquals(2000L, report.getFilesystemCapacity());
+    assertEquals(500L, report.getFilesystemUsed());
+    assertEquals(1500L, report.getFilesystemAvailable());
+  }
+
   ContainerInfo newContainerInfo(long containerId,
                                  HddsProtos.LifeCycleState state) {
     return new ContainerInfo.Builder()
diff --git 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
index 42907339879..07dd11d8021 100644
--- 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
+++ 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
@@ -141,7 +141,6 @@
 import org.apache.hadoop.ozone.security.acl.IAccessAuthorizer;
 import org.apache.ozone.recon.schema.UtilizationSchemaDefinition;
 import 
org.apache.ozone.recon.schema.generated.tables.daos.ContainerCountBySizeDao;
-import org.apache.ozone.recon.schema.generated.tables.daos.GlobalStatsDao;
 import 
org.apache.ozone.recon.schema.generated.tables.pojos.ContainerCountBySize;
 import org.apache.ozone.recon.schema.generated.tables.pojos.FileCountBySize;
 import org.apache.ozone.test.LambdaTestUtils;
@@ -294,7 +293,6 @@ private void initializeInjector() throws Exception {
     volumeEndpoint = reconTestInjector.getInstance(VolumeEndpoint.class);
     bucketEndpoint = reconTestInjector.getInstance(BucketEndpoint.class);
     ContainerCountBySizeDao containerCountBySizeDao = 
reconScm.getContainerCountBySizeDao();
-    GlobalStatsDao globalStatsDao = getDao(GlobalStatsDao.class);
     UtilizationSchemaDefinition utilizationSchemaDefinition =
         getSchemaDefinition(UtilizationSchemaDefinition.class);
     reconFileMetadataManager = 
reconTestInjector.getInstance(ReconFileMetadataManager.class);
@@ -314,7 +312,7 @@ private void initializeInjector() throws Exception {
     ContainerHealthSchemaManager containerHealthSchemaManager =
         reconTestInjector.getInstance(ContainerHealthSchemaManager.class);
     clusterStateEndpoint =
-        new ClusterStateEndpoint(reconScm, globalStatsDao, 
reconGlobalStatsManager,
+        new ClusterStateEndpoint(reconScm, reconGlobalStatsManager,
             containerHealthSchemaManager, mock(OzoneConfiguration.class));
     containerSizeCountTask = reconScm.getContainerSizeCountTask();
     MetricsServiceProviderFactory metricsServiceProviderFactory =


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

Reply via email to