Daniel Erez has uploaded a new change for review. Change subject: core: introduce CloneSingleCinderDiskCommand ......................................................................
core: introduce CloneSingleCinderDiskCommand Adding CloneSingleCinderDiskCommand and CloneSingleCinderDiskCommandCallback. Change-Id: I608ab9de6c4a79ea8bdf44e1547f72a30ab80db7 Bug-Url: https://bugzilla.redhat.com/1185826 Signed-off-by: Daniel Erez <de...@redhat.com> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneSingleCinderDiskCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneSingleCinderDiskCommandCallback.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java 3 files changed, 171 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/43/39643/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneSingleCinderDiskCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneSingleCinderDiskCommand.java new file mode 100644 index 0000000..b9c678b --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneSingleCinderDiskCommand.java @@ -0,0 +1,93 @@ +package org.ovirt.engine.core.bll.storage; + +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.DiskImageDynamic; +import org.ovirt.engine.core.common.businessentities.storage.ImageStatus; +import org.ovirt.engine.core.common.businessentities.storage.ImageStorageDomainMap; +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 CloneSingleCinderDiskCommand<T extends ImagesContainterParametersBase> extends BaseImagesCommand<T> { + + private CinderDisk disk; + + public CloneSingleCinderDiskCommand(T parameters) { + this(parameters, null); + } + + public CloneSingleCinderDiskCommand(T parameters, CommandContext commandContext) { + super(parameters, commandContext); + setStorageDomainId(parameters.getStorageDomainId()); + } + + @Override + protected void executeCommand() { + lockImage(); + CinderDisk cinderDisk = getDisk(); + String volumeId = getCinderBroker().cloneDisk(cinderDisk); + + cinderDisk.setId(Guid.createGuidFromString(volumeId)); + cinderDisk.setImageId(Guid.createGuidFromString(volumeId)); + cinderDisk.setImageStatus(ImageStatus.LOCKED); + cinderDisk.setVolumeType(VolumeType.Sparse); + addCinderDiskTemplateToDB(cinderDisk); + + getReturnValue().setActionReturnValue(cinderDisk.getId()); + getParameters().setDestinationImageId(Guid.createGuidFromString(volumeId)); + persistCommand(getParameters().getParentCommand(), true); + setSucceeded(true); + } + + protected void addCinderDiskTemplateToDB(final CinderDisk cinderDisk) { + TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { + @Override + public Void runInTransaction() { + getBaseDiskDao().save(cinderDisk); + getImageDao().save(cinderDisk.getImage()); + DiskImageDynamic diskDynamic = new DiskImageDynamic(); + diskDynamic.setId(cinderDisk.getImageId()); + getDiskImageDynamicDAO().save(diskDynamic); + ImageStorageDomainMap image_storage_domain_map = new ImageStorageDomainMap(cinderDisk.getImageId(), + cinderDisk.getStorageIds().get(0), cinderDisk.getQuotaId(), cinderDisk.getDiskProfileId()); + getDbFacade().getImageStorageDomainMapDao().save(image_storage_domain_map); + return null; + } + }); + } + + protected CinderDisk getDisk() { + if (disk == null) { + disk = (CinderDisk) getDiskDao().get(getImageId()); + } + return disk; + } + + @Override + protected void lockImage() { + ImagesHandler.updateImageStatus(getParameters().getImageId(), ImageStatus.LOCKED); + } + + @Override + public CommandCallback getCallback() { + return new CloneSingleCinderDiskCommandCallback(); + } + + @Override + protected void endSuccessfully() { + setSucceeded(true); + } + + @Override + protected void endWithFailure() { + setSucceeded(true); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneSingleCinderDiskCommandCallback.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneSingleCinderDiskCommandCallback.java new file mode 100644 index 0000000..8617563 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneSingleCinderDiskCommandCallback.java @@ -0,0 +1,77 @@ +package org.ovirt.engine.core.bll.storage; + +import org.ovirt.engine.core.bll.ImagesHandler; +import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil; +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.DiskImage; +import org.ovirt.engine.core.common.businessentities.storage.ImageStatus; +import org.ovirt.engine.core.compat.CommandStatus; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.dao.DiskDao; + +import java.util.List; + +public class CloneSingleCinderDiskCommandCallback extends AbstractCinderDiskCommandCallback<CloneSingleCinderDiskCommand<ImagesContainterParametersBase>> { + + @Override + public void doPolling(Guid cmdId, List<Guid> childCmdIds) { + super.doPolling(cmdId, childCmdIds); + + ImageStatus imageStatus = getCinderBroker().getDiskStatus(getDiskId()); + DiskImage disk = getDisk(); + if (imageStatus != null && imageStatus != disk.getImageStatus()) { + switch (imageStatus) { + case OK: + getCommand().setCommandStatus(CommandStatus.SUCCEEDED); + break; + case ILLEGAL: + getCommand().setCommandStatus(CommandStatus.FAILED); + break; + } + } + } + + @Override + public void onFailed(Guid cmdId, List<Guid> childCmdIds) { + super.onFailed(cmdId, childCmdIds); + ImagesHandler.updateImageStatus(getDiskId(), ImageStatus.ILLEGAL); + onFinish(cmdId); + } + + @Override + public void onSucceeded(Guid cmdId, List<Guid> childCmdIds) { + super.onSucceeded(cmdId, childCmdIds); + ImagesHandler.updateImageStatus(getDiskId(), ImageStatus.OK); + onFinish(cmdId); + } + + private void onFinish(Guid cmdId) { + ImagesHandler.updateImageStatus(getCommand().getParameters().getImageId(), ImageStatus.OK); + getCommand().endAction(); + CommandCoordinatorUtil.removeAllCommandsInHierarchy(cmdId); + } + + @Override + protected Guid getDiskId() { + return getCommand().getParameters().getDestinationImageId(); + } + + @Override + protected CinderDisk getDisk() { + if (disk == null) { + disk = (CinderDisk) getDiskDao().get(getCommand().getParameters().getDestinationImageId()); + } + return disk; + } + + protected DiskDao getDiskDao() { + return DbFacade.getInstance().getDiskDao(); + } + + @Override + protected CinderBroker getCinderBroker() { + return getCommand().getCinderBroker(); + } +} 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 adcbfff..37d75a7 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 @@ -438,6 +438,7 @@ RemoveCinderDisk(3201, QuotaDependency.STORAGE), ExtendCinderDisk(3202, ActionGroup.CONFIGURE_VM_STORAGE, QuotaDependency.STORAGE), RemoveAllVmCinderDisks(3203, QuotaDependency.STORAGE), + CloneSingleCinderDisk(3204, ActionGroup.CONFIGURE_VM_STORAGE, QuotaDependency.STORAGE), // Host Devices RefreshHostDevices(4000, ActionGroup.MANIPULATE_HOST, false, QuotaDependency.NONE); -- To view, visit https://gerrit.ovirt.org/39643 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I608ab9de6c4a79ea8bdf44e1547f72a30ab80db7 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Daniel Erez <de...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches