Make TLS connection optional

Issue-ID: DCAEGEN2-3039
Signed-off-by: Tomasz Wrobel <tomasz.wrobel@nokia.com>
Change-Id: Id637ba17c655407009a4f40f6c93f518b99e45ff
diff --git a/Changelog.md b/Changelog.md
index cbbc4d4..ce4f0e0 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -4,6 +4,10 @@
 The format is based on [Keep a Changelog](http://keepachangelog.com/)
 and this project adheres to [Semantic Versioning](http://semver.org/).
 
+## [1.8.0] - 2022/06/24
+### Changed
+- [DCAEGEN2-3039] Make certificate dependencies configurable
+
 ## [1.7.1] - 2022/03/10
 ### Changed
 - [DCAEGEN2-3104] Fix application startup
diff --git a/README.md b/README.md
index b8f8c1a..53aa43d 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,11 @@
 Whole project (top level of DFC directory) and each module (sub module directory) can be compiled using
 `mvn clean install` command.
 
+## Build image 
+```
+mvn install docker:build
+```
+
 ## Main API Endpoints
 
 Running with dev-mode of DFC
diff --git a/datafile-app-server/pom.xml b/datafile-app-server/pom.xml
index c8a0e64..14620ed 100644
--- a/datafile-app-server/pom.xml
+++ b/datafile-app-server/pom.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
   ~ ============LICENSE_START=======================================================
-  ~ Copyright (C) 2018-2022 NOKIA Intellectual Property. All rights reserved.
+  ~ Copyright (C) 2018-2022 Nokia. All rights reserved.
   ~ Copyright (C) 2018-2021 Nordix Foundation. All rights reserved.
   ~ Copyright (c) 2019 AT&T Intellectual Property. All rights reserved.
   ~ Copyright (c) 2021 Samsung Electronics. All rights reserved.
@@ -27,7 +27,7 @@
     <parent>
         <groupId>org.onap.dcaegen2.collectors</groupId>
         <artifactId>datafile</artifactId>
-        <version>1.7.1-SNAPSHOT</version>
+        <version>1.8.0-SNAPSHOT</version>
     </parent>
 
     <groupId>org.onap.dcaegen2.collectors.datafile</groupId>
@@ -149,6 +149,12 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.junit.vintage</groupId>
+            <artifactId>junit-vintage-engine</artifactId>
+            <version>5.7.0</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.testng</groupId>
             <artifactId>testng</artifactId>
             <scope>test</scope>
diff --git a/datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/configuration/AppConfig.java b/datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/configuration/AppConfig.java
index f11a85a..0691d72 100644
--- a/datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/configuration/AppConfig.java
+++ b/datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/configuration/AppConfig.java
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START======================================================================
- * Copyright (C) 2018, 2020-2021 NOKIA Intellectual Property, 2018-2019 Nordix Foundation.
- * All rights reserved.
+ * Copyright (C) 2018, 2020-2022 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Nordix Foundation. 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
@@ -234,6 +234,10 @@
         this.certificateConfiguration = certificateConfig;
         this.sftpConfiguration = sftpConfig;
 
+        if (!certificateConfig.enableCertAuth()) {
+            logger.debug("External TLS certificate disabled, skipping setup HTTPS client");
+            return;
+        }
         HttpsClientConnectionManagerUtil.setupOrUpdate(certificateConfig.keyCert(), certificateConfig.keyPasswordPath(),
             certificateConfig.trustedCa(), certificateConfig.trustedCaPasswordPath(),
             certificateConfig.httpsHostnameVerify());
diff --git a/datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/configuration/CertificateConfig.java b/datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/configuration/CertificateConfig.java
index 78be36d..668fcc7 100644
--- a/datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/configuration/CertificateConfig.java
+++ b/datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/configuration/CertificateConfig.java
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
- * Copyright (C) 2018-2021 NOKIA Intellectual Property, 2019 Nordix Foundation. All rights reserved.
+ * Copyright (C) 2018-2022 Nokia. All rights reserved.
+ * Copyright (C) 2019 Nordix Foundation. 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.
@@ -50,4 +51,7 @@
 
     @Value.Parameter
     public abstract Boolean httpsHostnameVerify();
+
+    @Value.Parameter
+    public abstract Boolean enableCertAuth();
 }
diff --git a/datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/configuration/CloudConfigParser.java b/datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/configuration/CloudConfigParser.java
index 025166c..db811fa 100644
--- a/datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/configuration/CloudConfigParser.java
+++ b/datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/configuration/CloudConfigParser.java
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
- * Copyright (C) 2018, 2020-2021 NOKIA Intellectual Property, 2018-2019 Nordix Foundation.
- * All rights reserved.
+ * Copyright (C) 2018, 2020-2022 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Nordix Foundation. 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.
@@ -48,6 +48,8 @@
 import org.onap.dcaegen2.services.sdk.security.ssl.ImmutableSecurityKeysStore;
 import org.onap.dcaegen2.services.sdk.security.ssl.Passwords;
 import org.onap.dcaegen2.services.sdk.security.ssl.SecurityKeys;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Parses the cloud configuration.
@@ -74,6 +76,8 @@
     private static final int EXPECTED_NUMBER_OF_SOURCE_TOPICS = 1;
     private static final int FIRST_SOURCE_INDEX = 0;
 
+    private static final Logger logger = LoggerFactory.getLogger(CloudConfigParser.class);
+
     private final Properties systemEnvironment;
 
     private final JsonObject jsonObject;
@@ -103,10 +107,10 @@
                 .publishUrl(getAsString(feedConfig, "publish_url")) //
                 .password(getAsString(feedConfig, "password")) //
                 .userName(getAsString(feedConfig, "username")) //
-                .trustStorePath(getAsString(jsonObject, DMAAP_SECURITY_TRUST_STORE_PATH)) //
-                .trustStorePasswordPath(getAsString(jsonObject, DMAAP_SECURITY_TRUST_STORE_PASS_PATH)) //
-                .keyStorePath(getAsString(jsonObject, DMAAP_SECURITY_KEY_STORE_PATH)) //
-                .keyStorePasswordPath(getAsString(jsonObject, DMAAP_SECURITY_KEY_STORE_PASS_PATH)) //
+                .trustStorePath(getAsOptionalStringOrDefault(jsonObject, DMAAP_SECURITY_TRUST_STORE_PATH,"")) //
+                .trustStorePasswordPath(getAsOptionalStringOrDefault(jsonObject, DMAAP_SECURITY_TRUST_STORE_PASS_PATH, "")) //
+                .keyStorePath(getAsOptionalStringOrDefault(jsonObject, DMAAP_SECURITY_KEY_STORE_PATH,"")) //
+                .keyStorePasswordPath(getAsOptionalStringOrDefault(jsonObject, DMAAP_SECURITY_KEY_STORE_PASS_PATH,"")) //
                 .enableDmaapCertAuth(get(jsonObject, DMAAP_SECURITY_ENABLE_DMAAP_CERT_AUTH).getAsBoolean()) //
                 .changeIdentifier(changeIdentifier) //
                 .logUrl(getAsString(feedConfig, "log_url")) //
@@ -189,12 +193,38 @@
      * @throws DatafileTaskException if a member of the configuration is missing.
      */
     public @NotNull CertificateConfig getCertificateConfig() throws DatafileTaskException {
+        boolean enableCertAuth = getAsBooleanOrDefault(jsonObject, "dmaap.certificateConfig.enableCertAuth",
+            Boolean.TRUE);
+
+        String keyCert = "";
+        String keyPasswordPath = "";
+        String trustedCa = "";
+        String trustedCaPasswordPath = "";
+        boolean httpsHostnameVerify = true;
+
+        if (enableCertAuth) {
+            logger.debug("TlS enabled, attempt to read certificates property");
+            try {
+                keyCert = getAsString(jsonObject, "dmaap.certificateConfig.keyCert");
+                keyPasswordPath = getAsString(jsonObject, "dmaap.certificateConfig.keyPasswordPath");
+                trustedCa = getAsString(jsonObject, "dmaap.certificateConfig.trustedCa");
+                trustedCaPasswordPath = getAsString(jsonObject, "dmaap.certificateConfig.trustedCaPasswordPath");
+                httpsHostnameVerify = getAsBooleanOrDefault(jsonObject, "dmaap.certificateConfig.httpsHostnameVerify",
+                    Boolean.TRUE);
+            } catch (DatafileTaskException e) {
+                throw new DatafileTaskException(
+                    "Wrong configuration. External certificate enabled but configs are missing: "
+                        + e.getMessage());
+            }
+        }
+
         return new ImmutableCertificateConfig.Builder() //
-            .keyCert(getAsString(jsonObject, "dmaap.certificateConfig.keyCert"))
-            .keyPasswordPath(getAsString(jsonObject, "dmaap.certificateConfig.keyPasswordPath"))
-            .trustedCa(getAsString(jsonObject, "dmaap.certificateConfig.trustedCa"))
-            .trustedCaPasswordPath(getAsString(jsonObject, "dmaap.certificateConfig.trustedCaPasswordPath")) //
-            .httpsHostnameVerify(getAsBooleanOrDefault(jsonObject, "dmaap.certificateConfig.httpsHostnameVerify", Boolean.TRUE))
+            .keyCert(keyCert)
+            .keyPasswordPath(keyPasswordPath)
+            .trustedCa(trustedCa)
+            .trustedCaPasswordPath(trustedCaPasswordPath) //
+            .httpsHostnameVerify(httpsHostnameVerify)
+            .enableCertAuth(enableCertAuth)
             .build();
     }
 
@@ -219,6 +249,15 @@
         return get(obj, memberName).getAsString();
     }
 
