package org.ovirt.engine.api.restapi.util; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.ovirt.engine.api.model.Agent; import org.ovirt.engine.api.model.Option; import org.ovirt.engine.api.model.Options; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class FenceOptionsParser { private static Logger log = LoggerFactory.getLogger(FenceOptionsParser.class); /* Format of @str is <agent>;<agent>;... * Format of @typeStr is <name>=<type>,<name=type>,... */ public static List<Agent> parse(String str, String typeStr, boolean ignoreValues) { List<Agent> ret = new ArrayList<>(); Map<String, String> types = parseTypes(typeStr); for (String agent : str.split(";", -1)) { if (!agent.isEmpty()) { Agent parsedAgent = parseAgent(agent, types, ignoreValues); if (parsedAgent != null) { ret.add(parsedAgent); } } } return ret; } public static List<Agent> parse(String str, String typeStr) { return parse(str, typeStr, false); } /* Format is <name>=<bool|int>,<name=bool|int>,... */ private static Map<String, String> parseTypes(String str) { Map<String, String> ret = new HashMap<>(); for (String option : str.split(",", -1)) { if (!option.isEmpty()) { String[] parts = option.split("=", -1); if (parts.length != 2) { log.error("Invalid fencing type description \"{}\".", option); continue; } ret.put(parts[0], parts[1]); } } return ret; } /* Format is <agent>:<name=value>,<name=value>,... * * e.g. alom:secure=secure,port=ipport */ private static Agent parseAgent(String str, Map<String, String> types, boolean ignoreValues) { String[] parts = str.split(":", -1); if (parts.length != 2) { log.error("Invalid fencing agent description \"{}\".", str); return null; } Agent ret = new Agent(); ret.setType(parts[0]); ret.setOptions(parseOptions(parts[1], types, ignoreValues)); return ret; } /* Format is <name=value>,<name=value>,... */ private static Options parseOptions(String str, Map<String, String> types, boolean ignoreValues) { Options ret = new Options(); for (String option : str.split(",", -1)) { if (!option.isEmpty()) { Option parsedOption = parseOption(option, types, ignoreValues); if (parsedOption != null) { ret.getOptions().add(parsedOption); } } } return ret; } /* Format is <name=value> */ private static Option parseOption(String str, Map<String, String> types, boolean ignoreValues) { String[] parts = str.split("=", -1); if (parts.length != 2) { log.error("Invalid fencing option description \"{}\".", str); return null; } Option ret = new Option(); ret.setName(parts[0]); if (!ignoreValues) { ret.setValue(parts[1]); } if (types.containsKey(parts[0])) { ret.setType(types.get(parts[0])); } else { log.error("No type specified for fencing option \"{}\".", parts[0]); return null; } return ret; } }