Idan Shaby has uploaded a new change for review. Change subject: core: move logic regarding memory storage handling ......................................................................
core: move logic regarding memory storage handling This patch moves the logic regarding memory storage handling from VmHandler to a more specific new handler, MemoryStorageHandler. Change-Id: I367ee3b1e902495472e687b6dad63bc305b2c8bb 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/VmHandler.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandler.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/VmHandlerTest.java A backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandlerTest.java 7 files changed, 156 insertions(+), 120 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/33/40433/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 e293231..ee2d4d7 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 @@ -11,6 +11,7 @@ import org.ovirt.engine.core.bll.job.ExecutionHandler; import org.ovirt.engine.core.bll.memory.LiveSnapshotMemoryImageBuilder; import org.ovirt.engine.core.bll.memory.MemoryImageBuilder; +import org.ovirt.engine.core.bll.memory.MemoryStorageHandler; import org.ovirt.engine.core.bll.memory.MemoryUtils; import org.ovirt.engine.core.bll.memory.NullableMemoryImageBuilder; import org.ovirt.engine.core.bll.memory.StatelessSnapshotMemoryImageBuilder; @@ -212,7 +213,8 @@ public Guid getStorageDomainIdForVmMemory(List<DiskImage> memoryDisksList) { if (cachedStorageDomainId.equals(Guid.Empty) && getVm() != null) { - StorageDomain storageDomain = VmHandler.findStorageDomainForMemory(getVm().getStoragePoolId(), memoryDisksList); + StorageDomain storageDomain = MemoryStorageHandler.findStorageDomainForMemory(getVm().getStoragePoolId(), + memoryDisksList); 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 7e869d8..b1aea13 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 @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; +import org.ovirt.engine.core.bll.memory.MemoryStorageHandler; import org.ovirt.engine.core.bll.memory.MemoryUtils; import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil; import org.ovirt.engine.core.bll.validator.LocalizedVmStatus; @@ -81,7 +82,8 @@ List<DiskImage> diskDummiesForMemSize = MemoryUtils.createDiskDummies( getVm().getTotalMemorySizeInBytes(), MemoryUtils.META_DATA_SIZE_IN_BYTES); - StorageDomain storageDomain = VmHandler.findStorageDomainForMemory(getStoragePoolId(), diskDummiesForMemSize); + StorageDomain storageDomain = MemoryStorageHandler.findStorageDomainForMemory(getStoragePoolId(), + diskDummiesForMemSize); 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 3d9c6e2..4a7553e 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 @@ -15,6 +15,7 @@ import org.apache.commons.lang.NotImplementedException; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.context.CommandContext; +import org.ovirt.engine.core.bll.memory.MemoryStorageHandler; import org.ovirt.engine.core.bll.memory.MemoryUtils; import org.ovirt.engine.core.bll.network.VmInterfaceManager; import org.ovirt.engine.core.bll.profiles.CpuProfileHelper; @@ -552,7 +553,8 @@ private StorageDomain updateStorageDomainInMemoryVolumes(List<DiskImage> disksList) { List<DiskImage> memoryDisksList = MemoryUtils.createDiskDummies(getVm().getTotalMemorySizeInBytes(), MemoryUtils.META_DATA_SIZE_IN_BYTES); - StorageDomain storageDomain = VmHandler.findStorageDomainForMemory(getParameters().getStoragePoolId(), memoryDisksList); + StorageDomain storageDomain = MemoryStorageHandler.findStorageDomainForMemory(getParameters().getStoragePoolId(), + memoryDisksList); disksList.addAll(memoryDisksList); return storageDomain; } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java index 0ecc8e4..9ff21b1 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -20,7 +19,6 @@ import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.bll.utils.VmDeviceUtils; import org.ovirt.engine.core.bll.validator.VmValidationUtils; -import org.ovirt.engine.core.bll.validator.storage.StorageDomainValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.FeatureSupported; import org.ovirt.engine.core.common.VdcObjectType; @@ -39,8 +37,6 @@ import org.ovirt.engine.core.common.businessentities.GuestAgentStatus; import org.ovirt.engine.core.common.businessentities.NumaTuneMode; import org.ovirt.engine.core.common.businessentities.Snapshot; -import org.ovirt.engine.core.common.businessentities.StorageDomain; -import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.UsbPolicy; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSGroup; @@ -57,8 +53,6 @@ import org.ovirt.engine.core.common.businessentities.storage.Disk; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.DiskInterface; -import org.ovirt.engine.core.common.businessentities.storage.StorageType; -import org.ovirt.engine.core.common.businessentities.storage.VolumeType; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.errors.VdcBLLException; @@ -720,54 +714,6 @@ if (osRepository.isLinux(vmBase.getOsId()) && vmBase.getUsbPolicy().equals(UsbPolicy.ENABLED_LEGACY)) { vmBase.setUsbPolicy(UsbPolicy.DISABLED); } - } - - /** - * Returns a <code>StorageDomain</code> in the given <code>StoragePool</code> that has - * at least as much as requested free space and can be used to store memory images - * - * @param storagePoolId - * The storage pool where the search for a domain will be made - * @param disksList - * Disks for which space is needed - * @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 static StorageDomain findStorageDomainForMemory(Guid storagePoolId, List<DiskImage> disksList) { - List<StorageDomain> domainsInPool = DbFacade.getInstance().getStorageDomainDao().getAllForStoragePool(storagePoolId); - return findStorageDomainForMemory(domainsInPool, disksList); - } - - protected static StorageDomain findStorageDomainForMemory(List<StorageDomain> domainsInPool, List<DiskImage> disksList) { - for (StorageDomain currDomain : domainsInPool) { - - updateDisksStorage(currDomain, disksList); - if (currDomain.getStorageDomainType().isDataDomain() - && currDomain.getStatus() == StorageDomainStatus.Active - && validateSpaceRequirements(currDomain, disksList)) { - return currDomain; - } - } - return null; - } - - private static void updateDisksStorage(StorageDomain storageDomain, List<DiskImage> disksList) { - for (DiskImage disk : disksList) { - 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)); - } - - private static void updateDiskVolumeType(StorageType storageType, DiskImage disk) { - VolumeType volumeType = storageType.isFileDomain() ? VolumeType.Sparse : VolumeType.Preallocated; - disk.setVolumeType(volumeType); - } - - private static boolean validateSpaceRequirements(StorageDomain storageDomain, List<DiskImage> disksList) { - StorageDomainValidator storageDomainValidator = new StorageDomainValidator(storageDomain); - return (storageDomainValidator.isDomainWithinThresholds().isValid() && - storageDomainValidator.hasSpaceForClonedDisks(disksList).isValid()); } public static ValidationResult canRunActionOnNonManagedVm(VM vm, VdcActionType actionType) { 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 new file mode 100644 index 0000000..fb5e475 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandler.java @@ -0,0 +1,70 @@ +package org.ovirt.engine.core.bll.memory; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.ovirt.engine.core.bll.validator.storage.StorageDomainValidator; +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; +import org.ovirt.engine.core.common.businessentities.storage.DiskImage; +import org.ovirt.engine.core.common.businessentities.storage.StorageType; +import org.ovirt.engine.core.common.businessentities.storage.VolumeType; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; + +public class MemoryStorageHandler { + + /** + * Returns a <code>StorageDomain</code> in the given <code>StoragePool</code> that has + * at least as much as requested free space and can be used to store memory images + * + * @param storagePoolId + * The storage pool where the search for a domain will be made + * @param disksList + * Disks for which space is needed + * @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 static StorageDomain findStorageDomainForMemory(Guid storagePoolId, List<DiskImage> disksList) { + List<StorageDomain> domainsInPool = + DbFacade.getInstance().getStorageDomainDao().getAllForStoragePool(storagePoolId); + return findStorageDomainForMemory(domainsInPool, disksList); + } + + protected static StorageDomain findStorageDomainForMemory(List<StorageDomain> domainsInPool, + List<DiskImage> disksList) { + for (StorageDomain currDomain : domainsInPool) { + + updateDisksStorage(currDomain, disksList); + if (currDomain.getStorageDomainType().isDataDomain() + && currDomain.getStatus() == StorageDomainStatus.Active + && validateSpaceRequirements(currDomain, disksList)) { + return currDomain; + } + } + return null; + } + + private static void updateDisksStorage(StorageDomain storageDomain, List<DiskImage> disksList) { + for (DiskImage disk : disksList) { + 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)); + } + + private static void updateDiskVolumeType(StorageType storageType, DiskImage disk) { + VolumeType volumeType = storageType.isFileDomain() ? VolumeType.Sparse : VolumeType.Preallocated; + disk.setVolumeType(volumeType); + } + + private static boolean validateSpaceRequirements(StorageDomain storageDomain, List<DiskImage> disksList) { + StorageDomainValidator storageDomainValidator = new StorageDomainValidator(storageDomain); + return (storageDomainValidator.isDomainWithinThresholds().isValid() && + storageDomainValidator.hasSpaceForClonedDisks(disksList).isValid()); + } +} diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/VmHandlerTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/VmHandlerTest.java index 4a243c2..e4d4757 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/VmHandlerTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/VmHandlerTest.java @@ -1,12 +1,7 @@ package org.ovirt.engine.core.bll; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.nullValue; -import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; -import static org.ovirt.engine.core.utils.MockConfigRule.mockConfig; import java.util.ArrayList; @@ -15,12 +10,7 @@ import java.util.List; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; -import org.ovirt.engine.core.bll.memory.MemoryUtils; -import org.ovirt.engine.core.common.businessentities.StorageDomain; -import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; -import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmDevice; import org.ovirt.engine.core.common.businessentities.VmDeviceGeneralType; @@ -32,27 +22,12 @@ import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType; import org.ovirt.engine.core.common.businessentities.storage.ImageStatus; import org.ovirt.engine.core.common.businessentities.storage.LunDisk; -import org.ovirt.engine.core.common.businessentities.storage.StorageType; -import org.ovirt.engine.core.common.config.ConfigValues; -import org.ovirt.engine.core.common.utils.SizeConverter; import org.ovirt.engine.core.common.utils.VmDeviceType; import org.ovirt.engine.core.compat.Guid; -import org.ovirt.engine.core.utils.MockConfigRule; import org.ovirt.engine.core.utils.RandomUtils; /** A test case for the {@link VmHandler} class. */ public class VmHandlerTest { - - public static final long META_DATA_SIZE_IN_GB = 1; - public static final Integer LOW_SPACE_IN_GB = 3; - public static final Integer ENOUGH_SPACE_IN_GB = 4; - public static final Integer THRESHOLD_IN_GB = 4; - public static final Integer THRESHOLD_HIGH_GB = 10; - public static final int VM_SPACE_IN_MB = 2000; - - @Rule - public MockConfigRule mcr = new MockConfigRule( - mockConfig(ConfigValues.FreeSpaceCriticalLowInGB, THRESHOLD_IN_GB)); @Before public void setUp() { @@ -101,44 +76,6 @@ assertTrue(vm.getManagedVmDeviceMap().containsKey(regularDisk.getId())); assertFalse(vm.getManagedVmDeviceMap().containsKey(lunDisk.getId())); assertFalse(vm.getManagedVmDeviceMap().containsKey(snapshotDisk.getId())); - } - - @Test - public void verifyDomainForMemory() { - Guid sdId = Guid.newGuid(); - List<StorageDomain> storageDomains = createStorageDomains(sdId); - long vmSpaceInBytes = SizeConverter.convert(VM_SPACE_IN_MB, SizeConverter.SizeUnit.MB, SizeConverter.SizeUnit.BYTES).intValue(); - List<DiskImage> disksList = MemoryUtils.createDiskDummies(vmSpaceInBytes, META_DATA_SIZE_IN_GB); - - StorageDomain storageDomain = VmHandler.findStorageDomainForMemory(storageDomains, disksList); - assertThat(storageDomain, notNullValue()); - if (storageDomain != null) { - Guid selectedId = storageDomain.getId(); - assertThat(selectedId.equals(sdId), is(true)); - } - - mcr.mockConfigValue(ConfigValues.FreeSpaceCriticalLowInGB, THRESHOLD_HIGH_GB); - - storageDomain = VmHandler.findStorageDomainForMemory(storageDomains, disksList); - assertThat(storageDomain, nullValue()); - } - - private static List<StorageDomain> createStorageDomains(Guid sdIdToBeSelected) { - StorageDomain sd1 = createStorageDomain(Guid.newGuid(), StorageType.NFS, LOW_SPACE_IN_GB); - StorageDomain sd2 = createStorageDomain(Guid.newGuid(), StorageType.NFS, LOW_SPACE_IN_GB); - StorageDomain sd3 = createStorageDomain(sdIdToBeSelected, StorageType.NFS, ENOUGH_SPACE_IN_GB); - List<StorageDomain> storageDomains = Arrays.asList(sd1, sd2, sd3); - return storageDomains; - } - - private static StorageDomain createStorageDomain(Guid guid, StorageType storageType, Integer size) { - StorageDomain storageDomain = new StorageDomain(); - storageDomain.setId(guid); - storageDomain.setStorageDomainType(StorageDomainType.Data); - storageDomain.setStorageType(storageType); - storageDomain.setStatus(StorageDomainStatus.Active); - storageDomain.setAvailableDiskSize(size); - return storageDomain; } private void populateVmWithDisks(List<Disk> disks, VM vm) { 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 new file mode 100644 index 0000000..8c2e781 --- /dev/null +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/memory/MemoryStorageHandlerTest.java @@ -0,0 +1,77 @@ +package org.ovirt.engine.core.bll.memory; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.ovirt.engine.core.utils.MockConfigRule.mockConfig; + +import java.util.Arrays; +import java.util.List; + +import org.junit.Rule; +import org.junit.Test; +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; +import org.ovirt.engine.core.common.businessentities.StorageDomainType; +import org.ovirt.engine.core.common.businessentities.storage.DiskImage; +import org.ovirt.engine.core.common.businessentities.storage.StorageType; +import org.ovirt.engine.core.common.config.ConfigValues; +import org.ovirt.engine.core.common.utils.SizeConverter; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.utils.MockConfigRule; + +public class MemoryStorageHandlerTest { + + public static final long META_DATA_SIZE_IN_GB = 1; + public static final Integer LOW_SPACE_IN_GB = 3; + public static final Integer ENOUGH_SPACE_IN_GB = 4; + public static final Integer THRESHOLD_IN_GB = 4; + public static final Integer THRESHOLD_HIGH_GB = 10; + public static final int VM_SPACE_IN_MB = 2000; + + @Rule + public MockConfigRule mcr = new MockConfigRule( + mockConfig(ConfigValues.FreeSpaceCriticalLowInGB, THRESHOLD_IN_GB)); + + @Test + public void verifyDomainForMemory() { + Guid sdId = Guid.newGuid(); + List<StorageDomain> storageDomains = createStorageDomains(sdId); + long vmSpaceInBytes = SizeConverter.convert(VM_SPACE_IN_MB, + SizeConverter.SizeUnit.MB, + SizeConverter.SizeUnit.BYTES).intValue(); + List<DiskImage> disksList = MemoryUtils.createDiskDummies(vmSpaceInBytes, META_DATA_SIZE_IN_GB); + + StorageDomain storageDomain = MemoryStorageHandler.findStorageDomainForMemory(storageDomains, disksList); + assertThat(storageDomain, notNullValue()); + if (storageDomain != null) { + Guid selectedId = storageDomain.getId(); + assertThat(selectedId.equals(sdId), is(true)); + } + + mcr.mockConfigValue(ConfigValues.FreeSpaceCriticalLowInGB, THRESHOLD_HIGH_GB); + + storageDomain = MemoryStorageHandler.findStorageDomainForMemory(storageDomains, disksList); + assertThat(storageDomain, nullValue()); + } + + private static List<StorageDomain> createStorageDomains(Guid sdIdToBeSelected) { + StorageDomain sd1 = createStorageDomain(Guid.newGuid(), StorageType.NFS, LOW_SPACE_IN_GB); + StorageDomain sd2 = createStorageDomain(Guid.newGuid(), StorageType.NFS, LOW_SPACE_IN_GB); + StorageDomain sd3 = createStorageDomain(sdIdToBeSelected, StorageType.NFS, ENOUGH_SPACE_IN_GB); + List<StorageDomain> storageDomains = Arrays.asList(sd1, sd2, sd3); + return storageDomains; + } + + private static StorageDomain createStorageDomain(Guid guid, StorageType storageType, Integer size) { + StorageDomain storageDomain = new StorageDomain(); + storageDomain.setId(guid); + storageDomain.setStorageDomainType(StorageDomainType.Data); + storageDomain.setStorageType(storageType); + storageDomain.setStatus(StorageDomainStatus.Active); + storageDomain.setAvailableDiskSize(size); + return storageDomain; + } + +} -- To view, visit https://gerrit.ovirt.org/40433 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I367ee3b1e902495472e687b6dad63bc305b2c8bb 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