Allon Mureinik has uploaded a new change for review.

Change subject: core: ImagesHandler: Remove SD status validation
......................................................................

core: ImagesHandler: Remove SD status validation

Extracted the validation of Storage Domain statuses from ImagesHandler
and moved it to its natural place, StorageDomainValidator.

Change-Id: Id632168da64832a9c9393b81e552112240e974c0
Signed-off-by: Allon Mureinik <amure...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java
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/CreateAllSnapshotsFromVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.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/MoveOrCopyTemplateCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreAllSnapshotsCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmRunHandler.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmTemplateCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java
18 files changed, 148 insertions(+), 42 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/87/11487/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java
index 9789194..6a48f6e 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java
@@ -212,7 +212,6 @@
                 true,
                 false,
                 false,
-                false,
                 true,
                 Collections.<Disk> emptyList());
     }
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 bb8bce6..83c0dd0 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
@@ -204,13 +204,18 @@
         }
 
         for (Guid srcStorageDomainId : sourceImageDomainsImageMap.keySet()) {
+            storage_domains domain = getStorageDomain(srcStorageDomainId);
+
+            if (!validate(new 
StorageDomainValidator(domain).isDomainExistAndActive())) {
+                return false;
+            }
+
             boolean checkIsValid = true;
             if (!ImagesHandler.PerformImagesChecks(
                     getReturnValue().getCanDoActionMessages(),
                     getVm().getStoragePoolId(),
                     srcStorageDomainId,
                     false,
-                    true,
                     true,
                     true,
                     true,
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 147d235..50bed57 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
@@ -293,11 +293,11 @@
                     && validate(vmValidator.vmNotDuringMigration())
                     && validate(vmValidator.vmNotRunningStateless())
                     && validate(vmValidator.vmNotIlegal())
+                    && validateStorageDoaminsActive(disksList)
                     && ImagesHandler.PerformImagesChecks(
                             getReturnValue().getCanDoActionMessages(),
                             getVm().getStoragePoolId(),
                             Guid.Empty,
-                            true,
                             true,
                             true,
                             true,
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java
index cd5fb10..044e3d5 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java
@@ -152,12 +152,21 @@
             return false;
         }
 
+        // Check the source storage domains exist and are up
+        for (Guid sdId : 
ImagesHandler.getAllDomainsIds(getDisksBasedOnImage())) {
+            StorageDomainValidator sdValidator = new 
StorageDomainValidator(getStorageDomain(sdId));
+            if (validate(sdValidator.isDomainExistAndActive())) {
+                return false;
+            }
+        }
+
         SnapshotsValidator snapshotValidator = new SnapshotsValidator();
         if (!(checkVmInStorageDomain()
                 && validate(new StoragePoolValidator(getStoragePool()).isUp())
                 && validate(snapshotValidator.vmNotDuringSnapshot(getVmId()))
                 && validate(snapshotValidator.vmNotInPreview(getVmId()))
                 && validate(new VmValidator(getVm()).vmDown())
+                && validateStorageDoaminsActive(getDisksBasedOnImage())
                 && ImagesHandler.PerformImagesChecks(
                         getReturnValue().getCanDoActionMessages(),
                         getVm().getStoragePoolId(),
@@ -166,7 +175,6 @@
                         true,
                         false,
                         false,
-                        true,
                         true,
                         getDisksBasedOnImage()))) {
             return false;
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 0bbd43c..610ff8f 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
@@ -2,6 +2,7 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -445,7 +446,6 @@
             boolean checkImagesLocked,
             boolean checkImagesIllegal,
             boolean checkImagesExist,
-            boolean checkStorageDomain,
             boolean checkIsValid,
             Collection<? extends Disk> diskImageList) {
 
@@ -464,7 +464,6 @@
                                 diskSpaceCheck,
                                 checkImagesIllegal,
                                 checkImagesExist,
-                                checkStorageDomain,
                                 images);
             } else if (checkImagesExist) {
                 returnValue = false;
@@ -511,32 +510,21 @@
             boolean diskSpaceCheck,
             boolean checkImagesIllegal,
             boolean checkImagesExist,
-            boolean checkStorageDomain,
             List<DiskImage> images) {
         boolean returnValue = true;
         ArrayList<DiskImage> irsImages = new ArrayList<DiskImage>();
 
-        if (diskSpaceCheck || checkStorageDomain) {
-            Set<Guid> domainsIds = new HashSet<Guid>();
+        if (diskSpaceCheck) {
+            Set<Guid> domainsIds;
             if (!Guid.Empty.equals(storageDomainId)) {
-                domainsIds.add(storageDomainId);
+                domainsIds = Collections.singleton(storageDomainId);
             } else {
-                for (DiskImage image : images) {
-                    domainsIds.addAll(image.getstorage_ids());
-                }
+                domainsIds = getAllDomainsIds(images);
             }
+
             for (Guid domainId : domainsIds) {
                 storage_domains domain = 
DbFacade.getInstance().getStorageDomainDao().getForStoragePool(
                         domainId, storagePoolId);
-                if (checkStorageDomain) {
-                    StorageDomainValidator storageDomainValidator =
-                            new StorageDomainValidator(domain);
-                    ValidationResult res = 
storageDomainValidator.isDomainExistAndActive();
-                    returnValue = res.isValid();
-                    if (!returnValue) {
-                        messages.add(res.getMessage().toString());
-                    }
-                }
                 if (diskSpaceCheck && returnValue && 
!StorageDomainSpaceChecker.isBelowThresholds(domain)) {
                     returnValue = false;
                     ListUtils.nullSafeAdd(messages, 
VdcBllMessages.ACTION_TYPE_FAILED_DISK_SPACE_LOW.toString());
@@ -558,6 +546,14 @@
         return returnValue;
     }
 
+    public static Set<Guid> getAllDomainsIds(Collection<DiskImage> images) {
+        Set<Guid> domainsIds = new HashSet<Guid>();
+        for (DiskImage image : images) {
+            domainsIds.addAll(image.getstorage_ids());
+        }
+        return domainsIds;
+    }
+
     private static boolean CheckImagesLegality
             (List<String> messages, List<DiskImage> images, List<DiskImage> 
irsImages) {
         boolean returnValue = true;
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 a0efdbf..a56ff20 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
@@ -281,10 +281,6 @@
         return VdcActionType.MoveOrCopyImageGroup;
     }
 
-    protected storage_domains getStorageDomain(Guid domainId) {
-        return getStorageDomainDAO().getForStoragePool(domainId, 
getStoragePool().getId());
-    }
-
     protected Map<storage_domains, Integer> 
getSpaceRequirementsForStorageDomains(Collection<DiskImage> images) {
         Map<DiskImage, storage_domains> spaceMap = new HashMap<DiskImage, 
storage_domains>();
         for (DiskImage image : images) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveVmCommand.java
index be63a0d..2f44c6c 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveVmCommand.java
@@ -80,7 +80,6 @@
                                 true,
                                 true,
                                 true,
-                                false,
                                 true,
                                 diskImages);
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java
index 335cf5f..26d24b8 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java
@@ -247,7 +247,6 @@
                             firstTime,
                             false,
                             false,
-                            false,
                             firstTime,
                             diskList)) {
                 return false;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotCommand.java
index 534a9a3..2dd565f 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotCommand.java
@@ -28,6 +28,7 @@
 import org.ovirt.engine.core.common.locks.LockingGroup;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.VdcBllMessages;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.dao.SnapshotDao;
 import org.ovirt.engine.core.utils.transaction.TransactionMethod;
 import org.ovirt.engine.core.utils.transaction.TransactionSupport;
@@ -39,6 +40,7 @@
 
     private static final long serialVersionUID = 3162100352844371734L;
     private List<DiskImage> _sourceImages = null;
+    private List<DiskImage> _imagesForValidation = null;
 
     public RemoveSnapshotCommand(T parameters) {
         super(parameters);
@@ -73,6 +75,21 @@
             _sourceImages = 
getDiskImageDao().getAllSnapshotsForVmSnapshot(getParameters().getSnapshotId());
         }
         return _sourceImages;
+    }
+
+    /**
+     * @return The list of images that validations are run on.
+     * This is done in order to keep backwards compatibility to the class' 
original behaviour.
+     * In the future, this should be revisited and checked if it can be united 
with {@link #getSourceImages()}
+     */
+    protected List<DiskImage> getImagesForValidation() {
+        if (_imagesForValidation == null) {
+            _imagesForValidation =
+                    
ImagesHandler.filterImageDisks(DbFacade.getInstance().getDiskDao().getAllForVm(getVmId()),
+                            true,
+                            false);
+        }
+        return _imagesForValidation;
     }
 
     @Override
@@ -168,6 +185,7 @@
                 !validateVmNotInPreview() ||
                 !validateSnapshotExists() ||
                 !validate(new VmValidator(getVm()).vmDown()) ||
+                !validateStorageDoaminsActive(getImagesForValidation()) ||
                 !validateImagesAndVMStates()) {
             return false;
         }
@@ -210,7 +228,7 @@
     protected boolean validateImagesAndVMStates() {
         return 
ImagesHandler.PerformImagesChecks(getReturnValue().getCanDoActionMessages(),
                 getVm().getStoragePoolId(), Guid.Empty,
-                hasImages(), hasImages(), hasImages(), hasImages(), true, 
true, getDiskDao().getAllForVm(getVmId()));
+                hasImages(), hasImages(), hasImages(), hasImages(), true, 
getImagesForValidation());
     }
 
     protected boolean validateImageNotInTemplate() {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java
index a925ff2..5dccddf 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java
@@ -152,6 +152,10 @@
             return false;
         }
 
+        if 
(!validateStorageDoaminsActive(ImagesHandler.filterImageDisks(getVm().getDiskMap().values(),
 true, false))) {
+            return false;
+        }
+
         if (!ImagesHandler.PerformImagesChecks(
                 getReturnValue().getCanDoActionMessages(),
                 getVm().getStoragePoolId(),
@@ -160,7 +164,6 @@
                 !getParameters().getForce(),
                 false,
                 false,
-                !getVm().getDiskMap().values().isEmpty(),
                 true,
                 getVm().getDiskMap().values())) {
             return false;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreAllSnapshotsCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreAllSnapshotsCommand.java
index cdbf1bf..79e47e5 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreAllSnapshotsCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreAllSnapshotsCommand.java
@@ -303,6 +303,7 @@
         VmValidator vmValidator = new VmValidator(getVm());
         if (!validate(snapshotValidator.snapshotExists(getVmId(), 
getParameters().getDstSnapshotId())) ||
                 !validate(new StoragePoolValidator(getStoragePool()).isUp()) ||
+                !validateStorageDoaminsActive(getImagesList()) ||
                 !performImagesChecks() ||
                 !validate(vmValidator.vmDown())) {
             return false;
@@ -336,7 +337,6 @@
                         true,
                         false,
                         false,
-                        true,
                         true,
                         getImagesList());
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java
index d45fae3..24798ef 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java
@@ -216,6 +216,7 @@
                 ImagesHandler.filterImageDisks(getVm().getDiskMap().values(), 
false, true);
         if (!diskImages.isEmpty()) {
           if (!validate(new StoragePoolValidator(getStoragePool()).isUp())
+                  || !validateStorageDoaminsActive(diskImages)
                   || !ImagesHandler.PerformImagesChecks(
                                     getReturnValue().getCanDoActionMessages(),
                                     getVm().getStoragePoolId(),
@@ -224,7 +225,6 @@
                                     true,
                                     false,
                                     false,
-                                    true,
                                     true,
                                     diskImages)) {
               return false;
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 8a74e59..2c0a19b 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,23 +1,27 @@
 package org.ovirt.engine.core.bll;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 
 import org.ovirt.engine.core.bll.network.MacPoolManager;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
+import org.ovirt.engine.core.bll.validator.StorageDomainValidator;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.action.VmOperationParameterBase;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
 import org.ovirt.engine.core.common.businessentities.Disk;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
 import org.ovirt.engine.core.common.businessentities.DiskInterface;
 import org.ovirt.engine.core.common.businessentities.TagsVmMap;
 import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.businessentities.VMStatus;
 import org.ovirt.engine.core.common.businessentities.VmPayload;
 import org.ovirt.engine.core.common.businessentities.VmStatic;
+import org.ovirt.engine.core.common.businessentities.storage_domains;
 import org.ovirt.engine.core.common.businessentities.tags;
 import org.ovirt.engine.core.common.businessentities.network.VmInterfaceType;
 import 
org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface;
@@ -406,6 +410,20 @@
         return true;
     }
 
+    protected boolean validateStorageDoaminsActive(Collection<DiskImage> 
disksList) {
+        for (Guid sdId : ImagesHandler.getAllDomainsIds(disksList)) {
+            StorageDomainValidator sdValidator = new 
StorageDomainValidator(getStorageDomain(sdId));
+            if (validate(sdValidator.isDomainExistAndActive())) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    protected storage_domains getStorageDomain(Guid domainId) {
+        return getStorageDomainDAO().getForStoragePool(domainId, 
getStoragePool().getId());
+    }
+
     protected VmDeviceDAO getVmDeviceDao() {
         return getDbFacade().getVmDeviceDao();
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
index 0f1ee92..2b35789 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
@@ -6,6 +6,7 @@
 import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator;
 import org.ovirt.engine.core.bll.storage.StoragePoolValidator;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
+import org.ovirt.engine.core.bll.validator.StorageDomainValidator;
 import org.ovirt.engine.core.bll.validator.VmValidator;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.RunVmParams;
@@ -18,6 +19,7 @@
 import org.ovirt.engine.core.common.businessentities.VmDynamic;
 import org.ovirt.engine.core.common.businessentities.VmPoolMap;
 import org.ovirt.engine.core.common.businessentities.VmType;
+import org.ovirt.engine.core.common.businessentities.storage_domains;
 import org.ovirt.engine.core.common.businessentities.storage_pool;
 import org.ovirt.engine.core.common.businessentities.tags;
 import org.ovirt.engine.core.common.businessentities.vm_pools;
@@ -212,6 +214,16 @@
                     returnValue = false;
                 }
 
+                if (!Guid.Empty.equals(storageDomainId)) {
+                    storage_domains domain = 
DbFacade.getInstance().getStorageDomainDao().getForStoragePool(
+                            storageDomainId, vm.getStoragePoolId());
+                    ValidationResult sdUpResult = new 
StorageDomainValidator(domain).isDomainExistAndActive();
+                    if (!sdUpResult.isValid()) {
+                        messages.add(sdUpResult.getMessage().name());
+                        returnValue = false;
+                    }
+                }
+
                 if (returnValue) {
                     returnValue =
                         ImagesHandler.PerformImagesChecks(
@@ -222,7 +234,6 @@
                                 true,
                                 false,
                                 false,
-                                !Guid.Empty.equals(storageDomainId),
                                 true,
                                 disks);
                 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmRunHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmRunHandler.java
index 344caf4..a41e5ff 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmRunHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmRunHandler.java
@@ -12,6 +12,7 @@
 import org.ovirt.engine.core.bll.interfaces.BackendInternal;
 import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator;
 import org.ovirt.engine.core.bll.storage.StoragePoolValidator;
+import org.ovirt.engine.core.bll.validator.StorageDomainValidator;
 import org.ovirt.engine.core.bll.validator.VmValidator;
 import org.ovirt.engine.core.common.VdcActionUtils;
 import org.ovirt.engine.core.common.action.RunVmParams;
@@ -119,7 +120,22 @@
                             }
                         }
 
-                        if (retValue && !performImageChecksForRunningVm(vm, 
message, runParams, vmDisks)) {
+                        List<DiskImage> vmDiskImages = 
ImagesHandler.filterImageDisks(vmDisks, true, false);
+                        if (retValue && isRunInvokedByUser(vm, runParams)) {
+                            for (Guid sdId : 
ImagesHandler.getAllDomainsIds(vmDiskImages)) {
+                                storage_domains sd =
+                                        
getStorageDomainDAO().getForStoragePool(sdId, vm.getStoragePoolId());
+                                StorageDomainValidator sdValidator = new 
StorageDomainValidator(sd);
+                                ValidationResult sdUpResult = 
sdValidator.isDomainExistAndActive();
+                                if (!sdUpResult.isValid()) {
+                                    
message.add(sdUpResult.getMessage().name());
+                                    retValue = false;
+                                    break;
+                                }
+                            }
+                        }
+
+                        if (retValue && !performImageChecksForRunningVm(vm, 
message, runParams, vmDiskImages)) {
                             retValue = false;
                         }
 
@@ -232,15 +248,19 @@
      * Check isValid, storageDomain and diskSpace only if VM is not HA VM
      */
     protected boolean performImageChecksForRunningVm
-            (VM vm, List<String> message, RunVmParams runParams, List<Disk> 
vmDisks) {
+            (VM vm, List<String> message, RunVmParams runParams, List<? 
extends Disk> vmDisks) {
         return ImagesHandler.PerformImagesChecks(message,
                 vm.getStoragePoolId(), Guid.Empty, !vm.isAutoStartup(),
                 true, false, false,
-                !vm.isAutoStartup() || !runParams.getIsInternal() && 
vm.isAutoStartup(),
-                !vm.isAutoStartup() || !runParams.getIsInternal() && 
vm.isAutoStartup(),
+                isRunInvokedByUser(vm, runParams),
                 vmDisks);
     }
 
+    /** @return Is the VM run due to a user request (i.e., not due to the HA 
mechanism */
+    private static boolean isRunInvokedByUser(VM vm, RunVmParams runParams) {
+        return !vm.isAutoStartup() || !runParams.getIsInternal() && 
vm.isAutoStartup();
+    }
+
     /**
      * The following method should return only plugged images which are 
attached to VM,
      * only those images are relevant for the RunVmCommand
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmTemplateCommand.java
index 16472bc..0b48c2e 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmTemplateCommand.java
@@ -15,6 +15,7 @@
 import org.ovirt.engine.core.common.businessentities.VmDeviceId;
 import org.ovirt.engine.core.common.businessentities.VmTemplate;
 import org.ovirt.engine.core.common.businessentities.VmTemplateStatus;
+import org.ovirt.engine.core.common.businessentities.storage_domains;
 import 
org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface;
 import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.config.ConfigValues;
@@ -206,4 +207,8 @@
         }
         return jobProperties;
     }
+
+    protected storage_domains getStorageDomain(Guid domainId) {
+        return getStorageDomainDAO().getForStoragePool(domainId, 
getStoragePool().getId());
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java
index ade5e90..e3eae09 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java
@@ -1,14 +1,18 @@
 package org.ovirt.engine.core.bll.storage;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 
+import org.ovirt.engine.core.bll.ImagesHandler;
 import org.ovirt.engine.core.bll.context.CompensationContext;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
+import org.ovirt.engine.core.bll.validator.StorageDomainValidator;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.StorageDomainParametersBase;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
 import 
org.ovirt.engine.core.common.businessentities.LUN_storage_server_connection_map;
 import 
org.ovirt.engine.core.common.businessentities.LUN_storage_server_connection_map_id;
 import org.ovirt.engine.core.common.businessentities.LUNs;
@@ -64,6 +68,10 @@
     public NGuid getStorageDomainId() {
         return getParameters() != null ? 
!Guid.Empty.equals(getParameters().getStorageDomainId()) ? getParameters()
                 .getStorageDomainId() : super.getStorageDomainId() : 
super.getStorageDomainId();
+    }
+
+    public storage_domains getStorageDomain(Guid domainId) {
+        return getStorageDomainDAO().getForStoragePool(domainId, 
getStoragePool().getId());
     }
 
     protected boolean canDetachDomain(boolean isDestroyStoragePool, boolean 
isRemoveLast, boolean isInternal) {
@@ -180,6 +188,16 @@
         return valid;
     }
 
+    protected boolean validateStorageDoaminsActive(Collection<DiskImage> 
disksList) {
+        for (Guid sdId : ImagesHandler.getAllDomainsIds(disksList)) {
+            StorageDomainValidator sdValidator = new 
StorageDomainValidator(getStorageDomain(sdId));
+            if (validate(sdValidator.isDomainExistAndActive())) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     protected boolean checkStorageDomainStatusNotEqual(StorageDomainStatus 
status) {
         boolean returnValue = false;
         if (getStorageDomain() != null && getStorageDomain().getstatus() != 
null) {
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java
index aa95bb9..8830e34 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java
@@ -36,6 +36,7 @@
 import org.ovirt.engine.core.common.businessentities.Disk;
 import org.ovirt.engine.core.common.businessentities.DiskImage;
 import org.ovirt.engine.core.common.businessentities.IVdsAsyncCommand;
+import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
 import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
 import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.businessentities.VMStatus;
@@ -87,6 +88,9 @@
 
     @Mock
     private StoragePoolDAO spDao;
+
+    @Mock
+    private StorageDomainDAO sdDao;
 
     @Spy
     private final VmRunHandler vmRunHandler = VmRunHandler.getInstance();
@@ -327,17 +331,25 @@
     }
 
     protected void mockVmRunHandler() {
+        Guid spId = Guid.NewGuid();
         storage_pool sp = new storage_pool();
+        sp.setId(spId);
         sp.setstatus(StoragePoolStatus.Up);
         when(spDao.get(any(Guid.class))).thenReturn(sp);
         doReturn(spDao).when(vmRunHandler).getStoragePoolDAO();
 
-        doReturn(vmRunHandler).when(command).getVmRunHandler();
+        storage_domains sd = new storage_domains();
+        sd.setstatus(StorageDomainStatus.Active);
+        sd.setstorage_pool_id(spId);
+        when(sdDao.getForStoragePool(any(Guid.class), 
any(NGuid.class))).thenReturn(sd);
+        doReturn(sdDao).when(vmRunHandler).getStorageDomainDAO();
 
         
doReturn(true).when(vmRunHandler).performImageChecksForRunningVm(any(VM.class),
                 anyListOf(String.class),
                 any(RunVmParams.class),
                 anyListOf(Disk.class));
+
+        doReturn(vmRunHandler).when(command).getVmRunHandler();
     }
 
     @Test
@@ -478,11 +490,10 @@
         doReturn(diskDao).when(command).getDiskDao();
         doReturn(diskDao).when(vmRunHandler).getDiskDao();
 
-        final StorageDomainDAO storageDomainDAO = mock(StorageDomainDAO.class);
-        when(storageDomainDAO.getAllForStoragePool(Guid.Empty))
+        when(sdDao.getAllForStoragePool(Guid.Empty))
                 .thenReturn(new ArrayList<storage_domains>());
-        doReturn(storageDomainDAO).when(command).getStorageDomainDAO();
-        doReturn(storageDomainDAO).when(vmRunHandler).getStorageDomainDAO();
+        doReturn(sdDao).when(command).getStorageDomainDAO();
+        doReturn(sdDao).when(vmRunHandler).getStorageDomainDAO();
 
         final VmDeviceDAO vmDeviceDao = mock(VmDeviceDAO.class);
         when(vmDeviceDao.getVmDeviceByVmIdTypeAndDevice(Guid.Empty,


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id632168da64832a9c9393b81e552112240e974c0
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Allon Mureinik <amure...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to