package com.sequenceiq.cloudbreak.service.cluster; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.springframework.stereotype.Service; import com.sequenceiq.ambari.client.AmbariClient; @Service public class AmbariConfigurationService { private static final List<String> CONFIG_LIST = new ArrayList<>(ConfigParam.values().length); private static final String AZURE_ADDRESS_SUFFIX = "cloudapp.net"; static { for (ConfigParam param : ConfigParam.values()) { CONFIG_LIST.add(param.key()); } } public Map<String, String> getConfiguration(AmbariClient ambariClient, String hostGroup) { Map<String, String> configuration = new HashMap<>(); Set<Map.Entry<String, Map<String, String>>> serviceConfigs = ambariClient.getServiceConfigMapByHostGroup(hostGroup).entrySet(); for (Map.Entry<String, Map<String, String>> serviceEntry : serviceConfigs) { for (Map.Entry<String, String> configEntry : serviceEntry.getValue().entrySet()) { if (CONFIG_LIST.contains(configEntry.getKey())) { configuration.put(configEntry.getKey(), replaceHostName(ambariClient, configEntry)); } } } return configuration; } private String replaceHostName(AmbariClient ambariClient, Map.Entry<String, String> entry) { String result = entry.getValue(); if (entry.getKey().startsWith("yarn.resourcemanager")) { int portStartIndex = result.indexOf(":"); String internalAddress = result.substring(0, portStartIndex); String publicAddress = ambariClient.resolveInternalHostName(internalAddress); if (internalAddress.equals(publicAddress)) { if (internalAddress.contains(AZURE_ADDRESS_SUFFIX)) { publicAddress = internalAddress.substring(0, internalAddress.indexOf(".") + 1) + AZURE_ADDRESS_SUFFIX; } } result = publicAddress + result.substring(portStartIndex); } return result; } }