The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
+## [1.8.4] - 14/05/2021
+### Added
+ - [DCAEGEN2-2716] (https://jira.onap.org/browse/DCAEGEN2-2716) - Add to Java CBS-Client ability to resolve evns in app-config.yaml loaded from ConfigMap
+
## [1.8.3] - 29/04/2021
### Added
- [DCAEGEN2-2716] (https://jira.onap.org/browse/DCAEGEN2-2716) - Adapt CBS-CLient to read configuration from a file exposed in a cfgMap
<groupId>org.onap.dcaegen2.services</groupId>
<artifactId>sdk</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
<name>dcaegen2-services-sdk</name>
<description>Common SDK repo for all DCAE Services</description>
<parent>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
<artifactId>dcaegen2-services-sdk-rest-services</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<groupId>org.onap.dcaegen2.services.sdk.rest.services</groupId>
--- /dev/null
+/*
+ * ============LICENSE_START====================================
+ * DCAEGEN2-SERVICES-SDK
+ * =========================================================
+ * Copyright (C) 2021 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.dcaegen2.services.sdk.rest.services.cbs.client.api.exceptions;
+
+import org.jetbrains.annotations.NotNull;
+
+public class EnvironmentParsingException extends RuntimeException {
+ public EnvironmentParsingException(final @NotNull String message) {
+ super(message);
+ }
+}
private static final Logger LOGGER = LoggerFactory.getLogger(CbsClientConfigMap.class);
private final String configMapFilePath;
+
public CbsClientConfigMap (String configMapFilePath) {
this.configMapFilePath = configMapFilePath;
}
@Override
public @NotNull Mono<JsonObject> get(CbsRequest request) {
return Mono.just(this.loadConfigMapFile())
+ .map(CbsClientEnvironmentParsing::processEnvironmentVariables)
.doOnNext(this::logConfigMapOutput);
}
return new Yaml().load(new FileReader(configMapFilePath).getContent());
}
+
+
private void logConfigMapOutput(JsonObject jsonObject) {
LOGGER.info("Got successful output from ConfigMap file");
LOGGER.debug("ConfigMap output: {}", jsonObject);
--- /dev/null
+/*
+ * ============LICENSE_START=======================================================
+ * DCAEGEN2-SERVICES-SDK
+ * ================================================================================
+ * Copyright (C) 2021 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.dcaegen2.services.sdk.rest.services.cbs.client.impl;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.api.exceptions.EnvironmentParsingException;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * <p>Config Binding Service client environment variables parsing.</p>
+ *
+ * @since 1.8.4
+ */
+public class CbsClientEnvironmentParsing {
+
+ private static final Pattern shellEnvPattern = Pattern.compile("\\$\\{(.+?)}");
+
+ private CbsClientEnvironmentParsing() {}
+
+ /**
+ * <p>
+ * This method will do a lookup of shell variables in provided jsonObject and replace it with found environment variables.
+ * </p>
+ * <p>
+ * In case of failure during resolving environment variables, EnvironmentParsingException is thrown.
+ * </p>
+ *
+ * @param jsonObject
+ * @return JsonObject
+ * @since 1.8.4
+ */
+ public static JsonObject processEnvironmentVariables(JsonObject jsonObject) {
+ JsonObject jsonObjectCopy = jsonObject.deepCopy();
+ processJsonObject(jsonObjectCopy);
+ return jsonObjectCopy;
+ }
+ private static void processJsonObject(JsonObject jsonObject) {
+ for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
+ processJsonObjectEntry(jsonObject, entry);
+ }
+ }
+ private static void processJsonObjectEntry(JsonObject jsonObject, Map.Entry<String, JsonElement> entry) {
+ if (entry.getValue().isJsonArray()) {
+ processJsonArray(entry.getValue().getAsJsonArray());
+ } else if (entry.getValue().isJsonObject()) {
+ processJsonObject(entry.getValue().getAsJsonObject());
+ } else {
+ Matcher matcher = getMatcher(entry.getValue().getAsString());
+ if (matcher.find()) {
+ jsonObject.addProperty(entry.getKey(), getValueFromSystemEnv(matcher.group(1)));
+ }
+ }
+ }
+
+ private static void processJsonArray(JsonArray jsonArray) {
+ for (int i = 0; i < jsonArray.size(); i++) {
+ if (jsonArray.get(i).isJsonObject()) {
+ processJsonObject(jsonArray.get(i).getAsJsonObject());
+ } else if (jsonArray.get(i).isJsonArray()) {
+ processJsonArray(jsonArray.get(i).getAsJsonArray());
+ } else {
+ Matcher matcher = getMatcher(jsonArray.get(i).getAsString());
+ if (matcher.find()) {
+ jsonArray.set(i, new JsonPrimitive(getValueFromSystemEnv(matcher.group(1))));
+ }
+ }
+ }
+ }
+
+ private static Matcher getMatcher(String value) {
+ return shellEnvPattern.matcher(value);
+ }
+
+ private static String getValueFromSystemEnv( String envName) {
+ String envValue = System.getenv(envName);
+ if (envValue == null || "".equals(envValue)) {
+ throw new EnvironmentParsingException("Cannot read " + envName + " from environment.");
+ }
+ return envValue;
+ }
+}
.flatMap(httpClient::call)
.doOnNext(HttpResponse::throwIfUnsuccessful)
.map(resp -> resp.bodyAsJson(JsonObject.class))
+ .map(CbsClientEnvironmentParsing::processEnvironmentVariables)
.doOnNext(this::logCbsResponse);
}
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
+import com.google.gson.stream.JsonReader;
+import org.junit.Rule;
+import org.junit.contrib.java.lang.system.EnvironmentVariables;
import org.junit.jupiter.api.Test;
import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.api.CbsClient;
import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.api.CbsRequests;
import org.onap.dcaegen2.services.sdk.rest.services.model.logging.RequestDiagnosticContext;
-import org.onap.dcaegen2.services.sdk.services.common.FileReader;
-import org.yaml.snakeyaml.Yaml;
-import java.util.LinkedHashMap;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
import static org.assertj.core.api.Assertions.assertThat;
public class CbsClientConfigMapTest {
+ private static final String SAMPLE_EXPECTED_CONFIG = "src/test/resources/sample_expected_service_config.json";
+ @Rule
+ public final EnvironmentVariables envs = new EnvironmentVariables();
+
@Test
- void shouldFetchUsingProperConfigMapFile() {
+ void shouldFetchUsingProperConfigMapFile() throws FileNotFoundException {
// given
+ envs.set("AAF_USER", "admin");
+ envs.set("AAF_PASSWORD", "admin_secret");
String configMapFilePath = "src/test/resources/application_config.yaml";
final CbsClient cut = new CbsClientConfigMap(configMapFilePath);
// then
assertThat(result).isNotNull();
- assertThat(result).isEqualTo(covertYamlToJson(configMapFilePath));
+ assertThat(result).isEqualTo(convertToJson(new JsonReader(new FileReader(SAMPLE_EXPECTED_CONFIG))));
}
- private JsonObject covertYamlToJson(String configMapFilePath) {
+ private JsonObject convertToJson(JsonReader jsonReader) {
Gson gson = new GsonBuilder().create();
- return gson.fromJson(gson.toJson(new Yaml().load(new FileReader(configMapFilePath).getContent()),
- LinkedHashMap.class), JsonObject.class);
+ return gson.fromJson(jsonReader, JsonObject.class);
}
}
--- /dev/null
+/*
+ * ============LICENSE_START====================================
+ * DCAEGEN2-SERVICES-SDK
+ * =========================================================
+ * Copyright (C) 2021 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.dcaegen2.services.sdk.rest.services.cbs.client.impl;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+import com.google.gson.stream.JsonReader;
+import org.junit.Rule;
+import org.junit.contrib.java.lang.system.EnvironmentVariables;
+import org.junit.jupiter.api.Test;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class CbsClientEnvironmentParsingTest {
+
+ private static final String SAMPLE_CONFIG = "src/test/resources/sample_service_config.json";
+ private static final String SAMPLE_EXPECTED_CONFIG = "src/test/resources/sample_expected_service_config.json";
+ @Rule
+ public final EnvironmentVariables envs = new EnvironmentVariables();
+
+ @Test
+ void shouldProcessEnvironmentVariables() throws FileNotFoundException {
+ //given
+ envs.set("AAF_USER", "admin");
+ envs.set("AAF_PASSWORD", "admin_secret");
+ JsonObject jsonObject = getSampleJsonObject(SAMPLE_CONFIG);
+ //when
+ JsonObject result = CbsClientEnvironmentParsing.processEnvironmentVariables(jsonObject);
+ //then
+ assertThat(result).isEqualTo(getSampleJsonObject(SAMPLE_EXPECTED_CONFIG));
+ }
+
+ private JsonObject getSampleJsonObject(String file) throws FileNotFoundException {
+ Gson gson = new GsonBuilder().create();
+ JsonReader reader = new JsonReader(new FileReader(file));
+ return gson.fromJson(reader, JsonObject.class);
+ }
+}
import com.google.gson.JsonObject;
import io.vavr.collection.Stream;
import org.jetbrains.annotations.NotNull;
+import org.junit.Rule;
+import org.junit.contrib.java.lang.system.EnvironmentVariables;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
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.api.exceptions.EnvironmentParsingException;
import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.api.exceptions.StreamParsingException;
import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.api.streams.DataStreams;
import org.onap.dcaegen2.services.sdk.rest.services.cbs.client.api.streams.StreamFromGsonParser;
private static final String SAMPLE_KEY = "/sample_key.json";
private static final String SAMPLE_CONFIG_KEY = "keystore.path";
private static final String EXPECTED_CONFIG_VALUE_FROM_CBS = "/var/run/security/keystore.p12";
- private static final String EXPECTED_CONFIG_VALUE_FROM_FILE = "/var/run/security/keystore_file.p12";
- private static final String CONFIG_MAP_FILE_PATH = "src/test/resources/sample_local_service_config.json";
+ private static final String CONFIG_MAP_FILE_PATH = "src/test/resources/application_config.yaml";
private static CbsClientConfiguration sampleConfigurationCbsSource;
private static CbsClientConfiguration sampleConfigurationFileSource;
private static DummyHttpServer server;
+
+ @Rule
+ public final EnvironmentVariables envs = new EnvironmentVariables();
+
@BeforeAll
static void setUp() {
server = DummyHttpServer.start(routes ->
@Test
void testCbsClientWithSingleCall() {
// given
+ envs.set("AAF_USER", "admin");
+ envs.set("AAF_PASSWORD", "admin_secret");
final Mono<CbsClient> sut = CbsClientFactory.createCbsClient(sampleConfigurationCbsSource);
final CbsRequest request = CbsRequests.getConfiguration(RequestDiagnosticContext.create());
@Test
void testCbsClientWithPeriodicCall() {
// given
+ envs.set("AAF_USER", "admin");
+ envs.set("AAF_PASSWORD", "admin_secret");
final Mono<CbsClient> sut = CbsClientFactory.createCbsClient(sampleConfigurationCbsSource);
final CbsRequest request = CbsRequests.getConfiguration(RequestDiagnosticContext.create());
@Test
void testCbsClientWithUpdatesCall() {
// given
+ envs.set("AAF_USER", "admin");
+ envs.set("AAF_PASSWORD", "admin_secret");
final Mono<CbsClient> sut = CbsClientFactory.createCbsClient(sampleConfigurationCbsSource);
final CbsRequest request = CbsRequests.getConfiguration(RequestDiagnosticContext.create());
final Duration period = Duration.ofMillis(10);
.verify(Duration.ofSeconds(5));
}
+ @Test
+ void testCbsClientWithConfigRetrievedFromFileMissingEnv() {
+ // given
+ envs.set("AAF_USER", "");
+ final Mono<CbsClient> sut = CbsClientFactory.createCbsClient(sampleConfigurationFileSource);
+ final CbsRequest request = CbsRequests.getConfiguration(RequestDiagnosticContext.create());
+
+ // when
+ final Mono<JsonObject> result = sut.flatMap(cbsClient -> cbsClient.get(request));
+
+ // then
+ StepVerifier.create(result)
+ .expectErrorSatisfies(ex -> {
+ assertThat(ex).isInstanceOf(EnvironmentParsingException.class);
+ assertThat(ex).hasMessageContaining("Cannot read AAF_USER from environment.");
+ })
+ .verify(Duration.ofSeconds(5));
+ }
+
@Test
void testCbsClientWithConfigRetrievedFromFile() {
// given
+ envs.set("AAF_USER", "admin");
+ envs.set("AAF_PASSWORD", "admin_secret");
final Mono<CbsClient> sut = CbsClientFactory.createCbsClient(sampleConfigurationFileSource);
final CbsRequest request = CbsRequests.getConfiguration(RequestDiagnosticContext.create());
// then
StepVerifier.create(result.map(this::sampleConfigValue))
- .expectNext(EXPECTED_CONFIG_VALUE_FROM_FILE)
+ .expectNext(EXPECTED_CONFIG_VALUE_FROM_CBS)
.expectComplete()
.verify(Duration.ofSeconds(5));
}
@Test
void testCbsClientWithStreamsParsing() {
// given
+ envs.set("AAF_USER", "admin");
+ envs.set("AAF_PASSWORD", "admin_secret");
final Mono<CbsClient> sut = CbsClientFactory.createCbsClient(sampleConfigurationCbsSource);
final StreamFromGsonParser<KafkaSink> kafkaSinkParser = StreamFromGsonParsers.kafkaSinkParser();
final CbsRequest request = CbsRequests.getConfiguration(RequestDiagnosticContext.create());
@Test
void testCbsClientWithStreamsParsingUsingSwitch() {
// given
+ envs.set("AAF_USER", "admin");
+ envs.set("AAF_PASSWORD", "admin_secret");
final Mono<CbsClient> sut = CbsClientFactory.createCbsClient(sampleConfigurationCbsSource);
final CbsRequest request = CbsRequests.getConfiguration(RequestDiagnosticContext.create());
// TODO: Use these parsers below
@Test
void testCbsClientWithStreamsParsingWhenUsingInvalidParser() {
// given
+ envs.set("AAF_USER", "admin");
+ envs.set("AAF_PASSWORD", "admin_secret");
final Mono<CbsClient> sut = CbsClientFactory.createCbsClient(sampleConfigurationCbsSource);
final StreamFromGsonParser<KafkaSource> kafkaSourceParser = StreamFromGsonParsers.kafkaSourceParser();
final CbsRequest request = CbsRequests.getConfiguration(RequestDiagnosticContext.create());
---
+keystore.path: "/var/run/security/keystore.p12"
streams_publishes:
perf3gpp:
+ testArray:
+ - testPrimitiveArray:
+ - "${AAF_USER}"
+ - "${AAF_PASSWORD}"
+ - nestedArray:
+ - "${AAF_USER}"
+ testPrimitive: "${AAF_USER}"
+ aaf_credentials:
+ username: "${AAF_USER}"
+ password: "${AAF_PASSWORD}"
type: kafka
+ kafka_info:
+ bootstrap_servers: dmaap-mr-kafka:6060
+ topic_name: HVVES_PERF3GPP
+ pnf_ready:
+ aaf_credentials:
+ username: "${AAF_USER}"
+ password: "${AAF_PASSWORD}"
+ type: message_router
+ dmaap_info:
+ topic_url: http://message-router:3904/events/VES_PNF_READY
+ call_trace:
aaf_credentials:
- username: admin
- password: admin_secret
+ username: "${AAF_USER}"
+ password: "${AAF_PASSWORD}"
+ type: kafka
kafka_info:
- bootstrap_servers: message-router-kafka-0:9093
- topic_name: HV_VES_PERF3GPP
+ bootstrap_servers: dmaap-mr-kafka:6060
+ topic_name: HVVES_TRACE
+streams_subscribes:
+ measurements:
+ type: message_router
+ dmaap_info:
+ topic_url: http://message-router:3904/events/VES_MEASUREMENT
--- /dev/null
+{
+ "keystore.path": "/var/run/security/keystore.p12",
+ "streams_publishes": {
+ "perf3gpp": {
+ "testArray": [{
+ "testPrimitiveArray": ["admin", "admin_secret", {
+ "nestedArray": ["admin"]
+ }
+ ],
+ "testPrimitive": "admin",
+ "aaf_credentials": {
+ "username": "admin",
+ "password": "admin_secret"
+ }
+ }
+ ],
+ "type": "kafka",
+ "kafka_info": {
+ "bootstrap_servers": "dmaap-mr-kafka:6060",
+ "topic_name": "HVVES_PERF3GPP"
+ }
+ },
+ "pnf_ready": {
+ "aaf_credentials": {
+ "username": "admin",
+ "password": "admin_secret"
+ },
+ "type": "message_router",
+ "dmaap_info": {
+ "topic_url": "http://message-router:3904/events/VES_PNF_READY"
+ }
+ },
+ "call_trace": {
+ "aaf_credentials": {
+ "username": "admin",
+ "password": "admin_secret"
+ },
+ "type": "kafka",
+ "kafka_info": {
+ "bootstrap_servers": "dmaap-mr-kafka:6060",
+ "topic_name": "HVVES_TRACE"
+ }
+ }
+ },
+ "streams_subscribes": {
+ "measurements": {
+ "type": "message_router",
+ "dmaap_info": {
+ "topic_url": "http://message-router:3904/events/VES_MEASUREMENT"
+ }
+ }
+ }
+}
"keystore.path": "/var/run/security/keystore.p12",
"streams_publishes": {
"perf3gpp": {
+ "testArray": [{
+ "testPrimitiveArray": ["${AAF_USER}", "${AAF_PASSWORD}", {"nestedArray": ["${AAF_USER}"]}],
+ "testPrimitive": "${AAF_USER}",
+ "aaf_credentials": {
+ "username": "${AAF_USER}",
+ "password": "${AAF_PASSWORD}"
+ }
+ }],
"type": "kafka",
"kafka_info": {
"bootstrap_servers": "dmaap-mr-kafka:6060",
}
},
"pnf_ready": {
+ "aaf_credentials": {
+ "username": "${AAF_USER}",
+ "password": "${AAF_PASSWORD}"
+ },
"type": "message_router",
"dmaap_info": {
"topic_url": "http://message-router:3904/events/VES_PNF_READY"
}
},
"call_trace": {
+ "aaf_credentials": {
+ "username": "${AAF_USER}",
+ "password": "${AAF_PASSWORD}"
+ },
"type": "kafka",
"kafka_info": {
"bootstrap_servers": "dmaap-mr-kafka:6060",
<parent>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
<artifactId>dcaegen2-services-sdk-rest-services</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<groupId>org.onap.dcaegen2.services.sdk.rest.services</groupId>
<parent>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
<artifactId>dcaegen2-services-sdk-rest-services</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<groupId>org.onap.dcaegen2.services.sdk.rest.services</groupId>
<parent>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
<artifactId>dcaegen2-services-sdk-rest-services</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<groupId>org.onap.dcaegen2.services.sdk.rest.services</groupId>
<parent>
<groupId>org.onap.dcaegen2.services</groupId>
<artifactId>sdk</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
<parent>
<groupId>org.onap.dcaegen2.services.sdk.security</groupId>
<artifactId>dcaegen2-services-sdk-security</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.onap.dcaegen2.services</groupId>
<artifactId>sdk</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<groupId>org.onap.dcaegen2.services.sdk.security</groupId>
<parent>
<groupId>org.onap.dcaegen2.services.sdk.security</groupId>
<artifactId>dcaegen2-services-sdk-security</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<artifactId>ssl</artifactId>
<parent>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
<artifactId>dcaegen2-services-sdk-services</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<artifactId>dcaegen2-services-sdk-services-common</artifactId>
<parent>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
<artifactId>dcaegen2-services-sdk-services</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<artifactId>dcaegen2-services-sdk-services-external-schema-manager</artifactId>
<parent>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
<artifactId>dcaegen2-services-sdk-services</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<artifactId>dcaegen2-services-sdk-services-hvvesclient</artifactId>
<parent>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
<artifactId>hvvesclient-producer</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<artifactId>hvvesclient-producer-api</artifactId>
<parent>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
<artifactId>hvvesclient-producer</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<artifactId>hvvesclient-producer-ct</artifactId>
<parent>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
<artifactId>hvvesclient-producer</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<artifactId>hvvesclient-producer-impl</artifactId>
<parent>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
<artifactId>dcaegen2-services-sdk-services-hvvesclient</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<artifactId>hvvesclient-producer</artifactId>
<parent>
<artifactId>dcaegen2-services-sdk-services-hvvesclient</artifactId>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<name>High Volume VES Collector Client :: Protobuf</name>
<parent>
<groupId>org.onap.dcaegen2.services</groupId>
<artifactId>sdk</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
<parent>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
<artifactId>dcaegen2-services-sdk-standardization</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>
<parent>
<artifactId>dcaegen2-sdk-moher-api</artifactId>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<name>Monitoring and Healthcheck :: Health state</name>
<parent>
<artifactId>dcaegen2-sdk-moher-api</artifactId>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<name>Monitoring and Healthcheck :: Metrics</name>
<parent>
<artifactId>dcaegen2-services-sdk-standardization</artifactId>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<name>Monitoring and Healthcheck</name>
<parent>
<artifactId>dcaegen2-sdk-moher-api</artifactId>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<name>Monitoring and Healthcheck :: Server Adapters</name>
<parent>
<artifactId>dcaegen2-sdk-moher-server-adapters</artifactId>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<name>Monitoring and Healthcheck :: Server Adapters :: Reactor Netty</name>
<parent>
<artifactId>dcaegen2-sdk-moher-server-adapters</artifactId>
<groupId>org.onap.dcaegen2.services.sdk</groupId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
</parent>
<name>Monitoring and Healthcheck :: Server Adapters :: Spring Webflux</name>
<parent>
<groupId>org.onap.dcaegen2.services</groupId>
<artifactId>sdk</artifactId>
- <version>1.8.3-SNAPSHOT</version>
+ <version>1.8.4-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>
major=1
minor=8
-patch=3
+patch=4
base_version=${major}.${minor}.${patch}
release_version=${base_version}
snapshot_version=${base_version}-SNAPSHOT