Liron Ar has uploaded a new change for review.

Change subject: core: LSM - lock changes, added support for disk snapshot 
scenarios
......................................................................

core: LSM - lock changes, added support for disk snapshot scenarios

This patch contains the following changes:
*When live migrating a disk, the disk (and it's snapshots) would be
locked for the whole flow preventing other operations to be done on the
disk. Therefore the create snapshot command will ignore those disks in
its checks and they won't be unlocked as the snapshot phase ends.

*Disk can be live migrated when snapshots of it are attached to other
vms unless those vms are not in "Down" status as it means that the disk
is being used by them.

*When live migrating the disk (after creating the snapshot for the
migration) all the disk snapshots would be locked and not just the
active volume.

*Task Handlers should be able to use the compensation context of the
enclosing command.

Change-Id: I0c7cb49ff37f28d0b3ab0df9f4ee1f3082aba018
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1028768
Signed-off-by: Liron Aravot <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseImagesCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.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/ImagesHandler.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveDisksCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/CreateImagePlaceholderTaskHandler.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDisksTaskHandler.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/VmReplicateDiskFinishTaskHandler.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskValidator.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommandTest.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskValidatorTest.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CreateAllSnapshotsFromVmParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImagesActionsParametersBase.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/LiveMigrateDiskParameters.java
19 files changed, 348 insertions(+), 79 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/04/21804/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseImagesCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseImagesCommand.java
index aec0f6f..a92baf3 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseImagesCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseImagesCommand.java
@@ -326,13 +326,17 @@
                 log.errorFormat("Unable to update the image info for image {0} 
(image group: {1}) on domain {2}",
                         newImageId, newImageGroupId, newStorageDomainID);
             } finally {
-                // Unlock destination image:
-                getDestinationDiskImage().setImageStatus(ImageStatus.OK);
+                if (!getParameters().isLeaveLocked()) {
+                    getDestinationDiskImage().setImageStatus(ImageStatus.OK);
+                }
                 getImageDao().update(getDestinationDiskImage().getImage());
             }
         }
 
-        unLockImage();
+        if (!getParameters().isLeaveLocked()) {
+            unLockImage();
+        }
+
         setSucceeded(true);
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
index 0416bf2..4de3bcd 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
@@ -320,7 +320,7 @@
     /**
      * @return the compensationContext
      */
-    protected CompensationContext getCompensationContext() {
+    public CompensationContext getCompensationContext() {
         return context.getCompensationContext();
     }
 
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 a864561..7911a2c 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
@@ -3,6 +3,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
@@ -105,6 +106,21 @@
                     true);
         }
         return cachedSelectedActiveDisks;
+    }
+
+    protected List<DiskImage> getDisksListForChecks() {
+        if (getParameters().getDiskIdsToIgnoreInChecks().isEmpty()) {
+            return getDisksList();
+        }
+
+        List<DiskImage> toReturn = new LinkedList<>();
+        for (DiskImage diskImage : getDisksList()) {
+            if 
(!getParameters().getDiskIdsToIgnoreInChecks().contains(diskImage.getId())) {
+                toReturn.add(diskImage);
+            }
+        }
+
+        return toReturn;
     }
 
     private void incrementVmGeneration() {
@@ -212,6 +228,9 @@
         result.setEntityInfo(getParameters().getEntityInfo());
         result.setParentCommand(parentCommand);
         result.setParentParameters(getParametersForTask(parentCommand, 
getParameters()));
+        if 
(getParameters().getDiskIdsToIgnoreInChecks().contains(image.getId())) {
+            result.setLeaveLocked(true);
+        }
         return result;
     }
 
@@ -456,7 +475,7 @@
             return false;
         }
 
-        List<DiskImage> disksList = getDisksList();
+        List<DiskImage> disksList = getDisksListForChecks();
         if (disksList.size() > 0) {
             MultipleStorageDomainsValidator sdValidator = 
createMultipleStorageDomainsValidator(disksList);
             DiskImagesValidator diskImagesValidator = 
createDiskImageValidator(disksList);
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 6a9f9f0..a9c80ed 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
@@ -658,7 +658,7 @@
         DbFacade.getInstance().getImageDao().updateStatus(imageId, 
imageStatus);
     }
 
-    protected static void 
updateAllDiskImageSnapshotsStatusWithCompensation(final Guid diskId,
+    public static void updateAllDiskImageSnapshotsStatusWithCompensation(final 
Guid diskId,
             final ImageStatus status,
             ImageStatus statusForCompensation,
             final CompensationContext compensationContext) {
@@ -684,7 +684,7 @@
         }
     }
 
-    protected static void updateAllDiskImageSnapshotsStatus(Guid diskId, 
ImageStatus status) {
+    public static void updateAllDiskImageSnapshotsStatus(Guid diskId, 
ImageStatus status) {
         
DbFacade.getInstance().getImageDao().updateStatusOfImagesByImageGroupId(diskId, 
status);
     }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveDisksCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveDisksCommand.java
index 4597e4f..41ac529 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveDisksCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveDisksCommand.java
@@ -170,7 +170,8 @@
                 moveDiskParameters.getSourceDomainId(),
                 moveDiskParameters.getStorageDomainId(),
                 vmId,
-                moveDiskParameters.getQuotaId());
+                moveDiskParameters.getQuotaId(),
+                diskMap.get(moveDiskParameters.getImageId()).getId());
     }
 
     private LiveMigrateVmDisksParameters 
