package org.ovirt.engine.core.bll.gluster; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; 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.mockito.Mock; import org.ovirt.engine.core.bll.AbstractQueryTest; import org.ovirt.engine.core.bll.utils.GlusterUtil; import org.ovirt.engine.core.common.action.gluster.GlusterVolumeRemoveBricksQueriesParameters; import org.ovirt.engine.core.common.asynctasks.gluster.GlusterAsyncTask; import org.ovirt.engine.core.common.asynctasks.gluster.GlusterTaskParameters; import org.ovirt.engine.core.common.asynctasks.gluster.GlusterTaskType; import org.ovirt.engine.core.common.businessentities.Cluster; 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.GlusterServer; 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.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.dao.ClusterDao; import org.ovirt.engine.core.dao.StepDao; import org.ovirt.engine.core.dao.VdsDao; import org.ovirt.engine.core.dao.gluster.GlusterServerDao; import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao; public class GetGlusterVolumeRemoveBricksStatusQueryTest extends AbstractQueryTest<GlusterVolumeRemoveBricksQueriesParameters, GetGlusterVolumeRemoveBricksStatusQuery<GlusterVolumeRemoveBricksQueriesParameters>> { 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 static final Guid SERVER_UUID_1 = Guid.newGuid(); private GlusterVolumeTaskStatusEntity expectedVolumeStatusDetails; @Mock private VdsDao vdsDao; @Mock private GlusterVolumeDao volumeDao; @Mock private ClusterDao clusterDao; @Mock private StepDao stepDao; @Mock private GlusterServerDao glusterServerDao; @Mock private GlusterUtil glusterUtils; @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 status1 = new GlusterVolumeTaskStatusForHost(); status1.setHostName(SERVER_1); status1.setHostUuid(Guid.newGuid()); 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); status1.setHostUuid(SERVER_UUID_1); statusList.add(status1); GlusterVolumeTaskStatusForHost status2 = new GlusterVolumeTaskStatusForHost(); status2.setHostName(SERVER_2); status2.setHostUuid(Guid.newGuid()); 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); status2.setHostUuid(SERVER_UUID_1); 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<>(); 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.setClusterId(CLUSTER_ID); vds.setStatus(status); return vds; } private Cluster getCluster() { Cluster cluster = new Cluster(); cluster.setId(CLUSTER_ID); return cluster; } private List<Step> getStepsList() { List<Step> stepsList = new ArrayList<>(); 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); asyncTask.setStatus(JobExecutionStatus.FINISHED); asyncTask.setMessage("test_msg"); asyncTask.setTaskId(Guid.newGuid()); GlusterTaskParameters params = new GlusterTaskParameters(); params.setVolumeName("volume1"); asyncTask.setTaskParameters(params); return asyncTask; } private GlusterServer getGlusterServer() { GlusterServer glusterServer = new GlusterServer(); glusterServer.setId(SERVER_ID); glusterServer.setGlusterServerUuid(SERVER_UUID_1); return glusterServer; } private void setupMock() { 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()); when(glusterServerDao.getByGlusterServerUuid(any(Guid.class))).thenReturn(getGlusterServer()); when(vdsDao.get(any(Guid.class))).thenReturn(getVds(VDSStatus.Up)); when(clusterDao.get(any(Guid.class))).thenReturn(getCluster()); 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(); when(vdsDao.get(SERVER_ID)).thenReturn(getVds(VDSStatus.Up)); when(glusterUtils.getUpServer(CLUSTER_ID)).thenReturn(getVds(VDSStatus.Up)); getQuery().executeQueryCommand(); GlusterVolumeTaskStatusEntity volumeStatusDetails = 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(); getQuery().executeQueryCommand(); } }