Vered Volansky has uploaded a new change for review. Change subject: core: Storage validation when running stateless VM ......................................................................
core: Storage validation when running stateless VM When a VM is run as stateless, temporary volumes are created for each disk leaf. Up till now there were no storage validations in this case. These were added in this patch, along with some new functionality to the MultipleStorageDomainsValidator, as well as related tests. Change-Id: Id04203119cce475afeef7658db50e132b0c7036a Bug-Url: https://bugzilla.redhat.com/1054175 Signed-off-by: Vered Volansky <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidator.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidatorTest.java 3 files changed, 60 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/55/30855/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java index ce26b6c..5c33b38 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java @@ -23,6 +23,7 @@ import org.ovirt.engine.core.bll.scheduling.VdsFreeMemoryChecker; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.bll.utils.VmDeviceUtils; +import org.ovirt.engine.core.bll.validator.MultipleStorageDomainsValidator; import org.ovirt.engine.core.bll.validator.RunVmValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.FeatureSupported; @@ -38,6 +39,7 @@ import org.ovirt.engine.core.common.businessentities.ActionGroup; import org.ovirt.engine.core.common.businessentities.BootSequence; import org.ovirt.engine.core.common.businessentities.Disk; +import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.DisplayType; import org.ovirt.engine.core.common.businessentities.Entities; import org.ovirt.engine.core.common.businessentities.ImageFileType; @@ -851,6 +853,10 @@ return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_RNG_SOURCE_NOT_SUPPORTED); } + if (isRunAsStateless()) { + return validateSpaceRequirements(); + } + return true; } @@ -875,6 +881,13 @@ return true; } + protected boolean validateSpaceRequirements() { + fetchVmDisksFromDb(); + List<DiskImage> disksList = getVm().getDiskList(); + MultipleStorageDomainsValidator msdValidator = createMultipleStorageDomainsValidator(disksList); + return validate(msdValidator.allDomainsHaveSpaceForNewDisks(disksList)); + } + @Override protected List<Class<?>> getValidationGroups() { addValidationGroup(StartEntity.class); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidator.java index 0929e4a..84407f9 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidator.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidator.java @@ -83,6 +83,23 @@ * Validates that all the domains have enough space for the request * @return {@link ValidationResult#VALID} if all the domains have enough free space, or a {@link ValidationResult} with the first low-on-space domain encountered. */ + public ValidationResult allDomainsHaveSpaceForNewDisks(List<DiskImage> disksList) { + final Map<Guid, List<DiskImage>> disksMap = getDomainsDisksMap(disksList); + + return validOrFirstFailure(new ValidatorPredicate() { + @Override + public ValidationResult evaluate(Map.Entry<Guid, StorageDomainValidator> entry) { + Guid sdId = entry.getKey(); + List<DiskImage> disksList = disksMap.get(sdId); + return getStorageDomainValidator(entry).hasSpaceForNewDisks(disksList); + } + }); + } + + /** + * Validates that all the domains have enough space for the request + * @return {@link ValidationResult#VALID} if all the domains have enough free space, or a {@link ValidationResult} with the first low-on-space domain encountered. + */ public ValidationResult allDomainsHaveSpaceForAllDisks(List<DiskImage> newDisksList, List<DiskImage> clonedDisksList) { final Map<Guid, List<DiskImage>> domainsNewDisksMap = getDomainsDisksMap(newDisksList); final Map<Guid, List<DiskImage>> domainsClonedDisksMap = getDomainsDisksMap(clonedDisksList); diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidatorTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidatorTest.java index 11b43ce..56249af 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidatorTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidatorTest.java @@ -115,6 +115,36 @@ } @Test + public void testAllDomainsHaveSpaceForNewDisksSuccess(){ + List<Guid> sdIds = Arrays.asList(sdId1, sdId2); + List<DiskImage> disksList = generateDisksList(NUM_DISKS, sdIds); + + StorageDomainValidator storageDomainValidator = mock(StorageDomainValidator.class); + doReturn(ValidationResult.VALID).when(storageDomainValidator).hasSpaceForNewDisks(anyList()); + doReturn(storageDomainValidator).when(validator).getStorageDomainValidator(any(Map.Entry.class)); + + assertTrue(validator.allDomainsHaveSpaceForNewDisks(disksList).isValid()); + verify(storageDomainValidator, times(NUM_DOMAINS)).hasSpaceForNewDisks(anyList()); + } + + @Test + public void testAllDomainsHaveSpaceForNewDisksFail(){ + List<Guid> sdIds = Arrays.asList(sdId1, sdId2); + List<DiskImage> disksList = generateDisksList(NUM_DISKS, sdIds); + + StorageDomainValidator storageDomainValidator = mock(StorageDomainValidator.class); + doReturn(new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN)). + when(storageDomainValidator).hasSpaceForNewDisks(anyList()); + doReturn(storageDomainValidator).when(validator).getStorageDomainValidator(any(Map.Entry.class)); + + ValidationResult result = validator.allDomainsHaveSpaceForNewDisks(disksList); + assertFalse(result.isValid()); + assertEquals("Wrong validation error", + VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN, + result.getMessage()); + } + + @Test public void testAllDomainsHaveSpaceForAllDisksSuccess(){ List<Guid> sdIdsForNew = Arrays.asList(sdId1, sdId2); List<Guid> sdIdsForCloned = Arrays.asList(sdId2, sdId3); -- To view, visit http://gerrit.ovirt.org/30855 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Id04203119cce475afeef7658db50e132b0c7036a Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5 Gerrit-Owner: Vered Volansky <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
