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

Reply via email to