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.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import java.util.Collections;
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.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
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.GlusterClientInfo;
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.MallInfo;
import org.ovirt.engine.core.common.businessentities.gluster.MemoryStatus;
import org.ovirt.engine.core.common.businessentities.gluster.Mempool;
import org.ovirt.engine.core.common.queries.gluster.GlusterVolumeAdvancedDetailsParameters;
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.VdsDao;
import org.ovirt.engine.core.dao.gluster.GlusterBrickDao;
import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao;
public class GetGlusterVolumeAdvancedDetailsQueryTest extends
AbstractQueryTest<GlusterVolumeAdvancedDetailsParameters, GetGlusterVolumeAdvancedDetailsQuery<GlusterVolumeAdvancedDetailsParameters>> {
private static final Guid CLUSTER_ID = new Guid("b399944a-81ab-4ec5-8266-e19ba7c3c9d1");
private static final Guid VOLUME_ID = Guid.newGuid();
private static final Guid BRICK_ID = Guid.newGuid();
private static final Guid SERVER_ID = Guid.newGuid();
private static final String SERVER_NAME = "server1";
private GlusterVolumeAdvancedDetails expectedVolumeAdvancedDetails;
@Mock
private GlusterUtil glusterUtils;
@Mock
private VdsDao vdsDao;
@Mock
private GlusterVolumeDao volumeDao;
@Mock
private GlusterBrickDao brickDao;
@Before
@Override
public void setUp() throws Exception {
super.setUp();
setupExpectedVolume();
setupMock();
}
private void setupExpectedVolume() {
expectedVolumeAdvancedDetails = new GlusterVolumeAdvancedDetails();
expectedVolumeAdvancedDetails.setVolumeId(VOLUME_ID);
expectedVolumeAdvancedDetails.setBrickDetails(getBrickDetails());
}
private GlusterVolumeEntity getVolume() {
GlusterVolumeEntity volume = new GlusterVolumeEntity();
volume.setId(VOLUME_ID);
return volume;
}
private GlusterBrickEntity getBrick() {
GlusterBrickEntity brick = new GlusterBrickEntity();
brick.setId(BRICK_ID);
brick.setServerId(SERVER_ID);
return brick;
}
private List<BrickDetails> getBrickDetails() {
BrickDetails brickDetails = new BrickDetails();
brickDetails.setBrickProperties(getBrickProperties());
brickDetails.setClients(getClientInfo());
brickDetails.setMemoryStatus(getMemoryStatus());
return Collections.singletonList(brickDetails);
}
private BrickProperties getBrickProperties() {
BrickProperties brickProperties = new BrickProperties();
brickProperties.setBrickId(Guid.newGuid());
brickProperties.setPort(24009);
brickProperties.setStatus(GlusterStatus.UP);
brickProperties.setPid(1459);
return brickProperties;
}
private List<GlusterClientInfo> getClientInfo() {
GlusterClientInfo clientInfo = new GlusterClientInfo();
clientInfo.setBytesRead(836);
clientInfo.setBytesWritten(468);
clientInfo.setHostname(SERVER_NAME + ":1006");
return Collections.singletonList(clientInfo);
}
private MemoryStatus getMemoryStatus() {
MemoryStatus memoryStatus = new MemoryStatus();
memoryStatus.setMallInfo(getMallInfo());
memoryStatus.setMemPools(getMemPools());
return memoryStatus;
}
private List<Mempool> getMemPools() {
Mempool memPool = new Mempool();
memPool.setAllocCount(0);
memPool.setColdCount(1024);
memPool.setHotCount(0);
memPool.setMaxAlloc(0);
memPool.setMaxStdAlloc(0);
memPool.setName("v1-server:fd_t");
memPool.setPadddedSize(100);
memPool.setPoolMisses(0);
return Collections.singletonList(memPool);
}
private MallInfo getMallInfo() {
MallInfo mallInfo = new MallInfo();
mallInfo.setArena(606208);
mallInfo.setFordblks(110336);
mallInfo.setFsmblks(0);
mallInfo.setHblkhd(15179776);
mallInfo.setOrdblks(1);
mallInfo.setSmblks(0);
mallInfo.setUordblks(495872);
mallInfo.setUsmblks(0);
return mallInfo;
}
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 void setupMock() {
when(volumeDao.getById(VOLUME_ID)).thenReturn(getVolume());
when(brickDao.getById(BRICK_ID)).thenReturn(getBrick());
// Mock the query's parameters. Note that the brick id is
// mocked inside the test methods to test different scenarios.
doReturn(CLUSTER_ID).when(getQueryParameters()).getClusterId();
doReturn(true).when(getQueryParameters()).isDetailRequired();
VDSReturnValue returnValue = new VDSReturnValue();
returnValue.setSucceeded(true);
returnValue.setReturnValue(expectedVolumeAdvancedDetails);
doReturn(returnValue).when(getQuery()).runVdsCommand(eq(VDSCommandType.GetGlusterVolumeAdvancedDetails),
any(VDSParametersBase.class));
}
@Test
public void testQueryForBrickDetails() {
doReturn(VOLUME_ID).when(getQueryParameters()).getVolumeId();
doReturn(BRICK_ID).when(getQueryParameters()).getBrickId();
when(vdsDao.get(SERVER_ID)).thenReturn(getVds(VDSStatus.Up));
getQuery().executeQueryCommand();
GlusterVolumeAdvancedDetails volumeAdvancedDetails = getQuery().getQueryReturnValue().getReturnValue();
assertNotNull(volumeAdvancedDetails);
assertEquals(expectedVolumeAdvancedDetails, volumeAdvancedDetails);
// Server is fetched directly from the brick's server,
// and clusterUtils is not used to fetch a random UP server
verify(vdsDao, times(1)).get(SERVER_ID);
verifyZeroInteractions(glusterUtils);
}
@Test (expected = RuntimeException.class)
public void testQueryForInvalidVolumeId() {
doReturn(Guid.Empty).when(getQueryParameters()).getVolumeId();
getQuery().executeQueryCommand();
}
@Test
public void testQueryForNullBrickId() {
doReturn(VOLUME_ID).when(getQueryParameters()).getVolumeId();
doReturn(null).when(getQueryParameters()).getBrickId();
doReturn(getVds(VDSStatus.Up)).when(glusterUtils).getRandomUpServer(CLUSTER_ID);
getQuery().executeQueryCommand();
GlusterVolumeAdvancedDetails volumeAdvancedDetails = getQuery().getQueryReturnValue().getReturnValue();
assertNotNull(volumeAdvancedDetails);
assertEquals(expectedVolumeAdvancedDetails, volumeAdvancedDetails);
// Brick's server is not fetched, rather clusterUtil is used to fetch a random UP server
verifyZeroInteractions(vdsDao);
verify(glusterUtils, times(1)).getRandomUpServer(CLUSTER_ID);
}
}