X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=policy-agent%2Fsrc%2Fmain%2Fjava%2Forg%2Foransc%2Fpolicyagent%2Fconfiguration%2FApplicationConfigParser.java;h=14e836bebe24ffdeed6d09b294e219a87d02813a;hb=6a39814272307d0207222c9229b0d765ac062bf0;hp=c21af83981088c2b53164bcf53adf72ef6e7aea7;hpb=a538ca7e0b840e8dc20e85c1864697823ad96ae0;p=nonrtric.git diff --git a/policy-agent/src/main/java/org/oransc/policyagent/configuration/ApplicationConfigParser.java b/policy-agent/src/main/java/org/oransc/policyagent/configuration/ApplicationConfigParser.java index c21af839..14e836be 100644 --- a/policy-agent/src/main/java/org/oransc/policyagent/configuration/ApplicationConfigParser.java +++ b/policy-agent/src/main/java/org/oransc/policyagent/configuration/ApplicationConfigParser.java @@ -20,70 +20,150 @@ package org.oransc.policyagent.configuration; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import java.net.MalformedURLException; -import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import java.util.Map.Entry; -import java.util.Properties; import java.util.Set; -import java.util.Vector; import javax.validation.constraints.NotNull; -import lombok.Getter; - -import org.onap.dmaap.mr.test.clients.ProtocolTypeConstants; +import org.immutables.gson.Gson; +import org.immutables.value.Value; import org.oransc.policyagent.exceptions.ServiceException; -import org.springframework.http.MediaType; +/** + * Parser for the Json representing of the component configuration. + */ public class ApplicationConfigParser { private static final String CONFIG = "config"; + private static final String CONTROLLER = "controller"; + + @Value.Immutable + @Gson.TypeAdapters + public interface ConfigParserResult { + List ricConfigs(); + + Map controllerConfigs(); + + String dmaapConsumerTopicUrl(); - private static Gson gson = new GsonBuilder() // - .serializeNulls() // - .create(); // + String dmaapProducerTopicUrl(); - @Getter - private Vector ricConfigs; - @Getter - private Properties dmaapPublisherConfig = new Properties(); - @Getter - private Properties dmaapConsumerConfig = new Properties(); + } + + public ConfigParserResult parse(JsonObject root) throws ServiceException { + + String dmaapProducerTopicUrl = ""; + String dmaapConsumerTopicUrl = ""; - public void parse(JsonObject root) throws ServiceException { JsonObject agentConfigJson = root.getAsJsonObject(CONFIG); - ricConfigs = parseRics(agentConfigJson); + + if (agentConfigJson == null) { + throw new ServiceException("Missing root configuration \"" + CONFIG + "\" in JSON: " + root); + } JsonObject json = agentConfigJson.getAsJsonObject("streams_publishes"); if (json != null) { - this.dmaapPublisherConfig = parseDmaapConfig(json); + dmaapProducerTopicUrl = parseDmaapConfig(json); } json = agentConfigJson.getAsJsonObject("streams_subscribes"); if (json != null) { - this.dmaapConsumerConfig = parseDmaapConfig(json); + dmaapConsumerTopicUrl = parseDmaapConfig(json); } + List ricConfigs = parseRics(agentConfigJson); + Map controllerConfigs = parseControllerConfigs(agentConfigJson); + checkConfigurationConsistency(ricConfigs, controllerConfigs); + + return ImmutableConfigParserResult.builder() // + .dmaapConsumerTopicUrl(dmaapConsumerTopicUrl) // + .dmaapProducerTopicUrl(dmaapProducerTopicUrl) // + .ricConfigs(ricConfigs) // + .controllerConfigs(controllerConfigs) // + .build(); + } + + private void checkConfigurationConsistency(List ricConfigs, + Map controllerConfigs) throws ServiceException { + Set ricUrls = new HashSet<>(); + Set ricNames = new HashSet<>(); + for (RicConfig ric : ricConfigs) { + if (!ricUrls.add(ric.baseUrl())) { + throw new ServiceException("Configuration error, more than one RIC URL: " + ric.baseUrl()); + } + if (!ricNames.add(ric.name())) { + throw new ServiceException("Configuration error, more than one RIC with name: " + ric.name()); + } + if (!ric.controllerName().isEmpty() && controllerConfigs.get(ric.controllerName()) == null) { + throw new ServiceException( + "Configuration error, controller configuration not found: " + ric.controllerName()); + } + + } } - private Vector parseRics(JsonObject config) throws ServiceException { - Vector result = new Vector(); + private List parseRics(JsonObject config) throws ServiceException { + List result = new ArrayList<>(); for (JsonElement ricElem : getAsJsonArray(config, "ric")) { - result.add(gson.fromJson(ricElem.getAsJsonObject(), ImmutableRicConfig.class)); + JsonObject ricAsJson = ricElem.getAsJsonObject(); + JsonElement controllerNameElement = ricAsJson.get(CONTROLLER); + ImmutableRicConfig ricConfig = ImmutableRicConfig.builder() // + .name(get(ricAsJson, "name").getAsString()) // + .baseUrl(get(ricAsJson, "baseUrl").getAsString()) // + .managedElementIds(parseManagedElementIds(get(ricAsJson, "managedElementIds").getAsJsonArray())) // + .controllerName(controllerNameElement != null ? controllerNameElement.getAsString() : "") // + .build(); + result.add(ricConfig); + } + return result; + } + + Map parseControllerConfigs(JsonObject config) throws ServiceException { + if (config.get(CONTROLLER) == null) { + return new HashMap<>(); + } + Map result = new HashMap<>(); + for (JsonElement element : getAsJsonArray(config, CONTROLLER)) { + JsonObject controllerAsJson = element.getAsJsonObject(); + ImmutableControllerConfig controllerConfig = ImmutableControllerConfig.builder() // + .name(get(controllerAsJson, "name").getAsString()) // + .baseUrl(get(controllerAsJson, "baseUrl").getAsString()) // + .password(get(controllerAsJson, "password").getAsString()) // + .userName(get(controllerAsJson, "userName").getAsString()) // ) + .build(); + + if (result.put(controllerConfig.name(), controllerConfig) != null) { + throw new ServiceException( + "Configuration error, more than one controller with name: " + controllerConfig.name()); + } } return result; } + private List parseManagedElementIds(JsonArray asJsonObject) { + Iterator iterator = asJsonObject.iterator(); + List managedElementIds = new ArrayList<>(); + while (iterator.hasNext()) { + managedElementIds.add(iterator.next().getAsString()); + + } + return managedElementIds; + } + private static JsonElement get(JsonObject obj, String memberName) throws ServiceException { JsonElement elem = obj.get(memberName); if (elem == null) { - throw new ServiceException("Could not find member: " + memberName + " in: " + obj); + throw new ServiceException("Could not find member: '" + memberName + "' in: " + obj); } return elem; } @@ -92,7 +172,7 @@ public class ApplicationConfigParser { return get(obj, memberName).getAsJsonArray(); } - private Properties parseDmaapConfig(JsonObject streamCfg) throws ServiceException { + private String parseDmaapConfig(JsonObject streamCfg) throws ServiceException { Set> streamConfigEntries = streamCfg.entrySet(); if (streamConfigEntries.size() != 1) { throw new ServiceException( @@ -100,72 +180,10 @@ public class ApplicationConfigParser { } JsonObject streamConfigEntry = streamConfigEntries.iterator().next().getValue().getAsJsonObject(); JsonObject dmaapInfo = get(streamConfigEntry, "dmaap_info").getAsJsonObject(); - String topicUrl = getAsString(dmaapInfo, "topic_url"); - - try { - Properties dmaapProps = new Properties(); - URL url = new URL(topicUrl); - String passwd = ""; - String userName = ""; - if (url.getUserInfo() != null) { - String[] userInfo = url.getUserInfo().split(":"); - userName = userInfo[0]; - passwd = userInfo[1]; - } - String urlPath = url.getPath(); - DmaapUrlPath path = parseDmaapUrlPath(urlPath); - - dmaapProps.put("ServiceName", url.getHost() + ":" + url.getPort() + "/events"); - dmaapProps.put("topic", path.dmaapTopicName); - dmaapProps.put("host", url.getHost() + ":" + url.getPort()); - dmaapProps.put("contenttype", MediaType.APPLICATION_JSON.toString()); - dmaapProps.put("userName", userName); - dmaapProps.put("password", passwd); - dmaapProps.put("group", path.consumerGroup); - dmaapProps.put("id", path.consumerId); - dmaapProps.put("TransportType", ProtocolTypeConstants.HTTPNOAUTH.toString()); - dmaapProps.put("timeout", 15000); - dmaapProps.put("limit", 100); - dmaapProps.put("maxBatchSize", "10"); - dmaapProps.put("maxAgeMs", "10000"); - dmaapProps.put("compress", true); - dmaapProps.put("MessageSentThreadOccurance", "2"); - return dmaapProps; - } catch (MalformedURLException e) { - throw new ServiceException("Could not parse the URL", e); - } - + return getAsString(dmaapInfo, "topic_url"); } private static @NotNull String getAsString(JsonObject obj, String memberName) throws ServiceException { return get(obj, memberName).getAsString(); } - - private class DmaapUrlPath { - final String dmaapTopicName; - final String consumerGroup; - final String consumerId; - - DmaapUrlPath(String dmaapTopicName, String consumerGroup, String consumerId) { - this.dmaapTopicName = dmaapTopicName; - this.consumerGroup = consumerGroup; - this.consumerId = consumerId; - } - } - - private DmaapUrlPath parseDmaapUrlPath(String urlPath) throws ServiceException { - String[] tokens = urlPath.split("/"); // /events/A1-P/users/sdnc1 - if (!(tokens.length == 3 ^ tokens.length == 5)) { - throw new ServiceException("The path has incorrect syntax: " + urlPath); - } - - final String dmaapTopicName = tokens[2]; // /events/A1-P - String consumerGroup = ""; // users - String consumerId = ""; // sdnc1 - if (tokens.length == 5) { - consumerGroup = tokens[3]; - consumerId = tokens[4]; - } - return new DmaapUrlPath(dmaapTopicName, consumerGroup, consumerId); - } }