Ramesh N has uploaded a new change for review.

Change subject: gluster: dao changes for volume capacity info
......................................................................

gluster: dao changes for volume capacity info

  Adding Details table for Gluster Volume and Brick
entities.  Necessary DAO changes were made to update/read
the capacity information for brick and volume.

Change-Id: I7d67b7ee22f4cb6839d0f14d3f27f3e22149ff22
Signed-off-by: Ramesh Nachimuthu <rnach...@redhat.com>
---
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterBrickEntity.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDao.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java
M 
backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoTest.java
M 
backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoTest.java
M backend/manager/modules/dal/src/test/resources/fixtures.xml
M packaging/dbscripts/gluster_volumes_sp.sql
A 
packaging/dbscripts/upgrade/03_04_0580_add_tables_for_gluster_volume_and_brick_details.sql
10 files changed, 512 insertions(+), 4 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/45/24445/1

diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterBrickEntity.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterBrickEntity.java
index 78f1ad3..4cfad11 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterBrickEntity.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterBrickEntity.java
@@ -190,6 +190,12 @@
         this.brickDetails = brickDetails;
     }
 
+    public BrickProperties getBrickProperties() {
+        if (brickDetails != null) {
+            return brickDetails.getBrickProperties();
+        }
+        return null;
+    }
     @Override
     public GlusterAsyncTask getAsyncTask() {
        return asyncTask;
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java
index e278b0c..74c3de1 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java
@@ -3,6 +3,7 @@
 import java.util.Collection;
 import java.util.List;
 
+import org.ovirt.engine.core.common.businessentities.gluster.BrickProperties;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity;
 import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
 import org.ovirt.engine.core.compat.Guid;
@@ -53,4 +54,12 @@
      * @param bricks
      */
     public void 
updateAllBrickTasksByHostIdBrickDirInBatch(Collection<GlusterBrickEntity> 
bricks);
+
+    public void addBrickProperties(BrickProperties brickProperties);
+
+    public void addBrickProperties(List<GlusterBrickEntity> bricks);
+
+    public void updateBrickProperties(BrickProperties brickProperties);
+
+    public void updateBrickProperties(List<GlusterBrickEntity> bricks);
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java
index faabf91..b760805 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java
@@ -6,9 +6,12 @@
 import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
+import org.ovirt.engine.core.common.businessentities.gluster.BrickDetails;
+import org.ovirt.engine.core.common.businessentities.gluster.BrickProperties;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity;
 import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
 import org.ovirt.engine.core.common.utils.EnumUtils;
+import org.ovirt.engine.core.common.utils.SizeConverter;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.MapSqlParameterMapper;
 import org.ovirt.engine.core.dao.MassOperationsGenericDaoDbFacade;
@@ -19,7 +22,7 @@
     // The brick row mapper can't be static as its' type 
(GlusterBrickRowMapper) is a non-static inner class
     // There will still be a single instance of it, as the DAO itself will be 
instantiated only once
     private final RowMapper<GlusterBrickEntity> brickRowMapper = new 
GlusterBrickRowMapper();
-
+    private final RowMapper<BrickProperties> brickPropertiesRowMappeer = new 
GlusterBrickPropertiesRowMapper();
     public GlusterBrickDaoDbFacadeImpl() {
         super("GlusterBrick");
         setProcedureNameForGet("GetGlusterBrickById");
@@ -67,6 +70,11 @@
     }
 
     @Override
+    public void updateBrickProperties(List<GlusterBrickEntity> bricks) {
+        updateAllInBatch("UpdateGlusterVolumeBrickDetails", bricks, 
getBrickPropertiesMapper());
+    }
+
+    @Override
     public void updateBrickOrder(Guid brickId, int brickOrder) {
         getCallsHandler().executeModification("UpdateGlusterVolumeBrickOrder",
                 getCustomMapSqlParameterSource()
@@ -76,17 +84,46 @@
 
     @Override
     public GlusterBrickEntity getById(Guid id) {
-        return getCallsHandler().executeRead(
+        GlusterBrickEntity brick = getCallsHandler().executeRead(
                 "GetGlusterBrickById", brickRowMapper,
                 createIdParameterMapper(id));
+        populateBrickDetails(brick);
+        return brick;
     }
 
     @Override
     public List<GlusterBrickEntity> getBricksOfVolume(Guid volumeId) {
-        return getCallsHandler().executeReadList(
+        List<GlusterBrickEntity> bricks = getCallsHandler().executeReadList(
                 "GetBricksByGlusterVolumeGuid", brickRowMapper,
                 getCustomMapSqlParameterSource().addValue("volume_id", 
volumeId));
+        populateBrickDetails(bricks);
+        return bricks;
     }
+
+    private void populateBrickDetails(List<GlusterBrickEntity> bricks) {
+        for (GlusterBrickEntity brick : bricks) {
+            populateBrickDetails(brick);
+        }
+    }
+
+    private void populateBrickDetails(GlusterBrickEntity brick) {
+        if (brick != null) {
+            BrickProperties brickProperties = 
fetchBrickProperties(brick.getId());
+            if (brickProperties != null) {
+                BrickDetails brickDetails = new BrickDetails();
+                brickDetails.setBrickProperties(brickProperties);
+                brick.setBrickDetails(brickDetails);
+            }
+        }
+    }
+
+    private BrickProperties fetchBrickProperties(Guid brickId) {
+        BrickProperties brickProperties = getCallsHandler().executeRead(
+                "GetBrickDetailsByID",
+                brickPropertiesRowMappeer,
+                createBrickIdParams(brickId));
+        return brickProperties;
+     }
 
     private MapSqlParameterSource createBrickParams(GlusterBrickEntity brick) {
         return getCustomMapSqlParameterSource().addValue("id", brick.getId())
@@ -120,9 +157,11 @@
 
     @Override
     public List<GlusterBrickEntity> getGlusterVolumeBricksByServerId(Guid 
serverId) {
-        return getCallsHandler().executeReadList(
+        List<GlusterBrickEntity> bricks = getCallsHandler().executeReadList(
                 "GetGlusterVolumeBricksByServerGuid", brickRowMapper,
                 getCustomMapSqlParameterSource().addValue("server_id", 
serverId));
+        populateBrickDetails(bricks);
+        return bricks;
     }
 
     @Override
@@ -180,6 +219,25 @@
         };
     }
 
+    public MapSqlParameterMapper<GlusterBrickEntity> 
getBrickPropertiesMapper() {
+        return new MapSqlParameterMapper<GlusterBrickEntity>() {
+            @Override
+            public MapSqlParameterSource map(GlusterBrickEntity brick) {
+                return createBrickPropertiesParam(brick.getBrickProperties());
+            }
+        };
+    }
+
+    private static final class GlusterBrickPropertiesRowMapper implements 
RowMapper<BrickProperties> {
+        @Override
+        public BrickProperties mapRow(ResultSet rs, int rowNum)
+                throws SQLException {
+            BrickProperties brickProperties = new BrickProperties();
+            brickProperties.setTotalSize(rs.getDouble("total_space") / 
SizeConverter.BYTES_IN_MB);
+            brickProperties.setFreeSize(rs.getDouble("free_space") / 
SizeConverter.BYTES_IN_MB);
+            return brickProperties;
+        }
+    }
     @Override
     public void updateBrickTask(Guid brickId, Guid taskId) {
         
getCallsHandler().executeModification("UpdateGlusterVolumeBrickAsyncTask",
@@ -210,4 +268,34 @@
 
     }
 
+    @Override
+    public void updateBrickProperties(BrickProperties brickProperties) {
+        
getCallsHandler().executeModification("UpdateGlusterVolumeBrickDetails",
+                createBrickPropertiesParam(brickProperties));
+    }
+
+    @Override
+    public void addBrickProperties(BrickProperties brickProperties) {
+        
getCallsHandler().executeModification("InsertGlusterVolumeBrickDetails",
+                createBrickPropertiesParam(brickProperties));
+    }
+
+    @Override
+    public void addBrickProperties(List<GlusterBrickEntity> bricks) {
+        updateAllInBatch("InsertGlusterVolumeBrickDetails", bricks, 
getBrickPropertiesMapper());
+    }
+
+    private MapSqlParameterSource createBrickPropertiesParam(BrickProperties 
brickProperties) {
+        return getCustomMapSqlParameterSource()
+                .addValue("brick_id", brickProperties.getBrickId())
+                .addValue("total_space", brickProperties.getTotalSize() * 
SizeConverter.BYTES_IN_MB)
+                .addValue("used_space",
+                        (brickProperties.getTotalSize() - 
brickProperties.getFreeSize()) * SizeConverter.BYTES_IN_MB)
+                .addValue("free_space", brickProperties.getFreeSize() * 
SizeConverter.BYTES_IN_MB);
+    }
+
+    private MapSqlParameterSource createBrickIdParams(Guid brickId) {
+        return getCustomMapSqlParameterSource().addValue("brick_id", brickId);
+    }
+
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDao.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDao.java
index 9825c31..52c50fb 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDao.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDao.java
@@ -6,6 +6,7 @@
 import org.ovirt.engine.core.common.businessentities.gluster.AccessProtocol;
 import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSizeInfo;
 import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeType;
 import org.ovirt.engine.core.common.businessentities.gluster.TransportType;
 import org.ovirt.engine.core.compat.Guid;
@@ -70,6 +71,10 @@
 
     public void updateGlusterVolume(GlusterVolumeEntity volume);
 
+    public void addVolumeCapacityInfo(GlusterVolumeSizeInfo 
volumeCapacityInfo);
+
+    public void updateVolumeCapacityInfo(GlusterVolumeSizeInfo 
volumeCapacityInfo);
+
     public void updateVolumeTask(Guid volumeId, Guid taskId);
 
     public GlusterVolumeEntity getVolumeByGlusterTask(Guid taskId);
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java
index b5ccd90..b49f342 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java
@@ -12,8 +12,10 @@
 import org.ovirt.engine.core.common.businessentities.gluster.AccessProtocol;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity;
 import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeAdvancedDetails;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeOptionEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSizeInfo;
 import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeType;
 import org.ovirt.engine.core.common.businessentities.gluster.TransportType;
 import org.ovirt.engine.core.common.job.JobExecutionStatus;
@@ -36,6 +38,8 @@
     private static final RowMapper<AccessProtocol> accessProtocolRowMapper = 
new AccessProtocolRowMapper();
     private static final RowMapper<TransportType> transportTypeRowMapper = new 
TransportTypeRowMapper();
     private static final RowMapper<GlusterAsyncTask> glusterAsyncTaskRowMapper 
= new GlusterAsyncTaskRowMapper();
+    private static final RowMapper<GlusterVolumeAdvancedDetails> 
glusterVolumesAdvancedDetailsRowMapper =
+            new GlusterVolumeAdvancedDetailsRowMapper();
 
     public GlusterVolumeDaoDbFacadeImpl() {
         super("GlusterVolume");
@@ -316,6 +320,10 @@
             
volume.setOptions(dbFacade.getGlusterOptionDao().getOptionsOfVolume(volume.getId()));
             volume.setAccessProtocols(new 
HashSet<AccessProtocol>(getAccessProtocolsOfVolume(volume.getId())));
             volume.setTransportTypes(new 
HashSet<TransportType>(getTransportTypesOfVolume(volume.getId())));
+            GlusterVolumeAdvancedDetails advancedDetails = 
fetchAdvancedDatails(volume.getId());
+            if (advancedDetails != null) {
+                volume.setAdvancedDetails(advancedDetails);
+            }
             GlusterAsyncTask asyncTask = getAsyncTaskOfVolume(volume.getId());
             if (asyncTask != null) {
                 volume.setAsyncTask(asyncTask);
@@ -333,6 +341,13 @@
         }
     }
 
+    private GlusterVolumeAdvancedDetails fetchAdvancedDatails(Guid volumeId) {
+        GlusterVolumeAdvancedDetails glusterVolumeAdvancedDetails = 
getCallsHandler().executeRead(
+                "GetGlusterVolumeDetailsByID",
+                glusterVolumesAdvancedDetailsRowMapper,
+                createVolumeIdParams(volumeId));
+        return glusterVolumeAdvancedDetails;
+    }
     private static final class GlusterVolumeRowMapper implements 
RowMapper<GlusterVolumeEntity> {
         @Override
         public GlusterVolumeEntity mapRow(ResultSet rs, int rowNum)
@@ -388,6 +403,22 @@
         }
     }
 
+    private static final class GlusterVolumeAdvancedDetailsRowMapper 
implements RowMapper<GlusterVolumeAdvancedDetails> {
+        @Override
+        public GlusterVolumeAdvancedDetails mapRow(ResultSet rs, int rowNum)
+                throws SQLException {
+            GlusterVolumeAdvancedDetails advancedDetails = new 
GlusterVolumeAdvancedDetails();
+            GlusterVolumeSizeInfo capacityInfo = new GlusterVolumeSizeInfo();
+            capacityInfo.setVolumeId(getGuid(rs, "volume_id"));
+            capacityInfo.setTotalSize(rs.getLong("total_space"));
+            capacityInfo.setUsedSize(rs.getLong("used_space"));
+            capacityInfo.setFreeSize(rs.getLong("free_space"));
+            advancedDetails.setUpdatedAt(rs.getTimestamp("_update_date"));
+            advancedDetails.setCapacityInfo(capacityInfo);
+            return advancedDetails;
+        }
+    }
+
     private MapSqlParameterSource createReplicaCountParams(Guid volumeId, int 
replicaCount) {
         return createVolumeIdParams(volumeId).addValue("replica_count", 
replicaCount);
     }
@@ -411,6 +442,26 @@
     }
 
     @Override
+    public void updateVolumeCapacityInfo(GlusterVolumeSizeInfo 
volumeCapacityInfo) {
+        getCallsHandler().executeModification("UpdateGlusterVolumeDetails",
+                createCapacityInfoParas(volumeCapacityInfo));
+    }
+
+    @Override
+    public void addVolumeCapacityInfo(GlusterVolumeSizeInfo 
volumeCapacityInfo) {
+        getCallsHandler().executeModification("InsertGlusterVolumeDetails",
+                createCapacityInfoParas(volumeCapacityInfo));
+    }
+
+    private MapSqlParameterSource 
createCapacityInfoParas(GlusterVolumeSizeInfo volumeCapacityInfo) {
+        return getCustomMapSqlParameterSource()
+                .addValue("volume_id", volumeCapacityInfo.getVolumeId())
+                .addValue("total_space", volumeCapacityInfo.getTotalSize())
+                .addValue("used_space", volumeCapacityInfo.getUsedSize())
+                .addValue("free_space", volumeCapacityInfo.getFreeSize());
+    }
+
+    @Override
     protected MapSqlParameterSource 
createFullParametersMapper(GlusterVolumeEntity volume) {
         return getCustomMapSqlParameterSource()
                 .addValue("id", volume.getId())
diff --git 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoTest.java
 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoTest.java
index a0d1682..49032e2 100644
--- 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoTest.java
+++ 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoTest.java
@@ -11,6 +11,8 @@
 import org.junit.Test;
 import org.ovirt.engine.core.common.asynctasks.gluster.GlusterAsyncTask;
 import org.ovirt.engine.core.common.businessentities.VdsStatic;
+import org.ovirt.engine.core.common.businessentities.gluster.BrickDetails;
+import org.ovirt.engine.core.common.businessentities.gluster.BrickProperties;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity;
 import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
 import org.ovirt.engine.core.compat.Guid;
@@ -43,6 +45,66 @@
         GlusterBrickEntity retrievedBrick = dao.getById(brickToAdd.getId());
         assertNotNull(retrievedBrick);
         assertEquals(brickToAdd, retrievedBrick);
+    }
+
+    @Test
+    public void testAddBrickProperties() {
+        Guid brickId = new Guid("6ccdc294-d77b-4929-809d-8afe7634b47d");
+        GlusterBrickEntity brickBefore = dao.getById(brickId);
+        assertNotNull(brickBefore);
+        assertNull(brickBefore.getBrickProperties());
+
+        BrickProperties brickProperties = new BrickProperties();
+        brickProperties.setBrickId(brickId);
+        brickProperties.setFreeSize(Long.valueOf("75000"));
+        brickProperties.setTotalSize(Long.valueOf("250000"));
+        dao.addBrickProperties(brickProperties);
+
+        GlusterBrickEntity brickAfter = dao.getById(brickId);
+        assertNotNull(brickAfter);
+        assertNotNull(brickAfter.getBrickProperties());
+        assertTrue(brickAfter.getBrickProperties().getTotalSize() == 250000);
+        assertTrue(brickAfter.getBrickProperties().getFreeSize() == 75000);
+    }
+
+    @Test
+    public void testAddAllBrickProperties() {
+        // 61c94fc7-26b0-43e3-9d26-fc9d8cd6a754
+        Guid brickId1 = new Guid("6ccdc294-d77b-4929-809d-8afe7634b47d");
+        Guid brickId2 = new Guid("61c94fc7-26b0-43e3-9d26-fc9d8cd6a754");
+        GlusterBrickEntity brick1 = dao.getById(brickId1);
+        GlusterBrickEntity brick2 = dao.getById(brickId2);
+
+        brick1.setBrickDetails(new BrickDetails());
+        BrickProperties brickProperties1 = new BrickProperties();
+        brickProperties1.setBrickId(brickId1);
+        brickProperties1.setFreeSize(Long.valueOf("75000"));
+        brickProperties1.setTotalSize(Long.valueOf("250000"));
+        brick1.getBrickDetails().setBrickProperties(brickProperties1);
+
+        brick2.setBrickDetails(new BrickDetails());
+        BrickProperties brickProperties2 = new BrickProperties();
+        brickProperties2.setBrickId(brickId2);
+        brickProperties2.setFreeSize(Long.valueOf("175000"));
+        brickProperties2.setTotalSize(Long.valueOf("275000"));
+        brick2.getBrickDetails().setBrickProperties(brickProperties2);
+
+        List<GlusterBrickEntity> bricksToAdd = new 
ArrayList<GlusterBrickEntity>();
+        bricksToAdd.add(brick1);
+        bricksToAdd.add(brick2);
+        dao.addBrickProperties(bricksToAdd);
+
+        brick1 = dao.getById(brickId1);
+        assertNotNull(brick1);
+        assertNotNull(brick1.getBrickProperties());
+        assertTrue(brick1.getBrickProperties().getTotalSize() == 250000);
+        assertTrue(brick1.getBrickProperties().getFreeSize() == 75000);
+
+        brick2 = dao.getById(brickId2);
+        assertNotNull(brick2);
+        assertNotNull(brick2.getBrickProperties());
+        assertTrue(brick2.getBrickProperties().getTotalSize() == 275000);
+        assertTrue(brick2.getBrickProperties().getFreeSize() == 175000);
     }
 
     @Test
@@ -132,6 +194,86 @@
     }
 
     @Test
+    public void testGetBrickProperties() {
+        Guid GLUSTER_BRICK_UUID1 = new 
Guid("2ab384da-6190-4668-aa2e-37bc5c5ff014");
+        Guid GLUSTER_BRICK_UUID2 = new 
Guid("2702bb49-3037-405c-81c5-14a38793164e");
+        GlusterBrickEntity brick = dao.getById(GLUSTER_BRICK_UUID1);
+        assertNotNull(brick);
+        assertNotNull(brick.getBrickProperties());
+        assertTrue(brick.getBrickProperties().getFreeSize() == 20000);
+        assertTrue(brick.getBrickProperties().getTotalSize() == 100000);
+
+        brick = dao.getById(GLUSTER_BRICK_UUID2);
+        assertNotNull(brick);
+        assertNotNull(brick.getBrickProperties());
+        assertTrue(brick.getBrickProperties().getFreeSize() == 0);
+        assertTrue(brick.getBrickProperties().getTotalSize() == 0);
+    }
+
+    @Test
+    public void testUpdateBrickProperties() {
+        Guid GLUSTER_BRICK_UUID1 = new 
Guid("2ab384da-6190-4668-aa2e-37bc5c5ff014");
+        GlusterBrickEntity existingBrick = dao.getById(GLUSTER_BRICK_UUID1);
+        assertNotNull(existingBrick);
+        assertNotNull(existingBrick.getBrickProperties());
+
+        BrickProperties brickProperties = existingBrick.getBrickProperties();
+        brickProperties.setBrickId(GLUSTER_BRICK_UUID1);
+        brickProperties.setFreeSize(100000);
+        brickProperties.setTotalSize(200000);
+
+        dao.updateBrickProperties(brickProperties);
+
+        existingBrick = dao.getById(GLUSTER_BRICK_UUID1);
+        assertNotNull(existingBrick);
+        assertNotNull(existingBrick.getBrickProperties());
+        assertTrue(existingBrick.getBrickProperties().getFreeSize() == 100000);
+        assertTrue(existingBrick.getBrickProperties().getTotalSize() == 
200000);
+    }
+
+    @Test
+    public void testUpdateMultiBrickProperties() {
+
+        Guid GLUSTER_BRICK_UUID1 = new 
Guid("2ab384da-6190-4668-aa2e-37bc5c5ff014");
+        Guid GLUSTER_BRICK_UUID2 = new 
Guid("65d327f8-5864-4330-be04-fe27e1ffb553");
+        GlusterBrickEntity existingBrick1 = dao.getById(GLUSTER_BRICK_UUID1);
+        assertNotNull(existingBrick1);
+        assertNotNull(existingBrick1.getBrickProperties());
+
+        GlusterBrickEntity existingBrick2 = dao.getById(GLUSTER_BRICK_UUID2);
+        assertNotNull(existingBrick2);
+        assertNotNull(existingBrick2.getBrickProperties());
+
+        BrickProperties brickProperties1 = existingBrick1.getBrickProperties();
+        brickProperties1.setBrickId(GLUSTER_BRICK_UUID1);
+        brickProperties1.setFreeSize(1000);
+        brickProperties1.setTotalSize(2000);
+
+        BrickProperties brickProperties2 = existingBrick2.getBrickProperties();
+        brickProperties2.setBrickId(GLUSTER_BRICK_UUID2);
+        brickProperties2.setFreeSize(1000);
+        brickProperties2.setTotalSize(3000);
+
+        List<GlusterBrickEntity> bricksList = new 
ArrayList<GlusterBrickEntity>();
+        bricksList.add(existingBrick1);
+        bricksList.add(existingBrick2);
+
+        dao.updateBrickProperties(bricksList);
+
+        existingBrick1 = dao.getById(GLUSTER_BRICK_UUID1);
+        assertNotNull(existingBrick1);
+        assertNotNull(existingBrick1.getBrickProperties());
+        assertTrue(existingBrick1.getBrickProperties().getFreeSize() == 1000);
+        assertTrue(existingBrick1.getBrickProperties().getTotalSize() == 2000);
+
+        existingBrick2 = dao.getById(GLUSTER_BRICK_UUID2);
+        assertNotNull(existingBrick2);
+        assertNotNull(existingBrick2.getBrickProperties());
+        assertTrue(existingBrick2.getBrickProperties().getFreeSize() == 1000);
+        assertTrue(existingBrick2.getBrickProperties().getTotalSize() == 3000);
+    }
+
+    @Test
     public void testUpdateBrickStatuses() {
         GlusterBrickEntity existingBrick = 
dao.getById(FixturesTool.GLUSTER_BRICK_UUID1);
         GlusterBrickEntity existingBrick1 = 
dao.getById(FixturesTool.GLUSTER_BRICK_UUID2);
diff --git 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoTest.java
 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoTest.java
index 5fb0e92..aa8791e 100644
--- 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoTest.java
+++ 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoTest.java
@@ -6,6 +6,8 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -18,6 +20,7 @@
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity;
 import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSizeInfo;
 import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeType;
 import org.ovirt.engine.core.common.businessentities.gluster.TransportType;
 import org.ovirt.engine.core.common.job.JobExecutionStatus;
@@ -33,6 +36,7 @@
     private static final Guid EXISTING_VOL_DIST_ID = new 
Guid("0c3f45f6-3fe9-4b35-a30c-be0d1a835ea8");
     private static final Guid EXISTING_VOL_REPL_ID = new 
Guid("b2cb2f73-fab3-4a42-93f0-d5e4c069a43e");
     private static final Guid REBALANCING_VOLUME_TASKID = new 
Guid("44f714ed-2818-4350-b94a-8c3927e53f7c");
+    private final SimpleDateFormat EXPECTED_DATE_FORMAT = new 
SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     private static final String EXISTING_VOL_REPL_NAME = 
"test-vol-replicate-1";
     private static final String NEW_VOL_NAME = "test-new-vol-1";
     private static final String OPTION_KEY_NFS_DISABLE = "nfs.disable";
@@ -81,6 +85,18 @@
         assertTrue(volumes.size() == 2);
         assertTrue(volumes.contains(existingDistVol));
         assertTrue(volumes.contains(existingReplVol));
+    }
+
+    @Test
+    public void testGetCapacityInfo() throws ParseException {
+        GlusterVolumeEntity volume = dao.getById(EXISTING_VOL_DIST_ID);
+        assertNotNull("volume capacity info is not available", 
volume.getAdvancedDetails());
+        
assertTrue(volume.getAdvancedDetails().getCapacityInfo().getTotalSize() == 
100000);
+        assertTrue(volume.getAdvancedDetails().getCapacityInfo().getUsedSize() 
== 60000);
+        assertTrue(volume.getAdvancedDetails().getCapacityInfo().getFreeSize() 
== 40000);
+        assertTrue(EXPECTED_DATE_FORMAT.parse(volume.getAdvancedDetails()
+                .getUpdatedAt().toString())
+                .equals(EXPECTED_DATE_FORMAT.parse("2014-01-21 18:12:33")));
     }
 
     @Test
@@ -146,6 +162,28 @@
         assertFalse(volume.equals(existingDistVol));
         existingDistVol.setStatus(GlusterStatus.DOWN);
         assertEquals(existingDistVol, volume);
+    }
+
+    @Test
+    public void testUpdateVolumeCapacityInfo() {
+        GlusterVolumeSizeInfo capacityInfo = new GlusterVolumeSizeInfo();
+        capacityInfo.setVolumeId(existingDistVol.getId());
+        capacityInfo.setTotalSize(Long.valueOf("500000"));
+        capacityInfo.setFreeSize(Long.valueOf("300000"));
+        capacityInfo.setUsedSize(Long.valueOf("200000"));
+
+        dao.updateVolumeCapacityInfo(capacityInfo);
+
+        GlusterVolumeEntity volume = dao.getById(existingDistVol.getId());
+
+        assertNotNull(volume);
+        assertFalse(volume.equals(existingDistVol));
+        assertNotNull("volume capacity info is not available", 
volume.getAdvancedDetails().getCapacityInfo());
+        
assertTrue(volume.getAdvancedDetails().getCapacityInfo().getTotalSize() == 
500000);
+        assertTrue(volume.getAdvancedDetails().getCapacityInfo().getUsedSize() 
== 200000);
+        assertTrue(volume.getAdvancedDetails().getCapacityInfo().getFreeSize() 
== 300000);
+        assertNotNull(volume.getAdvancedDetails().getUpdatedAt());
+
     }
 
     @Test
@@ -275,6 +313,28 @@
     }
 
     @Test
+    public void testAddVolumeCapacityInfo() {
+        GlusterVolumeEntity volumeBefore = dao.getById(EXISTING_VOL_REPL_ID);
+        assertNotNull(volumeBefore);
+        assertNull(volumeBefore.getAdvancedDetails().getCapacityInfo());
+
+        GlusterVolumeSizeInfo capacityInfo = new GlusterVolumeSizeInfo();
+        capacityInfo.setVolumeId(EXISTING_VOL_REPL_ID);
+        capacityInfo.setTotalSize(Long.valueOf("250000"));
+        capacityInfo.setUsedSize(Long.valueOf("175000"));
+        capacityInfo.setFreeSize(Long.valueOf("75000"));
+
+        dao.addVolumeCapacityInfo(capacityInfo);
+        GlusterVolumeEntity volumeAfter = dao.getById(EXISTING_VOL_REPL_ID);
+        assertNotNull(volumeAfter);
+        assertNotNull(volumeAfter.getAdvancedDetails().getCapacityInfo());
+        
assertTrue(volumeAfter.getAdvancedDetails().getCapacityInfo().getTotalSize() == 
250000);
+        
assertTrue(volumeAfter.getAdvancedDetails().getCapacityInfo().getUsedSize() == 
175000);
+        
assertTrue(volumeAfter.getAdvancedDetails().getCapacityInfo().getFreeSize() == 
75000);
+        assertNotNull(volumeAfter.getAdvancedDetails().getUpdatedAt());
+    }
+
+    @Test
     public void testAddTransportTypes() {
         Set<TransportType> transportTypes = 
existingDistVol.getTransportTypes();
         assertEquals(1, transportTypes.size());
diff --git a/backend/manager/modules/dal/src/test/resources/fixtures.xml 
b/backend/manager/modules/dal/src/test/resources/fixtures.xml
index 0988b47..0f4faaa 100644
--- a/backend/manager/modules/dal/src/test/resources/fixtures.xml
+++ b/backend/manager/modules/dal/src/test/resources/fixtures.xml
@@ -5568,6 +5568,20 @@
             <value>2010-11-29 15:57:10</value>
         </row>
     </table>
+    <table name="gluster_volume_details">
+        <column>volume_id</column>
+        <column>total_space</column>
+        <column>used_space</column>
+        <column>free_space</column>
+        <column>_update_date</column>
+        <row>
+            <value>0c3f45f6-3fe9-4b35-a30c-be0d1a835ea8</value>
+            <value>100000</value>
+            <value>60000</value>
+            <value>40000</value>
+            <value>2014-01-21 18:12:33</value>
+        </row>
+    </table>
 
     <table name="gluster_volume_bricks">
         <column>id</column>
@@ -5651,6 +5665,42 @@
         </row>
     </table>
 
+    <table name="gluster_volume_brick_details">
+        <column>brick_id</column>
+        <column>total_space</column>
+        <column>used_space</column>
+        <column>free_space</column>
+        <column>_update_date</column>
+        <row>
+            <value>65d327f8-5864-4330-be04-fe27e1ffb553</value>
+            <value>104857600000</value>
+            <value>62914560000</value>
+            <value>41943040000</value>
+            <value>2010-11-29 15:57:10</value>
+        </row>
+        <row>
+            <value>2ab384da-6190-4668-aa2e-37bc5c5ff014</value>
+            <value>104857600000</value>
+            <value>83886080000</value>
+            <value>20971520000</value>
+            <value>2010-11-29 15:57:10</value>
+        </row> 2702bb49-3037-405c-81c5-14a38793164e
+        <row>
+            <value>2702bb49-3037-405c-81c5-14a38793164e</value>
+            <null/>
+            <null/>
+            <null/>
+            <value>2010-11-29 15:57:10</value>
+        </row>
+        <row>
+            <value>41eb430f-c2ed-435c-b4eb-e1e19173754e</value>
+            <value>104857600000</value>
+            <value>62914560000</value>
+            <value>41943040000</value>
+            <value>2010-11-29 15:57:10</value>
+        </row>
+    </table>
+
     <table name="gluster_volume_options">
         <column>id</column>
         <column>volume_id</column>
diff --git a/packaging/dbscripts/gluster_volumes_sp.sql 
b/packaging/dbscripts/gluster_volumes_sp.sql
index be0946d..6db2cac 100644
--- a/packaging/dbscripts/gluster_volumes_sp.sql
+++ b/packaging/dbscripts/gluster_volumes_sp.sql
@@ -25,6 +25,18 @@
 LANGUAGE plpgsql;
 
 
+Create or replace FUNCTION InsertGlusterVolumeDetails(v_volume_id UUID,
+                                                v_total_space bigint,
+                                                v_used_space bigint,
+                                                v_free_space bigint)
+    RETURNS VOID
+    AS $procedure$
+BEGIN
+    INSERT INTO gluster_volume_details (volume_id, total_space, used_space, 
free_space, _update_date)
+    VALUES (v_volume_id, v_total_space, v_used_space, v_free_space, 
LOCALTIMESTAMP);
+END; $procedure$
+LANGUAGE plpgsql;
+
 Create or replace FUNCTION InsertGlusterVolumeBrick(v_id UUID, v_volume_id 
UUID,
                                                     v_server_id UUID,
                                                     v_brick_dir VARCHAR(4096),
@@ -38,6 +50,18 @@
 END; $procedure$
 LANGUAGE plpgsql;
 
+
+Create or replace FUNCTION InsertGlusterVolumeBrickDetails(v_brick_id UUID,
+                                                v_total_space bigint,
+                                                v_used_space bigint,
+                                                v_free_space bigint)
+    RETURNS VOID
+    AS $procedure$
+BEGIN
+    INSERT INTO gluster_volume_brick_details (brick_id, total_space, 
used_space, free_space, _update_date)
+    VALUES (v_brick_id, v_total_space, v_used_space, v_free_space, 
LOCALTIMESTAMP);
+END; $procedure$
+LANGUAGE plpgsql;
 
 Create or replace FUNCTION InsertGlusterVolumeOption(v_id UUID, v_volume_id 
UUID,
                                                     v_option_key VARCHAR(8192),
@@ -162,6 +186,16 @@
 END; $procedure$
 LANGUAGE plpgsql;
 
+Create or replace FUNCTION GetGlusterVolumeDetailsById(v_volume_id UUID)
+    RETURNS SETOF gluster_volume_details STABLE
+    AS $procedure$
+BEGIN
+    RETURN QUERY SELECT *
+    FROM  gluster_volume_details
+    WHERE volume_id = v_volume_id;
+END; $procedure$
+LANGUAGE plpgsql;
+
 Create or replace FUNCTION GetGlusterBrickById(v_id UUID)
     RETURNS SETOF gluster_volume_bricks_view STABLE
     AS $procedure$
@@ -214,6 +248,16 @@
 FROM  gluster_volume_bricks_view
 WHERE task_id = v_task_id
 ORDER BY brick_order;
+END; $procedure$
+LANGUAGE plpgsql;
+
+Create or replace FUNCTION GetBrickDetailsById(v_brick_id UUID)
+    RETURNS SETOF gluster_volume_brick_details STABLE
+    AS $procedure$
+BEGIN
+    RETURN QUERY SELECT *
+    FROM  gluster_volume_brick_details
+    WHERE brick_id = v_brick_id;
 END; $procedure$
 LANGUAGE plpgsql;
 
@@ -394,6 +438,22 @@
 END; $procedure$
 LANGUAGE plpgsql;
 
+Create or replace FUNCTION UpdateGlusterVolumeDetails(v_volume_id UUID,
+                                                v_total_space bigint,
+                                                v_used_space bigint,
+                                                v_free_space bigint)
+    RETURNS VOID
+    AS $procedure$
+BEGIN
+    UPDATE gluster_volume_details
+    SET
+        total_space = v_total_space,
+        used_space = v_used_space,
+        free_space = v_free_space,
+        _update_date = LOCALTIMESTAMP
+    WHERE volume_id = v_volume_id;
+END; $procedure$
+LANGUAGE plpgsql;
 
 Create or replace FUNCTION UpdateGlusterVolumeBrick(v_id UUID,
                                                     v_new_id UUID,
@@ -413,6 +473,22 @@
 END; $procedure$
 LANGUAGE plpgsql;
 
+Create or replace FUNCTION UpdateGlusterVolumeBrickDetails(v_brick_id UUID,
+                                                v_total_space bigint,
+                                                v_used_space bigint,
+                                                v_free_space bigint)
+    RETURNS VOID
+    AS $procedure$
+BEGIN
+    UPDATE gluster_volume_brick_details
+    SET
+        total_space = v_total_space,
+        used_space = v_used_space,
+        free_space = v_free_space,
+        _update_date = LOCALTIMESTAMP
+    WHERE brick_id = v_brick_id;
+END; $procedure$
+LANGUAGE plpgsql;
 
 Create or replace FUNCTION UpdateGlusterVolumeBrickStatus(v_id UUID,
                                                         v_status VARCHAR(32))
diff --git 
a/packaging/dbscripts/upgrade/03_04_0580_add_tables_for_gluster_volume_and_brick_details.sql
 
b/packaging/dbscripts/upgrade/03_04_0580_add_tables_for_gluster_volume_and_brick_details.sql
new file mode 100644
index 0000000..317a566
--- /dev/null
+++ 
b/packaging/dbscripts/upgrade/03_04_0580_add_tables_for_gluster_volume_and_brick_details.sql
@@ -0,0 +1,21 @@
+-- Add gluster_volume_details table
+CREATE TABLE gluster_volume_details
+(
+    volume_id UUID NOT NULL REFERENCES gluster_volumes(id) ON DELETE CASCADE,
+    total_space BIGINT,
+    used_space BIGINT,
+    free_space BIGINT,
+    _update_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT LOCALTIMESTAMP,
+    CONSTRAINT pk_gluster_volume_details PRIMARY KEY(volume_id)
+) WITH OIDS;
+
+-- Add gluster_volume_brick_details table
+CREATE TABLE gluster_volume_brick_details
+(
+    brick_id UUID NOT NULL REFERENCES gluster_volume_bricks(id) ON DELETE 
CASCADE,
+    total_space BIGINT,
+    used_space BIGINT,
+    free_space BIGINT,
+    _update_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT LOCALTIMESTAMP,
+    CONSTRAINT pk_gluster_volume_brick_details PRIMARY KEY(brick_id)
+) WITH OIDS;


-- 
To view, visit http://gerrit.ovirt.org/24445
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7d67b7ee22f4cb6839d0f14d3f27f3e22149ff22
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.4
Gerrit-Owner: Ramesh N <rnach...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to