package org.ovirt.engine.core.vdsbroker.gluster;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.ovirt.engine.core.common.asynctasks.gluster.GlusterAsyncTask;
import org.ovirt.engine.core.common.asynctasks.gluster.GlusterAsyncTaskStatus;
import org.ovirt.engine.core.common.asynctasks.gluster.GlusterTaskParameters;
import org.ovirt.engine.core.common.asynctasks.gluster.GlusterTaskType;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.common.utils.SizeConverter;
import org.ovirt.engine.core.common.utils.SizeConverter.SizeUnit;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.vdsbroker.irsbroker.StatusReturn;
public class GlusterTasksListReturn extends StatusReturn {
private static final String TASKS_LIST = "tasks";
private static final String STATUS = "status";
private static final String TASK_TYPE = "type";
private static final String DATA = "data";
private static final String VOLUME_NAME = "volume";
private static final String BRICK_NAMES = "bricks";
private static final String FILES_MOVED = "filesMoved";
private static final String TOTAL_SIZE_MOVED = "totalSizeMoved";
private static final String FILES_SCANNED = "filesScanned";
private static final String FILES_FAILED = "filesFailed";
private List<GlusterAsyncTask> tasks = new ArrayList<>();
@SuppressWarnings("unchecked")
public GlusterTasksListReturn(Map<String, Object> innerMap) {
super(innerMap);
if (getStatus().code != 0) {
return;
}
Map<String, Object> tasksMap = (Map<String, Object>) innerMap.get(TASKS_LIST);
if (tasksMap != null) {
for (Entry<String, Object> entry: tasksMap.entrySet()) {
GlusterAsyncTask task = getTask(entry.getKey(), (Map<String, Object>)entry.getValue());
if(GlusterTaskType.UNKNOWN != task.getType()){
tasks.add(task);
}
}
}
}
@SuppressWarnings("unchecked")
private GlusterAsyncTask getTask(String taskId, Map<String, Object> map) {
GlusterAsyncTask task = new GlusterAsyncTask();
task.setTaskId(Guid.createGuidFromString(taskId));
task.setStatus(GlusterAsyncTaskStatus.from((String)map.get(STATUS)).getJobExecutionStatus());
task.setType(GlusterTaskType.fromValue((String)map.get(TASK_TYPE)));
if(GlusterTaskType.UNKNOWN != task.getType()){
task.setMessage(getMessage((Map<String, Object>)map.get(DATA)));
task.setTaskParameters(new GlusterTaskParameters());
task.getTaskParameters().setVolumeName((String)map.get(VOLUME_NAME));
task.getTaskParameters().setBricks(getBrickNames(map.get(BRICK_NAMES)));
}
return task;
}
private String getMessage(Map<String, Object> map) {
return String.format("Files [scanned: %1$s, moved: %2$s, failed: %3$s], Total size moved: %4$s",
map.get(FILES_SCANNED),
map.get(FILES_MOVED),
map.get(FILES_FAILED),
formatTotalSizeMoved(Long.parseLong(map.get(TOTAL_SIZE_MOVED).toString())));
}
private String formatTotalSizeMoved(long size) {
NumberFormat formatSize = NumberFormat.getInstance();
formatSize.setMaximumFractionDigits(2);
formatSize.setMinimumFractionDigits(2);
Pair<SizeConverter.SizeUnit, Double> sizeMoved= SizeConverter.autoConvert(size, SizeUnit.BYTES);
return formatSize.format(sizeMoved.getSecond().doubleValue()).toString().concat(" ").concat(sizeMoved.getFirst().toString());
}
private String[] getBrickNames(Object bricksObj){
if (bricksObj == null || !(bricksObj instanceof Object[])) {
return null;
}
Object[] brickObjectArray = (Object[])bricksObj;
String[] brickNames = new String[brickObjectArray.length];
for (int i=0; i< brickNames.length; i++){
brickNames[i] = brickObjectArray[i].toString();
}
return brickNames;
}
public List<GlusterAsyncTask> getGlusterTasks() {
return tasks;
}
}