Vered Volansky has uploaded a new change for review. Change subject: core: ImportVmTemplateCommand storage allocation ......................................................................
core: ImportVmTemplateCommand storage allocation This patch is a part of a series of patches, adding storage allocation validations to the system when they're missing, and replacing old verification usage with unified, new, correct and tested verification. This patch did this for ImportVmTemplateCommand, using only existing validations. Removing old verification in this command resulted in unused old validation and validation aids, which were also removed in this patch. Added tests to MoveOrCopyTemplateCommand.validateSpaceRequirements() in MoveMoveOrCopyTemplateCommandTest. Change-Id: I6ffc5c00905bb03c9cb3cbffa481e78c9b0ab87a Bug-Url: https://bugzilla.redhat.com/1136721 Signed-off-by: Vered Volansky <vvola...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/ImportVmTemplateCommandTest.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommandTest.java 5 files changed, 95 insertions(+), 65 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/78/33478/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java index f299fb7..476de1f 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java @@ -182,23 +182,11 @@ } if (retVal && getImages() != null && !getImages().isEmpty() && !isImagesAlreadyOnTarget()) { - Map<StorageDomain, Integer> domainMap = getSpaceRequirementsForStorageDomains( - new ArrayList<DiskImage>(getVmTemplate().getDiskImageMap().values())); - if (domainMap.isEmpty()) { - int sz = 0; - if (getVmTemplate().getDiskImageMap() != null) { - for (DiskImage image : getVmTemplate().getDiskImageMap().values()) { - sz += image.getSize(); - } - } - domainMap.put(getStorageDomain(), sz); - } - for (Map.Entry<StorageDomain, Integer> entry : domainMap.entrySet()) { - if (!doesStorageDomainhaveSpaceForRequest(entry.getKey(), entry.getValue())) { - return false; - } + if (!validateSpaceRequirements(getImages())) { + return false; } } + if (retVal) { retVal = validateMacAddress(Entities.<VmNic, VmNetworkInterface> upcast(getVmTemplate().getInterfaces())); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommand.java index 9afa129..5d294a5 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommand.java @@ -355,15 +355,6 @@ return getStorageDomainDAO().getForStoragePool(domainId, getStoragePool().getId()); } - protected Map<StorageDomain, Integer> getSpaceRequirementsForStorageDomains(Collection<DiskImage> images) { - Map<DiskImage, StorageDomain> spaceMap = new HashMap<DiskImage, StorageDomain>(); - for (DiskImage image : images) { - StorageDomain domain = getStorageDomain(imageToDestinationDomainMap.get(image.getId())); - spaceMap.put(image, domain); - } - return StorageDomainValidator.getSpaceRequirementsForStorageDomains(spaceMap); - } - /** * Space Validations are done using data extracted from the disks. The disks in question in this command * don't have all the needed data, and in order not to contaminate the command's data structures, as alter diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java index dd0b155..b69c308 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java @@ -14,7 +14,6 @@ import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.context.CompensationContext; import org.ovirt.engine.core.bll.utils.PermissionSubject; -import org.ovirt.engine.core.bll.validator.StorageDomainValidator; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.StorageDomainParametersBase; import org.ovirt.engine.core.common.businessentities.LUN_storage_server_connection_map; @@ -119,10 +118,6 @@ } } return returnValue; - } - - protected boolean doesStorageDomainhaveSpaceForRequest(StorageDomain storageDomain, long sizeRequested) { - return validate(new StorageDomainValidator(storageDomain).isDomainHasSpaceForRequest(sizeRequested)); } protected boolean isNotLocalData(final boolean isInternal) { diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/ImportVmTemplateCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/ImportVmTemplateCommandTest.java index 9298fee..38e7b8d 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/ImportVmTemplateCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/ImportVmTemplateCommandTest.java @@ -4,8 +4,8 @@ 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 static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyList; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; @@ -21,7 +21,6 @@ import javax.validation.ConstraintViolation; -import org.junit.Rule; import org.junit.Test; import org.ovirt.engine.core.bll.context.EngineContext; import org.ovirt.engine.core.common.action.ImportVmTemplateParameters; @@ -37,7 +36,6 @@ import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VolumeFormat; import org.ovirt.engine.core.common.businessentities.VolumeType; -import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; @@ -48,30 +46,17 @@ import org.ovirt.engine.core.dao.StorageDomainStaticDAO; import org.ovirt.engine.core.dao.StoragePoolDAO; import org.ovirt.engine.core.dao.VmTemplateDAO; -import org.ovirt.engine.core.utils.MockConfigRule; import org.springframework.util.Assert; public class ImportVmTemplateCommandTest { - @Rule - public MockConfigRule mcr = new MockConfigRule(); - @Test public void insufficientDiskSpace() { - final int lotsOfSpaceRequired = 1073741824; - final ImportVmTemplateCommand c = - setupDiskSpaceTest(lotsOfSpaceRequired); - assertFalse(c.canDoAction()); - assertTrue(c.getReturnValue() - .getCanDoActionMessages() - .contains(VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN.toString())); - } - - @Test - public void sufficientDiskSpace() { - final ImportVmTemplateCommand c = - setupDiskSpaceTest(0); - assertTrue(c.canDoAction()); + // The following is enough since the validation is mocked out anyway. Just want to make sure the flow in CDA is correct. + // Full test for the scenarios is done in the inherited class. + final ImportVmTemplateCommand command = setupVolumeFormatAndTypeTest(VolumeFormat.RAW, VolumeType.Preallocated, StorageType.NFS); + doReturn(false).when(command).validateSpaceRequirements(anyList()); + assertFalse(command.canDoAction()); } @Test @@ -115,14 +100,14 @@ VolumeType volumeType, StorageType storageType) { CanDoActionTestUtils.runAndAssertCanDoActionSuccess( - setupVolumeFormatAndTypeTest(volumeFormat, volumeType, storageType, 0)); + setupVolumeFormatAndTypeTest(volumeFormat, volumeType, storageType)); } private void assertInvalidVolumeInfoCombination(VolumeFormat volumeFormat, VolumeType volumeType, StorageType storageType) { CanDoActionTestUtils.runAndAssertCanDoActionFailure( - setupVolumeFormatAndTypeTest(volumeFormat, volumeType, storageType, 0), + setupVolumeFormatAndTypeTest(volumeFormat, volumeType, storageType), VdcBllMessages.ACTION_TYPE_FAILED_DISK_CONFIGURATION_NOT_SUPPORTED); } @@ -140,12 +125,8 @@ private ImportVmTemplateCommand setupVolumeFormatAndTypeTest( VolumeFormat volumeFormat, VolumeType volumeType, - StorageType storageType, - int freeSpaceCritical) { - mcr.mockConfigValue(ConfigValues.FreeSpaceCriticalLowInGB, freeSpaceCritical); - - ImportVmTemplateCommand command = - spy(new ImportVmTemplateCommand(createParameters())); + StorageType storageType) { + ImportVmTemplateCommand command = spy(new ImportVmTemplateCommand(createParameters())); Backend backend = mock(Backend.class); doReturn(backend).when(command).getBackend(); @@ -159,6 +140,7 @@ mockStorageDomains(command); doReturn(true).when(command).setAndValidateDiskProfiles(); doReturn(true).when(command).setAndValidateCpuProfile(); + doReturn(true).when(command).validateSpaceRequirements(anyList()); return command; } @@ -223,13 +205,6 @@ when(dao.get(any(Guid.class))).thenReturn(domain); doReturn(dao).when(command).getStorageDomainStaticDAO(); - } - - private ImportVmTemplateCommand setupDiskSpaceTest(final int extraDiskSpaceRequired) { - return setupVolumeFormatAndTypeTest(VolumeFormat.RAW, - VolumeType.Preallocated, - StorageType.NFS, - extraDiskSpaceRequired); } protected ImportVmTemplateParameters createParameters() { diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommandTest.java index 93627f2..1dbf171 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommandTest.java @@ -10,16 +10,22 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyList; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; +import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; +import org.ovirt.engine.core.bll.validator.MultipleStorageDomainsValidator; import org.ovirt.engine.core.common.action.MoveOrCopyParameters; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.StorageDomain; @@ -29,9 +35,13 @@ import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.Guid; +@RunWith(MockitoJUnitRunner.class) public class MoveOrCopyTemplateCommandTest { private Guid[] diskIds; + + @Mock + private MultipleStorageDomainsValidator multipleSdValidator; @Before public void setup() { @@ -91,6 +101,67 @@ verify(cmd, times(2)).runVdsCommand(any(VDSCommandType.class), any(GetImagesListVDSCommandParameters.class)); } + @Test + public void sufficientStorageSpaceWithCollapse() { + MoveOrCopyParameters parameters = createParameters(false); + parameters.setCopyCollapse(true); + final MoveOrCopyTemplateCommand<MoveOrCopyParameters> command = setupSpaceTests(parameters); + assertTrue(command.validateSpaceRequirements(anyList())); + verify(multipleSdValidator).allDomainsHaveSpaceForClonedDisks(anyList()); + verify(multipleSdValidator, never()).allDomainsHaveSpaceForDisksWithSnapshots(anyList()); + verify(multipleSdValidator, never()).allDomainsHaveSpaceForNewDisks(anyList()); + } + + @Test + public void sufficientStorageSpaceWithSnapshots() { + MoveOrCopyParameters parameters = createParameters(false); + parameters.setCopyCollapse(false); + final MoveOrCopyTemplateCommand<MoveOrCopyParameters> command = setupSpaceTests(parameters); + assertTrue(command.validateSpaceRequirements(anyList())); + verify(multipleSdValidator, never()).allDomainsHaveSpaceForClonedDisks(anyList()); + verify(multipleSdValidator).allDomainsHaveSpaceForDisksWithSnapshots(anyList()); + verify(multipleSdValidator, never()).allDomainsHaveSpaceForNewDisks(anyList()); + } + + @Test + public void lowThreshold() { + MoveOrCopyParameters parameters = createParameters(false); + parameters.setCopyCollapse(true); + final MoveOrCopyTemplateCommand<MoveOrCopyParameters> command = setupSpaceTests(parameters); + doReturn(new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN)). + when(multipleSdValidator).allDomainsWithinThresholds(); + assertFalse(command.validateSpaceRequirements(anyList())); + verify(multipleSdValidator, never()).allDomainsHaveSpaceForClonedDisks(anyList()); + verify(multipleSdValidator, never()).allDomainsHaveSpaceForDisksWithSnapshots(anyList()); + verify(multipleSdValidator, never()).allDomainsHaveSpaceForNewDisks(anyList()); + } + + @Test + public void insufficientStorageSpaceWithCollapse() { + MoveOrCopyParameters parameters = createParameters(false); + parameters.setCopyCollapse(true); + final MoveOrCopyTemplateCommand<MoveOrCopyParameters> command = setupSpaceTests(parameters); + doReturn(new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN)). + when(multipleSdValidator).allDomainsHaveSpaceForClonedDisks(anyList()); + assertFalse(command.validateSpaceRequirements(anyList())); + verify(multipleSdValidator).allDomainsHaveSpaceForClonedDisks(anyList()); + verify(multipleSdValidator, never()).allDomainsHaveSpaceForDisksWithSnapshots(anyList()); + verify(multipleSdValidator, never()).allDomainsHaveSpaceForNewDisks(anyList()); + } + + @Test + public void insufficientStorageSpaceWithSnapshots() { + MoveOrCopyParameters parameters = createParameters(false); + final MoveOrCopyTemplateCommand<MoveOrCopyParameters> command = setupSpaceTests(parameters); + parameters.setCopyCollapse(false); + doReturn(new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN)). + when(multipleSdValidator).allDomainsHaveSpaceForDisksWithSnapshots(anyList()); + assertFalse(command.validateSpaceRequirements(anyList())); + verify(multipleSdValidator, never()).allDomainsHaveSpaceForClonedDisks(anyList()); + verify(multipleSdValidator).allDomainsHaveSpaceForDisksWithSnapshots(anyList()); + verify(multipleSdValidator, never()).allDomainsHaveSpaceForNewDisks(anyList()); + } + protected MoveOrCopyParameters createParameters(boolean moveToSameStorageDomain) { Guid targetStorageDomainId = Guid.newGuid(); Map<Guid, Guid> imageToDestinationDomainMap = new HashMap<>(); @@ -137,6 +208,16 @@ return cmd; } + private MoveOrCopyTemplateCommand<MoveOrCopyParameters> setupSpaceTests(MoveOrCopyParameters parameters) { + MoveOrCopyTemplateCommand<MoveOrCopyParameters> cmd = spy(new MoveOrCopyTemplateCommand<MoveOrCopyParameters>(parameters)); + doReturn(multipleSdValidator).when(cmd).createMultipleStorageDomainsValidator(anyList()); + doReturn(ValidationResult.VALID).when(multipleSdValidator).allDomainsHaveSpaceForClonedDisks(anyList()); + doReturn(ValidationResult.VALID).when(multipleSdValidator).allDomainsHaveSpaceForDisksWithSnapshots(anyList()); + doReturn(ValidationResult.VALID).when(multipleSdValidator).allDomainsWithinThresholds(); + doReturn(ValidationResult.VALID).when(multipleSdValidator).allDomainsExistAndActive(); + return cmd; + } + private List<DiskImage> createImageList() { List<DiskImage> disks = new ArrayList<>(); for (Guid id : diskIds) { -- To view, visit http://gerrit.ovirt.org/33478 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I6ffc5c00905bb03c9cb3cbffa481e78c9b0ab87a Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5 Gerrit-Owner: Vered Volansky <vvola...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches