Shubhendu Tripathi has uploaded a new change for review. Change subject: gluster: Query for remove brick async task status ......................................................................
gluster: Query for remove brick async task status Query for remove brick async task status Change-Id: If4ec67f058bc9198bb6e1dfc96d0677294d93e9e Signed-off-by: Shubhendu Tripathi <[email protected]> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQuery.java A backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQueryTest.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java 3 files changed, 287 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/14/19114/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQuery.java new file mode 100644 index 0000000..23273b5 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQuery.java @@ -0,0 +1,60 @@ +package org.ovirt.engine.core.bll.gluster; + +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeTaskStatusEntity; +import org.ovirt.engine.core.common.job.Step; +import org.ovirt.engine.core.common.queries.gluster.GlusterVolumeQueriesParameters; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; +import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeRemoveBricksVDSParameters; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; + +public class GetGlusterVolumeRemoveBricksStatusQuery<P extends GlusterVolumeQueriesParameters> extends GlusterQueriesCommandBase<P> { + + private Guid clusterId; + private GlusterVolumeEntity volume; + + public GetGlusterVolumeRemoveBricksStatusQuery(P params) { + super(params); + } + + @Override + public void executeQueryCommand() { + clusterId = getParameters().getClusterId(); + Guid volumeId = getParameters().getVolumeId(); + if (volumeId != null) { + volume = getGlusterVolumeDao().getById(volumeId); + if (volume == null) { + throw new RuntimeException(String.format("Invalid volume id %s", volumeId)); + } + } + + getQueryReturnValue().setReturnValue(fetchAdvancedDetails()); + } + + private GlusterVolumeTaskStatusEntity fetchAdvancedDetails() { + VDSReturnValue returnValue = + runVdsCommand(VDSCommandType.GetGlusterVolumeRemoveBricksStatus, + new GlusterVolumeRemoveBricksVDSParameters(getUpServerId(clusterId), + volume.getName(), + volume.getBricks(), + volume.getReplicaCount())); + + // Set the volume re-balance start time + GlusterVolumeTaskStatusEntity entity = (GlusterVolumeTaskStatusEntity) returnValue.getReturnValue(); + List<Step> stepsList = getDbFacade().getStepDao().getStepsByExternalId(volume.getAsyncTask().getStepId()); + if (stepsList != null && !stepsList.isEmpty()) { + entity.setStartTime(stepsList.get(0).getStartTime()); + } + + return entity; + } + + @Override + public DbFacade getDbFacade() { + return DbFacade.getInstance(); + } +} diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQueryTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQueryTest.java new file mode 100644 index 0000000..d4126bd --- /dev/null +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetGlusterVolumeRemoveBricksStatusQueryTest.java @@ -0,0 +1,226 @@ +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.Date; +import java.util.List; + +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.asynctasks.gluster.GlusterAsyncTask; +import org.ovirt.engine.core.common.asynctasks.gluster.GlusterTaskType; +import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.businessentities.VDSStatus; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeTaskStatusDetail; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeTaskStatusEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeTaskStatusForHost; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeType; +import org.ovirt.engine.core.common.job.JobExecutionStatus; +import org.ovirt.engine.core.common.job.Step; +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.StepDao; +import org.ovirt.engine.core.dao.VdsDAO; +import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao; + +public class GetGlusterVolumeRemoveBricksStatusQueryTest extends + AbstractQueryTest<GlusterVolumeQueriesParameters, GetGlusterVolumeRemoveBricksStatusQuery<GlusterVolumeQueriesParameters>> { + + private static final Guid CLUSTER_ID = new Guid("b399944a-81ab-4ec5-8266-e19ba7c3c9d1"); + private static final String SERVER_1 = "server1"; + private static final String SERVER_2 = "server2"; + private static final Guid VOLUME_ID = Guid.newGuid(); + private static final Guid SERVER_ID = Guid.newGuid(); + private static final Guid STEP_ID = Guid.newGuid(); + private GlusterVolumeTaskStatusEntity expectedVolumeStatusDetails; + private VdsDAO vdsDao; + private GlusterVolumeDao volumeDao; + private StepDao stepDao; + private ClusterUtils clusterUtils; + private DbFacade dbFacade; + + @Before + @Override + public void setUp() throws Exception { + super.setUp(); + setupExpectedVolume(); + setupMock(); + } + + private void setupExpectedVolume() { + expectedVolumeStatusDetails = new GlusterVolumeTaskStatusEntity(); + expectedVolumeStatusDetails.setHostwiseStatusDetails(getHostwiseStatusDetails()); + expectedVolumeStatusDetails.setStatusSummary(getStatusSummary()); + expectedVolumeStatusDetails.setStartTime(new Date()); + expectedVolumeStatusDetails.setStatusTime(new Date()); + } + + private List<GlusterVolumeTaskStatusForHost> getHostwiseStatusDetails() { + List<GlusterVolumeTaskStatusForHost> statusList = new ArrayList<GlusterVolumeTaskStatusForHost>(); + + GlusterVolumeTaskStatusForHost status1 = new GlusterVolumeTaskStatusForHost(); + status1.setHostName(SERVER_1); + status1.setFilesScanned(100); + status1.setFilesMoved(100); + status1.setFilesFailed(0); + status1.setFilesScanned(100); + status1.setFilesSkipped(0); + status1.setRunTime(20); + status1.setStatus(JobExecutionStatus.FINISHED); + status1.setTotalSizeMoved(1024); + statusList.add(status1); + + GlusterVolumeTaskStatusForHost status2 = new GlusterVolumeTaskStatusForHost(); + status2.setHostName(SERVER_2); + status2.setFilesScanned(100); + status2.setFilesMoved(100); + status2.setFilesFailed(0); + status2.setFilesScanned(100); + status2.setFilesSkipped(0); + status2.setRunTime(20); + status2.setStatus(JobExecutionStatus.FINISHED); + status2.setTotalSizeMoved(1024); + statusList.add(status2); + + return statusList; + } + + private GlusterVolumeTaskStatusDetail getStatusSummary() { + GlusterVolumeTaskStatusDetail summary = new GlusterVolumeTaskStatusDetail(); + summary.setFilesMoved(200); + summary.setFilesFailed(0); + summary.setFilesScanned(200); + summary.setFilesSkipped(0); + summary.setRunTime(40); + summary.setStatus(JobExecutionStatus.FINISHED); + summary.setTotalSizeMoved(2048); + + return summary; + } + + private List<GlusterBrickEntity> getBricks() { + GlusterBrickEntity brick1 = new GlusterBrickEntity(); + brick1.setId(Guid.newGuid()); + brick1.setServerId(SERVER_ID); + brick1.setVolumeId(VOLUME_ID); + + GlusterBrickEntity brick2 = new GlusterBrickEntity(); + brick2.setId(Guid.newGuid()); + brick2.setServerId(SERVER_ID); + brick2.setVolumeId(VOLUME_ID); + + List<GlusterBrickEntity> bricksList = new ArrayList<GlusterBrickEntity>(); + bricksList.add(brick1); + bricksList.add(brick2); + + return bricksList; + } + + private GlusterVolumeEntity getVolume() { + GlusterVolumeEntity volume = new GlusterVolumeEntity(); + volume.setName("Vol1"); + volume.setId(VOLUME_ID); + volume.setReplicaCount(2); + volume.setBricks(getBricks()); + volume.setVolumeType(GlusterVolumeType.DISTRIBUTE); + volume.setAsyncTask(getAsyncTask()); + return volume; + } + + 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; + } + + private List<Step> getStepsList() { + List<Step> stepsList = new ArrayList<Step>(); + Step stp = new Step(); + stp.setId(STEP_ID); + stp.setStartTime(new Date()); + stepsList.add(stp); + + return stepsList; + } + + private GlusterAsyncTask getAsyncTask() { + GlusterAsyncTask asyncTask = new GlusterAsyncTask(); + asyncTask.setStepId(STEP_ID); + asyncTask.setType(GlusterTaskType.REBALANCE_VOLUME); + asyncTask.setStatus(JobExecutionStatus.FINISHED); + asyncTask.setMessage("test_msg"); + asyncTask.setTaskId(Guid.newGuid()); + + return asyncTask; + } + + private void setupMock() { + clusterUtils = mock(ClusterUtils.class); + vdsDao = mock(VdsDAO.class); + volumeDao = mock(GlusterVolumeDao.class); + stepDao = mock(StepDao.class); + dbFacade = mock(DbFacade.class); + + doReturn(dbFacade).when(getQuery()).getDbFacade(); + doReturn(vdsDao).when(getQuery()).getVdsDao(); + doReturn(volumeDao).when(getQuery()).getGlusterVolumeDao(); + doReturn(stepDao).when(dbFacade).getStepDao(); + doReturn(CLUSTER_ID).when(getQueryParameters()).getClusterId(); + doReturn(VOLUME_ID).when(getQueryParameters()).getVolumeId(); + when(volumeDao.getById(VOLUME_ID)).thenReturn(getVolume()); + when(stepDao.getStepsByExternalId(any(Guid.class))).thenReturn(getStepsList()); + + VDSReturnValue returnValue = new VDSReturnValue(); + returnValue.setSucceeded(true); + returnValue.setReturnValue(expectedVolumeStatusDetails); + + doReturn(returnValue).when(getQuery()).runVdsCommand(eq(VDSCommandType.GetGlusterVolumeRemoveBricksStatus), + any(VDSParametersBase.class)); + } + + @Test + public void testQueryForStatusDetails() { + doReturn(VOLUME_ID).when(getQueryParameters()).getVolumeId(); + 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(); + GlusterVolumeTaskStatusEntity volumeStatusDetails = + (GlusterVolumeTaskStatusEntity) getQuery().getQueryReturnValue().getReturnValue(); + + assertNotNull(volumeStatusDetails); + assertEquals(expectedVolumeStatusDetails, volumeStatusDetails); + + verify(volumeDao, times(1)).getById(VOLUME_ID); + } + + + @Test (expected = RuntimeException.class) + public void testQueryForInvalidVolumeId() { + doReturn(Guid.Empty).when(getQueryParameters()).getVolumeId(); + 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/VdcQueryType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java index cd67bbe..538aeb3 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java @@ -264,6 +264,7 @@ GetGlusterServerServicesByClusterId, GetGlusterServerServicesByServerId, GetGlusterClusterServiceByClusterId, + GetGlusterVolumeRemoveBricksStatus, GetDefaultConfigurationVersion(VdcQueryAuthType.User), OsRepository(VdcQueryAuthType.User), -- To view, visit http://gerrit.ovirt.org/19114 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: If4ec67f058bc9198bb6e1dfc96d0677294d93e9e Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Shubhendu Tripathi <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
