Vered Volansky has uploaded a new change for review.

Change subject: core: Fix storage allocation check when creating a VM snapshot
......................................................................

core: Fix storage allocation check when creating a VM snapshot

Allocation checks for memory and data volumes were done either way -
whether the VM is running or not. This patch takes these volumes into
consideration only when the VM is running.

Change-Id: I085d49dc90053e375f829900c75d2fe72c263161
Bug-Url: https://bugzilla.redhat.com/1053752
Bug-Url: https://bugzilla.redhat.com/1119022
Signed-off-by: Vered Volansky <vvola...@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/ImagesHandler.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommandTest.java
4 files changed, 64 insertions(+), 35 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/89/36889/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 e072ad6..27012bb 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
@@ -142,19 +142,38 @@
         return toReturn;
     }
 
-    private boolean validateStorageDomains(List<DiskImage> vmDisksList, 
List<DiskImage> memoryDisksList) {
-        List<DiskImage> disksList = getAllDisks(vmDisksList, memoryDisksList);
-        MultipleStorageDomainsValidator sdValidator = 
createMultipleStorageDomainsValidator(disksList);
-        return validate(sdValidator.allDomainsExistAndActive())
-                && validate(sdValidator.allDomainsWithinThresholds())
-                && 
validate(sdValidator.allDomainsHaveSpaceForAllDisks(vmDisksList, 
memoryDisksList));
-    }
+    private boolean validateStorageDomains() {
+        List<DiskImage> vmDisksList = getDisksListForChecks();
+        if (vmDisksList.size() > 0) {
+            DiskImagesValidator diskImagesValidator = 
createDiskImageValidator(vmDisksList);
+            if (!(validate(diskImagesValidator.diskImagesNotLocked())
+                    && validate(diskImagesValidator.diskImagesNotIllegal()))) {
+                return false;
+            }
+        }
+        vmDisksList = 
ImagesHandler.getDisksDummiesForStorageAllocations(vmDisksList);
+        List<DiskImage> allDisks = new ArrayList<>(vmDisksList);
 
-    private static List<DiskImage> getAllDisks(List<DiskImage> newDisksList, 
List<DiskImage> cloneDisksList) {
-        List<DiskImage> disksList = new ArrayList<>();
-        disksList.addAll(newDisksList);
-        disksList.addAll(cloneDisksList);
-        return disksList;
+        List<DiskImage> memoryDisksList = null;
+        if (getParameters().isSaveMemory()) {
+            memoryDisksList = 
MemoryUtils.createDiskDummies(getVm().getTotalMemorySizeInBytes(), 
MemoryUtils.META_DATA_SIZE_IN_BYTES);
+            if 
(Guid.Empty.equals(getStorageDomainIdForVmMemory(memoryDisksList))) {
+                return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_NO_SUITABLE_DOMAIN_FOUND);
+            }
+            allDisks.addAll(memoryDisksList);
+        }
+
+        MultipleStorageDomainsValidator sdValidator = 
createMultipleStorageDomainsValidator(allDisks);
+        if (!validate(sdValidator.allDomainsExistAndActive())
+                || !validate(sdValidator.allDomainsWithinThresholds())) {
+            return false;
+        }
+
+        if (memoryDisksList == null) { //no memory volumes
+            return 
validate(sdValidator.allDomainsHaveSpaceForNewDisks(vmDisksList));
+        }
+
+        return 
validate(sdValidator.allDomainsHaveSpaceForAllDisks(vmDisksList, 
memoryDisksList));
     }
 
     protected MemoryImageBuilder getMemoryImageBuilder() {
@@ -500,26 +519,7 @@
             return false;
         }
 
