package org.ovirt.engine.core.utils.pm; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigCommon; import org.ovirt.engine.core.common.config.ConfigValues; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class FenceConfigHelper { private static HashMap<String, String> keyValidatorMap; private static HashMap<String, String> keyValidatorExampleMap; private static HashMap<String, String> keySeparatorMap; private static Logger log = LoggerFactory.getLogger(FenceConfigHelper.class); private static boolean initialized=false; private static final String FenceAgentMappingExpr = "((\\w)+[=](\\w)+[,]{0,1})+"; private static final String FenceAgentDefaultParamsExpr = "([\\w]+([=][\\w]+){0,1}[,]{0,1})+"; private static final String VdsFenceOptionMappingExpr = "([\\w]+[:]([\\w]*[=][\\w]*[,]{0,1}[;]{0,1}){0,3}[;]{0,1})+"; private static final String CustomVdsFenceTypeExpr = "((\\w)+[,]{0,1})+"; private static final String FencePowerWaitParamExpr = "((\\w)+[=](\\w)+[,]{0,1})+"; private static final String COMMA = ","; private static final String SEMICOLON = ";"; private static void init() { if (!initialized) { keyValidatorMap = new HashMap<>(); keyValidatorMap.put("FenceAgentMapping", FenceAgentMappingExpr); keyValidatorMap.put("FenceAgentDefaultParams", FenceAgentDefaultParamsExpr); keyValidatorMap.put("FenceAgentDefaultParamsForPPC", FenceAgentDefaultParamsExpr); keyValidatorMap.put("VdsFenceOptionMapping", VdsFenceOptionMappingExpr); keyValidatorMap.put("VdsFenceType", CustomVdsFenceTypeExpr); keyValidatorMap.put("FencePowerWaitParam", FencePowerWaitParamExpr); keyValidatorMap.put("CustomFenceAgentMapping", FenceAgentMappingExpr); keyValidatorMap.put("CustomFenceAgentDefaultParams", FenceAgentDefaultParamsExpr); keyValidatorMap.put("CustomFenceAgentDefaultParamsForPPC", FenceAgentDefaultParamsExpr); keyValidatorMap.put("CustomVdsFenceOptionMapping", VdsFenceOptionMappingExpr); keyValidatorMap.put("CustomVdsFenceType", CustomVdsFenceTypeExpr); keyValidatorMap.put("CustomFencePowerWaitParam", FencePowerWaitParamExpr); keyValidatorExampleMap = new HashMap<>(); keyValidatorExampleMap.put("CustomFenceAgentMapping", "agent1=agent2,agent3=agent4"); keyValidatorExampleMap.put("CustomFenceAgentDefaultParams", "agent1=key1=val1,flag;key2=val2"); keyValidatorExampleMap.put("CustomFenceAgentDefaultParamsForPPC", "agent1=key1=val1,flag;key2=val2"); keyValidatorExampleMap.put("CustomVdsFenceOptionMapping", "agent1:secure=secure;agent2:port=ipport,slot=slot"); keyValidatorExampleMap.put("CustomVdsFenceType", "agent1,agent2"); keyValidatorExampleMap.put("CustomFencePowerWaitParam", "agent1=power_wait,agent2=delay"); keySeparatorMap = new HashMap<>(); keySeparatorMap.put("FenceAgentMapping", COMMA); keySeparatorMap.put("FenceAgentDefaultParams", SEMICOLON); keySeparatorMap.put("FenceAgentDefaultParamsForPPC", SEMICOLON); keySeparatorMap.put("VdsFenceOptionMapping", SEMICOLON); keySeparatorMap.put("VdsFenceType", COMMA); keySeparatorMap.put("FencePowerWaitParam", COMMA); initialized = true; } } private static String getCustomKey(String key) { return "Custom" + key; } private static String merge(String key, String value, String customValue) { init(); StringBuilder sb = new StringBuilder(); sb.append(value); if (StringUtils.isNotEmpty(value) && StringUtils.isNotEmpty(customValue)) { if (isValid(key, customValue)) { sb.append(keySeparatorMap.get(key)); sb.append(customValue); } else { log.error("Configuration key '{}' has illegal value '{}'. Expression should match '{}'", key, customValue, keyValidatorMap.get(key)); } } return sb.toString(); } private static boolean isValid(String key, String value) { if (keyValidatorMap.containsKey(key) && keySeparatorMap.containsKey(key)) { return value.matches(keyValidatorMap.get(key)); } return false; } public static String getFenceConfigurationValue(String key, String version) { init(); String returnValue = null; String customReturnValue = null; ConfigValues value = ConfigValues.valueOf(key); ConfigValues customValue = ConfigValues.valueOf(getCustomKey(key)); returnValue = Config.getValue(value, version); customReturnValue = Config.getValue(customValue, ConfigCommon.defaultConfigurationVersion); return merge(key, returnValue, customReturnValue); } public static String getValidator(String key) { init(); return keyValidatorMap.get(key); } public static String getValidatorExample(String key) { init(); return keyValidatorExampleMap.get(key); } public static Set<String> getValidFenceAgentTypes(String clusterCompatibilityVersion) { return new HashSet<>(Arrays.asList(FenceConfigHelper.getFenceConfigurationValue( ConfigValues.VdsFenceType.name(), clusterCompatibilityVersion).split(COMMA))); } }