createLiveMigrateVmDisksParameters(List<MoveDiskParameters> moveDiskParamsList, 
Guid vmId) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java
index 4a2c27d..3b3ee3c 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java
@@ -13,6 +13,7 @@
 import org.ovirt.engine.core.bll.quota.QuotaStorageConsumptionParameter;
 import org.ovirt.engine.core.bll.quota.QuotaStorageDependent;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
+import org.ovirt.engine.core.bll.validator.DiskValidator;
 import org.ovirt.engine.core.bll.validator.StorageDomainValidator;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.VdcObjectType;
@@ -26,7 +27,6 @@
 import org.ovirt.engine.core.common.businessentities.ImageStatus;
 import org.ovirt.engine.core.common.businessentities.StorageDomain;
 import org.ovirt.engine.core.common.businessentities.VM;
-import org.ovirt.engine.core.common.businessentities.VMStatus;
 import org.ovirt.engine.core.common.businessentities.VmDevice;
 import org.ovirt.engine.core.common.businessentities.VmEntityType;
 import org.ovirt.engine.core.common.businessentities.VmTemplate;
@@ -207,24 +207,13 @@
      * @return
      */
     protected boolean checkCanBeMoveInVm() {
-        List<Pair<VM, VmDevice>> vmsForDisk = 
getVmsWithVmDeviceInfoForDiskId();
-
-        for (Pair<VM, VmDevice> pair : vmsForDisk) {
-            VM currVm = pair.getFirst();
-            if (VMStatus.Down != currVm.getStatus()) {
-                if (pair.getSecond().getIsPlugged()) {
-                    
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_VM_IS_NOT_DOWN);
-                    return false;
-                }
-            }
-        }
-        return true;
+        return validate(new 
DiskValidator(getImage()).isDiskPluggedToVmsThatAreNotDown(false, 
getVmsWithVmDeviceInfoForDiskId()));
     }
 
     /**
      * Cache method to retrieve all the VMs with the device info related to 
the image
      */