+    private static String getAsOptionalStringOrDefault(JsonObject obj, String memberName, String def) {
+        try {
+            return get(obj, memberName).getAsString();
+        } catch (DatafileTaskException e) {
+            return def;
+        }
+    }
+
+
     private static @NotNull Boolean getAsBoolean(JsonObject obj, String memberName) throws DatafileTaskException {
         return get(obj, memberName).getAsBoolean();
     }
diff --git a/datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/tasks/FileCollector.java b/datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/tasks/FileCollector.java
index 7038043..0df57a2 100644
--- a/datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/tasks/FileCollector.java
+++ b/datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/tasks/FileCollector.java
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START======================================================================
  * Copyright (C) 2018-2019 Nordix Foundation. All rights reserved.
- * Copyright (C) 2020-2021 Nokia. All rights reserved.
+ * Copyright (C) 2020-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. You may obtain a copy of the License at
@@ -175,8 +175,11 @@
             new SftpClientSettings(datafileAppConfig.getSftpConfiguration()));
     }
 
-    protected FtpesClient createFtpesClient(FileData fileData) {
+    protected FtpesClient createFtpesClient(FileData fileData) throws DatafileTaskException {
         CertificateConfig config = datafileAppConfig.getCertificateConfiguration();
+        if (!config.enableCertAuth()) {
+            throw new DatafileTaskException("FTPES error: TLS connection is disabled");
+        }
         return new FtpesClient(fileData.fileServerData(), Paths.get(config.keyCert()), config.keyPasswordPath(),
             Paths.get(config.trustedCa()), config.trustedCaPasswordPath());
     }
@@ -186,6 +189,9 @@
     }
 
     protected FileCollectClient createHttpsClient(FileData fileData) throws DatafileTaskException {
+        if (!datafileAppConfig.getCertificateConfiguration().enableCertAuth()) {
+            throw new DatafileTaskException("HTTPS error: TLS connection is disabled");
+        }
         return new DfcHttpsClient(fileData.fileServerData(), HttpsClientConnectionManagerUtil.instance());
     }
 }
