/*************************************************************************** * Copyright (c) 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.api.model.support; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import com.vmware.bdd.plugin.ambari.utils.AmUtils; import com.vmware.bdd.utils.CommonUtil; import org.apache.log4j.Logger; import com.vmware.bdd.plugin.ambari.utils.Constants; import com.vmware.bdd.software.mgmt.plugin.utils.SerialUtils; import com.vmware.bdd.utils.Version; public class AvailableConfigurationContainer { private static final Logger logger = Logger.getLogger(AvailableConfigurationContainer.class); private static List<AvailableConfiguration> availableConfigurations = new ArrayList<AvailableConfiguration>(); private static String ambariAvailiableConfigurationsDir = null; static { StringBuilder builder = new StringBuilder(); ambariAvailiableConfigurationsDir = builder.append(AmUtils.getConfDir()).append(File.separator).append("available-configurations").toString(); } public static List<AvailableConfiguration> load(String fileName) throws IOException { logger.info("loading " + fileName + "..."); String content = null; try { content = SerialUtils.dataFromFile(ambariAvailiableConfigurationsDir + File.separator + fileName); AvailableConfiguration availableConfiguration = SerialUtils.getObjectByJsonString(AvailableConfiguration.class, content); availableConfigurations.add(availableConfiguration); } catch (IOException e) { logger.error(e.getMessage()); throw new IOException("Failed to load " + fileName); } return availableConfigurations; } public static void loadAll() throws IOException { availableConfigurations.clear(); File dir = new File(ambariAvailiableConfigurationsDir); for (File file : dir.listFiles()) { load(file.getName()); } } public static boolean isSupported(String distroVersion, AvailableConfiguration availableConfiguration) { if (Constants.VERSION_UNBOUNDED.equals(distroVersion)) { return true; } boolean isGreaterThanMinVersion = false; boolean isLessThanMaxVersion = false; String hdpMinVersion = availableConfiguration.getVersionHdpMin(); if (Version.compare(distroVersion, hdpMinVersion) >= 0) { isGreaterThanMinVersion = true; } String hdpMaxVersion = availableConfiguration.getVersionHdpMax(); if (Constants.VERSION_UNBOUNDED.equals(hdpMaxVersion) || Version.compare(distroVersion, hdpMaxVersion) <= 0) { isLessThanMaxVersion = true; } if (isGreaterThanMinVersion && isLessThanMaxVersion) { return true; } else { return false; } } public static synchronized Map<String, Object> getSupportedConfigs(String distroVersion) throws IOException { loadAll(); Map<String, Object> supportedConfigs = new HashMap<String, Object>(); for (AvailableConfiguration availableConfiguration : availableConfigurations) { if (isSupported(distroVersion, availableConfiguration)) { for (AvailableConfigurationInfo availableConfigurationInfo : availableConfiguration.getConfigurations()) { String configType = availableConfigurationInfo.getType(); String propertyName = availableConfigurationInfo.getName(); Set<String> propertyNames; if (supportedConfigs.containsKey(configType)) { propertyNames = (Set<String>) supportedConfigs.get(configType); } else { propertyNames = new HashSet<String>(); } propertyNames.add(propertyName); supportedConfigs.put(configType, propertyNames); } } } return supportedConfigs; } }