com.vmware.bdd.plugin.ambari.utils.AmUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.vmware.bdd.plugin.ambari.utils.AmUtils.java

Source

/***************************************************************************
 * 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;
    }
}