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