package org.ovirt.engine.core.vdsbroker.vdsbroker; import java.util.HashMap; import java.util.Map; import org.ovirt.engine.core.common.businessentities.AsyncTaskResultEnum; import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus; import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum; import org.ovirt.engine.core.common.vdscommands.VdsIdVDSCommandParametersBase; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.utils.log.Logged; import org.ovirt.engine.core.utils.log.Logged.LogLevel; @SuppressWarnings("unchecked") @Logged(executionLevel = LogLevel.DEBUG) public class HSMGetAllTasksStatusesVDSCommand<P extends VdsIdVDSCommandParametersBase> extends VdsBrokerCommand<P> { private TaskStatusListReturn result; public HSMGetAllTasksStatusesVDSCommand(P parameters) { super(parameters); } @Override protected void executeVdsBrokerCommand() { result = getBroker().getAllTasksStatuses(); proceedProxyReturnValue(); setReturnValue(parseTaskStatusList(result.taskStatusList)); } protected AsyncTaskStatus parseTaskStatus(TaskStatus taskStatus) { AsyncTaskStatus task = new AsyncTaskStatus(); task.setStatus((taskStatus != null && taskStatus.taskState != null) ? AsyncTaskStatusEnum .valueOf(taskStatus.taskState) : AsyncTaskStatusEnum.unknown); if (task.getStatus() == AsyncTaskStatusEnum.finished) { updateReturnStatus(taskStatus); try { proceedProxyReturnValue(); } catch (RuntimeException ex) { task.setException(ex); } task.setResult(taskStatus != null ? AsyncTaskResultEnum.valueOf(taskStatus.taskResult) : AsyncTaskResultEnum.unknown); // Normally, when the result is not 'success', there is an // exception. // Just in case, we check the result here and if there is no // exception, // we throw a special one here: if (task.getResult() != AsyncTaskResultEnum.success && task.getException() == null) { task.setException(new VDSTaskResultNotSuccessException(String.format( "TaskState contained successful return code, but a non-success result ('%1$s').", taskStatus.taskResult))); } } return task; } protected HashMap<Guid, AsyncTaskStatus> parseTaskStatusList(Map<String, ?> taskStatusList) { HashMap<Guid, AsyncTaskStatus> result = new HashMap<>(taskStatusList.size()); for (Map.Entry<String, ?> entry : taskStatusList.entrySet()) { try { Guid taskGuid = new Guid(entry.getKey().toString()); Map<String, Object> xrsTaskStatusAsMAp = (Map<String, Object>) entry.getValue(); if (xrsTaskStatusAsMAp == null) { log.error("Task ID {} has no task data", entry.getKey()); } else { Map<String, Object> xrsTaskStatus = xrsTaskStatusAsMAp; TaskStatus tempVar = new TaskStatus(); tempVar.code = Integer.parseInt(xrsTaskStatus.get("code").toString()); tempVar.message = xrsTaskStatus.get("message").toString(); tempVar.taskResult = xrsTaskStatus.get("taskResult").toString(); tempVar.taskState = xrsTaskStatus.get("taskState").toString(); TaskStatus taskStatus = tempVar; AsyncTaskStatus task = parseTaskStatus(taskStatus); result.put(taskGuid, task); } } catch (RuntimeException exp) { log.error( "HSMGetAllTasksStatusesVDSCommand: Ignoring error while parsing task status from list. key: '{}', value: '{}': {}", entry.getKey(), entry.getValue(), exp.getMessage()); log.debug("Exception", exp); } } return result; } @Override protected Status getReturnStatus() { return result.getStatus(); } // overrides the value of the status that is being checked in the // proceedProxyReturnValue method. // Used when multiple calls to proceedProxyReturnValue are needed within // the same VDSCommand on different status values, for example, a regular // verb // execution status and an asynchronous task status. protected void updateReturnStatus(Status newReturnStatus) { result.setStatus(newReturnStatus); } @Override protected Object getReturnValueFromBroker() { return result; } }