package org.ovirt.engine.core.bll.storage.disk.image; 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.MultiLevelAdministrationHandler; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.TransferImageStatusParameters; import org.ovirt.engine.core.common.businessentities.ActionGroup; import org.ovirt.engine.core.common.businessentities.storage.ImageTransfer; import org.ovirt.engine.core.common.businessentities.storage.ImageTransferPhase; import org.ovirt.engine.core.dao.ImageTransferDao; public class TransferImageStatusCommand<T extends TransferImageStatusParameters> extends CommandBase<T> { @Inject private ImageTransferDao imageTransferDao; @Inject private ImageTransferUpdater imageTransferUpdater; public TransferImageStatusCommand(T parameters, CommandContext cmdContext) { super(parameters, cmdContext); } @Override protected boolean validate() { return true; } @Override protected void executeCommand() { if (getParameters().getTransferImageCommandId() == null && getParameters().getDiskId() == null) { log.error("Invalid parameters: command or disk id must be specified"); setSucceeded(false); } ImageTransfer entity; if (getParameters().getTransferImageCommandId() != null) { entity = imageTransferDao.get(getParameters().getTransferImageCommandId()); } else { entity = imageTransferDao.getByDiskId(getParameters().getDiskId()); } if (entity != null) { // Always update; this serves as a keepalive entity = imageTransferUpdater.updateEntity(getParameters().getUpdates(), entity.getId(), false); } else { // Missing entity; this isn't unusual as the UI will poll until the entity is gone // due to upload completion or failure. Instead of an error, we'll return an entity // with phase "UNKNOWN" and the UI will know what to do. if (getParameters().getTransferImageCommandId() != null) { log.info("TransferImageStatus request for missing or removed entity, command id {}", getParameters().getTransferImageCommandId()); } else { log.info("TransferImageStatus request for missing or removed entity, disk id {}", getParameters().getDiskId()); } entity = new ImageTransfer(); entity.setId(getParameters().getTransferImageCommandId()); entity.setPhase(ImageTransferPhase.UNKNOWN); } setSucceeded(true); getReturnValue().setActionReturnValue(entity); } @Override public List<PermissionSubject> getPermissionCheckSubjects() { // Only check generic permissions because the command and/or ImageUpload entity may be missing return Collections.singletonList(new PermissionSubject( MultiLevelAdministrationHandler.SYSTEM_OBJECT_ID, VdcObjectType.System, ActionGroup.CREATE_DISK)); } @Override public AuditLogType getAuditLogTypeValue() { // An AuditLogType message is appended to the params when an error occurs. if (getParameters().getAuditLogType() != null) { addCustomValue("DiskId", getParameters().getDiskId().toString()); return getParameters().getAuditLogType(); } else { return super.getAuditLogTypeValue(); } } }