package org.ovirt.engine.core.dao.gluster;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
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;
import java.util.Set;
import org.junit.Test;
import org.ovirt.engine.core.common.asynctasks.gluster.GlusterTaskType;
import org.ovirt.engine.core.common.businessentities.VdsStatic;
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.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;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.BaseDaoTestCase;
/**
* Tests for Gluster Volume Dao
*/
public class GlusterVolumeDaoTest extends BaseDaoTestCase {
private static final Guid SERVER_ID = new Guid("afce7a39-8e8c-4819-ba9c-796d316592e6");
private static final Guid CLUSTER_ID = new Guid("ae956031-6be2-43d6-bb8f-5191c9253314");
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";
private static final String OPTION_VALUE_OFF = "off";
private GlusterVolumeDao dao;
private VdsStatic server;
private GlusterVolumeEntity existingDistVol;
private GlusterVolumeEntity existingReplVol;
private GlusterVolumeEntity newVolume;
@Override
public void setUp() throws Exception {
super.setUp();
dao = dbFacade.getGlusterVolumeDao();
server = dbFacade.getVdsStaticDao().get(SERVER_ID);
existingDistVol = dao.getById(EXISTING_VOL_DIST_ID);
existingReplVol = dao.getById(EXISTING_VOL_REPL_ID);
}
@Test
public void testSaveAndGetById() {
GlusterVolumeEntity volume = dao.getByName(CLUSTER_ID, NEW_VOL_NAME);
assertNull(volume);
newVolume = insertTestVolume();
volume = dao.getById(newVolume.getId());
assertNotNull(volume);
assertEquals(newVolume, volume);
}
@Test
public void testGetByName() {
newVolume = insertTestVolume();
GlusterVolumeEntity volume = dao.getByName(CLUSTER_ID, NEW_VOL_NAME);
assertNotNull(volume);
assertEquals(newVolume, volume);
}
@Test
public void testGetByClusterId() {
List<GlusterVolumeEntity> volumes = dao.getByClusterId(CLUSTER_ID);
assertNotNull(volumes);
assertEquals(2, volumes.size());
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());
assertEquals(100000L, volume.getAdvancedDetails().getCapacityInfo().getTotalSize().longValue());
assertEquals(60000L, volume.getAdvancedDetails().getCapacityInfo().getUsedSize().longValue());
assertEquals(40000L, volume.getAdvancedDetails().getCapacityInfo().getFreeSize().longValue());
assertEquals(EXPECTED_DATE_FORMAT.parse(volume.getAdvancedDetails()
.getUpdatedAt().toString()), EXPECTED_DATE_FORMAT.parse("2014-01-21 18:12:33"));
}
@Test
public void testGetAllWithQuery() {
List<GlusterVolumeEntity> volumes =
dao.getAllWithQuery("select * from gluster_volumes_view where vol_type = '"
+ GlusterVolumeType.DISTRIBUTED_REPLICATE.name() + "'");
assertNotNull(volumes);
assertEquals(1, volumes.size());
assertEquals(existingReplVol, volumes.get(0));
}
@Test
public void testRemove() {
dao.remove(EXISTING_VOL_DIST_ID);
List<GlusterVolumeEntity> volumes = dao.getByClusterId(CLUSTER_ID);
assertEquals(1, volumes.size());
assertFalse(volumes.contains(existingDistVol));
assertTrue(volumes.contains(existingReplVol));
}
@Test
public void testRemoveMultiple() {
List<Guid> idsToRemove = new ArrayList<>();
idsToRemove.add(EXISTING_VOL_DIST_ID);
idsToRemove.add(EXISTING_VOL_REPL_ID);
dao.removeAll(idsToRemove);
List<GlusterVolumeEntity> volumes = dao.getByClusterId(CLUSTER_ID);
assertTrue(volumes.isEmpty());
}
@Test
public void testRemoveByName() {
dao.removeByName(CLUSTER_ID, EXISTING_VOL_REPL_NAME);
List<GlusterVolumeEntity> volumes = dao.getByClusterId(CLUSTER_ID);
assertEquals(1, volumes.size());
assertTrue(volumes.contains(existingDistVol));
assertFalse(volumes.contains(existingReplVol));
}
@Test
public void testRemoveByClusterId() {
dao.removeByClusterId(CLUSTER_ID);
List<GlusterVolumeEntity> volumes = dao.getByClusterId(CLUSTER_ID);
assertTrue(volumes.isEmpty());
}
@Test
public void testUpdateVolumeStatus() {
assertTrue(existingDistVol.isOnline());
dao.updateVolumeStatus(existingDistVol.getId(), GlusterStatus.DOWN);
GlusterVolumeEntity volume = dao.getById(existingDistVol.getId());
assertNotNull(volume);
assertFalse(volume.isOnline());
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
public void testUpdateVolumeStatusByName() {
assertTrue(existingDistVol.isOnline());
dao.updateVolumeStatusByName(existingDistVol.getClusterId(),
existingDistVol.getName(),
GlusterStatus.DOWN);
GlusterVolumeEntity volume = dao.getById(existingDistVol.getId());
assertNotNull(volume);
assertFalse(volume.isOnline());
assertFalse(volume.equals(existingDistVol));
existingDistVol.setStatus(GlusterStatus.DOWN);
assertEquals(existingDistVol, volume);
}
@Test
public void testUpdateAsyncTaskId() {
assertNotNull(existingDistVol.getAsyncTask());
assertNull(existingDistVol.getAsyncTask().getTaskId());
dao.updateVolumeTask(existingDistVol.getId(), REBALANCING_VOLUME_TASKID);
GlusterVolumeEntity volume = dao.getAllWithQuery("select * from gluster_volumes_view where id = '"
+ existingDistVol.getId() + "'").get(0);
assertNotNull("Volume : "+ existingDistVol.getId() +" doesn't exists", volume);
assertEquals("Task ID is not getting updated", REBALANCING_VOLUME_TASKID, volume.getAsyncTask().getTaskId());
assertEquals("Invalid Task status", JobExecutionStatus.STARTED, volume.getAsyncTask().getStatus());
assertEquals("Invalid Task type", GlusterTaskType.REBALANCE, volume.getAsyncTask().getType());
}
@Test
public void testReplicateCount() {
GlusterVolumeEntity volume = dao.getById(EXISTING_VOL_REPL_ID);
int replicaCount = volume.getReplicaCount();
assertTrue(replicaCount != 0);
assertEquals(2, replicaCount);
dao.updateReplicaCount(EXISTING_VOL_REPL_ID, 3);
GlusterVolumeEntity volumeAfter = dao.getById(EXISTING_VOL_REPL_ID);
assertNotNull(volumeAfter);
replicaCount = volumeAfter.getReplicaCount();
assertTrue(replicaCount != 0);
assertEquals(3, replicaCount);
}
@Test
public void testStripeCount() {
GlusterVolumeEntity volume = dao.getById(EXISTING_VOL_REPL_ID);
int replicaCount = volume.getReplicaCount();
assertTrue(replicaCount != 0);
assertEquals(2, replicaCount);
dao.updateReplicaCount(EXISTING_VOL_REPL_ID, 4);
GlusterVolumeEntity volumeAfter = dao.getById(EXISTING_VOL_REPL_ID);
assertNotNull(volumeAfter);
replicaCount = volumeAfter.getReplicaCount();
assertTrue(replicaCount != 0);
assertEquals(4, replicaCount);
}
@Test
public void testAddAccessProtocol() {
Set<AccessProtocol> protocols = existingDistVol.getAccessProtocols();
assertEquals(1, protocols.size());
assertFalse(protocols.contains(AccessProtocol.NFS));
dao.addAccessProtocol(EXISTING_VOL_DIST_ID, AccessProtocol.NFS);
GlusterVolumeEntity volumeAfter = dao.getById(EXISTING_VOL_DIST_ID);
assertNotNull(volumeAfter);
protocols = volumeAfter.getAccessProtocols();
assertEquals(2, protocols.size());
assertTrue(protocols.contains(AccessProtocol.NFS));
assertFalse(volumeAfter.equals(existingDistVol));
existingDistVol.addAccessProtocol(AccessProtocol.NFS);
assertEquals(volumeAfter, existingDistVol);
}
@Test
public void testRemoveAccessProtocol() {
Set<AccessProtocol> protocols = existingReplVol.getAccessProtocols();
assertEquals(2, protocols.size());
assertTrue(protocols.contains(AccessProtocol.NFS));
dao.removeAccessProtocol(EXISTING_VOL_REPL_ID, AccessProtocol.NFS);
GlusterVolumeEntity volumeAfter = dao.getById(EXISTING_VOL_REPL_ID);
assertNotNull(volumeAfter);
protocols = volumeAfter.getAccessProtocols();
assertEquals(1, protocols.size());
assertFalse(protocols.contains(AccessProtocol.NFS));
assertFalse(volumeAfter.equals(existingReplVol));
existingReplVol.removeAccessProtocol(AccessProtocol.NFS);
assertEquals(volumeAfter, existingReplVol);
}
@Test
public void testAddTransportType() {
Set<TransportType> transportTypes = existingDistVol.getTransportTypes();
assertEquals(1, transportTypes.size());
assertFalse(transportTypes.contains(TransportType.RDMA));
dao.addTransportType(EXISTING_VOL_DIST_ID, TransportType.RDMA);
GlusterVolumeEntity volumeAfter = dao.getById(EXISTING_VOL_DIST_ID);
assertNotNull(volumeAfter);
transportTypes = volumeAfter.getTransportTypes();
assertEquals(2, transportTypes.size());
assertTrue(transportTypes.contains(TransportType.RDMA));
assertFalse(volumeAfter.equals(existingDistVol));
existingDistVol.addTransportType(TransportType.RDMA);
assertEquals(volumeAfter, existingDistVol);
}
@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());
dao.removeTransportType(EXISTING_VOL_DIST_ID, TransportType.TCP);
transportTypes = dao.getById(EXISTING_VOL_DIST_ID).getTransportTypes();
assertEquals(0, transportTypes.size());
List<TransportType> types = new ArrayList<>();
types.add(TransportType.TCP);
types.add(TransportType.RDMA);
dao.addTransportTypes(EXISTING_VOL_DIST_ID, types);
GlusterVolumeEntity volumeAfter = dao.getById(EXISTING_VOL_DIST_ID);
assertNotNull(volumeAfter);
transportTypes = volumeAfter.getTransportTypes();
assertEquals(2, transportTypes.size());
assertTrue(transportTypes.contains(TransportType.TCP));
assertTrue(transportTypes.contains(TransportType.RDMA));
assertFalse(volumeAfter.equals(existingDistVol));
existingDistVol.addTransportType(TransportType.TCP);
existingDistVol.addTransportType(TransportType.RDMA);
assertEquals(volumeAfter, existingDistVol);
}
@Test
public void testRemoveTransportType() {
Set<TransportType> transportTypes = existingReplVol.getTransportTypes();
assertEquals(2, transportTypes.size());
assertTrue(transportTypes.contains(TransportType.RDMA));
dao.removeTransportType(EXISTING_VOL_REPL_ID, TransportType.RDMA);
GlusterVolumeEntity volumeAfter = dao.getById(EXISTING_VOL_REPL_ID);
assertNotNull(volumeAfter);
transportTypes = volumeAfter.getTransportTypes();
assertEquals(1, transportTypes.size());
assertFalse(transportTypes.contains(TransportType.RDMA));
assertFalse(volumeAfter.equals(existingReplVol));
existingReplVol.removeTransportType(TransportType.RDMA);
assertEquals(volumeAfter, existingReplVol);
}
@Test
public void testGetVolumesByOption() {
List<GlusterVolumeEntity> volumes = dao.getVolumesByOption(CLUSTER_ID, GlusterStatus.UP, OPTION_KEY_NFS_DISABLE, OPTION_VALUE_OFF);
assertNotNull(volumes);
assertTrue(volumes.contains(existingReplVol));
assertTrue(volumes.get(0).isNfsEnabled());
}
@Test
public void testGetVolumesByStatusTypesAndOption() {
List<GlusterVolumeEntity> volumes =
dao.getVolumesByStatusTypesAndOption(CLUSTER_ID,
GlusterStatus.UP,
Collections.singletonList(GlusterVolumeType.DISTRIBUTED_REPLICATE),
OPTION_KEY_NFS_DISABLE,
OPTION_VALUE_OFF);
assertNotNull(volumes);
assertTrue(volumes.contains(existingReplVol));
for (GlusterVolumeEntity volume : volumes) {
assertTrue(volume.isNfsEnabled() && volume.getVolumeType() == GlusterVolumeType.DISTRIBUTED_REPLICATE);
}
}
@Test
public void testGetVolumesByStatusAndTypes() {
List<GlusterVolumeEntity> volumes =
dao.getVolumesByStatusAndTypes(CLUSTER_ID,
GlusterStatus.UP,
Collections.singletonList(GlusterVolumeType.DISTRIBUTE));
assertNotNull(volumes);
assertTrue(volumes.contains(existingDistVol));
for (GlusterVolumeEntity volume : volumes) {
assertEquals(GlusterVolumeType.DISTRIBUTE, volume.getVolumeType());
}
}
@Test
public void testRemoveTransportTypes() {
Set<TransportType> transportTypes = existingReplVol.getTransportTypes();
assertEquals(2, transportTypes.size());
assertTrue(transportTypes.contains(TransportType.TCP));
assertTrue(transportTypes.contains(TransportType.RDMA));
List<TransportType> types = new ArrayList<>();
types.add(TransportType.TCP);
types.add(TransportType.RDMA);
dao.removeTransportTypes(EXISTING_VOL_REPL_ID, types);
GlusterVolumeEntity volumeAfter = dao.getById(EXISTING_VOL_REPL_ID);
assertNotNull(volumeAfter);
transportTypes = volumeAfter.getTransportTypes();
assertEquals(0, transportTypes.size());
assertFalse(transportTypes.contains(TransportType.TCP));
assertFalse(transportTypes.contains(TransportType.RDMA));
assertFalse(volumeAfter.equals(existingReplVol));
existingReplVol.removeTransportType(TransportType.TCP);
existingReplVol.removeTransportType(TransportType.RDMA);
assertEquals(volumeAfter, existingReplVol);
}
@Test
public void testGetVolumesSupportedAsStorageDomain() {
List<GlusterVolumeEntity> vols = dao.getVolumesSupportedAsStorageDomain();
assertEquals(1, vols.size());
}
private GlusterVolumeEntity insertTestVolume() {
Guid volumeId = Guid.newGuid();
GlusterVolumeEntity volume = new GlusterVolumeEntity();
volume.setName(NEW_VOL_NAME);
volume.setClusterId(CLUSTER_ID);
volume.setId(volumeId);
volume.setVolumeType(GlusterVolumeType.DISTRIBUTE);
volume.addTransportType(TransportType.TCP);
volume.setReplicaCount(0);
volume.setStripeCount(0);
volume.setStatus(GlusterStatus.UP);
volume.setOption("auth.allow", "*");
volume.addAccessProtocol(AccessProtocol.GLUSTER);
volume.addAccessProtocol(AccessProtocol.NFS);
GlusterBrickEntity brick = new GlusterBrickEntity();
brick.setVolumeId(volumeId);
brick.setServerId(server.getId());
brick.setServerName(server.getHostName());
brick.setBrickDirectory("/export/testVol1");
brick.setStatus(GlusterStatus.UP);
brick.setBrickOrder(0);
volume.addBrick(brick);
volume.setSnapshotsCount(0);
volume.setSnapMaxLimit(0);
dao.save(volume);
return volume;
}
}