Fix loading SSL Context when certpaths not exist in configuration 45/126745/18 1.8.0
authorTomasz Wrobel <tomasz.wrobel@nokia.com>
Tue, 25 Jan 2022 10:00:42 +0000 (11:00 +0100)
committerTomasz Wrobel <tomasz.wrobel@nokia.com>
Fri, 11 Feb 2022 11:27:06 +0000 (12:27 +0100)
- Make cert paths field optional in configuration.
- Allow to skip ssl context load.
- Make PublisherConfig and SubscriberConfig fields optional.
- Remove Auth Header when AAF credentials are empty

Issue-ID: DCAEGEN2-3032
Issue-ID: DCAEGEN2-3038
Signed-off-by: Tomasz Wrobel <tomasz.wrobel@nokia.com>
Change-Id: I27d44cf8c2887b3a75c5ad16f833439b7b5757ee

27 files changed:
Changelog.md
csit/plans/pmmapper/assets/config.json [new file with mode: 0644]
csit/tests/pmmapper/assets/pm_filter_config.json
csit/tests/pmmapper/assets/pm_filter_regex_config.json
csit/tests/pmmapper/assets/vendor_filter_config.json
src/main/java/org/onap/dcaegen2/services/pmmapper/App.java
src/main/java/org/onap/dcaegen2/services/pmmapper/config/ConfigHandler.java
src/main/java/org/onap/dcaegen2/services/pmmapper/exceptions/MapperConfigException.java
src/main/java/org/onap/dcaegen2/services/pmmapper/model/MapperConfig.java
src/main/java/org/onap/dcaegen2/services/pmmapper/model/PublisherConfig.java
src/main/java/org/onap/dcaegen2/services/pmmapper/model/SubscriberConfig.java
src/main/java/org/onap/dcaegen2/services/pmmapper/ssl/SSLContextFactory.java
src/main/java/org/onap/dcaegen2/services/pmmapper/utils/DmaapRequestSender.java
src/test/java/org/onap/dcaegen2/services/pmmapper/config/ConfigHandlerTests.java
src/test/java/org/onap/dcaegen2/services/pmmapper/ssl/SSLContextFactoryTest.java
src/test/resources/missing_optional_fields/null_aaf_identity.json [moved from src/test/resources/invalid_configs/null_aaf_identity.json with 99% similarity]
src/test/resources/missing_optional_fields/null_aaf_password.json [moved from src/test/resources/invalid_configs/null_aaf_password.json with 99% similarity]
src/test/resources/missing_optional_fields/null_client_role.json [moved from src/test/resources/invalid_configs/null_client_role.json with 99% similarity]
src/test/resources/missing_optional_fields/null_dr_location.json [moved from src/test/resources/invalid_configs/null_dr_location.json with 99% similarity]
src/test/resources/missing_optional_fields/null_dr_password.json [moved from src/test/resources/invalid_configs/null_dr_password.json with 99% similarity]
src/test/resources/missing_optional_fields/null_dr_username.json [moved from src/test/resources/invalid_configs/null_dr_username.json with 99% similarity]
src/test/resources/missing_optional_fields/null_key_store_pass_path.json [moved from src/test/resources/invalid_configs/null_key_store_pass_path.json with 99% similarity]
src/test/resources/missing_optional_fields/null_key_store_path.json [moved from src/test/resources/invalid_configs/null_key_store_path.json with 99% similarity]
src/test/resources/missing_optional_fields/null_location.json [moved from src/test/resources/invalid_configs/null_location.json with 99% similarity]
src/test/resources/missing_optional_fields/null_trust_store_pass_path.json [moved from src/test/resources/invalid_configs/null_trust_store_pass_path.json with 99% similarity]
src/test/resources/missing_optional_fields/null_trust_store_path.json [moved from src/test/resources/invalid_configs/null_trust_store_path.json with 99% similarity]
tools/development/resources/mount_config.yaml

index c5fee1a..49b672c 100644 (file)
@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
 ### Changed
 - [DCAEGEN2-2964] Switch configuration provider to CBS Client - DCAE SDK
 - [DCAEGEN2-3049] Remove vulnerability
+- - [DCAEGEN2-3032] [DCAEGEN2-3038] Allow supports unauthenticated topic and connection without TLS
 
 ## [1.7.2] - 2021/08/26
 ### Changed
