Maor Lipchuk has uploaded a new change for review. Change subject: core: Introduce create Cinder snapshot command ......................................................................
core: Introduce create Cinder snapshot command Introducing create snapshot for Cinder disk Change-Id: I828f61ed4892b52288256a9a1e14b2efb56140c7 Bug-Url: https://bugzilla.redhat.com/?????? Signed-off-by: Maor Lipchuk <[email protected]> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CreateCinderSnapshotCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java 2 files changed, 118 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/77/40977/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CreateCinderSnapshotCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CreateCinderSnapshotCommand.java new file mode 100644 index 0000000..e64ccb0 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CreateCinderSnapshotCommand.java @@ -0,0 +1,117 @@ +package org.ovirt.engine.core.bll.storage; + +import java.util.Date; + +import org.ovirt.engine.core.bll.BaseImagesCommand; +import org.ovirt.engine.core.bll.ImagesHandler; +import org.ovirt.engine.core.bll.InternalCommandAttribute; +import org.ovirt.engine.core.bll.context.CommandContext; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallback; +import org.ovirt.engine.core.common.action.ImagesContainterParametersBase; +import org.ovirt.engine.core.common.businessentities.storage.CinderDisk; +import org.ovirt.engine.core.common.businessentities.storage.ImageStatus; +import org.ovirt.engine.core.common.businessentities.storage.VolumeFormat; +import org.ovirt.engine.core.common.businessentities.storage.VolumeType; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.utils.transaction.TransactionMethod; +import org.ovirt.engine.core.utils.transaction.TransactionSupport; + +@InternalCommandAttribute +public class CreateCinderSnapshotCommand<T extends ImagesContainterParametersBase> extends BaseImagesCommand<T> { + + private CinderDisk disk; + private CinderBroker cinderBroker; + + public CreateCinderSnapshotCommand(T parameters) { + this(parameters, null); + } + + public CreateCinderSnapshotCommand(T parameters, CommandContext commandContext) { + super(parameters, commandContext); + } + + private CinderDisk cloneDiskFromSnapshot() { + CinderDisk newCinderVolume = getDisk(); + setStoragePoolId(newCinderVolume.getStoragePoolId() != null ? newCinderVolume.getStoragePoolId() + : Guid.Empty); + getParameters().setStoragePoolId(getStoragePoolId()); + + // override volume type and volume format to sparse and cow according to + // storage team request + newCinderVolume.setVolumeType(VolumeType.Sparse); + newCinderVolume.setvolumeFormat(VolumeFormat.COW); + newCinderVolume.setImageStatus(ImageStatus.LOCKED); + String snapshotId = getCinderBroker().createSnapshot(newCinderVolume, false); + Guid destinationImageId = Guid.createGuidFromString(snapshotId); + getParameters().setDestinationImageId(destinationImageId); + newCinderVolume.setImageId(destinationImageId); + return newCinderVolume; + } + + /** + * By default old image must be replaced by new one + */ + protected void processOldImageFromDb() { + getCompensationContext().snapshotEntity(getDiskImage().getImage()); + getParameters().setOldLastModifiedValue(getDiskImage().getLastModified()); + getDiskImage().setLastModified(new Date()); + getDiskImage().setActive(false); + getImageDao().update(getDiskImage().getImage()); + getCompensationContext().stateChanged(); + } + + @Override + protected void executeCommand() { + final CinderDisk newCinderVolume = cloneDiskFromSnapshot(); + TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { + @Override + public Void runInTransaction() { + processOldImageFromDb(); + addDiskImageToDb(newCinderVolume, getCompensationContext()); + setActionReturnValue(newCinderVolume); + setSucceeded(true); + return null; + } + }); + + getReturnValue().setActionReturnValue(newCinderVolume.getImageId()); + persistCommand(getParameters().getParentCommand(), true); + setSucceeded(true); + return; + } + + protected CinderDisk getDisk() { + if (disk == null) { + disk = (CinderDisk) getDiskDao().get(getImageId()); + } + return disk; + } + + public CinderBroker getCinderBroker() { + if (cinderBroker == null) { + Guid storageDomainId = getDisk().getStorageIds().get(0); + cinderBroker = new CinderBroker(storageDomainId, getReturnValue().getExecuteFailedMessages()); + } + return cinderBroker; + } + + @Override + protected void lockImage() { + ImagesHandler.updateImageStatus(getParameters().getImageId(), ImageStatus.LOCKED); + } + + @Override + public CommandCallback getCallback() { + return new CreateCinderSnapshotCommandCallback(); + } + + @Override + protected void endSuccessfully() { + setSucceeded(true); + } + + @Override + protected void endWithFailure() { + setSucceeded(true); + } +} 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 845d419..8c65e30 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 @@ -451,6 +451,7 @@ CloneSingleCinderDisk(3204, ActionGroup.CONFIGURE_VM_STORAGE, QuotaDependency.STORAGE), CloneCinderDisks(3205, ActionGroup.CONFIGURE_VM_STORAGE, QuotaDependency.STORAGE), RegisterCinderDisk(3206, ActionGroup.CONFIGURE_VM_STORAGE, false, QuotaDependency.NONE), + CreateCinderSnapshot(3207, ActionGroup.CONFIGURE_VM_STORAGE, false, QuotaDependency.NONE), // Host Devices RefreshHostDevices(4000, ActionGroup.MANIPULATE_HOST, false, QuotaDependency.NONE), -- To view, visit https://gerrit.ovirt.org/40977 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I828f61ed4892b52288256a9a1e14b2efb56140c7 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Maor Lipchuk <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