diff --git a/datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/configuration/AppConfigTest.java b/datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/configuration/AppConfigTest.java
index 839a9a1..3c94029 100644
--- a/datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/configuration/AppConfigTest.java
+++ b/datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/configuration/AppConfigTest.java
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START======================================================================
- * Copyright (C) 2018, 2020-2021 NOKIA Intellectual Property, 2018-2019 Nordix Foundation.
- * All rights reserved.
+ * Copyright (C) 2018, 2020-2022 Nokia. All rights reserved.
+ * Copyright (C) 2018-2019 Nordix Foundation. 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
@@ -91,6 +91,7 @@
             .trustedCa("/src/test/resources/cert.jks") //
             .trustedCaPasswordPath("/src/test/resources/cert.jks.pass") //
             .httpsHostnameVerify(true)
+            .enableCertAuth(true)
             .build();
 
     private AppConfig appConfigUnderTest;
@@ -129,6 +130,19 @@
     }
 
     @Test
+    void shouldInitializeApplicationWithoutCertificates() throws IOException {
+        // When
+        doReturn(getCorrectConfigWithoutTLS()).when(appConfigUnderTest).createInputStream(any());
+        appConfigUnderTest.initialize();
+
+        // Then
+        verify(appConfigUnderTest, times(1)).loadConfigurationFromFile();
+
+        CertificateConfig certificateConfig = appConfigUnderTest.getCertificateConfiguration();
+        assertThat(certificateConfig).isNotNull();
+    }
+
+    @Test
     void whenTheConfigurationFits_twoProducers() throws IOException, DatafileTaskException {
         // When
         doReturn(getCorrectJsonTwoProducers()).when(appConfigUnderTest).createInputStream(any());
@@ -293,6 +307,12 @@
         return new ByteArrayInputStream((string.getBytes(StandardCharsets.UTF_8)));
     }
 