-        List<DiskImage> disksList = getDisksListForChecks();
-        if (disksList.size() > 0) {
-            DiskImagesValidator diskImagesValidator = 
createDiskImageValidator(disksList);
-            if (!(validate(diskImagesValidator.diskImagesNotLocked())
-                    && validate(diskImagesValidator.diskImagesNotIllegal()))) {
-                return false;
-            }
-        }
-
-        List<DiskImage> memoryDisksList = 
MemoryUtils.createDiskDummies(getVm().getTotalMemorySizeInBytes(), 
MemoryUtils.META_DATA_SIZE_IN_BYTES);
-        getStorageDomainIdForVmMemory(memoryDisksList);
-        if (getParameters().isSaveMemory() && 
Guid.Empty.equals(cachedStorageDomainId)) {
-            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_NO_SUITABLE_DOMAIN_FOUND);
-        }
-
-        if (!validateStorageDomains(disksList, memoryDisksList)) {
-            return false;
-        }
-
-        return true;
+        return validateStorageDomains();
     }
 
     protected StoragePoolValidator createStoragePoolValidator() {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java
index 622aacb..6bb5899 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java
@@ -866,8 +866,8 @@
      * which could have another volume type/format than the target disk volume 
type/format, which is not yet created.
      * "Real" override for these values is done in CreateSnapshotCommand, when 
creating the new DiskImages.
      */
-    public static Collection<DiskImage> 
getDisksDummiesForStorageAllocations(Collection<DiskImage> originalDisks) {
-        Collection<DiskImage> diskDummies = new HashSet<>();
+    public static List<DiskImage> 
getDisksDummiesForStorageAllocations(Collection<DiskImage> originalDisks) {
+        List<DiskImage> diskDummies = new ArrayList<>(originalDisks.size());
         for (DiskImage diskImage : originalDisks) {
             DiskImage clone = DiskImage.copyOf(diskImage);
             clone.setVolumeType(VolumeType.Sparse);
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
index 907a1df..0f892aa 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
@@ -1,6 +1,7 @@
 package org.ovirt.engine.core.bll;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 
@@ -563,7 +564,7 @@
         return true;
     }
 
-    protected MultipleStorageDomainsValidator 
createMultipleStorageDomainsValidator(List<DiskImage> disksList) {
+    protected MultipleStorageDomainsValidator 
createMultipleStorageDomainsValidator(Collection<DiskImage> disksList) {
         return new MultipleStorageDomainsValidator(getVm().getStoragePoolId(),
                 ImagesHandler.getAllStorageIdsForImageIds(disksList));
     }
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommandTest.java
index e09601c..8ba7163 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommandTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommandTest.java
@@ -263,6 +263,29 @@
     }
 
     @Test
+    public void testAllDomainsHaveSpaceForNewDisksFailure() {
+        setUpGeneralValidations();
+        setUpDiskValidations();
+        List<DiskImage> disksList = getNonEmptyDiskList();
+        doReturn(disksList).when(cmd).getDisksList();
+        doReturn(new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN)).when(multipleStorageDomainsValidator)
+                .allDomainsHaveSpaceForNewDisks(disksList);
+        CanDoActionTestUtils.runAndAssertCanDoActionFailure(cmd, 
VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN);
+        
verify(multipleStorageDomainsValidator).allDomainsHaveSpaceForNewDisks(disksList);
+    }
+
+    @Test
+    public void testAllDomainsHaveSpaceForNewDisksSuccess() {
+        setUpGeneralValidations();
+        setUpDiskValidations();
+        List<DiskImage> disksList = getNonEmptyDiskList();
+        doReturn(disksList).when(cmd).getDisksList();
+        
doReturn(ValidationResult.VALID).when(multipleStorageDomainsValidator).allDomainsHaveSpaceForNewDisks(disksList);
+        CanDoActionTestUtils.runAndAssertCanDoActionSuccess(cmd);
+        
verify(multipleStorageDomainsValidator).allDomainsHaveSpaceForNewDisks(disksList);
+    }
+
+    @Test
     public void testAllDomainsWithinThreshold() {
         setUpGeneralValidations();
         setUpDiskValidations();
@@ -280,6 +303,8 @@
         setUpGeneralValidations();
         setUpDiskValidations();
         doReturn(Collections.emptyList()).when(cmd).getDisksList();
+        cmd.getParameters().setSaveMemory(true);
+        
doReturn(Guid.newGuid()).when(cmd).getStorageDomainIdForVmMemory(eq(Collections.<DiskImage>emptyList()));
         doReturn(new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN)).when(multipleStorageDomainsValidator)
                 
.allDomainsHaveSpaceForAllDisks(eq(Collections.<DiskImage>emptyList()), 
anyList());
         CanDoActionTestUtils.runAndAssertCanDoActionFailure(cmd, 
VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN);
@@ -291,6 +316,8 @@
         setUpGeneralValidations();
         setUpDiskValidations();
         doReturn(Collections.emptyList()).when(cmd).getDisksList();
+        cmd.getParameters().setSaveMemory(true);
+        
doReturn(Guid.newGuid()).when(cmd).getStorageDomainIdForVmMemory(eq(Collections.<DiskImage>emptyList()));
         CanDoActionTestUtils.runAndAssertCanDoActionSuccess(cmd);
         
verify(multipleStorageDomainsValidator).allDomainsHaveSpaceForAllDisks(eq(Collections.<DiskImage>emptyList()),
 anyList());
     }
@@ -301,6 +328,7 @@
         
doReturn(ValidationResult.VALID).when(multipleStorageDomainsValidator).allDomainsExistAndActive();
         
doReturn(ValidationResult.VALID).when(multipleStorageDomainsValidator).allDomainsWithinThresholds();
         
doReturn(ValidationResult.VALID).when(multipleStorageDomainsValidator).allDomainsHaveSpaceForAllDisks(anyList(),
 anyList());
+        
doReturn(ValidationResult.VALID).when(multipleStorageDomainsValidator).allDomainsHaveSpaceForNewDisks(anyList());
     }
 
     private void setUpGeneralValidations() {


-- 
To view, visit http://gerrit.ovirt.org/36889
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I085d49dc90053e375f829900c75d2fe72c263161
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