Maor Lipchuk has uploaded a new change for review. Change subject: core: Introduce restore from Cinder snapshot ......................................................................
core: Introduce restore from Cinder snapshot Intoroduce restore for Cinder snapshot. Change-Id: Ibd2c3ed4b2f2d0684476d9df9090d95dda72fd4e Bug-Url: https://bugzilla.redhat.com/1185826 Signed-off-by: Maor Lipchuk <mlipc...@redhat.com> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RestoreFromCinderSnapshotCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java 2 files changed, 129 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/37/42337/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RestoreFromCinderSnapshotCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RestoreFromCinderSnapshotCommand.java new file mode 100644 index 0000000..b277c5f --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RestoreFromCinderSnapshotCommand.java @@ -0,0 +1,128 @@ +package org.ovirt.engine.core.bll.storage; + +import java.util.ArrayList; + +import org.ovirt.engine.core.bll.BaseImagesCommand; +import org.ovirt.engine.core.bll.InternalCommandAttribute; +import org.ovirt.engine.core.bll.context.CommandContext; +import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.common.action.RestoreFromSnapshotParameters; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.asynctasks.AsyncTaskType; +import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotType; +import org.ovirt.engine.core.common.businessentities.storage.DiskImage; +import org.ovirt.engine.core.common.errors.VdcBLLException; +import org.ovirt.engine.core.common.errors.VdcFault; +import org.ovirt.engine.core.common.vdscommands.DestroyImageVDSCommandParameters; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; +import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.compat.Guid; + +/** + * This command responsible to make snapshot of some Vm mapped to some drive be active snapshot. All children snapshots + * and other snapshot mapped to same drive will be removed. + */ +@InternalCommandAttribute +public class RestoreFromCinderSnapshotCommand<T extends RestoreFromSnapshotParameters> extends BaseImagesCommand<T> { + + private final ArrayList<Guid> _imagesToDelete = new ArrayList<>(); + + public RestoreFromCinderSnapshotCommand(T parameters, CommandContext cmdContext) { + super(parameters, cmdContext); + } + + @Override + protected void executeCommand() { + if (removeImages()) { + if (getParameters().getSnapshot().getType() != SnapshotType.REGULAR) { + getImage().setActive(true); + getImageDao().update(getImage().getImage()); + } + + setSucceeded(true); + } + } + + private boolean removeImages() { + Guid imageToRemoveId = findImageForSameDrive(getParameters().getRemovedSnapshotId()); + + switch (getParameters().getSnapshot().getType()) { + case REGULAR: + removeOtherImageAndParents(imageToRemoveId, getDiskImage().getParentId()); + break; + case PREVIEW: + case STATELESS: + if (imageToRemoveId != null) { + removeSnapshot(getDiskImageDao().get(imageToRemoveId)); + } + + break; + } + + VDSReturnValue vdsReturnValue = performImageVdsmOperation(); + return vdsReturnValue != null && vdsReturnValue.getSucceeded(); + } + + @Override + protected AsyncTaskType getTaskType() { + return AsyncTaskType.deleteVolume; + } + + @Override + protected void removeSnapshot(DiskImage snapshot) { + super.removeSnapshot(snapshot); + _imagesToDelete.add(_imagesToDelete.size(), snapshot.getImageId()); + } + + private void removeOtherImageAndParents(Guid imageId, Guid lastParent) { + DiskImage image = getDiskImageDao().getSnapshotById(imageId); + // store other mapped image's parent Id + Guid currentParent = image.getParentId(); + // Remove other mapped image from Irs and db + removeSnapshot(image); + while (!lastParent.equals(currentParent)) { + image = getDiskImageDao().getSnapshotById(currentParent); + // store current image's parent Id + currentParent = image.getParentId(); + removeSnapshot(image); + } + } + + @Override + protected VDSReturnValue performImageVdsmOperation() { + VDSReturnValue vdsReturnValue = null; + try { + Guid storagePoolId = getDiskImage().getStoragePoolId() != null ? getDiskImage().getStoragePoolId() + : Guid.Empty; + Guid storageDomainId = + getDiskImage().getStorageIds() != null && !getDiskImage().getStorageIds().isEmpty() ? getDiskImage().getStorageIds() + .get(0) + : Guid.Empty; + Guid imageGroupId = getDiskImage().getimage_group_id() != null ? getDiskImage().getimage_group_id() + : Guid.Empty; + + Guid taskId = persistAsyncTaskPlaceHolder(VdcActionType.RestoreAllSnapshots); + + vdsReturnValue = runVdsCommand(VDSCommandType.DestroyImage, + PostZeroHandler.fixParametersWithPostZero( + new DestroyImageVDSCommandParameters(storagePoolId, storageDomainId, imageGroupId, + _imagesToDelete, getDiskImage().isWipeAfterDelete(), true))); + + if (vdsReturnValue.getSucceeded()) { + getReturnValue().getInternalVdsmTaskIdList().add( + createTask(taskId, + vdsReturnValue.getCreationInfo(), + VdcActionType.RestoreAllSnapshots, + VdcObjectType.Storage, + storageDomainId)); + } + } + // Don't throw an exception when cannot destroy image in the VDSM. + catch (VdcBLLException e) { + // Set fault for parent command RestoreAllSnapshotCommand to use, if decided to fail the command. + getReturnValue().setFault(new VdcFault(e, e.getVdsError().getCode())); + log.info("Image '{}' not exist in Irs", getDiskImage().getImageId()); + } + return vdsReturnValue; + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java index 0f15d4f..46bd17f 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java @@ -464,6 +464,7 @@ RemoveLibvirtSecret(3211, false, QuotaDependency.NONE), TryBackToCinderSnapshot(3212, ActionGroup.CONFIGURE_VM_STORAGE, false, QuotaDependency.STORAGE), TryBackToAllCinderSnapshots(3213, ActionGroup.CONFIGURE_VM_STORAGE, false, QuotaDependency.STORAGE), + RestoreFromCinderSnapshot(3214, ActionGroup.CONFIGURE_VM_STORAGE, false, QuotaDependency.STORAGE), // Host Devices RefreshHostDevices(4000, ActionGroup.MANIPULATE_HOST, false, QuotaDependency.NONE), -- To view, visit https://gerrit.ovirt.org/42337 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ibd2c3ed4b2f2d0684476d9df9090d95dda72fd4e Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Maor Lipchuk <mlipc...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches