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