package org.ovirt.engine.core.dao; 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 java.util.Arrays; import java.util.Collections; import java.util.LinkedList; import java.util.List; import org.junit.Test; import org.ovirt.engine.core.common.businessentities.VmDevice; import org.ovirt.engine.core.common.businessentities.VmDeviceId; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.DiskImageDynamic; import org.ovirt.engine.core.common.businessentities.storage.VolumeFormat; import org.ovirt.engine.core.common.businessentities.storage.VolumeType; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.compat.Guid; public class DiskImageDynamicDaoTest extends BaseDaoTestCase{ private static final Guid EXISTING_IMAGE_ID = new Guid("42058975-3d5e-484a-80c1-01c31207f578"); private static final int TOTAL_DYNAMIC_DISK_IMAGES = 5; private static final Guid EXISTING_IMAGE_DISK_TEMPLATE = new Guid("42058975-3d5e-484a-80c1-01c31207f578"); private DiskImageDynamicDao dao; private ImageDao imageDao; private BaseDiskDao diskDao; private DiskImageDynamic existingDynamic; @Override public void setUp() throws Exception { super.setUp(); dao = dbFacade.getDiskImageDynamicDao(); imageDao = dbFacade.getImageDao(); diskDao = dbFacade.getBaseDiskDao(); existingDynamic = dao.get(EXISTING_IMAGE_ID); } /** * Ensures that retrieving with an incorrect ID returns null. */ @Test public void testGetWithInvalidId() { DiskImageDynamic result = dao.get(Guid.newGuid()); assertNull(result); } /** * Ensures that retrieving the dynamic image works as expected. */ @Test public void testGet() { DiskImageDynamic result = dao.get(existingDynamic.getId()); assertNotNull(result); assertEquals(existingDynamic, result); } /** * Ensures that retrieving all dynamic disk images works. */ @Test public void testGetAll() { List<DiskImageDynamic> result = dao.getAll(); assertNotNull(result); assertFalse(result.isEmpty()); assertEquals(TOTAL_DYNAMIC_DISK_IMAGES, result.size()); } /** * Ensures that updating a dynamic image works. */ @Test public void testUpdate() { existingDynamic.setActualSize(existingDynamic.getActualSize() * 10); dao.update(existingDynamic); DiskImageDynamic result = dao.get(existingDynamic.getId()); assertNotNull(result); assertEquals(existingDynamic, result); } /** * Ensures that updating a dynamic image works. */ @Test public void testUpdateLatency() { existingDynamic.setReadLatency(0.000000001d); existingDynamic.setWriteLatency(0.000000002d); existingDynamic.setFlushLatency(0.999999999d); dao.update(existingDynamic); DiskImageDynamic result = dao.get(existingDynamic.getId()); assertNotNull(result); assertEquals(existingDynamic, result); } public DiskImageDynamic createDiskImageDynamic(Guid id) { DiskImageDynamic dynamic = new DiskImageDynamic(); dynamic.setReadRate(5); dynamic.setWriteRate(6); dynamic.setReadLatency(0d); dynamic.setFlushLatency(0.0202020d); dynamic.setWriteLatency(null); dynamic.setId(id); return dynamic; } @Test public void testSave() { DiskImage newImage = new DiskImage(); newImage.setImageId(Guid.newGuid()); newImage.setVolumeFormat(VolumeFormat.COW); newImage.setVolumeType(VolumeType.Sparse); newImage.setActive(true); newImage.setImageTemplateId(EXISTING_IMAGE_DISK_TEMPLATE); newImage.setId(Guid.newGuid()); imageDao.save(newImage.getImage()); diskDao.save(newImage); DiskImageDynamic dynamic = createDiskImageDynamic(newImage.getImageId()); dao.save(createDiskImageDynamic(newImage.getImageId())); DiskImageDynamic result = dao.get(dynamic.getId()); assertNotNull(result); assertEquals(dynamic, result); } /** * Ensures that removing a dynamic image works as expected. */ @Test public void testRemove() { dao.remove(existingDynamic.getId()); DiskImageDynamic result = dao.get(existingDynamic.getId()); assertNull(result); } @Test public void testUpdateAll() throws Exception { DiskImageDynamic existingDynamic2 = dao.get(new Guid("42058975-3d5e-484a-80c1-01c31207f579")); existingDynamic.setActualSize(100); existingDynamic2.setReadRate(120); existingDynamic.setReadLatency(100d); existingDynamic2.setReadLatency(0.00001d); dao.updateAll(Arrays.asList(existingDynamic, existingDynamic2)); assertEquals(existingDynamic, dao.get(existingDynamic.getId())); assertEquals(existingDynamic2, dao.get(existingDynamic2.getId())); } @Test public void updateAllDiskImageDynamicWithDiskIdByVmId() throws Exception { Guid imageId = FixturesTool.IMAGE_ID_2; Guid imageGroupId = FixturesTool.IMAGE_GROUP_ID_2; DiskImageDynamic existingDynamic2 = dao.get(imageId); assertFalse(existingDynamic2.getReadRate().equals(120)); VmDevice device = dbFacade.getVmDeviceDao().get(new VmDeviceId(imageGroupId, FixturesTool.VM_RHEL5_POOL_57)); assertNull(device.getSnapshotId()); existingDynamic2.setId(imageGroupId); Integer readRate = 120; existingDynamic2.setReadRate(readRate); // test that the record is updated when the active disk is attached to the vm dao.updateAllDiskImageDynamicWithDiskIdByVmId(Collections.singleton(new Pair<>(FixturesTool.VM_RHEL5_POOL_57, existingDynamic2))); existingDynamic2.setId(imageId); assertEquals(existingDynamic2, dao.get(imageId)); // test that the record isn't updated when a snapshot of the disk is attached to the vm device.setSnapshotId(FixturesTool.EXISTING_SNAPSHOT_ID); dbFacade.getVmDeviceDao().update(device); existingDynamic2.setReadRate(150); dao.updateAllDiskImageDynamicWithDiskIdByVmId(Collections.singleton(new Pair<>(FixturesTool.VM_RHEL5_POOL_57, existingDynamic2))); assertEquals(readRate, dao.get(imageId).getReadRate()); } @Test public void sortDiskImageDynamicForUpdate() throws Exception { Guid firstGuid = Guid.Empty; Guid secondGuid = Guid.createGuidFromString("11111111-1111-1111-1111-111111111111"); Guid thirdGuid = Guid.createGuidFromString("22222222-2222-2222-2222-222222222222"); List<Pair<Guid, DiskImageDynamic>> diskImageDynamicForVm = new LinkedList<>(); diskImageDynamicForVm.add(new Pair<>(Guid.Empty, createDiskImageDynamic(thirdGuid))); diskImageDynamicForVm.add(new Pair<>(Guid.Empty, createDiskImageDynamic(secondGuid))); diskImageDynamicForVm.add(new Pair<>(Guid.Empty, createDiskImageDynamic(firstGuid))); List<Pair<Guid, DiskImageDynamic>> sortedList = DiskImageDynamicDaoImpl.sortDiskImageDynamicForUpdate(diskImageDynamicForVm); Collections.reverse(diskImageDynamicForVm); assertEquals(diskImageDynamicForVm, sortedList); } }