Vered Volansky has uploaded a new change for review. Change subject: core: [WIP] MoveOrCopy storage allocation (1) ......................................................................
core: [WIP] MoveOrCopy storage allocation (1) Fixed checkFreeSpaceOnDestinationDomain signature and definition. Change-Id: Ic5de81b318d5b8a2e0da918b4a44ae2003ca4b06 Bug-Url: https://bugzilla.redhat.com/1053747 Signed-off-by: Vered Volansky <vvola...@redhat.com> --- 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/MoveOrCopyTemplateCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/MultipleStorageDomainsValidator.java 3 files changed, 51 insertions(+), 21 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/57/32257/1 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 3224464..a8b28cf 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 @@ -26,6 +26,7 @@ import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.bll.utils.VmDeviceUtils; import org.ovirt.engine.core.bll.validator.DiskImagesValidator; +import org.ovirt.engine.core.bll.validator.MultipleStorageDomainsValidator; import org.ovirt.engine.core.bll.validator.StorageDomainValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.FeatureSupported; @@ -105,6 +106,7 @@ private static VmStatic vmStaticForDefaultValues = new VmStatic(); private List<DiskImage> imageList; + private List<DiskImage> memoryDisksList; private final List<String> macsAdded = new ArrayList<String>(); private final SnapshotsManager snapshotsManager = new SnapshotsManager(); @@ -416,10 +418,13 @@ } if (!isImagesAlreadyOnTarget()) { + + //This gets a map of sizes with the DESTINATION(!) domain Map<StorageDomain, Integer> domainMap = getSpaceRequirementsForStorageDomains(imageList); - if (!setDomainsForMemoryImages(domainMap)) { - return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_NO_SUITABLE_DOMAIN_FOUND); + //Here storage domain for memory volumes is set and stored in the snapshot + if (!updateDomainsForMemoryImages()) { + return false; } for (Map.Entry<StorageDomain, Integer> entry : domainMap.entrySet()) { @@ -457,15 +462,12 @@ } /** - * This method fills the given map of domain to the required size for storing memory images - * within it, and also update the memory volume in each snapshot that has memory volume with - * the right storage pool and storage domain where it is going to be imported. + * For each snapshot that has memory volume, this method updates the memory volume with + * the storage pool and storage domain it's going to be imported to. * - * @param domain2requiredSize - * Maps domain to size required for storing memory volumes in it * @return true if we managed to assign storage domain for every memory volume, false otherwise */ - private boolean setDomainsForMemoryImages(Map<StorageDomain, Integer> domain2requiredSize) { + private boolean updateDomainsForMemoryImages() { Map<String, String> handledMemoryVolumes = new HashMap<String, String>(); for (Snapshot snapshot : getVm().getSnapshots()) { String memoryVolume = snapshot.getMemoryVolume(); @@ -479,17 +481,10 @@ continue; } - VM vm = getVmFromSnapshot(snapshot); - int requiredSizeForMemory = (int) Math.ceil((vm.getTotalMemorySizeInBytes() + - MemoryUtils.META_DATA_SIZE_IN_BYTES) * 1.0 / BYTES_IN_GB); - StorageDomain storageDomain = VmHandler.findStorageDomainForMemory( - getParameters().getStoragePoolId(), requiredSizeForMemory, domain2requiredSize); + StorageDomain storageDomain = getStorageDomainForMemoryVolumes(snapshot); if (storageDomain == null) { - return false; + return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_NO_SUITABLE_DOMAIN_FOUND); } - int requiredSizeInDomainIncludingMemoryVolumes = domain2requiredSize.containsKey(storageDomain) ? - domain2requiredSize.get(storageDomain) + requiredSizeForMemory : requiredSizeForMemory; - domain2requiredSize.put(storageDomain, requiredSizeInDomainIncludingMemoryVolumes); String modifiedMemoryVolume = MemoryUtils.changeStorageDomainAndPoolInMemoryState( memoryVolume, storageDomain.getId(), getParameters().getStoragePoolId()); // replace the volume representation with the one with the correct domain & pool @@ -500,6 +495,12 @@ return true; } + private StorageDomain getStorageDomainForMemoryVolumes(Snapshot snapshot) { + VM vm = getVmFromSnapshot(snapshot); + List<DiskImage> memoryDisksList = MemoryUtils.createDiskDummies(vm.getTotalMemorySizeInBytes(), MemoryUtils.META_DATA_SIZE_IN_BYTES); + return VmHandler.findStorageDomainForMemory(getParameters().getStoragePoolId(), memoryDisksList); + } + /** * 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/MoveOrCopyTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommand.java index d8edf59..f13841e 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 @@ -15,6 +15,7 @@ import org.ovirt.engine.core.bll.storage.StorageDomainCommandBase; 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.StorageDomainValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; @@ -136,8 +137,7 @@ checkStorageDomain() && checkStorageDomainStatus(StorageDomainStatus.Active) && (getParameters().getForceOverride() || (!isImagesAlreadyOnTarget() && checkIfDisksExist(getTemplateDisks()))) - && checkFreeSpaceOnDestinationDomain(getStorageDomain(), - (int) getVmTemplate().getActualDiskSize()); + && checkFreeSpaceOnDestinationDomain(getStorageDomain(), getTemplateDisks()); } if (retValue && DbFacade.getInstance() @@ -192,8 +192,8 @@ addCanDoActionMessage(VdcBllMessages.VAR__TYPE__VM_TEMPLATE); } - private boolean checkFreeSpaceOnDestinationDomain(StorageDomain domain, int requestedSizeGB) { - return validate(new StorageDomainValidator(domain).isDomainHasSpaceForRequest(requestedSizeGB)); + private boolean checkFreeSpaceOnDestinationDomain(StorageDomain domain, List<DiskImage> disksList) { + return validate(new StorageDomainValidator(domain).hasSpaceForClonedDisks(disksList)); } @Override @@ -356,6 +356,18 @@ return StorageDomainValidator.getSpaceRequirementsForStorageDomains(spaceMap); } + protected boolean validateSpaceRequirements(List<DiskImage> disksList) { + MultipleStorageDomainsValidator sdValidator = createMultipleStorageDomainsValidator(disksList); + return validate(sdValidator.allDomainsExistAndActive()) + && validate(sdValidator.allDomainsWithinThresholds()) + && validate(sdValidator.allDomainsHaveSpaceForClonedDisks(disksList)); + } + + protected MultipleStorageDomainsValidator createMultipleStorageDomainsValidator( List<DiskImage> disksList) { + return new MultipleStorageDomainsValidator(getVm().getStoragePoolId(), + ImagesHandler.getAllStorageIdsForImageIds(disksList)); + } + protected void ensureDomainMap(Collection<DiskImage> images, Guid defaultDomainId) { if (imageToDestinationDomainMap == null) { imageToDestinationDomainMap = new HashMap<Guid, Guid>(); 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 84407f9..c9bea3e 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 @@ -100,6 +100,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 allDomainsHaveSpaceForClonedDisks(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).hasSpaceForClonedDisks(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); -- To view, visit http://gerrit.ovirt.org/32257 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ic5de81b318d5b8a2e0da918b4a44ae2003ca4b06 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Vered Volansky <vvola...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches