package org.ovirt.engine.core.bll.storage.disk.image; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.inject.Inject; import org.ovirt.engine.core.bll.CommandBase; import org.ovirt.engine.core.bll.InternalCommandAttribute; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.storage.domain.PostDeleteActionHandler; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.DestroyImageParameters; import org.ovirt.engine.core.common.asynctasks.AsyncTaskType; import org.ovirt.engine.core.common.asynctasks.EntityInfo; import org.ovirt.engine.core.common.vdscommands.DestroyImageVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSParametersBase; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.CommandStatus; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.StorageDomainDao; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @InternalCommandAttribute public class DestroyImageCommand<T extends DestroyImageParameters> extends CommandBase<T> { @Inject private PostDeleteActionHandler postDeleteActionHandler; @Inject private StorageDomainDao storageDomainDao; private static final Logger log = LoggerFactory.getLogger(DestroyImageCommand.class); public DestroyImageCommand(T parameters, CommandContext cmdContext) { super(parameters, cmdContext); } @Override protected void executeCommand() { getParameters().setEntityInfo(new EntityInfo(VdcObjectType.Disk, getParameters().getImageGroupId())); Guid taskId = persistAsyncTaskPlaceHolder(getParameters().getParentCommand()); VDSReturnValue vdsReturnValue = runVdsCommand(VDSCommandType.DestroyImage, createVDSParameters()); if (vdsReturnValue != null && vdsReturnValue.getCreationInfo() != null) { getParameters().setVdsmTaskIds(new ArrayList<>()); Guid result = createTask(taskId, vdsReturnValue.getCreationInfo(), getParameters().getParentCommand(), VdcObjectType.Storage, getParameters().getStorageDomainId()); getReturnValue().getInternalVdsmTaskIdList().add(result); getReturnValue().getVdsmTaskIdList().add(result); getParameters().getVdsmTaskIds().add(result); setSucceeded(vdsReturnValue.getSucceeded()); log.info("Successfully started task to remove orphaned volumes resulting from live merge"); } else { setSucceeded(false); setCommandStatus(CommandStatus.FAILED); } } private VDSParametersBase createVDSParameters() { return postDeleteActionHandler.fixParameters( new DestroyImageVDSCommandParameters( getParameters().getStoragePoolId(), getParameters().getStorageDomainId(), getParameters().getImageGroupId(), getParameters().getImageList(), getParameters().isPostZero(), storageDomainDao.get(getParameters().getStorageDomainId()).isDiscardAfterDelete(), getParameters().isForce())); } @Override public List<PermissionSubject> getPermissionCheckSubjects() { return Collections.singletonList(new PermissionSubject(getParameters().getStorageDomainId(), VdcObjectType.Storage, getActionType().getActionGroup())); } @Override public AsyncTaskType getTaskType() { return AsyncTaskType.deleteVolume; } }