package org.ovirt.engine.core.bll; import org.ovirt.engine.core.common.action.RemoveImageParameters; 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.DeleteImageGroupVDSCommandParameters; 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.compat.LogCompat; import org.ovirt.engine.core.compat.LogFactoryCompat; import org.ovirt.engine.core.dal.dbbroker.DbFacade; /** * This command responcible to removing image, contains all created snapshots. */ // C# TO JAVA CONVERTER TODO TASK: Java annotations will not correspond to .NET // attributes: @InternalCommandAttribute public class RemoveImageCommand<T extends RemoveImageParameters> extends BaseImagesCommand<T> { public RemoveImageCommand(T parameters) { super(parameters); setDiskImage(((getParameters().getDiskImage()) != null) ? getParameters().getDiskImage() : getDiskImage()); if (getStoragePoolId() == null || (getStoragePoolId() != null && getStoragePoolId().getValue().equals(Guid.Empty))) { setStoragePoolId(getDiskImage() != null && getDiskImage().getstorage_pool_id() != null ? getDiskImage() .getstorage_pool_id().getValue() : Guid.Empty); } } @Override protected Guid getImageContainerId() { switch (getActionState()) { case EXECUTE: return getParameters().getContainerId(); default: return super.getImageContainerId(); } } @Override protected void executeCommand() { if (getDiskImage() != null) { VDSReturnValue vdsReturnValue = Backend .getInstance() .getResourceManager() .RunVdsCommand( VDSCommandType.DeleteImageGroup, new DeleteImageGroupVDSCommandParameters(getDiskImage().getstorage_pool_id().getValue(), getDiskImage().getstorage_id().getValue(), getDiskImage().getimage_group_id() .getValue(), getDiskImage().getwipe_after_delete(), getParameters() .getForceDelete(), getStoragePool().getcompatibility_version().toString())); if (vdsReturnValue.getSucceeded()) { getReturnValue().getInternalTaskIdList().add( CreateTask(vdsReturnValue.getCreationInfo(), getParameters().getParentCommand())); if (getParameters().getParentCommand() != VdcActionType.RemoveDisksFromVm && getParameters().getParentCommand() != VdcActionType.RemoveVmFromImportExport && getParameters().getParentCommand() != VdcActionType.RemoveVmTemplateFromImportExport) { RemoveImageFromDB(); } } else { return; } } else { log.warn("RemoveImageCommand::ExecuteCommand: DiskImage is null, nothing to remove"); } setSucceeded(true); } @Override protected Guid ConcreteCreateTask(AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand) { AsyncTaskParameters p = new AsyncTaskParameters(asyncTaskCreationInfo, new async_tasks(parentCommand, AsyncTaskResultEnum.success, AsyncTaskStatusEnum.running, asyncTaskCreationInfo.getTaskID(), getParametersForTask(parentCommand, getParameters()))); p.setEntityId(getParameters().getEntityId()); Guid ret = AsyncTaskManager.getInstance().CreateTask(AsyncTaskType.deleteImage, p, false); return ret; } private void RemoveImageFromDB() { if (getDiskImage() != null) { DbFacade.getInstance().getDiskImageDynamicDAO().remove(getDiskImage().getId()); Guid imageTemplate = getDiskImage().getit_guid(); Guid currentGuid = getDiskImage().getId(); // next 'while' statement removes snapshots from DB only (the // 'DeleteImageGroup' // VDS Command should take care of removing all the snapshots from // the storage). while (!imageTemplate.equals(currentGuid) && !currentGuid.equals(Guid.Empty)) { RemoveChildren(currentGuid); // DiskImage image = IrsBroker.getImageInfo(currentGuid); DiskImage image = DbFacade.getInstance().getDiskImageDAO().getSnapshotById(currentGuid); if (image != null) { RemoveSnapshot(image); currentGuid = image.getParentId(); } else { currentGuid = Guid.Empty; log.warnFormat( "RemoveImageCommand::RemoveImageFromDB: 'image' (snapshot of image '{0}') is null, cannot remove it.", getDiskImage().getId()); } } } else { log.warn("RemoveImageCommand::RemoveImageFromDB: DiskImage is null, nothing to remove."); } } @Override protected void EndSuccessfully() { if (getParameters() != null && getParameters().getParentCommand() == VdcActionType.RemoveDisksFromVm) { RemoveImageFromDB(); } setSucceeded(true); } @Override protected void EndWithFailure() { if (getParameters() != null && getParameters().getParentCommand() == VdcActionType.RemoveDisksFromVm) { RemoveImageFromDB(); } setSucceeded(true); } private static LogCompat log = LogFactoryCompat.getLog(RemoveImageCommand.class); }