Shubhendu Tripathi has uploaded a new change for review. Change subject: gluster: Query to get the gluster volume capacity details ......................................................................
gluster: Query to get the gluster volume capacity details Introduced a query to get the gluster volume capacity details like total, used and free capacity. Change-Id: Ib9503dfb8d6b08bc516fe80406720a62fae7b6a0 Signed-off-by: Shubhendu Tripathi <shtri...@redhat.com> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeSizeInfoQuery.java A backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeSizeInfoQueryTest.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/gluster/GlusterVolumeCapacityQueryParameters.java 3 files changed, 248 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/17/20317/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeSizeInfoQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeSizeInfoQuery.java new file mode 100644 index 0000000..76195d8 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeSizeInfoQuery.java @@ -0,0 +1,78 @@ +package org.ovirt.engine.core.bll.gluster; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; + +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSizeInfo; +import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.common.queries.gluster.GlusterVolumeCapacityQueryParameters; +import org.ovirt.engine.core.common.utils.Pair; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; +import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeVDSParameters; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil; + +public class GetGlusterVolumeSizeInfoQuery<P extends GlusterVolumeCapacityQueryParameters> extends GlusterQueriesCommandBase<P> { + private Guid clusterId; + private List<String> volumeNames = new ArrayList<>(); + + public GetGlusterVolumeSizeInfoQuery(P params) { + super(params); + } + + @Override + public void executeQueryCommand() { + clusterId = getParameters().getClusterId(); + List<Guid> volumeIds = getParameters().getVolumeIds(); + + for (Guid volumeId : volumeIds) { + if (volumeId != null) { + GlusterVolumeEntity volume = getGlusterVolumeDao().getById(volumeId); + if (volume == null) { + throw new RuntimeException(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_INVALID.toString()); + } + volumeNames.add(volume.getName()); + } + } + + getQueryReturnValue().setReturnValue(fetchVolumeCapacityDetails()); + } + + private Map<String, GlusterVolumeSizeInfo> fetchVolumeCapacityDetails() { + final Map<String, GlusterVolumeSizeInfo> sizeInfoMap = new HashMap<>(); + List<Callable<Pair<String, VDSReturnValue>>> queriesList = new ArrayList<Callable<Pair<String, VDSReturnValue>>>(); + + // Form the queries list + for (final String volumeName : volumeNames) { + queriesList.add(new Callable<Pair<String, VDSReturnValue>>() { + @Override + public Pair<String, VDSReturnValue> call() { + VDSReturnValue returnValue = + runVdsCommand(VDSCommandType.GetGlusterVolumeSizeInfo, + new GlusterVolumeVDSParameters(getUpServerId(clusterId), volumeName)); + Pair<String, VDSReturnValue> pairRetVal = new Pair<String, VDSReturnValue>(volumeName, returnValue); + sizeInfoMap.put(volumeName, (GlusterVolumeSizeInfo)returnValue.getReturnValue()); + return pairRetVal; + } + }); + } + + // Execute the queries + if (!queriesList.isEmpty()) { + ThreadPoolUtil.invokeAll(queriesList); + } + + return sizeInfoMap; + } + + @Override + public DbFacade getDbFacade() { + return DbFacade.getInstance(); + } +} diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeSizeInfoQueryTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeSizeInfoQueryTest.java new file mode 100644 index 0000000..698de94 --- /dev/null +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeSizeInfoQueryTest.java @@ -0,0 +1,139 @@ +package org.ovirt.engine.core.bll.gluster; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; +import org.ovirt.engine.core.bll.AbstractQueryTest; +import org.ovirt.engine.core.bll.utils.ClusterUtils; +import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.businessentities.VDSStatus; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSizeInfo; +import org.ovirt.engine.core.common.queries.gluster.GlusterVolumeCapacityQueryParameters; +import org.ovirt.engine.core.common.queries.gluster.GlusterVolumeQueriesParameters; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; +import org.ovirt.engine.core.common.vdscommands.VDSParametersBase; +import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.dao.VdsDAO; +import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao; + +public class GetGlusterVolumeSizeInfoQueryTest extends AbstractQueryTest<GlusterVolumeCapacityQueryParameters, GetGlusterVolumeSizeInfoQuery<GlusterVolumeCapacityQueryParameters>> { + + private static final Guid CLUSTER_ID = new Guid("b399944a-81ab-4ec5-8266-e19ba7c3c9d1"); + private static final Guid VOLUME_ID_1 = Guid.newGuid(); + private static final Guid VOLUME_ID_2 = Guid.newGuid(); + private static final Guid SERVER_ID = Guid.newGuid(); + private ClusterUtils clusterUtils; + private GlusterVolumeSizeInfo expectedVolumeSizeInfo1; + private GlusterVolumeSizeInfo expectedVolumeSizeInfo2; + private GlusterVolumeDao volumeDao; + private VdsDAO vdsDao; + private DbFacade dbFacade; + + @Before + @Override + public void setUp() throws Exception { + super.setUp(); + setupExpectedVolumeSizeInfos(); + setupMock(); + } + + private void setupExpectedVolumeSizeInfos() { + expectedVolumeSizeInfo1 = new GlusterVolumeSizeInfo(); + expectedVolumeSizeInfo1.setTotalSize(200 * 1024 * 1024 * 1024); // 200 GB + expectedVolumeSizeInfo1.setUsedSize(150 * 1024 * 1024 * 1024); // 150 GB + expectedVolumeSizeInfo1.setFreeSize(50 * 1024 * 1024 * 1024); // 50 GB + + expectedVolumeSizeInfo2 = new GlusterVolumeSizeInfo(); + expectedVolumeSizeInfo2.setTotalSize(100 * 1024 * 1024 * 1024); // 100 GB + expectedVolumeSizeInfo2.setUsedSize(50 * 1024 * 1024 * 1024); // 50 GB + expectedVolumeSizeInfo2.setFreeSize(10 * 1024 * 1024 * 1024); // 10 GB + } + + private List<Guid> getVolumeIds() { + List<Guid> volumeIds = new ArrayList<>(); + volumeIds.add(VOLUME_ID_1); + volumeIds.add(VOLUME_ID_2); + return volumeIds; + } + + private GlusterVolumeEntity getVolume(Guid volId) { + GlusterVolumeEntity volume = new GlusterVolumeEntity(); + volume.setId(volId); + return volume; + } + + private void setupMock() { + clusterUtils = mock(ClusterUtils.class); + vdsDao = mock(VdsDAO.class); + volumeDao = mock(GlusterVolumeDao.class); + dbFacade = mock(DbFacade.class); + + doReturn(dbFacade).when(getQuery()).getDbFacade(); + doReturn(vdsDao).when(getQuery()).getVdsDao(); + doReturn(volumeDao).when(getQuery()).getGlusterVolumeDao(); + doReturn(CLUSTER_ID).when(getQueryParameters()).getClusterId(); + doReturn(getVolumeIds()).when(getQueryParameters()).getVolumeIds(); + when(volumeDao.getById(VOLUME_ID_1)).thenReturn(getVolume(VOLUME_ID_1)); + when(volumeDao.getById(VOLUME_ID_2)).thenReturn(getVolume(VOLUME_ID_2)); + + VDSReturnValue returnValue = new VDSReturnValue(); + returnValue.setSucceeded(true); + List<GlusterVolumeSizeInfo> expectedVolumeSizeInfos = new ArrayList<>(); + expectedVolumeSizeInfos.add(expectedVolumeSizeInfo1); + expectedVolumeSizeInfos.add(expectedVolumeSizeInfo2); + returnValue.setReturnValue(expectedVolumeSizeInfos); + doReturn(returnValue).when(getQuery()).runVdsCommand(eq(VDSCommandType.GetGlusterVolumeSizeInfo), any(VDSParametersBase.class)); + } + + private VDS getVds(VDSStatus status) { + VDS vds = new VDS(); + vds.setId(Guid.newGuid()); + vds.setVdsName("gfs1"); + vds.setVdsGroupId(CLUSTER_ID); + vds.setStatus(status); + + return vds; + } + + @Test + public void testQueryForVolumeSizeInfo() { + doReturn(getVolumeIds()).when(getQueryParameters()).getVolumeIds(); + doReturn(clusterUtils).when(getQuery()).getClusterUtils(); + when(vdsDao.get(SERVER_ID)).thenReturn(getVds(VDSStatus.Up)); + when(clusterUtils.getUpServer(CLUSTER_ID)).thenReturn(getVds(VDSStatus.Up)); + + getQuery().executeQueryCommand(); + Map<String, GlusterVolumeSizeInfo> volumeSizeInfos = (Map<String, GlusterVolumeSizeInfo>)getQuery().getQueryReturnValue().getReturnValue(); + + assertNotNull(volumeSizeInfos); + assertEquals(expectedVolumeSizeInfo1, volumeSizeInfos.get(VOLUME_ID_1)); + assertEquals(expectedVolumeSizeInfo2, volumeSizeInfos.get(VOLUME_ID_2)); + + verify(volumeDao, times(1)).getById(VOLUME_ID_1); + verify(volumeDao, times(1)).getById(VOLUME_ID_2); + } + + @Test (expected = RuntimeException.class) + public void testQueryForInvalidVolumeId() { + doReturn(new ArrayList<>().add(null)).when(getQueryParameters()).getVolumeIds(); + doReturn(null).when(volumeDao).getById(Guid.Empty); + + getQuery().executeQueryCommand(); + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/gluster/GlusterVolumeCapacityQueryParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/gluster/GlusterVolumeCapacityQueryParameters.java new file mode 100644 index 0000000..e9dfce7 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/gluster/GlusterVolumeCapacityQueryParameters.java @@ -0,0 +1,31 @@ +package org.ovirt.engine.core.common.queries.gluster; + +import java.util.List; + +import org.ovirt.engine.core.compat.Guid; + +/** + * Parameter class with volume id as parameter which extends from GlusterParameters. <br> + * This will be used by gluster volume profile info command. + */ +public class GlusterVolumeCapacityQueryParameters extends GlusterParameters { + + private static final long serialVersionUID = 199106704417008718L; + private List<Guid> volumeIds; + + public GlusterVolumeCapacityQueryParameters() { + } + + public GlusterVolumeCapacityQueryParameters(Guid clusterId, List<Guid> volumeIdsList) { + super(clusterId); + setVolumeIds(volumeIdsList); + } + + public List<Guid> getVolumeIds() { + return volumeIds; + } + + public void setVolumeIds(List<Guid> volumeIdsList) { + this.volumeIds = volumeIdsList; + } +} -- To view, visit http://gerrit.ovirt.org/20317 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ib9503dfb8d6b08bc516fe80406720a62fae7b6a0 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Shubhendu Tripathi <shtri...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches