Idan Shaby has uploaded a new change for review. Change subject: core: add MemoryStorageHandler the ability to sort ......................................................................
core: add MemoryStorageHandler the ability to sort This patch adds the MemoryStorageHandler mechanism the ability to sort the list of storage domains according to given comparators logic. For example, sort by the available disk size of a storage domain. This way, if we have more than one valid candidate, we can sort the list and get the most suitable domain out of it. When there is more than one comparator, a nested sort is performed. Change-Id: I00ad78fca97527a7dbf426a28ced7314a7bd921c Bug-Url: https://bugzilla.redhat.com/1186230 Signed-off-by: Idan Shaby <ish...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandler.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainAvailableDiskSizeComparator.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainNumberOfVmDisksComparator.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageTypeComparator.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandlerTest.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterAbstractTest.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterTest.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainSpaceRequirementsFilterTest.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainStatusFilterTest.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainTypeFilterTest.java A backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainAvailableDiskSizeComparatorTest.java A backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainComparatorAbstractTest.java A backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainNumberOfVmDisksComparatorTest.java A backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageTypeComparatorTest.java 17 files changed, 429 insertions(+), 33 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/38/40438/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java index 4aa8135..d4322a8 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java @@ -214,7 +214,7 @@ public Guid getStorageDomainIdForVmMemory(List<DiskImage> memoryDisksList) { if (cachedStorageDomainId.equals(Guid.Empty) && getVm() != null) { StorageDomain storageDomain = MemoryStorageHandler.getInstance().findStorageDomainForMemory( - getVm().getStoragePoolId(), memoryDisksList); + getVm().getStoragePoolId(), memoryDisksList, getDisksList()); if (storageDomain != null) { cachedStorageDomainId = storageDomain.getId(); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java index 246d414..1cbf44c 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java @@ -83,7 +83,8 @@ getVm().getTotalMemorySizeInBytes(), MemoryUtils.META_DATA_SIZE_IN_BYTES); StorageDomain storageDomain = MemoryStorageHandler.getInstance().findStorageDomainForMemory( - getStoragePoolId(), diskDummiesForMemSize); + getStoragePoolId(), diskDummiesForMemSize, + ImagesHandler.filterImageDisks(getDiskDao().getAllForVm(getVmId()), false, false, false)); if (storageDomain != null) { cachedStorageDomainId = storageDomain.getId(); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java index 6f33751..965f56f 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java @@ -7,6 +7,7 @@ import java.util.Date; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -554,11 +555,21 @@ private StorageDomain updateStorageDomainInMemoryVolumes(List<DiskImage> disksList) { List<DiskImage> memoryDisksList = MemoryUtils.createDiskDummies(getVm().getTotalMemorySizeInBytes(), MemoryUtils.META_DATA_SIZE_IN_BYTES); StorageDomain storageDomain = MemoryStorageHandler.getInstance().findStorageDomainForMemory( - getParameters().getStoragePoolId(), memoryDisksList); + getParameters().getStoragePoolId(), memoryDisksList, getVmDisksDummies()); disksList.addAll(memoryDisksList); return storageDomain; } + private Collection<DiskImage> getVmDisksDummies() { + Collection<DiskImage> disksDummies = new LinkedList<>(); + for (Guid storageDomainId : getParameters().getImageToDestinationDomainMap().values()) { + DiskImage diskImage = new DiskImage(); + diskImage.setStorageIds(new ArrayList<Guid>(Arrays.asList(storageDomainId))); + disksDummies.add(diskImage); + } + return disksDummies; + } + /** * Validates that there is no duplicate VM. * @return <code>true</code> if the validation passes, <code>false</code> otherwise. diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandler.java index 7904374..f8e7386 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandler.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandler.java @@ -2,13 +2,19 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.List; +import org.apache.commons.collections.comparators.ComparatorChain; import org.ovirt.engine.core.bll.memory.storageDomainFilters.StorageDomainFilter; import org.ovirt.engine.core.bll.memory.storageDomainFilters.StorageDomainSpaceRequirementsFilter; import org.ovirt.engine.core.bll.memory.storageDomainFilters.StorageDomainStatusFilter; import org.ovirt.engine.core.bll.memory.storageDomainFilters.StorageDomainTypeFilter; +import org.ovirt.engine.core.bll.memory.storageDomainsComparators.StorageDomainAvailableDiskSizeComparator; +import org.ovirt.engine.core.bll.memory.storageDomainsComparators.StorageDomainNumberOfVmDisksComparator; +import org.ovirt.engine.core.bll.memory.storageDomainsComparators.StorageTypeComparator; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.StorageType; @@ -33,34 +39,39 @@ * * @param storagePoolId * The storage pool where the search for a domain will be made - * @param disksList + * @param memoryDisks * Disks for which space is needed + * @param vmDisks + * The vm's active snapshot disks. * @return storage domain in the given pool with at least the required amount of free space, * or null if no such storage domain exists in the pool */ - public StorageDomain findStorageDomainForMemory(Guid storagePoolId, List<DiskImage> disksList) { + public StorageDomain findStorageDomainForMemory(Guid storagePoolId, List<DiskImage> memoryDisks, + Collection<DiskImage> vmDisks) { List<StorageDomain> domainsInPool = DbFacade.getInstance().getStorageDomainDao().getAllForStoragePool(storagePoolId); - StorageDomain storageDomainForMemory = findStorageDomainForMemory(domainsInPool, disksList); + StorageDomain storageDomainForMemory = findStorageDomainForMemory(domainsInPool, memoryDisks, vmDisks); if (storageDomainForMemory != null) { - updateDisksStorage(storageDomainForMemory, disksList); + updateDisksStorage(storageDomainForMemory, memoryDisks); } return storageDomainForMemory; } - public void updateDisksStorage(StorageDomain storageDomain, List<DiskImage> disksList) { - for (DiskImage disk : disksList) { + public void updateDisksStorage(StorageDomain storageDomain, List<DiskImage> memoryDisks) { + for (DiskImage disk : memoryDisks) { disk.setStorageIds(new ArrayList<Guid>(Collections.singletonList(storageDomain.getId()))); } /* There should be two disks in the disksList, first of which is memory disk. Only its volume type should be modified. */ - updateDiskVolumeType(storageDomain.getStorageType(), disksList.get(0)); + updateDiskVolumeType(storageDomain.getStorageType(), memoryDisks.get(0)); } - protected StorageDomain findStorageDomainForMemory(List<StorageDomain> domainsInPool, List<DiskImage> disksList) { - domainsInPool = filterStorageDomains(domainsInPool, disksList); + protected StorageDomain findStorageDomainForMemory(List<StorageDomain> domainsInPool, List<DiskImage> memoryDisks, + Collection<DiskImage> vmDisks) { + domainsInPool = filterStorageDomains(domainsInPool, memoryDisks); + sortStorageDomains(domainsInPool, vmDisks); return domainsInPool.isEmpty() ? null : domainsInPool.get(0); } @@ -70,13 +81,29 @@ new StorageDomainSpaceRequirementsFilter()); } - protected List<StorageDomain> filterStorageDomains(List<StorageDomain> domainsInPool, List<DiskImage> disksList) { + protected List<? extends Comparator<StorageDomain>> getStorageDomainComparators( + List<StorageDomain> domainsInPool, Collection<DiskImage> vmDisks) { + return Arrays.asList(new StorageDomainNumberOfVmDisksComparator(domainsInPool, vmDisks), + new StorageTypeComparator(), + new StorageDomainAvailableDiskSizeComparator()); + } + + protected List<StorageDomain> filterStorageDomains(List<StorageDomain> domainsInPool, List<DiskImage> memoryDisks) { for (StorageDomainFilter storageDomainFilter : getStorageDomainFilters()) { - domainsInPool = storageDomainFilter.filterStorageDomains(domainsInPool, disksList); + domainsInPool = storageDomainFilter.filterStorageDomains(domainsInPool, memoryDisks); } return domainsInPool; } + protected void sortStorageDomains(List<StorageDomain> domainsInPool, Collection<DiskImage> vmDisks) { + ComparatorChain comparatorChain = new ComparatorChain(); + // When there is more than one comparator, a nested sort is performed. + for (Comparator<StorageDomain> comparator : getStorageDomainComparators(domainsInPool, vmDisks)) { + comparatorChain.addComparator(comparator, true); + } + Collections.sort(domainsInPool, comparatorChain); + } + private void updateDiskVolumeType(StorageType storageType, DiskImage disk) { VolumeType volumeType = storageType.isFileDomain() ? VolumeType.Sparse : VolumeType.Preallocated; disk.setVolumeType(volumeType); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainAvailableDiskSizeComparator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainAvailableDiskSizeComparator.java new file mode 100644 index 0000000..a1fa37e --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainAvailableDiskSizeComparator.java @@ -0,0 +1,13 @@ +package org.ovirt.engine.core.bll.memory.storageDomainsComparators; + +import java.util.Comparator; + +import org.ovirt.engine.core.common.businessentities.StorageDomain; + +public class StorageDomainAvailableDiskSizeComparator implements Comparator<StorageDomain> { + + @Override + public int compare(StorageDomain storageDomain, StorageDomain storageDomain2) { + return storageDomain.getAvailableDiskSize().compareTo(storageDomain2.getAvailableDiskSize()); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainNumberOfVmDisksComparator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainNumberOfVmDisksComparator.java new file mode 100644 index 0000000..64c4ded --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainNumberOfVmDisksComparator.java @@ -0,0 +1,42 @@ +package org.ovirt.engine.core.bll.memory.storageDomainsComparators; + +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.storage.DiskImage; +import org.ovirt.engine.core.compat.Guid; + +public class StorageDomainNumberOfVmDisksComparator implements Comparator<StorageDomain> { + + private Map<Guid, Integer> numOfVmDisksInStorageDomains; + + public StorageDomainNumberOfVmDisksComparator(List<StorageDomain> domainsInPool, Collection<DiskImage> vmDisks) { + setUpNumOfVmDisksInStorageDomains(domainsInPool, vmDisks); + } + + @Override + public int compare(StorageDomain storageDomain, StorageDomain storageDomain2) { + Integer numOfVmDisksInStorageDomain = numOfVmDisksInStorageDomains.get(storageDomain.getId()); + Integer numOfVmDisksInStorageDomain2 = numOfVmDisksInStorageDomains.get(storageDomain2.getId()); + return numOfVmDisksInStorageDomain.compareTo(numOfVmDisksInStorageDomain2); + } + + private void setUpNumOfVmDisksInStorageDomains(List<StorageDomain> domainsInPool, Collection<DiskImage> vmDisks) { + numOfVmDisksInStorageDomains = new HashMap<>(); + + // Initialize each storage domain to have 0 disks. + for (StorageDomain storageDomain : domainsInPool) { + numOfVmDisksInStorageDomains.put(storageDomain.getId(), 0); + } + + for (DiskImage vmDisk : vmDisks) { + Guid vmDiskStorageDomainId = vmDisk.getStorageIds().get(0); + numOfVmDisksInStorageDomains.put(vmDiskStorageDomainId, + numOfVmDisksInStorageDomains.get(vmDiskStorageDomainId) + 1); + } + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageTypeComparator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageTypeComparator.java new file mode 100644 index 0000000..ddaf8c7 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageTypeComparator.java @@ -0,0 +1,14 @@ +package org.ovirt.engine.core.bll.memory.storageDomainsComparators; + +import java.util.Comparator; + +import org.ovirt.engine.core.common.businessentities.StorageDomain; + +public class StorageTypeComparator implements Comparator<StorageDomain> { + + @Override + public int compare(StorageDomain storageDomain, StorageDomain storageDomain2) { + return Boolean.compare(storageDomain.getStorageType().isFileDomain(), + storageDomain2.getStorageType().isFileDomain()); + } +} diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandlerTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandlerTest.java index 7a8cda2..e58e95b 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandlerTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandlerTest.java @@ -1,9 +1,11 @@ package org.ovirt.engine.core.bll.memory; import static org.junit.Assert.assertEquals; +import static org.mockito.Matchers.anyListOf; import static org.mockito.Mockito.doReturn; import java.util.Arrays; +import java.util.Comparator; import java.util.LinkedList; import java.util.List; @@ -21,41 +23,48 @@ @RunWith(MockitoJUnitRunner.class) public class MemoryStorageHandlerTest { - private StorageDomain validStorageDomain; + private StorageDomain validStorageDomain1; + private StorageDomain validStorageDomain2; + private StorageDomain validStorageDomain3; private StorageDomain invalidStorageDomain1; private StorageDomain invalidStorageDomain2; private StorageDomain invalidStorageDomain3; private StorageDomainFilter filter1; private StorageDomainFilter filter2; private StorageDomainFilter filter3; - private List<DiskImage> disksList; + private Comparator<StorageDomain> comparator1; + private Comparator<StorageDomain> comparator2; + private List<DiskImage> memoryDisks; + private List<DiskImage> vmDisks; @Spy private MemoryStorageHandler memoryStorageHandler = MemoryStorageHandler.getInstance(); @Before public void setUp() { - disksList = new LinkedList<>(); + memoryDisks = new LinkedList<>(); + vmDisks = new LinkedList<>(); initStorageDomains(); initFilters(); + initComparators(); } @Test public void filterAllDomainsExceptForTheFirstOne() { filterAllStorageDomainsExceptOne(Arrays.asList( - validStorageDomain, invalidStorageDomain1, invalidStorageDomain2), validStorageDomain); + validStorageDomain1, invalidStorageDomain1, invalidStorageDomain2), validStorageDomain1); } @Test public void filterAllDomainsExceptForTheSecondOne() { filterAllStorageDomainsExceptOne(Arrays.asList( - invalidStorageDomain1, validStorageDomain, invalidStorageDomain2), validStorageDomain); + invalidStorageDomain1, validStorageDomain1, invalidStorageDomain2), validStorageDomain1); } @Test public void filterAllDomainsExceptForTheThirdOne() { filterAllStorageDomainsExceptOne(Arrays.asList( - invalidStorageDomain1, invalidStorageDomain2, validStorageDomain), validStorageDomain); + invalidStorageDomain1, invalidStorageDomain2, validStorageDomain1), validStorageDomain1); } @Test @@ -63,8 +72,29 @@ verifyDomainForMemory(Arrays.asList(invalidStorageDomain1, invalidStorageDomain2, invalidStorageDomain3), null); } + @Test + public void sortStorageDomainsWithSingleComparator() { + sortStorageDomains(Arrays.asList(validStorageDomain1, validStorageDomain3), + Arrays.asList(validStorageDomain3, validStorageDomain1)); + } + + @Test + public void sortStorageDomainsWithWithMultipleComparators() { + sortStorageDomains(Arrays.asList(validStorageDomain1, validStorageDomain2, validStorageDomain3), + Arrays.asList(validStorageDomain3, validStorageDomain1, validStorageDomain2)); + } + + @Test + public void testFindStorageDomainForMemory() { + verifyDomainForMemory( + Arrays.asList(invalidStorageDomain1, validStorageDomain1, invalidStorageDomain2, + validStorageDomain2, invalidStorageDomain3, validStorageDomain3), validStorageDomain3); + } + private void initStorageDomains() { - validStorageDomain = initStorageDomain(); + validStorageDomain1 = initStorageDomain(); + validStorageDomain2 = initStorageDomain(); + validStorageDomain3 = initStorageDomain(); invalidStorageDomain1 = initStorageDomain(); invalidStorageDomain2 = initStorageDomain(); invalidStorageDomain3 = initStorageDomain(); @@ -80,6 +110,14 @@ doReturn(storageDomainFilters).when(memoryStorageHandler).getStorageDomainFilters(); } + private void initComparators() { + List<? extends Comparator<StorageDomain>> comparators = Arrays.asList( + new SmallestStorageDomainComparator(validStorageDomain2), + new BiggestStorageDomainComparator(validStorageDomain3)); + doReturn(comparators).when(memoryStorageHandler) + .getStorageDomainComparators(anyListOf(StorageDomain.class), anyListOf(DiskImage.class)); + } + private StorageDomain initStorageDomain() { StorageDomain storageDomain = new StorageDomain(); storageDomain.setId(Guid.newGuid()); @@ -89,14 +127,19 @@ private void filterAllStorageDomainsExceptOne(List<StorageDomain> storageDomains, StorageDomain expectedStorageDomain) { List<StorageDomain> filteredStorageDomains = - memoryStorageHandler.filterStorageDomains(storageDomains, disksList); + memoryStorageHandler.filterStorageDomains(storageDomains, memoryDisks); assertEquals(filteredStorageDomains, Arrays.asList(expectedStorageDomain)); } private void verifyDomainForMemory(List<StorageDomain> storageDomains, StorageDomain expectedStorageDomain) { StorageDomain storageDomain = - memoryStorageHandler.findStorageDomainForMemory(storageDomains, disksList); + memoryStorageHandler.findStorageDomainForMemory(storageDomains, memoryDisks, vmDisks); assertEquals(expectedStorageDomain, storageDomain); + } + + private void sortStorageDomains(List<StorageDomain> domainsInPool, List<StorageDomain> expectedSortedList) { + memoryStorageHandler.sortStorageDomains(domainsInPool, vmDisks); + assertEquals(domainsInPool, expectedSortedList); } private static class StorageDomainRejectingFilter extends StorageDomainFilter { @@ -117,4 +160,65 @@ }; } } + + private static abstract class StorageDomainAbstractComparator implements Comparator<StorageDomain> { + + private StorageDomain storageDomain; + + public StorageDomainAbstractComparator(StorageDomain storageDomain) { + this.storageDomain = storageDomain; + } + + @Override + public int compare(StorageDomain storageDomain, StorageDomain storageDomain2) { + if (storageDomain.equals(storageDomain2)) { + return 0; + } + else if (storageDomain.equals(this.storageDomain)){ + return equalsToFirstStorageDomain(); + } + else if (storageDomain2.equals(this.storageDomain)){ + return equalsToSecondStorageDomain(); + } + return 0; + } + + protected abstract int equalsToFirstStorageDomain(); + + protected abstract int equalsToSecondStorageDomain(); + } + + private static class BiggestStorageDomainComparator extends StorageDomainAbstractComparator { + + public BiggestStorageDomainComparator(StorageDomain storageDomain) { + super(storageDomain); + } + + @Override + protected int equalsToFirstStorageDomain() { + return 1; + } + + @Override + protected int equalsToSecondStorageDomain() { + return -1; + } + } + + private static class SmallestStorageDomainComparator extends StorageDomainAbstractComparator { + + public SmallestStorageDomainComparator(StorageDomain storageDomain) { + super(storageDomain); + } + + @Override + protected int equalsToFirstStorageDomain() { + return -1; + } + + @Override + protected int equalsToSecondStorageDomain() { + return 1; + } + } } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterAbstractTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterAbstractTest.java index d7c0972..3275b10 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterAbstractTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterAbstractTest.java @@ -11,12 +11,12 @@ public class StorageDomainFilterAbstractTest { protected StorageDomain storageDomain; - protected List<DiskImage> disksList; + protected List<DiskImage> memoryDisks; @Before public void setUp() { storageDomain = new StorageDomain(); storageDomain.setId(Guid.newGuid()); - disksList = new LinkedList<>(); + memoryDisks = new LinkedList<>(); } } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterTest.java index 0c04aa9..baa1902 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainFilterTest.java @@ -46,6 +46,6 @@ when(predicate.eval(storageDomain)).thenReturn(!removeStorageDomainFromList); List<StorageDomain> storageDomains = Arrays.asList(storageDomain); - return filter.filterStorageDomains(storageDomains, disksList); + return filter.filterStorageDomains(storageDomains, memoryDisks); } } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainSpaceRequirementsFilterTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainSpaceRequirementsFilterTest.java index c954753..0743a6c 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainSpaceRequirementsFilterTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainSpaceRequirementsFilterTest.java @@ -39,21 +39,21 @@ @Test public void testStorageDomainForMemoryIsValid() { - assertTrue(filter.getPredicate(disksList).eval(storageDomain)); + assertTrue(filter.getPredicate(memoryDisks).eval(storageDomain)); } @Test public void testStorageDomainForMemoryIsNotValidWhenItHasLowSpace() { when(storageDomainValidator.isDomainWithinThresholds()) .thenReturn(new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN)); - assertFalse(filter.getPredicate(disksList).eval(storageDomain)); + assertFalse(filter.getPredicate(memoryDisks).eval(storageDomain)); } @Test public void testStorageDomainForMemoryIsNotValidWhenItHasNoSpaceForClonedDisks() { - when(storageDomainValidator.hasSpaceForClonedDisks(disksList)) + when(storageDomainValidator.hasSpaceForClonedDisks(memoryDisks)) .thenReturn(new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN)); - assertFalse(filter.getPredicate(disksList).eval(storageDomain)); + assertFalse(filter.getPredicate(memoryDisks).eval(storageDomain)); } private void initFilter() { @@ -63,7 +63,7 @@ private void initStorageDomainValidator() { when(storageDomainValidator.isDomainWithinThresholds()).thenReturn(ValidationResult.VALID); - when(storageDomainValidator.hasSpaceForClonedDisks(disksList)) + when(storageDomainValidator.hasSpaceForClonedDisks(memoryDisks)) .thenReturn(ValidationResult.VALID); } } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainStatusFilterTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainStatusFilterTest.java index 6039834..e84866e 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainStatusFilterTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainStatusFilterTest.java @@ -27,7 +27,7 @@ @Theory public void testStorageDomainForMemoryIsValidOnlyForActiveStatus(StorageDomainStatus storageDomainStatus) { storageDomain.setStatus(storageDomainStatus); - assertEquals(filter.getPredicate(disksList).eval(storageDomain), + assertEquals(filter.getPredicate(memoryDisks).eval(storageDomain), storageDomainStatus == StorageDomainStatus.Active); } } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainTypeFilterTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainTypeFilterTest.java index f000dc2..d3aa020 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainTypeFilterTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainFilters/StorageDomainTypeFilterTest.java @@ -27,6 +27,6 @@ @Theory public void testStorageDomainForMemoryIsValidOnlyForDataTypes(StorageDomainType storageDomainType) { storageDomain.setStorageDomainType(storageDomainType); - assertEquals(filter.getPredicate(disksList).eval(storageDomain), storageDomainType.isDataDomain()); + assertEquals(filter.getPredicate(memoryDisks).eval(storageDomain), storageDomainType.isDataDomain()); } } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainAvailableDiskSizeComparatorTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainAvailableDiskSizeComparatorTest.java new file mode 100644 index 0000000..76ee1e1 --- /dev/null +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainAvailableDiskSizeComparatorTest.java @@ -0,0 +1,43 @@ +package org.ovirt.engine.core.bll.memory.storageDomainsComparators; + +import org.junit.ClassRule; +import org.junit.Test; +import org.ovirt.engine.core.utils.RandomUtils; +import org.ovirt.engine.core.utils.RandomUtilsSeedingRule; + +public class StorageDomainAvailableDiskSizeComparatorTest extends StorageDomainComparatorAbstractTest { + + @ClassRule + public static RandomUtilsSeedingRule rusr = new RandomUtilsSeedingRule(); + + public StorageDomainAvailableDiskSizeComparatorTest() { + comparator = new StorageDomainAvailableDiskSizeComparator(); + } + + @Test + public void compareWhenSizesAreEqual() { + int availableDiskSize = getRandomNumberForTest(); + setStorageDomainsAvailableDiskSize(availableDiskSize, availableDiskSize); + + assertEqualsTo(storageDomain1, storageDomain2); + } + + @Test + public void compareWhenSizesAreNotEqual() { + int availableDiskSize = getRandomNumberForTest(); + setStorageDomainsAvailableDiskSize(availableDiskSize, availableDiskSize / 2); + + assertBiggerThan(storageDomain1, storageDomain2); + assertSmallerThan(storageDomain2, storageDomain1); + } + + private int getRandomNumberForTest() { + return RandomUtils.instance().nextInt(2, Integer.MAX_VALUE); + } + + private void setStorageDomainsAvailableDiskSize(int storageDomain1AvailableDiskSize, + int storageDomain2AvailableDiskSize) { + storageDomain1.setAvailableDiskSize(storageDomain1AvailableDiskSize); + storageDomain2.setAvailableDiskSize(storageDomain2AvailableDiskSize); + } +} diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainComparatorAbstractTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainComparatorAbstractTest.java new file mode 100644 index 0000000..22183f4 --- /dev/null +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainComparatorAbstractTest.java @@ -0,0 +1,44 @@ +package org.ovirt.engine.core.bll.memory.storageDomainsComparators; + +import static org.junit.Assert.assertTrue; + +import java.util.Comparator; + +import org.junit.Before; +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.compat.Guid; + +public class StorageDomainComparatorAbstractTest { + + protected Comparator<StorageDomain> comparator; + protected StorageDomain storageDomain1; + protected StorageDomain storageDomain2; + + @Before + public void setUp() { + storageDomain1 = initStorageDomain(); + storageDomain2 = initStorageDomain(); + } + + protected void assertSmallerThan(StorageDomain firstStorageDomain, StorageDomain secondStorageDomain) { + assertTrue(compareStorageDomains(firstStorageDomain, secondStorageDomain) < 0); + } + + protected void assertEqualsTo(StorageDomain firstStorageDomain, StorageDomain secondStorageDomain) { + assertTrue(compareStorageDomains(firstStorageDomain, secondStorageDomain) == 0); + } + + protected void assertBiggerThan(StorageDomain firstStorageDomain, StorageDomain secondStorageDomain) { + assertTrue(compareStorageDomains(firstStorageDomain, secondStorageDomain) > 0); + } + + private int compareStorageDomains(StorageDomain firstStorageDomain, StorageDomain secondStorageDomain) { + return comparator.compare(firstStorageDomain, secondStorageDomain); + } + + private StorageDomain initStorageDomain() { + StorageDomain storageDomain = new StorageDomain(); + storageDomain.setId(Guid.newGuid()); + return storageDomain; + } +} diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainNumberOfVmDisksComparatorTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainNumberOfVmDisksComparatorTest.java new file mode 100644 index 0000000..6c65f5f --- /dev/null +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageDomainNumberOfVmDisksComparatorTest.java @@ -0,0 +1,64 @@ +package org.ovirt.engine.core.bll.memory.storageDomainsComparators; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.storage.DiskImage; +import org.ovirt.engine.core.compat.Guid; + +public class StorageDomainNumberOfVmDisksComparatorTest extends StorageDomainComparatorAbstractTest { + + private List<StorageDomain> storageDomains; + private DiskImage vmDisk1; + private DiskImage vmDisk2; + private DiskImage vmDisk3; + + @Before + @Override + public void setUp() { + super.setUp(); + storageDomains = Arrays.asList(storageDomain1, storageDomain2); + vmDisk1 = new DiskImage(); + vmDisk2 = new DiskImage(); + vmDisk3 = new DiskImage(); + } + + @Test + public void compareWhenStorageDomainsHaveNoDisks() { + initComparator(); + assertEqualsTo(storageDomain1, storageDomain2); + } + + @Test + public void compareWhenSizesAreEqual() { + attachVmDisksToStorageDomain(storageDomain1, vmDisk1); + attachVmDisksToStorageDomain(storageDomain2, vmDisk2); + initComparator(vmDisk1, vmDisk2); + + assertEqualsTo(storageDomain1, storageDomain2); + } + + @Test + public void compareWhenSizesAreNotEqual() { + attachVmDisksToStorageDomain(storageDomain1, vmDisk1, vmDisk2); + attachVmDisksToStorageDomain(storageDomain2, vmDisk3); + initComparator(vmDisk1, vmDisk2, vmDisk3); + + assertBiggerThan(storageDomain1, storageDomain2); + assertSmallerThan(storageDomain2, storageDomain1); + } + + private void attachVmDisksToStorageDomain(StorageDomain storageDomain, DiskImage... vmDisks) { + for (DiskImage diskImage : vmDisks) { + diskImage.setStorageIds(new ArrayList<Guid>(Arrays.asList(storageDomain.getId()))); + } + } + + private void initComparator(DiskImage... vmDisks) { + comparator = new StorageDomainNumberOfVmDisksComparator(storageDomains, Arrays.asList(vmDisks)); + } +} diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageTypeComparatorTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageTypeComparatorTest.java new file mode 100644 index 0000000..7ab4e9e --- /dev/null +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/storageDomainsComparators/StorageTypeComparatorTest.java @@ -0,0 +1,33 @@ +package org.ovirt.engine.core.bll.memory.storageDomainsComparators; + +import static org.junit.Assert.assertEquals; + +import org.junit.experimental.theories.DataPoints; +import org.junit.experimental.theories.Theories; +import org.junit.experimental.theories.Theory; +import org.junit.runner.RunWith; +import org.ovirt.engine.core.common.businessentities.storage.StorageType; + +@RunWith(Theories.class) +public class StorageTypeComparatorTest extends StorageDomainComparatorAbstractTest { + + @DataPoints + public static StorageType[] storageTypes = StorageType.values(); + + public StorageTypeComparatorTest() { + comparator = new StorageTypeComparator(); + } + + @Theory + public void testCompare(StorageType storageType) { + storageDomain1.setStorageType(storageType); + for (StorageType storageType2 : StorageType.values()) { + storageDomain2.setStorageType(storageType2); + int compareTypes = Boolean.compare(storageType.isFileDomain(), storageType2.isFileDomain()); + int comparatorReturnValue = comparator.compare(storageDomain1, storageDomain2); + assertEquals(compareTypes < 0, comparatorReturnValue < 0); + assertEquals(compareTypes == 0, comparatorReturnValue == 0); + assertEquals(compareTypes > 0, comparatorReturnValue > 0); + } + } +} -- To view, visit https://gerrit.ovirt.org/40438 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I00ad78fca97527a7dbf426a28ced7314a7bd921c Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Idan Shaby <ish...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches