Vered Volansky has uploaded a new change for review.

Change subject: core: AddVmTemplateCommand storage allocation
......................................................................

core: AddVmTemplateCommand storage allocation

This patch is a part of a series of patches, adding storage allocation
validations to the system when they're missing, and replacing old
verification usage with unified, new, correct and tested verification.
This patch did this for AddVmTemplateCommand, using only existing
validations. Removing old verification in this command resulted in
unused old validation and validation aids, which were also removed in
this patch.

Change-Id: I7980510a7bb72e43e0a9dfc18460207386eb62fe
Bug-Url: https://bugzilla.redhat.com/1053744
Signed-off-by: Vered Volansky <vvola...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/StorageDomainValidator.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmTemplateCommandTest.java
3 files changed, 117 insertions(+), 52 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/95/33695/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
index ccb80a6..56969b7 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
@@ -1,6 +1,7 @@
 package org.ovirt.engine.core.bll;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
@@ -26,7 +27,6 @@
 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.bll.validator.VmWatchdogValidator;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.FeatureSupported;
@@ -120,7 +120,7 @@
         }
         if (getVm() != null) {
             updateVmDevices();
-            updateVmDisks();
+            mImages.addAll(getVmDisksFromDB());
             setStoragePoolId(getVm().getStoragePoolId());
             isVmInDb = true;
         } else if (getVdsGroup() != null && parameterMasterVm != null) {
@@ -160,10 +160,10 @@
         VmDeviceUtils.setVmDevices(getVm().getStaticData());
     }
 
-    protected void updateVmDisks() {
+    protected List<DiskImage> getVmDisksFromDB() {
         VmHandler.updateDisksFromDb(getVm());
         VmHandler.filterImageDisksForVM(getVm(), false, false, true);
-        mImages.addAll(getVm().getDiskList());
+        return getVm().getDiskList();
     }
 
     @Override
@@ -438,7 +438,7 @@
         return getParameters().getBaseTemplateId() != null;
     }
 
-    private boolean imagesRelatedChecks() {
+    protected boolean imagesRelatedChecks() {
         // images related checks
         if (!mImages.isEmpty()) {
             if (!validateVmNotDuringSnapshot()) {
@@ -457,7 +457,7 @@
             }
 
             MultipleStorageDomainsValidator storageDomainsValidator =
-                    new MultipleStorageDomainsValidator(getStoragePoolId(), 
sourceImageDomainsImageMap.keySet());
+                    getStorageDomainsValidator(getStoragePoolId(), 
sourceImageDomainsImageMap.keySet());
             if (!validate(storageDomainsValidator.allDomainsExistAndActive())) 
{
                 return false;
             }
@@ -490,26 +490,25 @@
                 }
                 storageDomains.put(destImageDomain, storage);
             }
-            // update vm snapshots for storage free space check
-            ImagesHandler.fillImagesBySnapshots(getVm());
-
-            Map<StorageDomain, Integer> domainMap =
-                    
StorageDomainValidator.getSpaceRequirementsForStorageDomains(
-                            
ImagesHandler.filterImageDisks(getVm().getDiskMap().values(), true, false, 
true),
-                            storageDomains,
-                            diskInfoDestinationMap);
-
-            for (Map.Entry<StorageDomain, Integer> entry : 
domainMap.entrySet()) {
-                if (!doesStorageDomainhaveSpaceForRequest(entry.getKey(), 
entry.getValue())) {
-                    return false;
-                }
-            }
+            return validateSpaceRequirements();
         }
         return true;
     }
 
