/***************************************************************************
* Copyright (c) 2012-2015 VMware, Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
***************************************************************************/
package com.vmware.bdd.plugin.ambari.utils;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import com.vmware.aurora.util.StringUtil;
import com.vmware.bdd.plugin.ambari.api.model.ApiHostsRequest;
import com.vmware.bdd.plugin.ambari.api.model.ApiHostsRequestInfo;
import com.vmware.bdd.plugin.ambari.api.model.cluster.ApiComponentInfo;
import com.vmware.bdd.plugin.ambari.api.model.cluster.ApiHostComponentsRequest;
import com.vmware.bdd.software.mgmt.plugin.model.ClusterBlueprint;
import com.vmware.bdd.usermgmt.UserMgmtConstants;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
import com.vmware.bdd.software.mgmt.plugin.model.NodeGroupInfo;
public class AmUtils {
public static List<Map<String, Object>> toAmConfigurations(
Map<String, Object> configuration) {
List<Map<String, Object>> configurations =
new ArrayList<Map<String, Object>>();
//set service user to configuration
updateServiceUserConfigInConfiguration(configuration);
if (configuration != null) {
for (String configurationType : configuration.keySet()) {
Map<String, String> properties = (Map<String, String>) configuration.get(configurationType);
if (!properties.keySet().isEmpty()) {
configurations = toAmConfigurations(configurations, configurationType, properties);
}
}
}
return configurations;
}
private static void updateServiceUserConfigInConfiguration(Map<String, Object> configuration) {
if (configuration == null) {
return;
}
Map<String, Map<String, String>> serviceUserConfigs = (Map<String, Map<String, String>>)
configuration.get(UserMgmtConstants.SERVICE_USER_CONFIG_IN_SPEC_FILE);
if (MapUtils.isEmpty(serviceUserConfigs)) {
return;
}
for (Map.Entry<String, Map<String, String>> serviceUserConfig: serviceUserConfigs.entrySet()) {
String serviceUser = serviceUserConfig.getValue().get(UserMgmtConstants.SERVICE_USER_NAME);
if (!StringUtils.isBlank(serviceUser)) {
String serviceUserParentConfigName = serviceName2EnvName(serviceUserConfig.getKey());
String serviceUserConfigName = serviceUserConfig.getKey().toLowerCase() + "_user";
Map<String, String> serviceConfig = (Map<String, String>) configuration.get(serviceUserParentConfigName);
if (serviceConfig == null) {
serviceConfig = new HashMap<>();
}
serviceConfig.put(serviceUserConfigName, serviceUser);
configuration.put(serviceUserParentConfigName, serviceConfig);
//for HDFS/HBASE we also need to change related field in xml files
//Reference: http://docs.hortonworks.com/HDPDocuments/HDP1/HDP-1.3.3/bk_using_Ambari_book/content/ambari-chap3-7-1_2x.html
switch (serviceUserConfig.getKey()) {
case "HDFS":
updateConfigInConfiguration(configuration, "hdfs-site", "dfs.permissions.superusergroup", serviceUser);
//the administrators config need to have a whitespace in front of the service user
updateConfigInConfiguration(configuration, "hdfs-site", "dfs.cluster.administrators", " " + serviceUser);
break;
case "HBASE":
updateConfigInConfiguration(configuration, "", "dfs.block.local-path-access.user", serviceUser);
break;
}
}
}
configuration.remove(UserMgmtConstants.SERVICE_USER_CONFIG_IN_SPEC_FILE);
}
private static String serviceName2EnvName(String serviceName) {
String envName;
if (serviceName.equals("HDFS")) {
envName = "hadoop" + "-env";
} else if (serviceName.equals("MAPREDUCE2")) {
envName = "mapred" + "-env";
} else {
envName = serviceName.toLowerCase() + "-env";
}
return envName;
}
private static void updateConfigInConfiguration(Map<String, Object> configuration, String configType, String key, String value) {
Map<String, String> conf = (Map<String, String>) configuration.get(configType);
if (conf == null) {
conf = new HashMap<>();
configuration.put(configType, conf);
}
conf.put(key, value);
}
public static List<Map<String, Object>> toAmConfigurations(
List<Map<String, Object>> configurations, String configurationType,
Map<String, String> property) {
if (configurations == null) {
configurations = new ArrayList<Map<String, Object>>();
}
Map<String, Object> configuration = new HashMap<String, Object>();
configuration.put(configurationType, property);
if (configurations.isEmpty()) {
configurations.add(configuration);
} else {
boolean isContainsKey = false;
for (Map<String, Object> nodeConfiguration : configurations) {
if (nodeConfiguration.containsKey(configurationType)) {
Map<String, String> properties =
(Map<String, String>) nodeConfiguration
.get(configurationType);
properties.putAll(property);
isContainsKey = true;
}
}
if (!isContainsKey) {
configurations.add(configuration);
}
}
return configurations;
}
public static boolean isValidRack(String rack) {
Pattern rackPattern = Pattern.compile("(/[a-zA-Z0-9\\.\\-\\_]+)+");
return rackPattern.matcher(rack).matches();
}
public static ApiHostsRequest createInstallComponentsRequest() {
ApiHostsRequest hostsRequest = new ApiHostsRequest();
ApiHostComponentsRequest components = new ApiHostComponentsRequest();
hostsRequest.setBody(components);
ApiComponentInfo hostRoles = new ApiComponentInfo();
hostRoles.setState("INSTALLED");
components.setHostRoles(hostRoles);
ApiHostsRequestInfo requestInfo = new ApiHostsRequestInfo();
hostsRequest.setRequestInfo(requestInfo);
requestInfo.setContext("Installing components");
requestInfo.setQueryString("HostRoles/state=INIT");
return hostsRequest;
}
public static String getConfDir() {
return com.vmware.bdd.utils.CommonUtil.getConfDir() + File.separator + Constants.AMBARI_PLUGIN_NAME;
}
public static boolean isAmbariServerBelow_2_0_0(String ambariServerVersion) {
//When server version is invalid, using the 1.x.x api as default
return Version.compare(ambariServerVersion, "2.0") < 0;
}
public static boolean isAmbariServerGreaterOrEquals_2_1_0(String ambariServerVersion) {
return Version.compare(ambariServerVersion, "2.1") >= 0;
}
public static boolean containsRole(ClusterBlueprint blueprint, String role) {
for (NodeGroupInfo info : blueprint.getNodeGroups()) {
if (info.getRoles().contains(role)) {
return true;
}
}
return false;
}
}