-    private List<Pair<VM, VmDevice>> getVmsWithVmDeviceInfoForDiskId() {
+    protected List<Pair<VM, VmDevice>> getVmsWithVmDeviceInfoForDiskId() {
         if (cachedVmsDeviceInfo == null) {
             cachedVmsDeviceInfo = 
getVmDAO().getVmsWithPlugInfo(getImage().getId());
         }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/CreateImagePlaceholderTaskHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/CreateImagePlaceholderTaskHandler.java
index 2810672..a3cb7ef 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/CreateImagePlaceholderTaskHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/CreateImagePlaceholderTaskHandler.java
@@ -22,8 +22,6 @@
 
     @Override
     protected void beforeTask() {
-        ImagesHandler.updateImageStatus(
-                getEnclosingCommand().getParameters().getDestinationImageId(), 
ImageStatus.LOCKED);
     }
 
     @Override
@@ -57,9 +55,8 @@
 
     @Override
     protected void revertTask() {
-        // Unlock the image we left locked
-        
ImagesHandler.updateImageStatus(getEnclosingCommand().getParameters().getImageId(),
 ImageStatus.OK);
-        
ImagesHandler.updateImageStatus(getEnclosingCommand().getParameters().getDestinationImageId(),
 ImageStatus.OK);
+        ImagesHandler.updateAllDiskImageSnapshotsStatus(
+                getEnclosingCommand().getParameters().getImageGroupID(), 
ImageStatus.OK);
     }
 
     @Override
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java
index b44e1c1..0184190 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java
@@ -3,6 +3,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 
 import org.ovirt.engine.core.bll.ImagesHandler;
 import org.ovirt.engine.core.bll.LockIdNameAttribute;
@@ -11,13 +12,16 @@
 import org.ovirt.engine.core.bll.job.ExecutionHandler;
 import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler;
 import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand;
+import org.ovirt.engine.core.bll.validator.DiskValidator;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.LiveMigrateDiskParameters;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
 import org.ovirt.engine.core.common.businessentities.ImageStatus;
 import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.utils.Pair;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector;
 
@@ -50,7 +54,7 @@
 
     @Override
     protected boolean checkCanBeMoveInVm() {
-        return true;
+        return 
validate(createDiskValidator(getDiskImage()).isDiskPluggedToVmsThatAreNotDown(true,
 getVmsWithVmDeviceInfoForDiskId()));
     }
 
     @Override
@@ -126,8 +130,7 @@
         getParameters().setExecutionIndex(0);
 
         // We should always unlock the disk
-        ImagesHandler.updateImageStatus(getParameters().getImageId(), 
ImageStatus.OK);
-        
ImagesHandler.updateImageStatus(getParameters().getDestinationImageId(), 
ImageStatus.OK);
+        
ImagesHandler.updateAllDiskImageSnapshotsStatus(getParameters().getImageGroupID(),
 ImageStatus.OK);
     }
 
     private boolean isFirstTaskHandler() {
@@ -150,6 +153,17 @@
     }
 
     @Override
+    protected boolean isImageNotLocked() {
+        // During LSM the disks are being locked prior to the snapshot phase
+        // therefore returning true here.
+        return true;
+    }
+
+    protected DiskValidator createDiskValidator(DiskImage disk) {
+        return new DiskValidator(disk);
+    }
+
+    @Override
     public AuditLogType getAuditLogTypeValue() {
         switch (getActionState()) {
         case EXECUTE:
@@ -170,4 +184,9 @@
 
         return AuditLogType.UNASSIGNED;
     }
+
+    @Override
+    protected Map<String, Pair<String, String>> getExclusiveLocks() {
+        return null;
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDisksTaskHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDisksTaskHandler.java
index f2add73..5bb205a 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDisksTaskHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDisksTaskHandler.java
@@ -1,6 +1,7 @@
 package org.ovirt.engine.core.bll.lsm;
 
 import org.ovirt.engine.core.bll.Backend;
+import org.ovirt.engine.core.bll.ImagesHandler;
 import org.ovirt.engine.core.bll.context.CommandContext;
 import org.ovirt.engine.core.bll.job.ExecutionHandler;
 import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler;
@@ -12,8 +13,12 @@
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
 import org.ovirt.engine.core.common.errors.VdcBLLException;
 import org.ovirt.engine.core.common.errors.VdcBllErrors;
+import org.ovirt.engine.core.common.businessentities.ImageStatus;
+import org.ovirt.engine.core.compat.TransactionScopeOption;
 import org.ovirt.engine.core.utils.log.Log;
 import org.ovirt.engine.core.utils.log.LogFactory;
+import org.ovirt.engine.core.utils.transaction.TransactionMethod;
+import org.ovirt.engine.core.utils.transaction.TransactionSupport;
 
 public class LiveMigrateDisksTaskHandler implements SPMAsyncTaskHandler {
 
@@ -30,27 +35,39 @@
             throw new VdcBLLException(VdcBllErrors.imageErr,
                 "Auto-generated live snapshot for VM " + 
enclosingCommand.getParameters().getVmId() + " failed");
         }
+        TransactionSupport.executeInScope(TransactionScopeOption.Suppress, new 
TransactionMethod<Void>() {
+            @Override
+            public Void runInTransaction() {
+                for (LiveMigrateDiskParameters parameters : 
enclosingCommand.getParameters().getParametersList()) {
+                    CommandContext commandContext = 
ExecutionHandler.createInternalJobContext();
+                    
ExecutionHandler.setAsyncJob(commandContext.getExecutionContext(), true);
+                    
parameters.setSessionId(enclosingCommand.getParameters().getSessionId());
 
-        for (LiveMigrateDiskParameters parameters : 
enclosingCommand.getParameters().getParametersList()) {
-            CommandContext commandContext = 
ExecutionHandler.createInternalJobContext();
-            ExecutionHandler.setAsyncJob(commandContext.getExecutionContext(), 
true);
-            
parameters.setSessionId(enclosingCommand.getParameters().getSessionId());
+                    VdcReturnValueBase vdcReturnValue =
+                            
Backend.getInstance().runInternalAction(VdcActionType.LiveMigrateDisk,
+                                    parameters,
+                                    commandContext);
 
-            VdcReturnValueBase vdcReturnValue =
-                    
Backend.getInstance().runInternalAction(VdcActionType.LiveMigrateDisk,
-                            parameters,
-                            commandContext);
+                    if (!vdcReturnValue.getSucceeded()) {
+                        
ImagesHandler.updateAllDiskImageSnapshotsStatus(parameters.getImageGroupID(), 
ImageStatus.OK);
+                    }
 
-            
enclosingCommand.getReturnValue().getVdsmTaskIdList().addAll(vdcReturnValue.getInternalVdsmTaskIdList());
+                    enclosingCommand.getReturnValue()
+                            .getVdsmTaskIdList()
+                            
.addAll(vdcReturnValue.getInternalVdsmTaskIdList());
 
-            if (!parameters.getTaskGroupSuccess()) {
-                
ExecutionHandler.endTaskJob(commandContext.getExecutionContext(), false);
-                log.errorFormat("Failed LiveMigrateDisk (Disk {0} , VM {1})",
-                        parameters.getImageGroupID(),
-                        parameters.getVmId());
+                    if (!parameters.getTaskGroupSuccess()) {
+                        
ExecutionHandler.endTaskJob(commandContext.getExecutionContext(), false);
+                        log.errorFormat("Failed LiveMigrateDisk (Disk {0} , VM 
{1})",
+                                parameters.getImageGroupID(),
+                                parameters.getVmId());
+                    }
+                }
+
+                enclosingCommand.getReturnValue().setSucceeded(true);
+                return null;
             }
-        }
-        enclosingCommand.getReturnValue().setSucceeded(true);
+        });
     }
 
     @Override
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 f3953ea..af81349 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
@@ -21,6 +21,7 @@
 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.DiskValidator;
 import org.ovirt.engine.core.bll.validator.StorageDomainValidator;
 import org.ovirt.engine.core.bll.validator.VmValidator;
 import org.ovirt.engine.core.common.VdcObjectType;
@@ -30,6 +31,7 @@
 import org.ovirt.engine.core.common.action.VdcReturnValueBase;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo;
 import org.ovirt.engine.core.common.businessentities.ActionGroup;
+import org.ovirt.engine.core.common.businessentities.Disk;
 import org.ovirt.engine.core.common.businessentities.DiskImage;
 import org.ovirt.engine.core.common.businessentities.StorageDomain;
 import org.ovirt.engine.core.common.businessentities.VM;
@@ -43,7 +45,7 @@
 import org.ovirt.engine.core.utils.collections.MultiValueMapUtils;
 
 @LockIdNameAttribute(isReleaseAtEndOfExecute = false)
-@NonTransactiveCommandAttribute
+@NonTransactiveCommandAttribute(forceCompensation = true)
 @InternalCommandAttribute
 public class LiveMigrateVmDisksCommand<T extends LiveMigrateVmDisksParameters> 
extends CommandBase<T>
         implements TaskHandlerCommand<LiveMigrateVmDisksParameters>, 
QuotaStorageDependent {
@@ -56,6 +58,11 @@
 
         getParameters().setCommandType(getActionType());
         setVmId(getParameters().getVmId());
+    }
+
+    // ctor for compensation
+    protected LiveMigrateVmDisksCommand(Guid commandId) {
+        super(commandId);
     }
 
     @Override
@@ -155,6 +162,21 @@
     }
 
     @Override
+    protected Map<String, Pair<String, String>> getExclusiveLocks() {
+        Map<String, Pair<String, String>> locksMap = new HashMap<>();
+        for (LiveMigrateDiskParameters parameters : 
getParameters().getParametersList()) {
+            locksMap.put(parameters.getImageGroupID().toString(), 
LockMessagesMatchUtil.makeLockingPair(LockingGroup.DISK,
+                    
getDiskIsBeingMigratedMessage(getDiskImageByDiskId(parameters.getImageGroupID()))));
+        }
+        return locksMap;
+    }
+
+    private String getDiskIsBeingMigratedMessage(Disk disk) {
+        return VdcBllMessages.ACTION_TYPE_FAILED_DISK_IS_BEING_MIGRATED.name()
+                + String.format("$DiskName %1$s", disk != null ? 
disk.getDiskAlias() : "");
+    }
+
+    @Override
     public VM getVm() {
         VM vm = super.getVm();
         if (vm != null) {
@@ -176,7 +198,7 @@
         return getDbFacade().getStorageDomainDao();
     }
 
-    private DiskImage getDiskImageById(Guid imageId) {
+    private DiskImage getDiskImageByImageId(Guid imageId) {
         if (diskImagesMap.containsKey(imageId)) {
             return diskImagesMap.get(imageId);
         }
@@ -185,6 +207,17 @@
         diskImagesMap.put(imageId, diskImage);
 
         return diskImage;
+    }
+
+    private Disk getDiskImageByDiskId(Guid diskId) {
+        Disk disk = getDiskDao().get(diskId);
+        if (disk != null && disk.getDiskStorageType() == 
Disk.DiskStorageType.IMAGE) {
+            DiskImage diskImage = (DiskImage)disk;
+            if (!diskImagesMap.containsKey(diskImage.getImageId())) {
+                diskImagesMap.put(diskImage.getImageId(), (DiskImage)disk);
+            }
+        }
+        return disk;
     }
 
     private StorageDomain getStorageDomainById(Guid storageDomainId, Guid 
storagePoolId) {
@@ -209,7 +242,7 @@
         List<QuotaConsumptionParameter> list = new 
ArrayList<QuotaConsumptionParameter>();
 
         for (LiveMigrateDiskParameters parameters : 
getParameters().getParametersList()) {
-            DiskImage diskImage = getDiskImageById(parameters.getImageId());
+            DiskImage diskImage = 
getDiskImageByImageId(parameters.getImageId());
 
             list.add(new QuotaStorageConsumptionParameter(
                     parameters.getQuotaId(),
@@ -241,7 +274,7 @@
 
         for (LiveMigrateDiskParameters parameters : 
getParameters().getParametersList()) {
             
getReturnValue().setCanDoAction(isDiskNotShareable(parameters.getImageId())
-                    && 
isDiskSnapshotNotPluggedToOtherVms(parameters.getImageId())
+                    && 
isDiskSnapshotNotPluggedToOtherVmsThatAreNotDown(parameters.getImageId())
                     && isTemplateInDestStorageDomain(parameters.getImageId(), 
parameters.getStorageDomainId())
                     && validateSourceStorageDomain(parameters.getImageId())
                     && validateDestStorage(parameters.getImageId(), 
parameters.getStorageDomainId()));
@@ -269,7 +302,7 @@
     }
 
     private boolean isDiskNotShareable(Guid imageId) {
-        DiskImage diskImage = getDiskImageById(imageId);
+        DiskImage diskImage = getDiskImageByImageId(imageId);
 
         if (diskImage.isShareable()) {
             addCanDoActionMessage(String.format("$%1$s %2$s", "diskAliases", 
diskImage.getDiskAlias()));
@@ -279,13 +312,8 @@
         return true;
     }
 
-    private boolean isDiskSnapshotNotPluggedToOtherVms(Guid imageId) {
-        DiskImage diskImage = getDiskImageById(imageId);
-        return 
validate((createDiskImagesValidator(Collections.singletonList(diskImage))).diskImagesSnapshotsNotAttachedToOtherVms(true));
-    }
-
     private boolean isTemplateInDestStorageDomain(Guid imageId, Guid 
sourceDomainId) {
-        Guid templateId = getDiskImageById(imageId).getImageTemplateId();
+        Guid templateId = getDiskImageByImageId(imageId).getImageTemplateId();
 
         if (!Guid.Empty.equals(templateId)) {
             DiskImage templateImage = getDiskImageDao().get(templateId);
@@ -298,7 +326,7 @@
     }
 
     private boolean validateSourceStorageDomain(Guid imageId) {
-        DiskImage diskImage = getDiskImageById(imageId);
+        DiskImage diskImage = getDiskImageByImageId(imageId);
         Guid domainId = diskImage.getStorageIds().get(0);
         StorageDomainValidator validator = getValidator(domainId, 
getStoragePoolId());
 
@@ -320,7 +348,7 @@
 
         for (LiveMigrateDiskParameters parameters : 
getParameters().getParametersList()) {
             MultiValueMapUtils.addToMap(parameters.getStorageDomainId(),
-                    getDiskImageById(parameters.getImageId()),
+                    getDiskImageByImageId(parameters.getImageId()),
                     storageDomainsImagesMap);
         }
 
@@ -352,6 +380,10 @@
         return true;
     }
 
+    protected boolean isDiskSnapshotNotPluggedToOtherVmsThatAreNotDown(Guid 
imageId) {
+        return 
validate(createDiskValidator(getDiskImageByImageId(imageId)).isDiskPluggedToVmsThatAreNotDown(true,
 null));
+    }
+
     protected boolean isStorageDomainWithinThresholds(StorageDomain 
storageDomain) {
         return validate(new 
StorageDomainValidator(storageDomain).isDomainWithinThresholds());
     }
@@ -369,10 +401,6 @@
         return new VmValidator(getVm());
     }
 
-    protected DiskImagesValidator 
createDiskImagesValidator(Iterable<DiskImage> disks) {
-        return new DiskImagesValidator(disks);
-    }
-
     private boolean isVmNotInPreview() {
         return validate(createSnapshotsValidator().vmNotInPreview(getVmId()));
     }
@@ -380,4 +408,8 @@
     protected SnapshotsValidator createSnapshotsValidator() {
         return new SnapshotsValidator();
     }
+
+    protected DiskValidator createDiskValidator(Disk disk) {
+        return new DiskValidator(disk);
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java
index 43d14c1..c40bad3 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java
@@ -1,5 +1,6 @@
 package org.ovirt.engine.core.bll.lsm;
 
+import java.util.LinkedHashSet;
 import java.util.List;
 
 import org.ovirt.engine.core.bll.Backend;
@@ -17,18 +18,36 @@
 import org.ovirt.engine.core.common.businessentities.Image;
 import org.ovirt.engine.core.common.businessentities.ImageStatus;
 import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotType;
+import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 
 public class LiveSnapshotTaskHandler implements SPMAsyncTaskHandler {
 
     private final TaskHandlerCommand<? extends LiveMigrateVmDisksParameters> 
enclosingCommand;
+    private LinkedHashSet<Guid> movedVmDiskIds;
 
     public LiveSnapshotTaskHandler(TaskHandlerCommand<? extends 
LiveMigrateVmDisksParameters> enclosingCommand) {
         this.enclosingCommand = enclosingCommand;
     }
 
+    private LinkedHashSet<Guid> getMovedDiskIds() {
+       if (movedVmDiskIds == null) {
+           movedVmDiskIds = new LinkedHashSet<>();
+           for (LiveMigrateDiskParameters parameters : 
enclosingCommand.getParameters().getParametersList()) {
+               movedVmDiskIds.add(parameters.getImageGroupID());
+           }
+       }
+        return movedVmDiskIds;
+    }
+
     @Override
     public void execute() {
+        for (Guid movedDiskId : getMovedDiskIds()) {
+            
ImagesHandler.updateAllDiskImageSnapshotsStatusWithCompensation(movedDiskId,
+                    ImageStatus.LOCKED,
+                    ImageStatus.OK,
+                    enclosingCommand.getCompensationContext());
+        }
         if (enclosingCommand.getParameters().getTaskGroupSuccess()) {
             VdcReturnValueBase vdcReturnValue =
                     
Backend.getInstance().runInternalAction(VdcActionType.CreateAllSnapshotsFromVm,
@@ -88,8 +107,7 @@
     public void compensate() {
         // Unlock the image we left locked
         for (LiveMigrateDiskParameters parameters : 
enclosingCommand.getParameters().getParametersList()) {
-            ImagesHandler.updateImageStatus(parameters.getImageId(), 
ImageStatus.OK);
-            
ImagesHandler.updateImageStatus(parameters.getDestinationImageId(), 
ImageStatus.OK);
+            
ImagesHandler.updateAllDiskImageSnapshotsStatus(parameters.getImageGroupID(), 
ImageStatus.OK);
         }
     }
 
@@ -114,6 +132,7 @@
         params.setParentParameters(enclosingCommand.getParameters());
         
params.setImagesParameters(enclosingCommand.getParameters().getImagesParameters());
         
params.setTaskGroupSuccess(enclosingCommand.getParameters().getTaskGroupSuccess());
+        params.setDiskIdsToIgnoreInChecks(getMovedDiskIds());
         params.setNeedsLocking(false);
 
         return params;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/VmReplicateDiskFinishTaskHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/VmReplicateDiskFinishTaskHandler.java
index 930e826..ac11763 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/VmReplicateDiskFinishTaskHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/VmReplicateDiskFinishTaskHandler.java
@@ -57,8 +57,8 @@
 
             if (ret.getSucceeded()) {
                 updateImagesInfo();
-                
ImagesHandler.updateImageStatus(getEnclosingCommand().getParameters().getDestinationImageId(),
-                        ImageStatus.OK);
+                ImagesHandler.updateAllDiskImageSnapshotsStatus(
+                        
getEnclosingCommand().getParameters().getImageGroupID(), ImageStatus.OK);
             }
             else {
                 throw new VdcBLLException(ret.getVdsError().getCode(), 
ret.getVdsError().getMessage());
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java
index 9d55d1c..8e180ef 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java
@@ -2,6 +2,7 @@
 
 import java.util.ArrayList;
 
+import org.ovirt.engine.core.bll.context.CompensationContext;
 import org.ovirt.engine.core.bll.job.ExecutionContext;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
@@ -45,4 +46,6 @@
     ArrayList<Guid> getTaskIdList();
 
     void deleteAsyncTaskPlaceHolder(String taskKey);
+
+    CompensationContext getCompensationContext();
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskValidator.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskValidator.java
index b072ae9..7e94cf9 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskValidator.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskValidator.java
@@ -9,12 +9,17 @@
 import org.ovirt.engine.core.common.businessentities.Disk.DiskStorageType;
 import org.ovirt.engine.core.common.businessentities.DiskInterface;
 import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.businessentities.VMStatus;
+import org.ovirt.engine.core.common.businessentities.VmDevice;
 import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.config.ConfigValues;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import org.ovirt.engine.core.common.osinfo.OsRepository;
+import org.ovirt.engine.core.common.utils.Pair;
 import org.ovirt.engine.core.common.utils.SimpleDependecyInjector;
 import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dao.VmDAO;
 
 /**
  * A validator for the {@link Disk} class.
@@ -75,4 +80,32 @@
     public boolean isVirtioScsiControllerAttached(Guid vmId) {
         return VmDeviceUtils.isVirtioScsiControllerAttached(vmId);
     }
+
+    public ValidationResult isDiskPluggedToVmsThatAreNotDown(boolean 
checkOnlyVmsSnapshotPluggedTo, List<Pair<VM, VmDevice>> vmsForDisk) {
+        if (vmsForDisk == null) {
+            vmsForDisk = getVmDAO().getVmsWithPlugInfo(disk.getId());
+        }
+
+        for (Pair<VM, VmDevice> pair : vmsForDisk) {
+            VmDevice vmDevice = pair.getSecond();
+
+            if (checkOnlyVmsSnapshotPluggedTo && vmDevice.getSnapshotId() == 
null) {
+                continue;
+            }
+
+            VM currVm = pair.getFirst();
+            if (VMStatus.Down != currVm.getStatus()) {
+                if (vmDevice.getIsPlugged()) {
+                    return new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_VM_IS_NOT_DOWN);
+                }
+            }
+        }
+
+        return ValidationResult.VALID;
+
+    }
+
+    protected VmDAO getVmDAO() {
+        return DbFacade.getInstance().getVmDao();
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommandTest.java
index 8aa36f3..41a2f9f 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommandTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommandTest.java
@@ -3,6 +3,7 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyBoolean;
 import static org.mockito.Matchers.anyList;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doReturn;
@@ -22,10 +23,11 @@
 import org.ovirt.engine.core.bll.CanDoActionTestUtils;
 import org.ovirt.engine.core.bll.ValidationResult;
 import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator;
-import org.ovirt.engine.core.bll.validator.DiskImagesValidator;
+import org.ovirt.engine.core.bll.validator.DiskValidator;
 import org.ovirt.engine.core.bll.validator.VmValidator;
 import org.ovirt.engine.core.common.action.LiveMigrateDiskParameters;
 import org.ovirt.engine.core.common.action.LiveMigrateVmDisksParameters;
+import org.ovirt.engine.core.common.businessentities.Disk;
 import org.ovirt.engine.core.common.businessentities.DiskImage;
 import org.ovirt.engine.core.common.businessentities.Snapshot;
 import org.ovirt.engine.core.common.businessentities.StorageDomain;
@@ -73,10 +75,10 @@
     private VmValidator vmValidator;
 
     @Mock
-    private DiskImagesValidator diskImagesValidator;
+    private SnapshotsValidator snapshotsValidator;
 
     @Mock
-    private SnapshotsValidator snapshotsValidator;
+    private DiskValidator diskValidator;
 
     /**
      * The command under test
@@ -99,7 +101,7 @@
     }
 
     private List<LiveMigrateDiskParameters> 
createLiveMigrateVmDisksParameters() {
-        return Arrays.asList(new LiveMigrateDiskParameters(diskImageId, 
srcStorageId, dstStorageId, vmId, quotaId));
+        return Arrays.asList(new LiveMigrateDiskParameters(diskImageId, 
srcStorageId, dstStorageId, vmId, quotaId, diskImageId));
     }
 
     private void createParameters() {
@@ -213,18 +215,18 @@
     }
 
     @Test
-    public void canDoActionVmHavingDeviceSnapshotsPluggedToOtherVms() {
+    public void 
canDoActionVmHavingDeviceSnapshotsPluggedToOtherVmsThatAreNotDown() {
         createParameters();
         initDiskImage(diskImageId);
         initVm(VMStatus.Up, Guid.newGuid(), diskImageId);
 
-        doReturn(new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_VM_DISK_SNAPSHOT_IS_PLUGGED_TO_ANOTHER_VM)).when(diskImagesValidator)
-                .diskImagesSnapshotsNotAttachedToOtherVms(true);
+        doReturn(new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_VM_IS_NOT_DOWN)).when(diskValidator)
+                .isDiskPluggedToVmsThatAreNotDown(anyBoolean(), anyList());
 
         assertFalse(command.canDoAction());
         assertTrue(command.getReturnValue()
                 .getCanDoActionMessages()
-                
.contains(VdcBllMessages.ACTION_TYPE_FAILED_VM_DISK_SNAPSHOT_IS_PLUGGED_TO_ANOTHER_VM.name()));
+                
.contains(VdcBllMessages.ACTION_TYPE_FAILED_VM_IS_NOT_DOWN.name()));
     }
 
     /** Initialize Entities */
@@ -303,11 +305,10 @@
 
     private void mockValidators() {
         doReturn(vmValidator).when(command).createVmValidator();
-        
doReturn(diskImagesValidator).when(command).createDiskImagesValidator(anyList());
         doReturn(snapshotsValidator).when(command).createSnapshotsValidator();
+        
doReturn(diskValidator).when(command).createDiskValidator(any(Disk.class));
         
doReturn(ValidationResult.VALID).when(vmValidator).vmNotRunningStateless();
-        
doReturn(ValidationResult.VALID).when(diskImagesValidator).diskImagesSnapshotsNotAttachedToOtherVms(true);
+        
doReturn(ValidationResult.VALID).when(diskValidator).isDiskPluggedToVmsThatAreNotDown(anyBoolean(),
 anyList());
         
doReturn(ValidationResult.VALID).when(snapshotsValidator).vmNotInPreview(any(Guid.class));
-        
doReturn(ValidationResult.VALID).when(vmValidator).vmNotHavingDeviceSnapshotsAttachedToOtherVms(false);
     }
 }
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskValidatorTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskValidatorTest.java
new file mode 100644
index 0000000..471d56b
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskValidatorTest.java
@@ -0,0 +1,109 @@
+package org.ovirt.engine.core.bll.validator;
+
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+import static 
org.ovirt.engine.core.bll.validator.ValidationResultMatchers.failsWith;
+import static 
org.ovirt.engine.core.bll.validator.ValidationResultMatchers.isValid;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.ovirt.engine.core.common.businessentities.Disk;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.businessentities.VMStatus;
+import org.ovirt.engine.core.common.businessentities.VmDevice;
+import org.ovirt.engine.core.common.businessentities.VmDeviceId;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.common.utils.Pair;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dao.VmDAO;
+
+@RunWith(MockitoJUnitRunner.class)
+public class DiskValidatorTest {
+
+    @Mock
+    private VmDAO vmDAO;
+    private DiskValidator validator;
+    private DiskImage disk;
+
+    private static DiskImage createDisk() {
+        DiskImage disk = new DiskImage();
+        disk.setId(Guid.newGuid());
+        return disk;
+    }
+
+    private static VM createVM() {
+        VM vm = new VM();
+        vm.setStatus(VMStatus.Down);
+        vm.setId(Guid.newGuid());
+        return vm;
+    }
+
+    @Before
+    public void setUp() {
+        disk = createDisk();
+        disk.setDiskAlias("disk1");
+        validator = spy(new DiskValidator(disk));
+        doReturn(vmDAO).when(validator).getVmDAO();
+    }
+
+    private VmDevice createVmDeviceForDisk(VM vm, Disk disk, Guid snapshotId, 
boolean isPlugged) {
+        VmDevice device = new VmDevice();
+        device.setId(new VmDeviceId(vm.getId(), disk.getId()));
+        device.setSnapshotId(snapshotId);
+        device.setIsPlugged(isPlugged);
+        return device;
+    }
+
+    public List<Pair<VM, VmDevice>> 
prepareForCheckingIfDiskPluggedToVmsThatAreNotDown() {
+        VM vm1 = createVM();
+        VM vm2 = createVM();
+        VmDevice device1 = createVmDeviceForDisk(vm1, disk, null, true);
+        VmDevice device2 = createVmDeviceForDisk(vm1, disk, null, true);
+        List<Pair<VM, VmDevice>> vmsInfo = new LinkedList<>();
+        vmsInfo.add(new Pair<>(vm1, device1));
+        vmsInfo.add(new Pair<>(vm2, device2));
+        when(vmDAO.getVmsWithPlugInfo(disk.getId())).thenReturn(vmsInfo);
+        return vmsInfo;
+    }
+
+    @Test
+    public void diskPluggedToVmsThatAreNotDownValid() {
+        List<Pair<VM, VmDevice>> vmsInfo = 
prepareForCheckingIfDiskPluggedToVmsThatAreNotDown();
+        assertThat(validator.isDiskPluggedToVmsThatAreNotDown(false, vmsInfo), 
isValid());
+    }
+
+    @Test
+    public void diskPluggedToVmsThatAreNotDownFail() {
+        List<Pair<VM, VmDevice>> vmsInfo = 
prepareForCheckingIfDiskPluggedToVmsThatAreNotDown();
+        vmsInfo.get(0).getFirst().setStatus(VMStatus.Up);
+        assertThat(validator.isDiskPluggedToVmsThatAreNotDown(false, vmsInfo),
+                failsWith(VdcBllMessages.ACTION_TYPE_FAILED_VM_IS_NOT_DOWN));
+    }
+
+    @Test
+    public void diskPluggedToVmsNotAsSnapshotSuccess() {
+        List<Pair<VM, VmDevice>> vmsInfo = 
prepareForCheckingIfDiskPluggedToVmsThatAreNotDown();
+        vmsInfo.get(0).getFirst().setStatus(VMStatus.Up);
+        vmsInfo.get(1).getFirst().setStatus(VMStatus.Up);
+        assertThat(validator.isDiskPluggedToVmsThatAreNotDown(true, vmsInfo),
+                isValid());
+    }
+
+    @Test
+    public void diskPluggedToVmsCheckSnapshotsFail() {
+        List<Pair<VM, VmDevice>> vmsInfo = 
prepareForCheckingIfDiskPluggedToVmsThatAreNotDown();
+        vmsInfo.get(1).getFirst().setStatus(VMStatus.Up);
+        vmsInfo.get(1).getSecond().setSnapshotId(Guid.newGuid());
+        assertThat(validator.isDiskPluggedToVmsThatAreNotDown(true, vmsInfo),
+                failsWith(VdcBllMessages.ACTION_TYPE_FAILED_VM_IS_NOT_DOWN));
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CreateAllSnapshotsFromVmParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CreateAllSnapshotsFromVmParameters.java
index 5e607fd..f35155b 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CreateAllSnapshotsFromVmParameters.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CreateAllSnapshotsFromVmParameters.java
@@ -1,7 +1,10 @@
 package org.ovirt.engine.core.common.action;
 
+import java.util.Collections;
+import java.util.Set;
 import javax.validation.constraints.Size;
 
+import org.codehaus.jackson.annotate.JsonIgnore;
 import org.hibernate.validator.constraints.NotEmpty;
 import 
org.ovirt.engine.core.common.businessentities.BusinessEntitiesDefinitions;
 import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotType;
@@ -33,14 +36,19 @@
     /** Used to indicate whether the memory should be saved as part of this 
snapshot or not */
     private boolean saveMemory;
 
+    @JsonIgnore
+    private Set<Guid> diskIdsToIgnoreInChecks;
+
     public CreateAllSnapshotsFromVmParameters() {
         needsLocking = true;
+        diskIdsToIgnoreInChecks = Collections.emptySet();
     }
 
     public CreateAllSnapshotsFromVmParameters(Guid vmId, String description) {
         super(vmId);
         this.description = description;
         needsLocking = true;
+        diskIdsToIgnoreInChecks = Collections.emptySet();
     }
 
     public CreateAllSnapshotsFromVmParameters(Guid vmId, String description, 
boolean saveMemory) {
@@ -88,4 +96,12 @@
     public void setNeedsLocking(boolean needsLocking) {
         this.needsLocking = needsLocking;
     }
+
+    public Set<Guid> getDiskIdsToIgnoreInChecks() {
+        return diskIdsToIgnoreInChecks;
+    }
+
+    public void setDiskIdsToIgnoreInChecks(Set<Guid> diskIdsToIgnoreInChecks) {
+        this.diskIdsToIgnoreInChecks = diskIdsToIgnoreInChecks;
+    }
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImagesActionsParametersBase.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImagesActionsParametersBase.java
index 8dc9c50..8c7717b 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImagesActionsParametersBase.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImagesActionsParametersBase.java
@@ -17,6 +17,7 @@
     private Guid vmSnapshotId;
     private Guid imageGroupID;
     private boolean importEntity;
+    private boolean leaveLocked;
 
     public ImagesActionsParametersBase() {
         imageId = Guid.Empty;
@@ -98,4 +99,12 @@
     public void setImportEntity(boolean importEntity) {
         this.importEntity = importEntity;
     }
+
+    public boolean isLeaveLocked() {
+        return leaveLocked;
+    }
+
+    public void setLeaveLocked(boolean leaveLocked) {
+        this.leaveLocked = leaveLocked;
+    }
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/LiveMigrateDiskParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/LiveMigrateDiskParameters.java
index b8464e2..29d2a6b 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/LiveMigrateDiskParameters.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/LiveMigrateDiskParameters.java
@@ -10,10 +10,11 @@
         // Empty constructor for serializing / deserializing
     }
 
-    public LiveMigrateDiskParameters(Guid imageId, Guid sourceDomainId, Guid 
destDomainId, Guid vmId, Guid quotaId) {
+    public LiveMigrateDiskParameters(Guid imageId, Guid sourceDomainId, Guid 
destDomainId, Guid vmId, Guid quotaId, Guid imageGroupId) {
         super(imageId, sourceDomainId, destDomainId, ImageOperation.Move);
         setVmId(vmId);
         setQuotaId(quotaId);
+        setImageGroupID(imageGroupId);
     }
 
     public Guid getSourceStorageDomainId() {


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0c7cb49ff37f28d0b3ab0df9f4ee1f3082aba018
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.3
Gerrit-Owner: Liron Ar <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to