aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/org/onap/dcae/configuration/ConfigUpdater.java
diff options
context:
space:
mode:
authorBogumil Zebek <bogumil.zebek@nokia.com>2020-10-30 10:23:45 +0100
committerBogumil Zebek <bogumil.zebek@nokia.com>2020-11-02 17:06:40 +0000
commite19fc5ef16b5daf6cd383b2092411fc355bb0192 (patch)
tree2e71e267f7038999d03fb2d2189e76599e76f9f3 /src/main/java/org/onap/dcae/configuration/ConfigUpdater.java
parent7be86e2ca0247f5939406f07c6fdefcee0cf963f (diff)
Fetch configuration from CBS
- Fix memory leak. - Add reactive configuration fetching from Consul. Now configuration is updated when any change in VES configuration has been done in Consul. Change-Id: I9cd42e04844c9e99d4d03951185523b569dc9483 Issue-ID: DCAEGEN2-2495 Signed-off-by: Zebek Bogumil <bogumil.zebek@nokia.com> (cherry picked from commit 1599617246f0ffec1b1c7840f9c7c42318183dcd)
Diffstat (limited to 'src/main/java/org/onap/dcae/configuration/ConfigUpdater.java')
-rw-r--r--src/main/java/org/onap/dcae/configuration/ConfigUpdater.java95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/main/java/org/onap/dcae/configuration/ConfigUpdater.java b/src/main/java/org/onap/dcae/configuration/ConfigUpdater.java
new file mode 100644
index 00000000..eb1a1a5f
--- /dev/null
+++ b/src/main/java/org/onap/dcae/configuration/ConfigUpdater.java
@@ -0,0 +1,95 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * org.onap.dcaegen2.collectors.ves
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. 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.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcae.configuration;
+
+import io.vavr.collection.Map;
+import io.vavr.control.Option;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ConfigUpdater {
+
+ private static final Logger log = LoggerFactory.getLogger(ConfigUpdater.class);
+ private final ConfigFilesFacade configFilesFacade;
+ private final Runnable applicationRestarter;
+ private boolean isApplicationRestartNeeded;
+
+ public ConfigUpdater(ConfigFilesFacade configFilesFacade, Runnable applicationRestarter) {
+ this.configFilesFacade = configFilesFacade;
+ this.applicationRestarter = applicationRestarter;
+ this.isApplicationRestartNeeded = false;
+ }
+
+ public synchronized void updateConfig(Option<JSONObject> appConfig) {
+ appConfig.peek(this::handleUpdate).onEmpty(logSkipMessage());
+ }
+
+ private Runnable logSkipMessage() {
+ return () -> log.info("Skipping dynamic configuration");
+ }
+
+ private void handleUpdate(JSONObject appConfig) {
+ updatePropertiesIfChanged(appConfig);
+ updateDmaapConfigIfChanged(appConfig);
+ restartApplicationIfNeeded();
+ }
+
+ private void updatePropertiesIfChanged(JSONObject appConfig) {
+ Map<String, String> newProperties = ConfigParsing.getProperties(appConfig);
+ Map<String, String> oldProperties = configFilesFacade.readCollectorProperties().get();
+
+ if (!areCommonPropertiesSame(oldProperties, newProperties)) {
+ configFilesFacade.writeProperties(newProperties);
+ isApplicationRestartNeeded = true;
+ }
+ }
+
+ private boolean areCommonPropertiesSame(Map<String, String> oldProperties, Map<String, String> newProperties) {
+ Map<String, String> filteredOldProperties = filterIntersectingKeys(oldProperties, newProperties);
+ return filteredOldProperties.equals(newProperties);
+ }
+
+ private Map<String, String> filterIntersectingKeys(Map<String, String> primaryProperties,
+ Map<String, String> otherProperties) {
+ return primaryProperties.filterKeys(key -> containsKey(key, otherProperties));
+ }
+
+ private boolean containsKey(String key, Map<String, String> properties) {
+ return properties.keySet().contains(key);
+ }
+
+ private void updateDmaapConfigIfChanged(JSONObject appConfig) {
+ JSONObject oldDmaapConfig = configFilesFacade.readDMaaPConfiguration().get();
+ JSONObject newDmaapConfig = ConfigParsing.getDMaaPConfig(appConfig).get();
+
+ if (!oldDmaapConfig.similar(newDmaapConfig)) {
+ configFilesFacade.writeDMaaPConfiguration(newDmaapConfig);
+ isApplicationRestartNeeded = true;
+ }
+ }
+
+ private void restartApplicationIfNeeded() {
+ if (isApplicationRestartNeeded) {
+ applicationRestarter.run();
+ isApplicationRestartNeeded = false;
+ }
+ }
+}