-    protected boolean doesStorageDomainhaveSpaceForRequest(StorageDomain 
storageDomain, long spaceForRequest) {
-        return validate(new 
StorageDomainValidator(storageDomain).isDomainHasSpaceForRequest(spaceForRequest));
+    protected boolean validateSpaceRequirements() {
+        // update vm snapshots for storage free space check
+        ImagesHandler.fillImagesBySnapshots(getVm());
+        List<DiskImage>  disksList =  
ImagesHandler.filterImageDisks(getVm().getDiskMap().values(), true, false, 
true);
+        List<DiskImage> disksListForStorageChecks = 
createDiskDummiesForSpaceValidations(disksList);
+        MultipleStorageDomainsValidator multipleSdValidator = 
getStorageDomainsValidator(
+                getVm().getStoragePoolId(), getStorageGuidSet());
+
+        return (validate(multipleSdValidator.allDomainsWithinThresholds())
+                && 
validate(multipleSdValidator.allDomainsHaveSpaceForClonedDisks(disksListForStorageChecks)));
+    }
+
+    protected MultipleStorageDomainsValidator getStorageDomainsValidator(Guid 
spId, Set<Guid> disks) {
+        return new MultipleStorageDomainsValidator(spId, disks);
     }
 
     protected boolean validateVmNotDuringSnapshot() {
@@ -524,6 +523,23 @@
         return destImageDomains;
     }
 
+    /**
+     * Space Validations are done using data extracted from the disks. The 
disks in question in this command
+     * don't have all the needed data, and in order not to contaminate the 
command's data structures, an alter
+     * one is created specifically for this validation - hence dummy.
+     * @param disksList
+     * @return
+     */
+    protected List<DiskImage> 
createDiskDummiesForSpaceValidations(Collection<DiskImage> disksList) {
+        List<DiskImage> dummies = new ArrayList<>(disksList.size());
+        for (DiskImage image : disksList) {
+            Guid targetSdId = 
diskInfoDestinationMap.get(image.getId()).getStorageIds().get(0);
+            DiskImage dummy = 
ImagesHandler.createDiskImageWithExcessData(image, targetSdId);
+            dummies.add(dummy);
+        }
+        return dummies;
+    }
+
     protected void addVmTemplateToDb() {
         // TODO: add timezone handling
         setVmTemplate(
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/StorageDomainValidator.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/StorageDomainValidator.java
index 1736afc..005caff 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/StorageDomainValidator.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/StorageDomainValidator.java
@@ -15,7 +15,6 @@
 import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.config.ConfigValues;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
-import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 
 public class StorageDomainValidator {
@@ -262,26 +261,6 @@
 
         return new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN,
                 storageName());
-    }
-
-    /**
-     * @deprecated
-     * This validation is replaced by 
hadSpaceForClonedDisks,hadSpaceForClonedDisk, hasSpaceForNewDisks and
-     * hasSpaceForNewDisk, according to the situation.
-     */
-    @Deprecated
-    public static Map<StorageDomain, Integer> 
getSpaceRequirementsForStorageDomains(Collection<DiskImage> images,
-            Map<Guid, StorageDomain> storageDomains, Map<Guid, DiskImage> 
imageToDestinationDomainMap) {
-        Map<DiskImage, StorageDomain> spaceMap = new HashMap<DiskImage, 
StorageDomain>();
-        for (DiskImage image : images) {
-            Guid storageId = 
imageToDestinationDomainMap.get(image.getId()).getStorageIds().get(0);
-            StorageDomain domain = storageDomains.get(storageId);
-            if (domain == null) {
-                domain = 
DbFacade.getInstance().getStorageDomainDao().get(storageId);
-            }
-            spaceMap.put(image, domain);
-        }
-        return 
StorageDomainValidator.getSpaceRequirementsForStorageDomains(spaceMap);
     }
 
     /**
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmTemplateCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmTemplateCommandTest.java
index 7592d93..61acd10 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmTemplateCommandTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmTemplateCommandTest.java
@@ -2,10 +2,17 @@
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyList;
+import static org.mockito.Matchers.anySet;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 import static org.ovirt.engine.core.utils.MockConfigRule.mockConfig;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 
 import org.junit.Before;
 import org.junit.ClassRule;
@@ -13,8 +20,13 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
+import org.ovirt.engine.core.bll.validator.DiskImagesValidator;
+import org.ovirt.engine.core.bll.validator.MultipleStorageDomainsValidator;
 import org.ovirt.engine.core.common.action.AddVmTemplateParameters;
 import org.ovirt.engine.core.common.businessentities.ArchitectureType;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.common.businessentities.StoragePool;
+import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
 import org.ovirt.engine.core.common.businessentities.VDSGroup;
 import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.businessentities.VMStatus;
@@ -24,35 +36,42 @@
 import org.ovirt.engine.core.common.utils.SimpleDependecyInjector;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.compat.Version;
+import org.ovirt.engine.core.dao.StoragePoolDAO;
 import org.ovirt.engine.core.dao.VdsGroupDAO;
 import org.ovirt.engine.core.dao.VmDAO;
 import org.ovirt.engine.core.utils.MockConfigRule;
 
-/** A test case for {@link AddVmTemplateCommand} */
+/**
+ * A test case for {@link AddVmTemplateCommand}
+ */
 @RunWith(MockitoJUnitRunner.class)
 public class AddVmTemplateCommandTest {
 
+    @ClassRule
+    public static MockConfigRule mcr = new 
MockConfigRule(mockConfig(ConfigValues.VmPriorityMaxValue, 100));
     private AddVmTemplateCommand<AddVmTemplateParameters> cmd;
     private VM vm;
     private VDSGroup vdsGroup;
+    private Guid spId;
     @Mock
     private VmDAO vmDao;
-
     @Mock
     private VdsGroupDAO vdsGroupDao;
-
+    @Mock
+    private StoragePoolDAO storagePoolDao;
     @Mock
     private OsRepository osRepository;
-
-    @ClassRule
-    public static MockConfigRule mcr = new 
MockConfigRule(mockConfig(ConfigValues.VmPriorityMaxValue, 100));
+    @Mock
+    private MultipleStorageDomainsValidator multipleSdValidator;
+    @Mock
+    private DiskImagesValidator diskImagesValidator;
 
     @Before
     public void setUp() {
         // The VM to use
         Guid vmId = Guid.newGuid();
         Guid vdsGroupId = Guid.newGuid();
-        Guid spId = Guid.newGuid();
+        spId = Guid.newGuid();
 
         vm = new VM();
         vm.setId(vmId);
@@ -77,7 +96,8 @@
         cmd = spy(new AddVmTemplateCommand<AddVmTemplateParameters>(params) {
 
             @Override
-            protected void updateVmDisks() {
+            protected List<DiskImage> getVmDisksFromDB() {
+                return getDisksList(spId);
             }
 
             @Override
@@ -108,9 +128,31 @@
     public void testCanDoAction() {
         doReturn(true).when(cmd).validateVmNotDuringSnapshot();
         vm.setStatus(VMStatus.Up);
-
         CanDoActionTestUtils.runAndAssertCanDoActionFailure(cmd, 
VdcBllMessages.VMT_CANNOT_CREATE_TEMPLATE_FROM_DOWN_VM);
     }
+
+    @Test
+    public void sufficientStorageSpace() {
+        setupForStorageTests();
+        assertTrue(cmd.imagesRelatedChecks());
+    }
+
+    @Test
+    public void storageSpaceNotWithinThreshold() {
+        setupForStorageTests();
+        doReturn(new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN)).
+                when(multipleSdValidator).allDomainsWithinThresholds();
+        assertFalse(cmd.imagesRelatedChecks());
+    }
+
+    @Test
+    public void insufficientStorageSpace() {
+        setupForStorageTests();
+        doReturn(new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN)).
+                
when(multipleSdValidator).allDomainsHaveSpaceForClonedDisks(anyList());
+        assertFalse(cmd.imagesRelatedChecks());
+    }
+
 
     @Test
     public void testBeanValidations() {
@@ -122,4 +164,32 @@
         cmd.getParameters().setName("aa-??bb");
         assertFalse("Pattern-based name should not be supported for Template", 
cmd.validateInputs());
     }
+
+    private void setupForStorageTests() {
+        doReturn(true).when(cmd).validateVmNotDuringSnapshot();
+        vm.setStatus(VMStatus.Down);
+        
doReturn(multipleSdValidator).when(cmd).getStorageDomainsValidator(any(Guid.class),
 anySet());
+        
doReturn(ValidationResult.VALID).when(multipleSdValidator).allDomainsHaveSpaceForClonedDisks(anyList());
+        
doReturn(ValidationResult.VALID).when(multipleSdValidator).allDomainsWithinThresholds();
+        
doReturn(ValidationResult.VALID).when(multipleSdValidator).allDomainsExistAndActive();
+        
doReturn(ValidationResult.VALID).when(diskImagesValidator).diskImagesNotIllegal();
+
+        setupStoragePool();
+    }
+
+    private void setupStoragePool() {
+        StoragePool storagePool = new StoragePool();
+        storagePool.setId(spId);
+        storagePool.setStatus(StoragePoolStatus.Up);
+        doReturn(storagePoolDao).when(cmd).getStoragePoolDAO();
+        when(storagePoolDao.get(spId)).thenReturn(storagePool);
+    }
+
+    private List<DiskImage> getDisksList(Guid spId) {
+        List disksList = new ArrayList(1);
+        DiskImage disk = new DiskImage();
+        disk.setStorageIds(new ArrayList<>(Collections.singletonList(spId)));
+        disksList.add(disk);
+        return disksList;
+    }
 }


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7980510a7bb72e43e0a9dfc18460207386eb62fe
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5
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