Allon Mureinik has uploaded a new change for review. Change subject: core: Remove image status check from ImagesHandler ......................................................................
core: Remove image status check from ImagesHandler Extracted all image status checks from ImagesHandler and moved them to the new DiskImagesValidator class, as a step in the effort to decouple ImagesHandler.PerformImagesChecks. Change-Id: I7c26d6cf37227aded9318523f0a807e19eeaa7bc Signed-off-by: Allon Mureinik <amure...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.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/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/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/lsm/LiveMigrateVmDisksCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskImagesValidator.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/ImagesHandlerTest.java A backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskImagesValidatorTest.java 17 files changed, 260 insertions(+), 80 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/01/14101/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java index af6d114..edcd8e5 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java @@ -9,6 +9,7 @@ import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.bll.utils.VmDeviceUtils; +import org.ovirt.engine.core.bll.validator.DiskImagesValidator; import org.ovirt.engine.core.bll.validator.VmValidator; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.AddVmFromSnapshotParameters; @@ -278,7 +279,8 @@ List<DiskImage> disksToCheck = ImagesHandler.filterImageDisks(getDiskDao().getAllForVm(getSourceVmFromDb().getId()), true, false); - if (!ImagesHandler.checkImagesLocked(getReturnValue().getCanDoActionMessages(), disksToCheck)) { + DiskImagesValidator diskImagesValidator = new DiskImagesValidator(disksToCheck); + if (!validate(diskImagesValidator.diskImagesNotLocked())) { return false; } 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 8378c76..1ef8979 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 @@ -19,6 +19,7 @@ import org.ovirt.engine.core.bll.storage.StoragePoolValidator; import org.ovirt.engine.core.bll.utils.PermissionSubject; 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.common.AuditLogType; @@ -207,7 +208,10 @@ return false; } - if (!ImagesHandler.checkImagesIllegal(getReturnValue().getCanDoActionMessages(), mImages)) { + List<DiskImage> diskImagesToCheck = ImagesHandler.filterImageDisks(mImages, true, false); + DiskImagesValidator diskImagesValidator = new DiskImagesValidator(diskImagesToCheck); + if (!validate(diskImagesValidator.diskImagesNotIllegal()) || + !validate(diskImagesValidator.diskImagesNotLocked())) { return false; } @@ -223,8 +227,7 @@ true, true, true, - true, - ImagesHandler.filterImageDisks(mImages, true, false))) { + diskImagesToCheck)) { return false; } 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 fcd8292..0fe973e 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 @@ -14,6 +14,7 @@ import org.ovirt.engine.core.bll.snapshots.SnapshotsManager; import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator; import org.ovirt.engine.core.bll.storage.StoragePoolValidator; +import org.ovirt.engine.core.bll.validator.DiskImagesValidator; import org.ovirt.engine.core.bll.validator.MultipleStorageDomainsValidator; import org.ovirt.engine.core.bll.validator.VmValidator; import org.ovirt.engine.core.common.AuditLogType; @@ -306,16 +307,17 @@ MultipleStorageDomainsValidator sdValidator = new MultipleStorageDomainsValidator(getVm().getStoragePoolId(), ImagesHandler.getAllStorageIdsForImageIds(disksList)); + DiskImagesValidator diskImagesValidator = new DiskImagesValidator(disksList); result = validate(spValidator.isUp()) && validate(snapshotValidator.vmNotDuringSnapshot(getVmId())) && validate(snapshotValidator.vmNotInPreview(getVmId())) && validate(vmValidator.vmNotDuringMigration()) && validate(vmValidator.vmNotRunningStateless()) && validate(vmValidator.vmNotIlegal()) + && validate(diskImagesValidator.diskImagesNotLocked()) && ImagesHandler.PerformImagesChecks( getReturnValue().getCanDoActionMessages(), getVm().getStoragePoolId(), - 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 b7a85d2..52f0c99 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 @@ -13,6 +13,7 @@ import org.ovirt.engine.core.bll.storage.StoragePoolValidator; import org.ovirt.engine.core.bll.utils.ClusterUtils; 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.VmValidator; @@ -96,7 +97,9 @@ // load the disks of vm from database VmHandler.updateDisksFromDb(getVm()); - if (!ImagesHandler.checkImagesIllegal(getReturnValue().getCanDoActionMessages(), getVm().getDiskList())) { + DiskImagesValidator diskImagesValidator = new DiskImagesValidator(getDisksBasedOnImage()); + if (!validate(diskImagesValidator.diskImagesNotIllegal()) || + !validate(diskImagesValidator.diskImagesNotLocked())) { return false; } @@ -167,7 +170,6 @@ && ImagesHandler.PerformImagesChecks( getReturnValue().getCanDoActionMessages(), getVm().getStoragePoolId(), - true, false, false, true, 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 5c9d920..fc0696f 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 @@ -449,18 +449,13 @@ public static boolean PerformImagesChecks( List<String> messages, Guid storagePoolId, - boolean checkImagesLocked, boolean checkImagesIllegalInVdsm, boolean checkImagesExist, boolean checkIsValid, List<DiskImage> diskImageList) { boolean returnValue = true; - if (checkImagesLocked) { - returnValue = checkImagesLocked(messages, diskImageList); - } - - if (returnValue && checkIsValid) { + if (checkIsValid) { if (diskImageList.size() > 0) { returnValue = returnValue && checkDiskImages(messages, @@ -473,33 +468,6 @@ ListUtils.nullSafeAdd(messages, VdcBllMessages.ACTION_TYPE_FAILED_VM_HAS_NO_DISKS.toString()); } } - return returnValue; - } - - public static boolean checkImagesLocked(List<String> messages, List<DiskImage> images) { - return checkImagesNotInStatus(messages, images, ImageStatus.LOCKED, VdcBllMessages.ACTION_TYPE_FAILED_DISKS_LOCKED); - } - - public static boolean checkImagesIllegal(List<String> messages, List<DiskImage> images) { - return checkImagesNotInStatus(messages, images, ImageStatus.ILLEGAL, VdcBllMessages.ACTION_TYPE_FAILED_DISKS_ILLEGAL); - } - - private static boolean checkImagesNotInStatus(List<String> messages, List<DiskImage> images, ImageStatus status, VdcBllMessages failMessage) { - boolean returnValue = true; - List<String> disksInStatus = new ArrayList<String>(); - for (DiskImage diskImage : images) { - if (diskImage.getImageStatus() == status) { - disksInStatus.add(diskImage.getDiskAlias()); - returnValue = false; - } - } - - if (disksInStatus.size() > 0) { - ListUtils.nullSafeAdd(messages, failMessage.toString()); - ListUtils.nullSafeAdd(messages, - String.format("$%1$s %2$s", "diskAliases", StringUtils.join(disksInStatus, ", "))); - } - return returnValue; } 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 6de6851..4eceb8a 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 @@ -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.validator.DiskImagesValidator; import org.ovirt.engine.core.bll.validator.StorageDomainValidator; import org.ovirt.engine.core.bll.validator.VmValidator; import org.ovirt.engine.core.common.AuditLogType; @@ -70,16 +71,18 @@ // CheckTemplateInStorageDomain later VmHandler.updateDisksFromDb(getVm()); List<DiskImage> diskImages = ImagesHandler.filterImageDisks(getVm().getDiskMap().values(), false, false); + List<DiskImage> diskImagesToValidate = ImagesHandler.filterImageDisks(diskImages, true, false); + DiskImagesValidator diskImagesValidator = new DiskImagesValidator(diskImagesToValidate); retValue = retValue && validate(new StoragePoolValidator(getStoragePool()).isUp()) && + validate(diskImagesValidator.diskImagesNotLocked()) && ImagesHandler.PerformImagesChecks( getReturnValue().getCanDoActionMessages(), getVm().getStoragePoolId(), true, true, true, - true, - ImagesHandler.filterImageDisks(diskImages, true, false)); + diskImagesToValidate); ensureDomainMap(diskImages, getParameters().getStorageDomainId()); for(DiskImage disk : 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 f8ae1e7..aa8b649 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 @@ -15,6 +15,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.DiskImagesValidator; import org.ovirt.engine.core.bll.validator.StorageDomainValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; @@ -213,15 +214,16 @@ return false; } - List<Disk> diskList = Arrays.asList(getDisk()); - if (!ImagesHandler.PerformImagesChecks( + List<DiskImage> diskList = ImagesHandler.filterImageDisks(Arrays.asList(getDisk()), true, false); + DiskImagesValidator diskImagesValidator = new DiskImagesValidator(diskList); + if (!validate(diskImagesValidator.diskImagesNotLocked()) || + !ImagesHandler.PerformImagesChecks( getReturnValue().getCanDoActionMessages(), storagePoolId, - true, false, false, true, - ImagesHandler.filterImageDisks(diskList, true, false))) { + 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 930566d..54c1f67 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 @@ -14,6 +14,7 @@ import org.ovirt.engine.core.bll.quota.QuotaStorageDependent; import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator; import org.ovirt.engine.core.bll.storage.StoragePoolValidator; +import org.ovirt.engine.core.bll.validator.DiskImagesValidator; import org.ovirt.engine.core.bll.validator.StorageDomainValidator; import org.ovirt.engine.core.bll.validator.VmValidator; import org.ovirt.engine.core.common.AuditLogType; @@ -263,10 +264,12 @@ protected boolean validateImages() { List<DiskImage> imagesToValidate = ImagesHandler.filterImageDisks(getDiskDao().getAllForVm(getVmId()), true, false); + DiskImagesValidator diskImagesValidator = new DiskImagesValidator(imagesToValidate); - return ImagesHandler.PerformImagesChecks(getReturnValue().getCanDoActionMessages(), + return validate(diskImagesValidator.diskImagesNotLocked()) && + ImagesHandler.PerformImagesChecks(getReturnValue().getCanDoActionMessages(), getVm().getStoragePoolId(), - true, true, true, true, imagesToValidate); + true, true, true, imagesToValidate); } 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 2557dae..fedf6df 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 @@ -16,6 +16,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.DiskImagesValidator; import org.ovirt.engine.core.bll.validator.MultipleStorageDomainsValidator; import org.ovirt.engine.core.bll.validator.VmValidator; import org.ovirt.engine.core.common.AuditLogType; @@ -165,10 +166,14 @@ return false; } + DiskImagesValidator diskImagesValidator = new DiskImagesValidator(vmImages); // NO! + if (!getParameters().getForce() && !validate(diskImagesValidator.diskImagesNotLocked())) { + return false; + } + if (!ImagesHandler.PerformImagesChecks( getReturnValue().getCanDoActionMessages(), getVm().getStoragePoolId(), - !getParameters().getForce(), false, false, true, 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 9741b9d..66effab 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 @@ -15,6 +15,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.DiskImagesValidator; import org.ovirt.engine.core.bll.validator.MultipleStorageDomainsValidator; import org.ovirt.engine.core.bll.validator.VmValidator; import org.ovirt.engine.core.common.AuditLogType; @@ -340,14 +341,17 @@ } protected boolean performImagesChecks() { - return ImagesHandler.PerformImagesChecks + List<DiskImage> diskImagesToCheck = + ImagesHandler.filterImageDisks(getImagesList(), true, false); + DiskImagesValidator diskImagesValidator = new DiskImagesValidator(diskImagesToCheck); + return validate(diskImagesValidator.diskImagesNotLocked()) && + ImagesHandler.PerformImagesChecks (getReturnValue().getCanDoActionMessages(), getVm().getStoragePoolId(), - true, false, false, true, - ImagesHandler.filterImageDisks(getImagesList(), true, false)); + diskImagesToCheck); } @Override 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 f314270..33c50e9 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 @@ -9,6 +9,7 @@ import org.ovirt.engine.core.bll.snapshots.SnapshotsManager; import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator; import org.ovirt.engine.core.bll.storage.StoragePoolValidator; +import org.ovirt.engine.core.bll.validator.DiskImagesValidator; import org.ovirt.engine.core.bll.validator.MultipleStorageDomainsValidator; import org.ovirt.engine.core.bll.validator.VmValidator; import org.ovirt.engine.core.common.AuditLogType; @@ -219,7 +220,9 @@ return false; } - if (!ImagesHandler.checkImagesIllegal(getReturnValue().getCanDoActionMessages(), diskImages)) { + DiskImagesValidator diskImagesValidator = new DiskImagesValidator(diskImages); + if (!validate(diskImagesValidator.diskImagesNotIllegal()) || + !validate(diskImagesValidator.diskImagesNotLocked())) { return false; } @@ -232,7 +235,6 @@ || !ImagesHandler.PerformImagesChecks( getReturnValue().getCanDoActionMessages(), getVm().getStoragePoolId(), - true, false, false, true, 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 5e86b99..195791d 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 @@ -1,11 +1,14 @@ package org.ovirt.engine.core.bll; import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedList; import java.util.List; 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.DiskImagesValidator; import org.ovirt.engine.core.bll.validator.StorageDomainValidator; import org.ovirt.engine.core.bll.validator.VmValidator; import org.ovirt.engine.core.common.VdcObjectType; @@ -166,10 +169,18 @@ } } + DiskImagesValidator diskImagesValidator = new DiskImagesValidator(vmImages); + ValidationResult disksNotLockedResult = diskImagesValidator.diskImagesNotLocked(); + if (!disksNotLockedResult.isValid()) { + List<String> messagesToAdd = new LinkedList<String>(); + messagesToAdd.add(disksNotLockedResult.getMessage().name()); + messagesToAdd.addAll(disksNotLockedResult.getVariableReplacements()); + return failVmFree(messages, messagesToAdd); + } + if (!ImagesHandler.PerformImagesChecks( messages, vm.getStoragePoolId(), - true, false, false, true, @@ -189,7 +200,11 @@ for (String messageToAdd : messagesToAdd) { messages.add(messageToAdd); } + return failVmFree(messages, Arrays.asList(messagesToAdd)); + } + private static boolean failVmFree(List<String> messages, List<String> messagesToAdd) { + messages.addAll(messagesToAdd); messages.add(VdcBllMessages.VAR__TYPE__DESKTOP_POOL.toString()); messages.add(VdcBllMessages.VAR__ACTION__ATTACH_DESKTOP_TO.toString()); return false; 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 0d44939..f3786f7 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.DiskImagesValidator; import org.ovirt.engine.core.bll.validator.MultipleStorageDomainsValidator; import org.ovirt.engine.core.bll.validator.StorageDomainValidator; import org.ovirt.engine.core.bll.validator.VmValidator; @@ -293,9 +294,11 @@ */ protected boolean performImageChecksForRunningVm (VM vm, List<String> message, RunVmParams runParams, List<DiskImage> vmDisks) { - return ImagesHandler.PerformImagesChecks(message, + DiskImagesValidator diskImagesValidator = new DiskImagesValidator(vmDisks); + return validate(diskImagesValidator.diskImagesNotLocked(), message) && + ImagesHandler.PerformImagesChecks(message, vm.getStoragePoolId(), - true, false, false, + false, false, !vm.isAutoStartup() || !runParams.getIsInternal(), vmDisks); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java index cad601f..bbc5baa 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java @@ -19,6 +19,7 @@ import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler; import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand; import org.ovirt.engine.core.bll.utils.PermissionSubject; +import org.ovirt.engine.core.bll.validator.DiskImagesValidator; import org.ovirt.engine.core.bll.validator.StorageDomainValidator; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.LiveMigrateDiskParameters; @@ -219,7 +220,8 @@ protected boolean checkImagesStatus() { List<DiskImage> disksToCheck = ImagesHandler.filterImageDisks(getDiskDao().getAllForVm(getVmId()), true, false); - return ImagesHandler.checkImagesLocked(getReturnValue().getCanDoActionMessages(), disksToCheck); + DiskImagesValidator diskImagesValidator = new DiskImagesValidator(disksToCheck); + return validate(diskImagesValidator.diskImagesNotLocked()); } private boolean isDiskNotShareable(Guid imageId) { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskImagesValidator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskImagesValidator.java new file mode 100644 index 0000000..bb084c8 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskImagesValidator.java @@ -0,0 +1,70 @@ +package org.ovirt.engine.core.bll.validator; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.apache.commons.lang.StringUtils; +import org.ovirt.engine.core.bll.ValidationResult; +import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.businessentities.ImageStatus; +import org.ovirt.engine.core.dal.VdcBllMessages; + +/** + * A validator for the {@link DiskImage} class. Since most usecases require validations of multiple {@link DiskImage}s + * (e.g., all the disks belonging to a VM/template), this class works on a {@link Collection} of {@link DiskImage}s. + * + */ +public class DiskImagesValidator { + + private Collection<DiskImage> diskImages; + + public DiskImagesValidator(Collection<DiskImage> disks) { + this.diskImages = disks; + } + + /** + * Validates that non of the disk are {@link ImageStatus#ILLEGAL}. + * + * @return A {@link ValidationResult} with the validation information. + */ + public ValidationResult diskImagesNotIllegal() { + return diskImagesNotInStatus(ImageStatus.ILLEGAL, VdcBllMessages.ACTION_TYPE_FAILED_DISKS_ILLEGAL); + } + + /** + * Validates that non of the disk are {@link ImageStatus#LOCKED}. + * + * @return A {@link ValidationResult} with the validation information. + */ + public ValidationResult diskImagesNotLocked() { + return diskImagesNotInStatus(ImageStatus.LOCKED, VdcBllMessages.ACTION_TYPE_FAILED_DISKS_LOCKED); + } + + /** + * Validates that non of the disk are in the given {@link #status}. + * + * @param status + * The status to check + * @param failMessage + * The validation message to return in case of failure. + * @return A {@link ValidationResult} with the validation information. If none of the disks are in the given status, + * {@link ValidationResult#VALID} is returned. If one or more disks are in that status, a + * {@link ValidationResult} with {@link #failMessage} and the names of the disks in that status is returned. + */ + private ValidationResult diskImagesNotInStatus(ImageStatus status, VdcBllMessages failMessage) { + List<String> disksInStatus = new ArrayList<String>(); + for (DiskImage diskImage : diskImages) { + if (diskImage.getImageStatus() == status) { + disksInStatus.add(diskImage.getDiskAlias()); + } + } + + if (!disksInStatus.isEmpty()) { + return new ValidationResult(failMessage, + String.format("$diskAliases %s", StringUtils.join(disksInStatus, ", "))); + } + + return ValidationResult.VALID; + } +} diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/ImagesHandlerTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/ImagesHandlerTest.java index fd70867..7e6792b 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/ImagesHandlerTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/ImagesHandlerTest.java @@ -2,20 +2,15 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertFalse; import java.util.ArrayList; import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; import java.util.Set; import org.junit.Before; import org.junit.Test; import org.ovirt.engine.core.common.businessentities.DiskImage; -import org.ovirt.engine.core.common.businessentities.ImageStatus; import org.ovirt.engine.core.compat.Guid; -import org.ovirt.engine.core.dal.VdcBllMessages; /** A test case for {@link ImagesHandler} */ public class ImagesHandlerTest { @@ -65,23 +60,6 @@ public void testGetDiskAliasWithDefaultNotNullAlias() { disk1.setDiskAlias("alias"); assertEquals("alias", ImagesHandler.getDiskAliasWithDefault(disk1, "default")); - } - - @Test - public void testCheckImagesIllegalWithIllegalDisk() { - disk1.setImageStatus(ImageStatus.ILLEGAL); - List<DiskImage> images = Arrays.asList(disk1, disk2); - List<String> messages = new LinkedList<String>(); - assertFalse(ImagesHandler.checkImagesIllegal(messages, images)); - assertTrue(messages.contains(VdcBllMessages.ACTION_TYPE_FAILED_DISKS_ILLEGAL.toString())); - } - - @Test - public void testCheckImagesIllegalWithoutIllegalDisk() { - List<DiskImage> images = Arrays.asList(disk1, disk2); - List<String> messages = new LinkedList<String>(); - assertTrue(ImagesHandler.checkImagesIllegal(messages, images)); - assertTrue(messages.isEmpty()); } @Test diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskImagesValidatorTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskImagesValidatorTest.java new file mode 100644 index 0000000..6152636 --- /dev/null +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskImagesValidatorTest.java @@ -0,0 +1,116 @@ +package org.ovirt.engine.core.bll.validator; + +import static org.junit.Assert.assertThat; +import static org.junit.matchers.JUnitMatchers.both; +import static org.junit.matchers.JUnitMatchers.hasItem; +import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.failsWith; +import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.isValid; +import static org.ovirt.engine.core.bll.validator.ValidationResultMatchers.replacements; + +import java.util.Arrays; + +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Test; +import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.businessentities.ImageStatus; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.VdcBllMessages; +import org.ovirt.engine.core.utils.RandomUtils; +import org.ovirt.engine.core.utils.RandomUtilsSeedingRule; + +public class DiskImagesValidatorTest { + @ClassRule + public static RandomUtilsSeedingRule rusr = new RandomUtilsSeedingRule(); + + private DiskImage disk1; + private DiskImage disk2; + private DiskImagesValidator validator; + + @Before + public void setUp() { + disk1 = createDisk(); + disk1.setDiskAlias("disk1"); + disk2 = createDisk(); + disk2.setDiskAlias("disk2"); + validator = new DiskImagesValidator(Arrays.asList(disk1, disk2)); + } + + private static DiskImage createDisk() { + DiskImage disk = new DiskImage(); + disk.setId(Guid.NewGuid()); + disk.setDiskAlias(RandomUtils.instance().nextString(10)); + disk.setActive(true); + disk.setImageStatus(ImageStatus.OK); + + return disk; + } + + private static String createAliasReplacements(DiskImage... disks) { + // Take the first alias + StringBuilder msg = new StringBuilder("$diskAliases ").append(disks[0].getDiskAlias()); + + // And and the rest + for (int i = 1; i < disks.length; ++i) { + msg.append(", ").append(disks[i].getDiskAlias()); + } + + return msg.toString(); + } + + @Test + public void diskImagesNotIllegalBothOK() { + assertThat("Neither disk is illegal", validator.diskImagesNotIllegal(), isValid()); + } + + @Test + public void diskImagesNotIllegalFirstIllegal() { + disk1.setImageStatus(ImageStatus.ILLEGAL); + assertThat(validator.diskImagesNotIllegal(), + both(failsWith(VdcBllMessages.ACTION_TYPE_FAILED_DISKS_ILLEGAL)).and(replacements(hasItem(createAliasReplacements(disk1))))); + } + + @Test + public void diskImagesNotIllegalSecondtIllegal() { + disk2.setImageStatus(ImageStatus.ILLEGAL); + assertThat(validator.diskImagesNotIllegal(), + both(failsWith(VdcBllMessages.ACTION_TYPE_FAILED_DISKS_ILLEGAL)).and(replacements(hasItem(createAliasReplacements(disk2))))); + } + + @Test + public void diskImagesNotIllegalBothIllegal() { + disk1.setImageStatus(ImageStatus.ILLEGAL); + disk2.setImageStatus(ImageStatus.ILLEGAL); + assertThat(validator.diskImagesNotIllegal(), + both(failsWith(VdcBllMessages.ACTION_TYPE_FAILED_DISKS_ILLEGAL)).and(replacements + (hasItem(createAliasReplacements(disk1, disk2))))); + } + + @Test + public void diskImagesNotLockedBothOK() { + assertThat("Neither disk is Locked", validator.diskImagesNotLocked(), isValid()); + } + + @Test + public void diskImagesNotLockedFirstLocked() { + disk1.setImageStatus(ImageStatus.LOCKED); + assertThat(validator.diskImagesNotLocked(), + both(failsWith(VdcBllMessages.ACTION_TYPE_FAILED_DISKS_LOCKED)).and(replacements(hasItem(createAliasReplacements(disk1))))); + } + + @Test + public void diskImagesNotLockedSecondtLocked() { + disk2.setImageStatus(ImageStatus.LOCKED); + assertThat(validator.diskImagesNotLocked(), + both(failsWith(VdcBllMessages.ACTION_TYPE_FAILED_DISKS_LOCKED)).and(replacements(hasItem(createAliasReplacements(disk2))))); + } + + @Test + public void diskImagesNotLockedBothLocked() { + disk1.setImageStatus(ImageStatus.LOCKED); + disk2.setImageStatus(ImageStatus.LOCKED); + assertThat(validator.diskImagesNotLocked(), + both(failsWith(VdcBllMessages.ACTION_TYPE_FAILED_DISKS_LOCKED)).and(replacements + (hasItem(createAliasReplacements(disk1, disk2))))); + } +} -- To view, visit http://gerrit.ovirt.org/14101 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I7c26d6cf37227aded9318523f0a807e19eeaa7bc 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