diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/disk/image/TransferDiskImageCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/disk/image/TransferDiskImageCommand.java index 0a073c5714d..e32c6cd7985 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/disk/image/TransferDiskImageCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/disk/image/TransferDiskImageCommand.java @@ -12,6 +12,7 @@ import javax.inject.Inject; import org.ovirt.engine.core.bll.CommandActionState; +import org.ovirt.engine.core.bll.LockMessage; import org.ovirt.engine.core.bll.LockMessagesMatchUtil; import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; import org.ovirt.engine.core.bll.ValidationResult; @@ -435,14 +436,21 @@ protected Map> getSharedLocks() { // StartVmBackup should handle locks return locks; } - if (!Guid.isNullOrEmpty(getParameters().getImageId())) { + if (!Guid.isNullOrEmpty(getParameters().getImageId()) && getDiskImage() != null) { List vms = vmDao.getVmsListForDisk(getDiskImage().getId(), true); vms.forEach(vm -> locks.put(vm.getId().toString(), - LockMessagesMatchUtil.makeLockingPair(LockingGroup.VM, EngineMessage.ACTION_TYPE_FAILED_VM_IS_LOCKED))); + LockMessagesMatchUtil.makeLockingPair(LockingGroup.VM, getDiskIsBeingTransferredLockMessage()))); } + return locks; } + private String getDiskIsBeingTransferredLockMessage() { + return new LockMessage(EngineMessage.ACTION_TYPE_FAILED_DISK_IS_BEING_TRANSFERRED) + .withOptional("DiskName", getDiskImage().getDiskAlias() != null ? getDiskImage().getDiskAlias() : "") + .toString(); + } + @Override protected Map> getExclusiveLocks() { Map> locks = new HashMap<>(); @@ -452,7 +460,7 @@ protected Map> getExclusiveLocks() { } if (getDiskImage() != null) { locks.put(getDiskImage().getId().toString(), - LockMessagesMatchUtil.makeLockingPair(LockingGroup.DISK, EngineMessage.ACTION_TYPE_FAILED_DISK_IS_LOCKED)); + LockMessagesMatchUtil.makeLockingPair(LockingGroup.DISK, getDiskIsBeingTransferredLockMessage())); } return locks; } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/EngineMessage.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/EngineMessage.java index 73e9c21251a..94626761daa 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/EngineMessage.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/EngineMessage.java @@ -1047,6 +1047,7 @@ public enum EngineMessage { ACTION_TYPE_FAILED_VM_IS_HIBERNATING(ErrorType.CONFLICT), ACTION_TYPE_FAILED_DISK_IS_USED_FOR_CREATE_VM(ErrorType.CONFLICT), ACTION_TYPE_FAILED_DISK_IS_BEING_REMOVED(ErrorType.CONFLICT), + ACTION_TYPE_FAILED_DISK_IS_BEING_TRANSFERRED(ErrorType.CONFLICT), ACTION_TYPE_FAILED_OVF_DISK_IS_BEING_USED(ErrorType.CONFLICT), ACTION_TYPE_FAILED_UNSUPPORTED_OVF(ErrorType.CONFLICT), ACTION_TYPE_FAILED_DOMAIN_OVF_ON_UPDATE(ErrorType.CONFLICT), diff --git a/frontend/webadmin/modules/frontend/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/frontend/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index 4a5f4db5055..72160dc60d0 100644 --- a/frontend/webadmin/modules/frontend/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/frontend/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -141,6 +141,7 @@ ACTION_TYPE_FAILED_DISCARD_AFTER_DELETE_SUPPORTED_ONLY_BY_BLOCK_DOMAINS=Cannot $ ACTION_TYPE_FAILED_DISK_CONFIGURATION_NOT_SUPPORTED=Cannot ${action} ${type}. Disk configuration (${volumeFormat} ${volumeType} backup-${backup}) is incompatible with the storage domain type. ACTION_TYPE_FAILED_DISK_HAS_SNAPSHOTS=Cannot ${action} ${type}. Disks with snapshots are not supported. ACTION_TYPE_FAILED_DISK_IS_BEING_EXPORTED=Cannot ${action} ${type}. Disk ${DiskAlias} is being exported. +ACTION_TYPE_FAILED_DISK_IS_BEING_TRANSFERRED=Cannot ${action} ${type}. Disk ${DiskName} is being transferred. ACTION_TYPE_FAILED_DISK_IS_BEING_CONVERTED=Cannot ${action} ${type}. Disk ${DiskAlias} is being converted. ACTION_TYPE_FAILED_DISK_IS_BEING_MIGRATED=Cannot ${action} ${type}. Disk ${DiskName} is being moved or copied. ACTION_TYPE_FAILED_DISK_IMAGE_CANNOT_BE_MEASURED_WHILE_USED=Cannot measure image ${imageId}, it is being used by a VM.