package com.sequenceiq.cloudbreak.orchestrator.salt.states; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import com.sequenceiq.cloudbreak.orchestrator.salt.domain.RunnerInfo; public class JidInfoResponseTransformer { private JidInfoResponseTransformer() { } public static Map<String, List<RunnerInfo>> getHighStates(Map map) { Map<String, Object> stringObjectMap; if (isOldSalt(map)) { stringObjectMap = ((Map<String, List<Map<String, Map<String, Object>>>>) map).get("return").get(0).get("data"); } else { stringObjectMap = ((Map<String, List<Map<String, Object>>>) map).get("return").get(0); } Map<String, List<RunnerInfo>> result = new HashMap<>(); for (Map.Entry<String, Object> stringObjectEntry : stringObjectMap.entrySet()) { if (stringObjectEntry.getValue() instanceof Map) { Map<String, Map<String, Object>> mapValue = (Map<String, Map<String, Object>>) stringObjectEntry.getValue(); result.put(stringObjectEntry.getKey(), runnerInfoObjects(mapValue)); } else if (stringObjectEntry.getValue() instanceof List) { List<String> listValue = (List<String>) stringObjectEntry.getValue(); if (!listValue.isEmpty()) { throw new RuntimeException("Salt execution went wrong: " + listValue.get(0)); } } else { throw new UnsupportedOperationException("Not supported Salt response: " + stringObjectEntry.getValue().getClass()); } } return result; } private static boolean isOldSalt(Map<String, List<Map<String, Object>>> map) { return map.get("return").get(0).get("data") != null; } public static Map<String, List<RunnerInfo>> getSimpleStates(Map map) { Map<String, Map<String, Map<String, Object>>> stringMapMap = ((Map<String, List<Map<String, Map<String, Map<String, Object>>>>>) map).get("return").get(0); Map<String, List<RunnerInfo>> result = new HashMap<>(); for (Map.Entry<String, Map<String, Map<String, Object>>> stringMapEntry : stringMapMap.entrySet()) { result.put(stringMapEntry.getKey(), runnerInfoObjects(stringMapEntry.getValue())); } return result; } private static List<RunnerInfo> runnerInfoObjects(Map<String, Map<String, Object>> map) { List<RunnerInfo> runnerInfoList = new ArrayList<>(); for (Map.Entry<String, Map<String, Object>> stringMapEntry : map.entrySet()) { Map<String, Object> value = stringMapEntry.getValue(); RunnerInfo runnerInfo = new RunnerInfo(); runnerInfo.setStateId(stringMapEntry.getKey()); Object changes = value.get("changes"); runnerInfo.setChanges(changes == null ? Collections.emptyMap() : (Map<String, Object>) changes); runnerInfo.setComment(String.valueOf(value.get("comment"))); double duration; try { String[] durationArray = String.valueOf(value.get("duration")).split(" "); duration = Double.parseDouble(durationArray[0]); } catch (NumberFormatException nfe) { duration = 0.0; } runnerInfo.setDuration(duration); runnerInfo.setName(String.valueOf(value.get("name"))); runnerInfo.setResult(Boolean.valueOf(String.valueOf(value.get("result")))); String runNum = String.valueOf(value.get("__run_num__")); runnerInfo.setRunNum(runNum == null ? -1 : Integer.parseInt(runNum)); runnerInfo.setStartTime(String.valueOf(value.get("start_time"))); runnerInfoList.add(runnerInfo); } Collections.sort(runnerInfoList, new RunnerInfo.RunNumComparator()); return runnerInfoList; } }