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

Reply via email to