package org.ovirt.engine.core.bll; import org.ovirt.engine.core.common.action.ImagesContainterParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo; import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters; import org.ovirt.engine.core.common.asynctasks.AsyncTaskType; import org.ovirt.engine.core.common.businessentities.AsyncTaskResultEnum; import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.async_tasks; import org.ovirt.engine.core.common.vdscommands.MergeSnapshotsVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; @InternalCommandAttribute public class MergeSnapshotSingleDiskCommand<T extends ImagesContainterParametersBase> extends BaseImagesCommand<T> { public MergeSnapshotSingleDiskCommand(T parameters) { super(parameters); } @Override protected void executeCommand() { Guid storagePoolId = getDiskImage().getstorage_pool_id() != null ? getDiskImage().getstorage_pool_id() .getValue() : Guid.Empty; Guid storageDomainId = getDiskImage().getstorage_id() != null ? getDiskImage().getstorage_id().getValue() : Guid.Empty; Guid imageGroupId = getDiskImage().getimage_group_id() != null ? getDiskImage().getimage_group_id().getValue() : Guid.Empty; VDSReturnValue vdsReturnValue = Backend .getInstance() .getResourceManager() .RunVdsCommand( VDSCommandType.MergeSnapshots, new MergeSnapshotsVDSCommandParameters(storagePoolId, storageDomainId, getVmId(), imageGroupId, getDiskImage().getId(), getDestinationDiskImage().getId(), getDiskImage().getwipe_after_delete(), getStoragePool().getcompatibility_version() .toString())); if (vdsReturnValue != null && vdsReturnValue.getCreationInfo() != null) { getReturnValue().getInternalTaskIdList().add( CreateTask(vdsReturnValue.getCreationInfo(), VdcActionType.MergeSnapshot)); setSucceeded(vdsReturnValue.getSucceeded()); } else { setSucceeded(false); } } @Override protected Guid ConcreteCreateTask(AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand) { AsyncTaskParameters p = new AsyncTaskParameters(asyncTaskCreationInfo, new async_tasks(parentCommand, AsyncTaskResultEnum.success, AsyncTaskStatusEnum.running, asyncTaskCreationInfo.getTaskID(), getParameters())); p.setEntityId(getParameters().getEntityId()); Guid ret = AsyncTaskManager.getInstance().CreateTask(AsyncTaskType.mergeSnapshots, p, false); return ret; } @Override protected void EndSuccessfully() { // NOTE: The removal of the images from DB is done here // assuming that there might be situation (related to // tasks failures) in which we will want to preserve the // original state (before the merge-attempt). if (getDestinationDiskImage() != null) { DiskImage curr = getDestinationDiskImage(); while (!curr.getParentId().equals(getDiskImage().getParentId())) { curr = DbFacade.getInstance().getDiskImageDAO().getSnapshotById(curr.getParentId()); DbFacade.getInstance().getDiskImageDAO().remove(curr.getId()); } getDestinationDiskImage().setvolume_format(curr.getvolume_format()); getDestinationDiskImage().setvolume_type(curr.getvolume_type()); getDestinationDiskImage().setdisk_type(curr.getdisk_type()); getDestinationDiskImage().setParentId(getDiskImage().getParentId()); DbFacade.getInstance().getDiskImageDAO().update(getDestinationDiskImage()); } setSucceeded(true); } @Override protected void EndWithFailure() { // TODO: FILL! We should determine what to do in case of // failure (is everything rolled-backed? rolled-forward? // some and some?). setSucceeded(true); } }