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.

Change-Id: Id04203119cce475afeef7658db50e132b0c7036a
Bug-Url: https://bugzilla.redhat.com/1054175
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/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/StorageDomainValidatorFreeSpaceTest.java
4 files changed, 40 insertions(+), 10 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/76/30776/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 3f810ff..dad2002 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
@@ -534,11 +534,6 @@
         return new DiskImagesValidator(disksList);
     }
 
-    protected MultipleStorageDomainsValidator 
createMultipleStorageDomainsValidator(List<DiskImage> disksList) {
-        return new MultipleStorageDomainsValidator(getVm().getStoragePoolId(),
-                ImagesHandler.getAllStorageIdsForImageIds(disksList));
-    }
-
     protected VmValidator createVmValidator() {
         return new VmValidator(getVm());
     }
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/StorageDomainValidatorFreeSpaceTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/StorageDomainValidatorFreeSpaceTest.java
index 32690ea..eead8f8 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/StorageDomainValidatorFreeSpaceTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/StorageDomainValidatorFreeSpaceTest.java
@@ -88,11 +88,16 @@
     @Test
     public void testValidateAllDisks() {
         StorageDomainValidator sdValidator = new StorageDomainValidator(sd);
-        String assertData = disk.getVolumeFormat() + ", " + 
disk.getVolumeType() + ", " + sd.getStorageType() + ", " +
-        isValidForNew + ", " + isValidForCloned;
+        String assertData = disk.getVolumeFormat() + ", " + 
disk.getVolumeType() + ", " + sd.getStorageType();
         List<DiskImage> disksList = Collections.singletonList(disk);
-        assertEquals(assertData, sdValidator.hasSpaceForAllDisks(disksList, 
null).isValid());
-        assertEquals(assertData, sdValidator.hasSpaceForAllDisks(null, 
disksList).isValid());
-        assertEquals(assertData, sdValidator.hasSpaceForAllDisks(disksList, 
Collections.singletonList(disk)).isValid());
+        assertEquals(assertData,
+                isValidForNew,
+                sdValidator.hasSpaceForAllDisks(disksList, null).isValid());
+        assertEquals(assertData,
+                isValidForCloned,
+                sdValidator.hasSpaceForAllDisks(null, disksList).isValid());
+        assertEquals(assertData,
+                isValidForNew && isValidForCloned,
+                sdValidator.hasSpaceForAllDisks(disksList, 
disksList).isValid());
     }
 }


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

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