diff --git a/csit/plans/pmmapper/assets/config.json b/csit/plans/pmmapper/assets/config.json
new file mode 100644 (file)
index 0000000..e69de29
index 79e3f98..21dbd79 100644 (file)
@@ -39,4 +39,4 @@
         }
       }
     }
-}
\ No newline at end of file
+}
index 0da2b7e..0c49a96 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019-2020 Nordix Foundation.
- *  Copyright (C) 2021-2022 Nokia.
+ *  Copyright (C) 2021-2022 Nokia. All rights reserved.
  *  Copyright (C) 2021 Samsung Electronics.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -169,7 +169,7 @@ public class App {
         this.serverResources = Arrays.asList(healthCheckHandler, deliveryHandler, dynamicConfiguration);
         try {
             this.applicationServer = server(this.mapperConfig, this.serverResources);
-        } catch (IOException e) {
+        } catch (IOException | MapperConfigException e ) {
             logger.unwrap().error("Failed to create server instance.", e);
             throw new IllegalStateException("Server instantiation failed");
         }
@@ -194,7 +194,10 @@ public class App {
     private Undertow server(MapperConfig config, List<ServerResource> serverResources) throws IOException {
         SSLContextFactory sslContextFactory = new SSLContextFactory(config);
         SSLContext sslContext = sslContextFactory.createSSLContext(config);
-        SSLContext.setDefault(sslContext);
+        if (sslContext != null) {
+            SSLContext.setDefault(sslContext);
+            logger.unwrap().info("SSL Context loaded");
+        }
         Undertow.Builder builder = Undertow.builder();
         if (config.getEnableHttp()) {
             builder.addHttpListener(this.httpPort, "0.0.0.0");
index 6c93d2f..ff28634 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019 Nordix Foundation.
- *  Copyright (C) 2022 Nokia.
+ *  Copyright (C) 2022 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.
@@ -102,8 +102,8 @@ public class ConfigHandler {
                 .create()
                 .fromJson(jsonObject, MapperConfig.class);
         } catch (Exception exception) {
-            String exceptionMessage = "Error parsing configuration, mapper config:\n" + mapperConfig;
-            logger.unwrap().error(exceptionMessage);
+            String exceptionMessage = "Error parsing configuration, mapper config: " + mapperConfig;
+            logger.unwrap().error("Error parsing configuration", exception);
             throw new MapperConfigException(exceptionMessage, exception);
         }
         logger.unwrap().info("PM-mapper configuration processed successful");
index 4669871..56e2d23 100644 (file)
@@ -1,6 +1,7 @@
 /*-\r
  * ============LICENSE_START=======================================================\r
  *  Copyright (C) 2019 Nordix Foundation.\r
+ *  Copyright (C) 2022 Nokia. All rights reserved.\r
  * ================================================================================\r
  * Licensed under the Apache License, Version 2.0 (the "License");\r
  * you may not use this file except in compliance with the License.\r
@@ -23,4 +24,8 @@ public class MapperConfigException extends RuntimeException {
     public MapperConfigException(String message, Throwable cause) {\r
         super(message, cause);\r
     }\r
+\r
+    public MapperConfigException(String message) {\r
+        super(message);\r
+    }\r
 }\r
index a71696b..18b9388 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019 Nordix Foundation.
+ *  Copyright (C) 2022 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.
@@ -41,19 +42,15 @@ public class MapperConfig implements Configurable {
     @SerializedName("enable_http")
     private Boolean enableHttp;
 
-    @GSONRequired
     @SerializedName("key_store_path")
     private String keyStorePath;
 
-    @GSONRequired
     @SerializedName("key_store_pass_path")
     private String keyStorePassPath;
 
-    @GSONRequired
     @SerializedName("trust_store_path")
     private String trustStorePath;
 
-    @GSONRequired
     @SerializedName("trust_store_pass_path")
     private String trustStorePassPath;
 
@@ -66,11 +63,9 @@ public class MapperConfig implements Configurable {
     @JsonAdapter(MeasFilterConfigAdapter.class)
     private MeasFilterConfig filterConfig;
 
-    @GSONRequired
     @SerializedName("aaf_identity")
     private String aafUsername;
 
-    @GSONRequired
     @SerializedName("aaf_password")
     private String aafPassword;
 
@@ -127,4 +122,4 @@ public class MapperConfig implements Configurable {
                 ", publisherConfig=" + publisherConfig +
                 '}';
     }
-}
\ No newline at end of file
+}
index 16ab941..4b0cdac 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019 Nordix Foundation.
+ *  Copyright (C) 2022 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.
@@ -30,15 +31,12 @@ public class PublisherConfig {
     @SerializedName("topic_url")
     private String topicUrl;
 
-    @GSONRequired
     @SerializedName("client_role")
     private String clientRole;
 
-    @GSONRequired
     @SerializedName("client_id")
     private String clientId;
 
-    @GSONRequired
     @SerializedName("location")
     private String clusterLocation;
 
index c53d36d..89cc243 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019 Nordix Foundation.
+ *  Copyright (C) 2022 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.
@@ -26,15 +27,13 @@ import org.onap.dcaegen2.services.pmmapper.utils.GSONRequired;
 
 @Data
 public class SubscriberConfig {
-    @GSONRequired
+
     @SerializedName("username")
     private String username;
 
-    @GSONRequired
     @SerializedName("password")
     private String password;
 
-    @GSONRequired
     @SerializedName("location")
     private String drLocation;
 
index e7c317d..007ba86 100644 (file)
@@ -2,6 +2,7 @@
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019-2020 Nordix Foundation.
  *  Copyright (C) 2021 Samsung Electronics.
+ *  Copyright (C) 2022 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.
@@ -23,6 +24,7 @@ package org.onap.dcaegen2.services.pmmapper.ssl;
 import org.onap.dcaegen2.services.pmmapper.exceptions.CreateContextException;
 import org.onap.dcaegen2.services.pmmapper.exceptions.KeyManagerException;
 import org.onap.dcaegen2.services.pmmapper.exceptions.LoadKeyStoreException;
+import org.onap.dcaegen2.services.pmmapper.exceptions.MapperConfigException;
 import org.onap.dcaegen2.services.pmmapper.exceptions.TrustManagerException;
 import org.onap.dcaegen2.services.pmmapper.model.MapperConfig;
 import org.onap.logging.ref.slf4j.ONAPLogAdapter;
@@ -48,14 +50,18 @@ import static java.nio.file.Files.readAllBytes;
 
 public class SSLContextFactory {
     private static final ONAPLogAdapter logger = new ONAPLogAdapter(LoggerFactory.getLogger(SSLContextFactory.class));
-    private MapperConfig mapperConfig;
+    private final MapperConfig mapperConfig;
 
     public SSLContextFactory(MapperConfig config) {
         mapperConfig = config;
     }
 
     public SSLContext createSSLContext(MapperConfig mapperConfig) throws IOException {
-        SSLContext sslContext = null;
+        logger.unwrap().info("Attempt to Create SSL Context");
+        if (isSslDisabled(mapperConfig)) {
+            logger.unwrap().warn("SSL is disabled. Skip creating SSL Context");
+            return null;
+        }
 
         try {
             KeyStore keyStore = loadKeyStore(mapperConfig.getKeyStorePath(), mapperConfig.getKeyStorePassPath());
@@ -64,15 +70,36 @@ public class SSLContextFactory {
             KeyStore trustStore = loadKeyStore(mapperConfig.getTrustStorePath(), mapperConfig.getTrustStorePassPath());
             TrustManager[] trustManagers = createTrustManager(trustStore);
 
-            sslContext = SSLContext.getInstance("TLSv1.2");
+            SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
             sslContext.init(keyManagers, trustManagers, null);
+            return sslContext;
         } catch(KeyManagementException | NoSuchAlgorithmException e) {
             logger.unwrap().error("Failed to create SSL Context.", e);
             throw new CreateContextException("Failed to create SSL Context", e);
         }
-        return sslContext;
     }
 
+    private boolean isSslDisabled(MapperConfig mapperConfig) {
+        boolean isCertPathMissing = !areCertPathsConfigured(mapperConfig);
+        if (isCertPathMissing && !mapperConfig.getEnableHttp()) {
+            throw new MapperConfigException("Certificate paths are missing, HTTP is disabled. Not allowed configuration");
+        }
+
+        return isCertPathMissing;
+    }
+
+    private boolean areCertPathsConfigured(MapperConfig mapperConfig) {
+        return isNotBlank(mapperConfig.getKeyStorePath()) &&
+            isNotBlank(mapperConfig.getKeyStorePassPath()) &&
+            isNotBlank(mapperConfig.getTrustStorePath()) &&
+            isNotBlank(mapperConfig.getTrustStorePassPath());
+    }
+
+    private boolean isNotBlank(String str) {
+        return str != null && !str.isEmpty();
+    }
+
+
     private KeyManager[] createKeyManager(KeyStore keyStore) throws NoSuchAlgorithmException, IOException {
         KeyManager[] keyManager;
         KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
index 1a7c59e..e7898af 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2021 Nokia.
+ *  Copyright (C) 2021-2022 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.
@@ -25,6 +25,7 @@ import com.google.gson.JsonParser;
 import io.vavr.control.Try;
 import org.onap.dcaegen2.services.sdk.model.streams.AafCredentials;
 import org.onap.dcaegen2.services.sdk.model.streams.dmaap.ImmutableMessageRouterSink;
+import org.onap.dcaegen2.services.sdk.model.streams.dmaap.ImmutableMessageRouterSink.Builder;
 import org.onap.dcaegen2.services.sdk.model.streams.dmaap.MessageRouterSink;
 import org.onap.dcaegen2.services.sdk.rest.services.dmaap.client.ContentType;
 import org.onap.dcaegen2.services.sdk.rest.services.dmaap.client.api.DmaapClientFactory;
@@ -88,10 +89,19 @@ public class DmaapRequestSender {
     }
 
     private static MessageRouterSink sink(String topicUrl, AafCredentials credentials) {
-        return ImmutableMessageRouterSink.builder()
-                .aafCredentials(credentials)
-                .topicUrl(topicUrl)
-                .build();
+        Builder builder = ImmutableMessageRouterSink.builder();
+        if (credentialsExists(credentials)) {
+            builder.aafCredentials(credentials);
+        }
+        return builder.topicUrl(topicUrl).build();
+    }
+
+    private static boolean credentialsExists(AafCredentials credentials) {
+        return isNotBlank(credentials.username()) && isNotBlank(credentials.password());
+    }
+
+    private static boolean isNotBlank(String str) {
+        return str != null && !str.isEmpty();
     }
 
     private static RequestDiagnosticContext diagnosticContext() {
index a1538ee..d007123 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019 Nordix Foundation.
- *  Copyright (C) 2022 Nokia.
+ *  Copyright (C) 2022 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.
@@ -20,6 +20,7 @@
  */
 
 package org.onap.dcaegen2.services.pmmapper.config;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
@@ -62,6 +63,8 @@ class ConfigHandlerTests {
     private static String validMapperConfigChanged;
 
     private static final Path INVALID_CONFIGS_DIRECTORY = Paths.get("src/test/resources/invalid_configs/");
+    private static final Path MISSING_OPTIONAL_FIELDS_CONFIGS_DIRECTORY =
+        Paths.get("src/test/resources/missing_optional_fields/");
     private static final String EXPECTED_ERROR_MESSAGE_IN_LOG = "Error parsing configuration";
     private static final String EXPECTED_CHANGED_VALUE = "https://dmaap-dr-node:8443/delete_changed";
 
@@ -141,6 +144,17 @@ class ConfigHandlerTests {
         logAppender.stop();
     }
 
+    @ParameterizedTest
+    @MethodSource("getConfigsWithMissingOptionalFields")
+    void should_parse_json_with_missing_optional_fields(String mapperConfig) {
+        Mono<JsonObject> just = createMonoJsonObject(mapperConfig);
+
+        when(cbsClient.get(any())).thenReturn(just);
+        ConfigHandler configHandler = new ConfigHandler(cbsClient, cbsRequest);
+
+        assertDoesNotThrow(configHandler::getInitialConfiguration);
+    }
+
     @ParameterizedTest
     @MethodSource("getInvalidConfigs")
     void parse_valid_json_bad_values_mapper_config(String mapperConfig) throws Exception {
@@ -169,4 +183,8 @@ class ConfigHandlerTests {
     private static List<String> getInvalidConfigs() throws IOException {
         return FileUtils.getFilesFromDirectory(INVALID_CONFIGS_DIRECTORY);
     }
+
+    private static List<String> getConfigsWithMissingOptionalFields() throws IOException {
+        return FileUtils.getFilesFromDirectory(MISSING_OPTIONAL_FIELDS_CONFIGS_DIRECTORY);
+    }
 }
index 6f5cee9..747715c 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019 Nordix Foundation.
+ *  Copyright (C) 2022 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.
@@ -23,28 +24,39 @@ package org.onap.dcaegen2.services.pmmapper.ssl;
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
+import java.util.ArrayList;
+import java.util.List;
+import javax.net.ssl.SSLContext;
 import org.junit.Rule;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
 import org.junit.rules.ExpectedException;
+
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import org.mockito.junit.jupiter.MockitoExtension;
+import org.onap.dcaegen2.services.pmmapper.exceptions.MapperConfigException;
 import org.onap.dcaegen2.services.pmmapper.model.MapperConfig;
 
-import javax.net.ssl.*;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 
-import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 @ExtendWith(MockitoExtension.class)
 
 public class SSLContextFactoryTest {
 
+    private static final String TEST_PATH = "";
+
     @Rule
     public ExpectedException exception = ExpectedException.none();
 
@@ -52,7 +64,6 @@ public class SSLContextFactoryTest {
     private static MapperConfig validConfig;
     private static MapperConfig inValidConfig;
 
-
     private static final Path validConfigPath = Paths.get("src/test/resources/valid_mapper_config.json");
 
     private SSLContextFactory objUnderTest;
@@ -81,4 +92,68 @@ public class SSLContextFactoryTest {
 
         assertThrows(IOException.class, () -> objUnderTest.createSSLContext(inValidConfig));
     }
-}
\ No newline at end of file
+
+    @Test
+    void shouldThrowExceptionWhenCertPathAreMissingButHttpIsDisabled() {
+        MapperConfig mapperConfig = mock(MapperConfig.class);
+        when(mapperConfig.getKeyStorePath()).thenReturn(TEST_PATH);
+        when(mapperConfig.getEnableHttp()).thenReturn(false);
+
+        SSLContextFactory sslContextFactory = new SSLContextFactory(mapperConfig);
+
+        assertThrows(MapperConfigException.class, () -> sslContextFactory.createSSLContext(mapperConfig));
+    }
+
+
+    @ParameterizedTest
+    @MethodSource("pathsAreNull")
+    void shouldReturnNullWhenOneCertPathIsNull(MapperConfig mapperConfig) throws IOException {
+        SSLContextFactory sslContextFactory = new SSLContextFactory(mapperConfig);
+        SSLContext sslContext = sslContextFactory.createSSLContext(mapperConfig);
+
+        assertNull(sslContext);
+    }
+
+    @ParameterizedTest
+    @MethodSource("pathsAreEmpty")
+    void shouldReturnNullWhenOneCertPathIsEmpty(MapperConfig mapperConfig) throws IOException {
+        SSLContextFactory sslContextFactory = new SSLContextFactory(mapperConfig);
+        SSLContext sslContext = sslContextFactory.createSSLContext(mapperConfig);
+
+        assertNull(sslContext);
+    }
+
+    private static List<MapperConfig> pathsAreNull() {
+        return mockMapperConfigList(null);
+    }
+
+    private static List<MapperConfig> pathsAreEmpty() {
+        return mockMapperConfigList("");
+    }
+
+    private static List<MapperConfig> mockMapperConfigList(String returnValue) {
+        List<MapperConfig> mapperConfigList = new ArrayList<>();
+
+        MapperConfig mapperConfig1 = mock(MapperConfig.class);
+        when(mapperConfig1.getKeyStorePath()).thenReturn(returnValue);
+        when(mapperConfig1.getEnableHttp()).thenReturn(true);
+        mapperConfigList.add(mapperConfig1);
+
+        MapperConfig mapperConfig2 = mock(MapperConfig.class);
+        when(mapperConfig2.getKeyStorePassPath()).thenReturn(returnValue);
+        when(mapperConfig2.getEnableHttp()).thenReturn(true);
+        mapperConfigList.add(mapperConfig2);
+
+        MapperConfig mapperConfig3 = mock(MapperConfig.class);
+        when(mapperConfig3.getTrustStorePath()).thenReturn(returnValue);
+        when(mapperConfig3.getEnableHttp()).thenReturn(true);
+        mapperConfigList.add(mapperConfig3);
+
+        MapperConfig mapperConfig4 = mock(MapperConfig.class);
+        when(mapperConfig4.getTrustStorePassPath()).thenReturn(returnValue);
+        when(mapperConfig4.getEnableHttp()).thenReturn(true);
+        mapperConfigList.add(mapperConfig4);
+
+        return mapperConfigList;
+    }
+}
index f3cf34e..ff81f1b 100644 (file)
@@ -15,7 +15,7 @@ dmaap_dr_delete_endpoint: "https://dmaap-dr-node:8443/delete"
 dmaap_dr_feed_name: "1"
 aaf_identity: "aaf_admin@people.osaaf.org"
 aaf_password: "demo123456!"
-enable_http: true,
+enable_http: true
 streams_publishes:
   dmaap_publisher:
     type: "message_router"