X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=policy-agent%2Fsrc%2Fmain%2Fjava%2Forg%2Foransc%2Fpolicyagent%2Fconfiguration%2FApplicationConfig.java;h=3b4f8104b377b5dd31daa89b20e5ac37dc77b861;hb=3e8bccd59c63f424052fcef5930e94a6629a1a95;hp=7e5228425c957d124e0c3b44a1a6c3078f60c784;hpb=cc53bb179ee61d77290c3831fc75dc5f3e972aac;p=nonrtric.git diff --git a/policy-agent/src/main/java/org/oransc/policyagent/configuration/ApplicationConfig.java b/policy-agent/src/main/java/org/oransc/policyagent/configuration/ApplicationConfig.java index 7e522842..3b4f8104 100644 --- a/policy-agent/src/main/java/org/oransc/policyagent/configuration/ApplicationConfig.java +++ b/policy-agent/src/main/java/org/oransc/policyagent/configuration/ApplicationConfig.java @@ -20,243 +20,134 @@ package org.oransc.policyagent.configuration; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.google.gson.JsonSyntaxException; -import com.google.gson.TypeAdapterFactory; - -import java.io.BufferedInputStream; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.time.Duration; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; -import java.util.Optional; import java.util.Properties; -import java.util.ServiceLoader; -import java.util.Vector; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; -import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.api.CbsClient; -import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.api.CbsClientFactory; -import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.api.CbsRequests; -import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.model.CbsRequest; -import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.model.EnvProperties; -import org.onap.dcaegen2.services.sdk.rest.services.model.logging.RequestDiagnosticContext; +import lombok.Getter; + import org.oransc.policyagent.exceptions.ServiceException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; - -import reactor.core.Disposable; import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; @EnableConfigurationProperties @ConfigurationProperties("app") public class ApplicationConfig { - private static final Logger logger = LoggerFactory.getLogger(ApplicationConfig.class); - - @Value("#{systemEnvironment}") - Properties systemEnvironment; - - private Disposable refreshConfigTask = null; - private Collection observers = new Vector<>(); - - private Map ricConfigs = new HashMap<>(); - @NotEmpty private String filepath; - @Autowired - public ApplicationConfig() { - } - - protected String getLocalConfigurationFilePath() { - return this.filepath; - } - - public synchronized void setFilepath(String filepath) { - this.filepath = filepath; - } - - public synchronized Collection getRicConfigs() { - return this.ricConfigs.values(); - } - - public synchronized Optional lookupRicConfigForManagedElement(String managedElementId) { - for (RicConfig ricConfig : getRicConfigs()) { - if (ricConfig.managedElementIds().contains(managedElementId)) { - return Optional.of(ricConfig); - } - } - return Optional.empty(); - } - - public RicConfig getRic(String ricName) throws ServiceException { - for (RicConfig ricConfig : getRicConfigs()) { - if (ricConfig.name().equals(ricName)) { - return ricConfig; - } - } - throw new ServiceException("Could not find ric: " + ricName); - } + @NotEmpty + private String a1ControllerBaseUrl; - public void initialize() { - stop(); - loadConfigurationFromFile(); + @NotEmpty + private String a1ControllerUsername; - refreshConfigTask = createRefreshTask() // - .subscribe(notUsed -> logger.info("Refreshed configuration data"), - throwable -> logger.error("Configuration refresh terminated due to exception", throwable), - () -> logger.error("Configuration refresh terminated")); - } + @NotEmpty + private String a1ControllerPassword; - public static enum RicConfigUpdate { - ADDED, CHANGED, REMOVED - } + private Map ricConfigs = new HashMap<>(); + @Getter + private Properties dmaapPublisherConfig; + @Getter + private Properties dmaapConsumerConfig; - public interface Observer { - void onRicConfigUpdate(RicConfig ric, RicConfigUpdate event); + public String getLocalConfigurationFilePath() { + return this.filepath; } - public void addObserver(Observer o) { - this.observers.add(o); + public synchronized String getA1ControllerBaseUrl() { + return this.a1ControllerBaseUrl; } - Mono getEnvironment(Properties systemEnvironment) { - return EnvironmentProcessor.readEnvironmentVariables(systemEnvironment); + public synchronized String getA1ControllerUsername() { + return this.a1ControllerUsername; } - Flux createRefreshTask() { - return getEnvironment(systemEnvironment) // - .flatMap(this::createCbsClient) // - .flatMapMany(this::periodicConfigurationUpdates) // - .map(this::parseRicConfigurationfromConsul) // - .onErrorResume(this::onErrorResume); + public synchronized String getA1ControllerPassword() { + return this.a1ControllerPassword; } - Mono createCbsClient(EnvProperties env) { - return CbsClientFactory.createCbsClient(env); + /* + * Do not remove, used by framework! + */ + public synchronized void setFilepath(String filepath) { + this.filepath = filepath; } - private Flux periodicConfigurationUpdates(CbsClient cbsClient) { - final Duration initialDelay = Duration.ZERO; - final Duration refreshPeriod = Duration.ofMinutes(1); - final CbsRequest getConfigRequest = CbsRequests.getAll(RequestDiagnosticContext.create()); - return cbsClient.updates(getConfigRequest, initialDelay, refreshPeriod); + public synchronized void setA1ControllerBaseUrl(String a1ControllerBaseUrl) { + this.a1ControllerBaseUrl = a1ControllerBaseUrl; } - private Mono onErrorResume(Throwable trowable) { - logger.error("Could not refresh application configuration {}", trowable.toString()); - return Mono.empty(); + public synchronized void setA1ControllerUsername(String a1ControllerUsername) { + this.a1ControllerUsername = a1ControllerUsername; } - private ApplicationConfig parseRicConfigurationfromConsul(JsonObject jsonObject) { - try { - ApplicationConfigParser parser = new ApplicationConfigParser(); - parser.parse(jsonObject); - setConfiguration(parser.getRicConfigs()); - - } catch (ServiceException e) { - logger.error("Could not parse configuration {}", e.toString(), e); - } - return this; + public synchronized void setA1ControllerPassword(String a1ControllerPassword) { + this.a1ControllerPassword = a1ControllerPassword; } - private class Notification { - final RicConfig ric; - final RicConfigUpdate event; - - Notification(RicConfig ric, RicConfigUpdate event) { - this.ric = ric; - this.event = event; - } + public synchronized Collection getRicConfigs() { + return this.ricConfigs.values(); } - private void setConfiguration(@NotNull Collection ricConfigs) { - Collection notifications = new Vector<>(); - synchronized (this) { - Map newRicConfigs = new HashMap<>(); - for (RicConfig newConfig : ricConfigs) { - RicConfig oldConfig = this.ricConfigs.get(newConfig.name()); - if (oldConfig == null) { - newRicConfigs.put(newConfig.name(), newConfig); - notifications.add(new Notification(newConfig, RicConfigUpdate.ADDED)); - this.ricConfigs.remove(newConfig.name()); - } else if (!newConfig.equals(newConfig)) { - notifications.add(new Notification(newConfig, RicConfigUpdate.CHANGED)); - newRicConfigs.put(newConfig.name(), newConfig); - this.ricConfigs.remove(newConfig.name()); - } else { - newRicConfigs.put(oldConfig.name(), oldConfig); - } - } - for (RicConfig deletedConfig : this.ricConfigs.values()) { - notifications.add(new Notification(deletedConfig, RicConfigUpdate.REMOVED)); + public RicConfig getRic(String ricName) throws ServiceException { + for (RicConfig ricConfig : getRicConfigs()) { + if (ricConfig.name().equals(ricName)) { + return ricConfig; } - this.ricConfigs = newRicConfigs; } - notifyObservers(notifications); + throw new ServiceException("Could not find ric: " + ricName); } - private void notifyObservers(Collection notifications) { - for (Observer observer : this.observers) { - for (Notification notif : notifications) { - observer.onRicConfigUpdate(notif.ric, notif.event); - } + public static class RicConfigUpdate { + public enum Type { + ADDED, CHANGED, REMOVED } - } - public void stop() { - if (refreshConfigTask != null) { - refreshConfigTask.dispose(); - refreshConfigTask = null; - } - } + @Getter + private final RicConfig ricConfig; + @Getter + private final Type type; - /** - * Reads the configuration from file. - */ - public void loadConfigurationFromFile() { - String filepath = getLocalConfigurationFilePath(); - if (filepath == null) { - logger.debug("No localconfiguration file used"); - return; + RicConfigUpdate(RicConfig ric, Type event) { + this.ricConfig = ric; + this.type = event; } - GsonBuilder gsonBuilder = new GsonBuilder(); - ServiceLoader.load(TypeAdapterFactory.class).forEach(gsonBuilder::registerTypeAdapterFactory); + } - try (InputStream inputStream = createInputStream(filepath)) { - JsonParser parser = new JsonParser(); - JsonObject rootObject = getJsonElement(parser, inputStream).getAsJsonObject(); - if (rootObject == null) { - throw new JsonSyntaxException("Root is not a json object"); + public synchronized Flux setConfiguration(@NotNull Collection ricConfigs, + Properties dmaapPublisherConfig, Properties dmaapConsumerConfig) { + + Collection modifications = new ArrayList<>(); + this.dmaapPublisherConfig = dmaapPublisherConfig; + this.dmaapConsumerConfig = dmaapConsumerConfig; + + Map newRicConfigs = new HashMap<>(); + for (RicConfig newConfig : ricConfigs) { + RicConfig oldConfig = this.ricConfigs.get(newConfig.name()); + if (oldConfig == null) { + newRicConfigs.put(newConfig.name(), newConfig); + modifications.add(new RicConfigUpdate(newConfig, RicConfigUpdate.Type.ADDED)); + this.ricConfigs.remove(newConfig.name()); + } else if (!newConfig.equals(oldConfig)) { + modifications.add(new RicConfigUpdate(newConfig, RicConfigUpdate.Type.CHANGED)); + newRicConfigs.put(newConfig.name(), newConfig); + this.ricConfigs.remove(newConfig.name()); + } else { + newRicConfigs.put(oldConfig.name(), oldConfig); } - ApplicationConfigParser appParser = new ApplicationConfigParser(); - appParser.parse(rootObject); - setConfiguration(appParser.getRicConfigs()); - logger.info("Local configuration file loaded: {}", filepath); - } catch (JsonSyntaxException | ServiceException | IOException e) { - logger.trace("Local configuration file not loaded: {}", filepath, e); } - } - - JsonElement getJsonElement(JsonParser parser, InputStream inputStream) { - return parser.parse(new InputStreamReader(inputStream)); - } + for (RicConfig deletedConfig : this.ricConfigs.values()) { + modifications.add(new RicConfigUpdate(deletedConfig, RicConfigUpdate.Type.REMOVED)); + } + this.ricConfigs = newRicConfigs; - InputStream createInputStream(@NotNull String filepath) throws IOException { - return new BufferedInputStream(new FileInputStream(filepath)); + return Flux.fromIterable(modifications); } }