+    private static InputStream getCorrectConfigWithoutTLS() throws IOException {
+        URL url = CloudConfigParser.class.getClassLoader().getResource("datafile_test_config_no_tls.json");
+        String string = Resources.toString(url, Charsets.UTF_8);
+        return new ByteArrayInputStream((string.getBytes(StandardCharsets.UTF_8)));
+    }
+
     private static InputStream getCorrectJsonTwoProducers() throws IOException {
         URL url = CloudConfigParser.class.getClassLoader().getResource("datafile_endpoints_test_2producers.json");
         String string = Resources.toString(url, Charsets.UTF_8);
diff --git a/datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/configuration/CloudConfigParserTest.java b/datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/configuration/CloudConfigParserTest.java
new file mode 100644
index 0000000..e7ef7d7
--- /dev/null
+++ b/datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/configuration/CloudConfigParserTest.java
@@ -0,0 +1,78 @@
+/*-
+ * ============LICENSE_START======================================================================
+ * 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. 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.collectors.datafile.configuration;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import org.junit.jupiter.api.Test;
+import org.onap.dcaegen2.collectors.datafile.exceptions.DatafileTaskException;
+
+class CloudConfigParserTest {
+
+    public static final String CONFIG_TLS_JSON = "src/test/resources/datafile_test_config_tls.json";
+    public static final String CONFIG_NO_TLS_JSON = "src/test/resources/datafile_test_config_no_tls.json";
+    public static final String INCORRECT_CERT_CONFIG_JSON = "src/test/resources/datafile_test_config_incorrect_cert_config.json";
+    public static final String EXPECTED_EXCEPTION_MESSAGE = "Wrong configuration. External certificate enabled but configs are missing: Could not find member: dmaap.certificateConfig.keyCert";
+
+    @Test
+    public void shouldCorrectReadCertificateConfigWithTLS () throws IOException, DatafileTaskException {
+
+        CloudConfigParser parser = getCloudConfigParser(CONFIG_TLS_JSON);
+        CertificateConfig certificateConfig = parser.getCertificateConfig();
+
+        assertEquals(true, certificateConfig.enableCertAuth());
+        assertEquals("/src/test/resources/dfc.jks", certificateConfig.keyCert());
+        assertEquals("/src/test/resources/dfc.jks.pass", certificateConfig.keyPasswordPath());
+        assertEquals("/src/test/resources/cert.jks", certificateConfig.trustedCa());
+        assertEquals("/src/test/resources/cert.jks.pass", certificateConfig.trustedCaPasswordPath());
+        assertEquals(true, certificateConfig.httpsHostnameVerify());
+    }
+
+    @Test
+    public void shouldCorrectReadCertificateConfigWithoutTLS () throws IOException, DatafileTaskException {
+        CloudConfigParser parser = getCloudConfigParser(CONFIG_NO_TLS_JSON);
+        CertificateConfig certificateConfig = parser.getCertificateConfig();
+
+        assertEquals(false, certificateConfig.enableCertAuth());
+        assertEquals("", certificateConfig.keyCert());
+        assertEquals("", certificateConfig.keyPasswordPath());
+        assertEquals("", certificateConfig.trustedCa());
+        assertEquals("", certificateConfig.trustedCaPasswordPath());
+    }
+
+    @Test
+    public void shouldThrowExceptionWhenCertAuthIsEnabledButPathsPropertyIsMissing () throws IOException {
+        CloudConfigParser parser = getCloudConfigParser(INCORRECT_CERT_CONFIG_JSON);
+
+        DatafileTaskException exception = assertThrows(DatafileTaskException.class, parser::getCertificateConfig);
+        assertTrue(exception.getMessage().contains(EXPECTED_EXCEPTION_MESSAGE));
+    }
+
+    private CloudConfigParser getCloudConfigParser(String configPath) throws IOException {
+        String jsonStr = Files.readString(Path.of(configPath));
+        JsonObject jsonObject = JsonParser.parseString(jsonStr).getAsJsonObject();
+
+        return new CloudConfigParser(jsonObject,null);
+    }
+}
diff --git a/datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/tasks/FileCollectorTest.java b/datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/tasks/FileCollectorTest.java
index ceb8a98..917055c 100644
--- a/datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/tasks/FileCollectorTest.java
+++ b/datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/tasks/FileCollectorTest.java
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START======================================================================
  * Copyright (C) 2018-2019 Nordix Foundation. All rights reserved.
- * Copyright (C) 2020 Nokia. All rights reserved.
+ * Copyright (C) 2020-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. You may obtain a copy of the License at
@@ -18,6 +18,7 @@
 package org.onap.dcaegen2.collectors.datafile.tasks;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
@@ -197,6 +198,8 @@
         assertEquals(0, counters.getNoOfFailedHttpAttempts(),"failedHttpAttempts should have been 0");
     }
 
+
+
     @Test
     public void whenSftpFile_returnCorrectResponse() throws Exception {
         FileCollector collectorUndetTest = spy(new FileCollector(appConfigMock, counters));
@@ -291,6 +294,38 @@
     }
 
     @Test
+    public void whenTlsDisabled_ThrowExceptionForHttpsFile() {
+        when(appConfigMock.getCertificateConfiguration().enableCertAuth()).thenReturn(false);
+        FileCollector collectorUndetTest = spy(new FileCollector(appConfigMock, counters));
+        FileData fileData = createFileData(HTTPS_LOCATION, Scheme.HTTPS);
+
+        StepVerifier.create(collectorUndetTest.collectFile(fileData, 3, Duration.ofSeconds(0), contextMap))
+            .expectErrorMessage("Retries exhausted: 3/3")
+            .verify();
+
+        StepVerifier.create(collectorUndetTest.collectFile(fileData, 3, Duration.ofSeconds(0), contextMap))
+            .consumeErrorWith(throwable ->
+                assertEquals("HTTPS error: TLS connection is disabled", throwable.getCause().getMessage()))
+            .verify();
+    }
+
+    @Test
+    public void whenTlsDisabled_ThrowExceptionForFtpesFile() {
+        when(appConfigMock.getCertificateConfiguration().enableCertAuth()).thenReturn(false);
+        FileCollector collectorUndetTest = spy(new FileCollector(appConfigMock, counters));
+        FileData fileData = createFileData(FTPES_LOCATION, Scheme.FTPES);
+
+        StepVerifier.create(collectorUndetTest.collectFile(fileData, 3, Duration.ofSeconds(0), contextMap))
+            .expectErrorMessage("Retries exhausted: 3/3")
+            .verify();
+
+        StepVerifier.create(collectorUndetTest.collectFile(fileData, 3, Duration.ofSeconds(0), contextMap))
+            .consumeErrorWith(throwable ->
+                assertEquals("FTPES error: TLS connection is disabled", throwable.getCause().getMessage()))
+            .verify();
+    }
+
+    @Test
     public void whenFtpesFileAlwaysFail_retryAndFail() throws Exception {
         FileCollector collectorUndetTest = spy(new FileCollector(appConfigMock, counters));
         doReturn(ftpesClientMock).when(collectorUndetTest).createFtpesClient(any());
diff --git a/datafile-app-server/src/test/resources/datafile_test_config_incorrect_cert_config.json b/datafile-app-server/src/test/resources/datafile_test_config_incorrect_cert_config.json
new file mode 100644
index 0000000..a282c5c
--- /dev/null
+++ b/datafile-app-server/src/test/resources/datafile_test_config_incorrect_cert_config.json
@@ -0,0 +1,41 @@
+{
+  "config": {
+    "dmaap.certificateConfig.enableCertAuth": true,
+    "dmaap.certificateConfig.keyCert.missing": "/src/test/resources/dfc.jks",
+    "dmaap.certificateConfig.keyPasswordPath": "/src/test/resources/dfc.jks.pass",
+    "dmaap.certificateConfig.trustedCa": "/src/test/resources/cert.jks",
+    "dmaap.certificateConfig.trustedCaPasswordPath": "/src/test/resources/cert.jks.pass",
+    "dmaap.certificateConfig.httpsHostnameVerify": true,
+    "dmaap.security.trustStorePath": "src/test/resources/trust.jks",
+    "dmaap.security.trustStorePasswordPath": "src/test/resources/trust.pass",
+    "dmaap.security.keyStorePath": "src/test/resources/cert.jks",
+    "dmaap.security.keyStorePasswordPath": "src/test/resources/jks.pass",
+    "dmaap.security.enableDmaapCertAuth": "true",
+    "dmaap.dmaapConsumerConfiguration.consumerGroup": "OpenDcae-c12",
+    "dmaap.dmaapConsumerConfiguration.consumerId": "C12",
+    "dmaap.dmaapConsumerConfiguration.timeoutMs": 1000,
+    "sftp.security.strictHostKeyChecking": "false",
+    "streams_publishes": {
+      "PM_MEAS_FILES": {
+        "type": "data_router",
+        "dmaap_info": {
+          "username": "CYE9fl40",
+          "location": "loc00",
+          "log_url": "https://localhost:3907/feedlog/1",
+          "publisher_id": "4.307dw",
+          "password": "izBJD8nLjawq0HMG",
+          "publish_url": "https://localhost:3907/publish/1"
+        }
+      }
+    },
+    "streams_subscribes": {
+      "dmaap_subscriber": {
+        "dmaap_info": {
+          "topic_url": "http://localhost:2222/events/unauthenticated.VES_NOTIFICATION_OUTPUT"
+        },
+        "type": "message_router"
+      }
+    }
+  }
+}
+
diff --git a/datafile-app-server/src/test/resources/datafile_test_config_no_tls.json b/datafile-app-server/src/test/resources/datafile_test_config_no_tls.json
new file mode 100644
index 0000000..e51b5cd
--- /dev/null
+++ b/datafile-app-server/src/test/resources/datafile_test_config_no_tls.json
@@ -0,0 +1,37 @@
+{
+  "config": {
+    "dmaap.certificateConfig.enableCertAuth": false,
+    "dmaap.certificateConfig.httpsHostnameVerify": false,
+    "dmaap.security.trustStorePath": "src/test/resources/trust.jks",
+    "dmaap.security.trustStorePasswordPath": "src/test/resources/trust.pass",
+    "dmaap.security.keyStorePath": "src/test/resources/cert.jks",
+    "dmaap.security.keyStorePasswordPath": "src/test/resources/jks.pass",
+    "dmaap.security.enableDmaapCertAuth": "true",
+    "dmaap.dmaapConsumerConfiguration.consumerGroup": "OpenDcae-c12",
+    "dmaap.dmaapConsumerConfiguration.consumerId": "C12",
+    "dmaap.dmaapConsumerConfiguration.timeoutMs": 1000,
+    "sftp.security.strictHostKeyChecking": "false",
+    "streams_publishes": {
+      "PM_MEAS_FILES": {
+        "type": "data_router",
+        "dmaap_info": {
+          "username": "CYE9fl40",
+          "location": "loc00",
+          "log_url": "https://localhost:3907/feedlog/1",
+          "publisher_id": "4.307dw",
+          "password": "izBJD8nLjawq0HMG",
+          "publish_url": "https://localhost:3907/publish/1"
+        }
+      }
+    },
+    "streams_subscribes": {
+      "dmaap_subscriber": {
+        "dmaap_info": {
+          "topic_url": "http://localhost:2222/events/unauthenticated.VES_NOTIFICATION_OUTPUT"
+        },
+        "type": "message_router"
+      }
+    }
+  }
+}
+
diff --git a/datafile-app-server/src/test/resources/datafile_test_config_tls.json b/datafile-app-server/src/test/resources/datafile_test_config_tls.json
new file mode 100644
index 0000000..54f7581
--- /dev/null
+++ b/datafile-app-server/src/test/resources/datafile_test_config_tls.json
@@ -0,0 +1,40 @@
+{
+  "config": {
+    "dmaap.certificateConfig.keyCert": "/src/test/resources/dfc.jks",
+    "dmaap.certificateConfig.keyPasswordPath": "/src/test/resources/dfc.jks.pass",
+    "dmaap.certificateConfig.trustedCa": "/src/test/resources/cert.jks",
+    "dmaap.certificateConfig.trustedCaPasswordPath": "/src/test/resources/cert.jks.pass",
+    "dmaap.certificateConfig.httpsHostnameVerify": true,
+    "dmaap.security.trustStorePath": "src/test/resources/trust.jks",
+    "dmaap.security.trustStorePasswordPath": "src/test/resources/trust.pass",
+    "dmaap.security.keyStorePath": "src/test/resources/cert.jks",
+    "dmaap.security.keyStorePasswordPath": "src/test/resources/jks.pass",
+    "dmaap.security.enableDmaapCertAuth": "true",
+    "dmaap.dmaapConsumerConfiguration.consumerGroup": "OpenDcae-c12",
+    "dmaap.dmaapConsumerConfiguration.consumerId": "C12",
+    "dmaap.dmaapConsumerConfiguration.timeoutMs": 1000,
+    "sftp.security.strictHostKeyChecking": "false",
+    "streams_publishes": {
+      "PM_MEAS_FILES": {
+        "type": "data_router",
+        "dmaap_info": {
+          "username": "CYE9fl40",
+          "location": "loc00",
+          "log_url": "https://localhost:3907/feedlog/1",
+          "publisher_id": "4.307dw",
+          "password": "izBJD8nLjawq0HMG",
+          "publish_url": "https://localhost:3907/publish/1"
+        }
+      }
+    },
+    "streams_subscribes": {
+      "dmaap_subscriber": {
+        "dmaap_info": {
+          "topic_url": "http://localhost:2222/events/unauthenticated.VES_NOTIFICATION_OUTPUT"
+        },
+        "type": "message_router"
+      }
+    }
+  }
+}
+
diff --git a/pom.xml b/pom.xml
index 512c9b6..033764c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
   ~ ============LICENSE_START=====================================================================
-  ~ Copyright (C) 2018-2022 NOKIA Intellectual Property. All rights reserved.
+  ~ Copyright (C) 2018-2022 Nokia. All rights reserved.
   ~ Copyright (C) 2018-2021 Nordix Foundation. All rights reserved.
   ~ Copyright (C) 2021 Samsung Electronics. All rights reserved.
   ~ ==============================================================================================
@@ -32,7 +32,7 @@
 
     <groupId>org.onap.dcaegen2.collectors</groupId>
     <artifactId>datafile</artifactId>
-    <version>1.7.1-SNAPSHOT</version>
+    <version>1.8.0-SNAPSHOT</version>
 
     <name>dcaegen2-collectors.datafile</name>
     <description>datafile collector</description>
diff --git a/version.properties b/version.properties
index 35cb39c..3c57200 100644
--- a/version.properties
+++ b/version.properties
@@ -1,6 +1,6 @@
 major=1

-minor=7

-patch=1

+minor=8

+patch=0

 base_version=${major}.${minor}.${patch}

 release_version=${base_version}

 snapshot_version=${base_version}-SNAPSHOT