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
