Implement improved MinIo client

Change-Id: Ic9abd6b0bdaa17e9deff2279a64416d81f7ad606
Signed-off-by: Vasyl Razinkov <vasyl.razinkov@est.tech>
Issue-ID: SDC-3886
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/OrchestrationTemplateCandidateImpl.java b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/OrchestrationTemplateCandidateImpl.java
index b515839..01d2a59 100644
--- a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/OrchestrationTemplateCandidateImpl.java
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/OrchestrationTemplateCandidateImpl.java
@@ -32,6 +32,7 @@
 import static org.openecomp.sdc.common.errors.Messages.UNEXPECTED_PROBLEM_HAPPENED_WHILE_GETTING;
 
 import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -102,6 +103,7 @@
     private final VendorSoftwareProductManager vendorSoftwareProductManager;
     private final ActivityLogManager activityLogManager;
     private final ArtifactStorageManager artifactStorageManager;
+    private final StorageFactory storageFactory;
     private final PackageSizeReducer packageSizeReducer;
     private final OrchestrationTemplateCandidateUploadManager orchestrationTemplateCandidateUploadManager;
 
@@ -111,7 +113,7 @@
         this.vendorSoftwareProductManager = VspManagerFactory.getInstance().createInterface();
         this.activityLogManager = ActivityLogManagerFactory.getInstance().createInterface();
         LOGGER.info("Instantiating artifactStorageManager");
-        final StorageFactory storageFactory = new StorageFactory();
+        this.storageFactory = new StorageFactory();
         this.artifactStorageManager = storageFactory.createArtifactStorageManager();
         LOGGER.info("Instantiating packageSizeReducer");
         this.packageSizeReducer = storageFactory.createPackageSizeReducer().orElse(null);
@@ -129,12 +131,14 @@
         this.vendorSoftwareProductManager = vendorSoftwareProductManager;
         this.activityLogManager = activityLogManager;
         this.artifactStorageManager = artifactStorageManager;
+        this.storageFactory = new StorageFactory();
         this.packageSizeReducer = packageSizeReducer;
         this.orchestrationTemplateCandidateUploadManager = orchestrationTemplateCandidateUploadManager;
     }
 
     @Override
     public Response upload(String vspId, String versionId, final Attachment fileToUpload, final String user) {
+        LOGGER.debug("STARTED -> OrchestrationTemplateCandidateImpl.upload");
         vspId = ValidationUtils.sanitizeInputString(vspId);
         versionId = ValidationUtils.sanitizeInputString(versionId);
         final Response response;
@@ -145,6 +149,7 @@
             final DataHandler dataHandler = fileToUpload.getDataHandler();
             final var filename = ValidationUtils.sanitizeInputString(dataHandler.getName());
             ArtifactInfo artifactInfo = null;
+            final ArtifactStorageManager artifactStorageManager = storageFactory.createArtifactStorageManager();
             if (artifactStorageManager.isEnabled()) {
                 artifactInfo = handleArtifactStorage(vspId, versionId, filename, dataHandler);
                 fileToUploadBytes = artifactInfo.getBytes();
@@ -190,6 +195,7 @@
             }
             throw ex;
         }
+        LOGGER.debug("FINISHED -> OrchestrationTemplateCandidateImpl.upload");
         return response;
     }
 
@@ -202,22 +208,26 @@
             final Path folder = Path.of(storageConfiguration.getTempPath()).resolve(vspId).resolve(versionId);
             tempArtifactPath = folder.resolve(UUID.randomUUID().toString());
             Files.createDirectories(folder);
+            LOGGER.debug("STARTED -> Transfer to '{}'", tempArtifactPath.toString());
             try (final InputStream packageInputStream = artifactDataHandler.getInputStream();
                 final var fileOutputStream = new FileOutputStream(tempArtifactPath.toFile())) {
                 packageInputStream.transferTo(fileOutputStream);
             }
+            LOGGER.debug("FINISHED -> Transfer to '{}'", tempArtifactPath.toString());
         } catch (final Exception e) {
             throw new ArtifactStorageException(UNEXPECTED_PROBLEM_HAPPENED_WHILE_GETTING.formatMessage(filename));
         }
         final ArtifactInfo artifactInfo;
-        try (final InputStream inputStream = Files.newInputStream(tempArtifactPath)) {
+        try (final InputStream inputStream = new FileInputStream(tempArtifactPath.toFile())) {
             artifactInfo = artifactStorageManager.upload(vspId, versionId, inputStream);
         } catch (final Exception e) {
             LOGGER.error("Package Size Reducer not configured", e);
             throw new ArtifactStorageException(ERROR_HAS_OCCURRED_WHILE_PERSISTING_THE_ARTIFACT.formatMessage(filename));
         }
         try {
+            LOGGER.debug("STARTED -> reducing '{}'", tempArtifactPath.toString());
             artifactInfo.setBytes(packageSizeReducer.reduce(tempArtifactPath));
+            LOGGER.debug("FINISHED -> reducing '{}'", tempArtifactPath.toString());
             Files.delete(tempArtifactPath);
         } catch (final Exception e) {
             LOGGER.error("Package Size Reducer not configured", e);
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/test/java/org/openecomp/sdcrests/vsp/rest/services/OrchestrationTemplateCandidateImplTest.java b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/test/java/org/openecomp/sdcrests/vsp/rest/services/OrchestrationTemplateCandidateImplTest.java
index 6c21cc4..802d6d8 100644
--- a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/test/java/org/openecomp/sdcrests/vsp/rest/services/OrchestrationTemplateCandidateImplTest.java
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/test/java/org/openecomp/sdcrests/vsp/rest/services/OrchestrationTemplateCandidateImplTest.java
@@ -65,6 +65,7 @@
 import org.openecomp.sdc.be.csar.storage.MinIoStorageArtifactStorageConfig.Credentials;
 import org.openecomp.sdc.be.csar.storage.MinIoStorageArtifactStorageConfig.EndPoint;
 import org.openecomp.sdc.be.csar.storage.PackageSizeReducer;
+import org.openecomp.sdc.be.csar.storage.StorageFactory;
 import org.openecomp.sdc.logging.api.Logger;
 import org.openecomp.sdc.logging.api.LoggerFactory;
 import org.openecomp.sdc.vendorsoftwareproduct.OrchestrationTemplateCandidateManager;
@@ -100,6 +101,10 @@
     private PackageSizeReducer packageSizeReducer;
     @Mock
     private OrchestrationTemplateCandidateUploadManager orchestrationTemplateCandidateUploadManager;
+    @Mock
+    private StorageFactory storageFactory;
+    @Mock
+    private Attachment fileToUpload;
     @InjectMocks
     private OrchestrationTemplateCandidateImpl orchestrationTemplateCandidate;
 
@@ -178,9 +183,10 @@
 
     @Test
     void uploadNotSignedArtifactStorageManagerIsEnabledTest() throws IOException {
+        when(storageFactory.createArtifactStorageManager()).thenReturn(artifactStorageManager);
         when(artifactStorageManager.isEnabled()).thenReturn(true);
-        when(artifactStorageManager.getStorageConfiguration()).thenReturn(
-            new MinIoStorageArtifactStorageConfig(true, new EndPoint("host", 9000, false), new Credentials("accessKey", "secretKey"), "tempPath"));
+        when(artifactStorageManager.getStorageConfiguration()).thenReturn(new MinIoStorageArtifactStorageConfig
+            (true, new EndPoint("host", 9000, false), new Credentials("accessKey", "secretKey"), "tempPath", 10_000_000));
 
         final Path path = Path.of("src/test/resources/files/sample-not-signed.csar");
         final String vspId = "vspId";
@@ -316,12 +322,10 @@
         vspUploadStatusDto.setLockId(UUID.randomUUID());
         when(orchestrationTemplateCandidateUploadManager.putUploadInProgress(candidateId, versionId, user)).thenReturn(vspUploadStatusDto);
         final RuntimeException forcedException = new RuntimeException();
-        when(artifactStorageManager.isEnabled()).thenThrow(forcedException);
-        final Attachment mock = Mockito.mock(Attachment.class);
-        when(mock.getDataHandler()).thenReturn(Mockito.mock(DataHandler.class));
+        when(fileToUpload.getDataHandler()).thenThrow(forcedException);
         //when
         final RuntimeException actualException = assertThrows(RuntimeException.class,
-            () -> orchestrationTemplateCandidate.upload(candidateId, versionId, mock, user));
+            () -> orchestrationTemplateCandidate.upload(candidateId, versionId, fileToUpload, user));
         //then
         assertEquals(forcedException, actualException);
         verify(orchestrationTemplateCandidateUploadManager)
diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/CsarSecurityValidatorTest.java b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/CsarSecurityValidatorTest.java
index 5f88070..25b9ff0 100644
--- a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/CsarSecurityValidatorTest.java
+++ b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/validation/CsarSecurityValidatorTest.java
@@ -150,6 +150,7 @@
                 when(commonConfigurationManager.getConfigValue("externalCsarStore", "credentials", null)).thenReturn(credentials);
                 when(commonConfigurationManager.getConfigValue("externalCsarStore", "tempPath", null)).thenReturn("cert/2-file-signed-package");
                 when(commonConfigurationManager.getConfigValue(eq("externalCsarStore"), eq("storageType"), any())).thenReturn(MINIO.name());
+                when(commonConfigurationManager.getConfigValue(eq("externalCsarStore"), eq("uploadPartSize"), any())).thenReturn(50_000_000);
 
                 final byte[] packageBytes = getFileBytesOrFail("signed-package-tampered-data.zip");
 
diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/security/SecurityManagerTest.java b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/security/SecurityManagerTest.java
index afc4396..b9f3d87 100644
--- a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/security/SecurityManagerTest.java
+++ b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/security/SecurityManagerTest.java
@@ -180,6 +180,7 @@
                 when(commonConfigurationManager.getConfigValue("externalCsarStore", "credentials", null)).thenReturn(credentials);
                 when(commonConfigurationManager.getConfigValue("externalCsarStore", "tempPath", null)).thenReturn("cert/2-file-signed-package");
                 when(commonConfigurationManager.getConfigValue(eq("externalCsarStore"), eq("storageType"), any())).thenReturn(MINIO.name());
+                when(commonConfigurationManager.getConfigValue(eq("externalCsarStore"), eq("uploadPartSize"), any())).thenReturn(50_000_000);
 
                 prepareCertFiles("/cert/rootCA.cert", cerDirPath + "root.cert");
                 byte[] fileToUploadBytes = readAllBytes("/cert/2-file-signed-package/2-file-signed-package.zip");
@@ -248,6 +249,7 @@
                 when(commonConfigurationManager.getConfigValue("externalCsarStore", "credentials", null)).thenReturn(credentials);
                 when(commonConfigurationManager.getConfigValue("externalCsarStore", "tempPath", null)).thenReturn("tempPath");
                 when(commonConfigurationManager.getConfigValue(eq("externalCsarStore"), eq("storageType"), any())).thenReturn(MINIO.name());
+                when(commonConfigurationManager.getConfigValue(eq("externalCsarStore"), eq("uploadPartSize"), any())).thenReturn(50_000_000);
 
                 prepareCertFiles("/cert/rootCA.cert", cerDirPath + "root.cert");
                 byte[] fileToUploadBytes = readAllBytes("/cert/3-file-signed-package/3-file-signed-package.zip");
diff --git a/openecomp-be/dist/sdc-onboard-backend-docker/artifacts/chef-repo/cookbooks/sdc-onboard-backend/files/default/logback.xml b/openecomp-be/dist/sdc-onboard-backend-docker/artifacts/chef-repo/cookbooks/sdc-onboard-backend/files/default/logback.xml
index 34dd8e3..49ae967 100644
--- a/openecomp-be/dist/sdc-onboard-backend-docker/artifacts/chef-repo/cookbooks/sdc-onboard-backend/files/default/logback.xml
+++ b/openecomp-be/dist/sdc-onboard-backend-docker/artifacts/chef-repo/cookbooks/sdc-onboard-backend/files/default/logback.xml
@@ -211,4 +211,5 @@
     </root>
 
     <logger name="org.openecomp.sdc" level="INFO"/>
+    <logger name="org.openecomp.sdcrests" level="INFO"/>
 </configuration>
\ No newline at end of file
diff --git a/openecomp-be/dist/sdc-onboard-backend-docker/artifacts/chef-repo/cookbooks/sdc-onboard-backend/templates/default/configuration.yaml.erb b/openecomp-be/dist/sdc-onboard-backend-docker/artifacts/chef-repo/cookbooks/sdc-onboard-backend/templates/default/configuration.yaml.erb
index 3b02114..ae07857 100644
--- a/openecomp-be/dist/sdc-onboard-backend-docker/artifacts/chef-repo/cookbooks/sdc-onboard-backend/templates/default/configuration.yaml.erb
+++ b/openecomp-be/dist/sdc-onboard-backend-docker/artifacts/chef-repo/cookbooks/sdc-onboard-backend/templates/default/configuration.yaml.erb
@@ -68,3 +68,4 @@
   sizeLimit: 10000000
   thresholdEntries: 10000
   tempPath: "/home/onap/temp/"
+  uploadPartSize: 200000000
diff --git a/openecomp-be/dist/sdc-onboard-backend-docker/artifacts/startup.sh b/openecomp-be/dist/sdc-onboard-backend-docker/artifacts/startup.sh
index dc68d6f..0829fba 100644
--- a/openecomp-be/dist/sdc-onboard-backend-docker/artifacts/startup.sh
+++ b/openecomp-be/dist/sdc-onboard-backend-docker/artifacts/startup.sh
@@ -7,6 +7,7 @@
             -Dlogback.configurationFile=$JETTY_BASE/config/onboarding-be/logback.xml \
             -Dconfiguration.yaml=$JETTY_BASE/config/onboarding-be/onboarding_configuration.yaml \
             -Dfeatures.properties=$JETTY_BASE/config/onboarding-be/features.properties \
+            -XX:+HeapDumpOnOutOfMemoryError \
             -Dconfig.location=$JETTY_BASE/config/onboarding-be/."
 
 cd $JETTY_BASE
diff --git a/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/CommonConfigurationManager.java b/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/CommonConfigurationManager.java
index 46747fb..92ace44 100644
--- a/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/CommonConfigurationManager.java
+++ b/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/CommonConfigurationManager.java
@@ -19,21 +19,21 @@
  */
 package org.openecomp.sdc.common;
 
-import org.onap.sdc.tosca.services.YamlUtil;
-import org.openecomp.sdc.logging.api.Logger;
-import org.openecomp.sdc.logging.api.LoggerFactory;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.function.BiConsumer;
+import org.onap.sdc.tosca.services.YamlUtil;
+import org.openecomp.sdc.logging.api.Logger;
+import org.openecomp.sdc.logging.api.LoggerFactory;
 
 /**
- * This is a common class that can access the config file given in input to the JVM with the parameter
- * -Dconfiguration.yaml=file.yaml.
+ * This is a common class that can access the config file given in input to the JVM with the parameter -Dconfiguration.yaml=file.yaml.
  */
 public class CommonConfigurationManager {
+
     public static final String JVM_PARAM_CONFIGURATION_FILE = "configuration.yaml";
     private static final Logger LOGGER = LoggerFactory.getLogger(CommonConfigurationManager.class);
     private static CommonConfigurationManager singletonInstance;
@@ -57,6 +57,10 @@
         return singletonInstance;
     }
 
+    public void reload() {
+        initConfiguration();
+    }
+
     private void initConfiguration() {
         YamlUtil yamlUtil = new YamlUtil();
         readConfigurationFromStream(yamlUtil, (filename, stream) -> {
@@ -106,7 +110,7 @@
         Map<String, Object> section = this.configuration.get(yamlSection);
         if (section == null) {
             LOGGER.error("Section " + yamlSection + " is missing in configuration file '" + configFilename +
-                    "'. Using defaults");
+                "'. Using defaults");
             return defaultValue;
         }
         Object value = section.get(name);
@@ -114,15 +118,14 @@
             return value == null ? defaultValue : (T) value;
         } catch (ClassCastException e) {
             LOGGER.warn(
-                    String.format("Failed to read configuration property '%s' as requested type. Using default '%s'",
-                            name, defaultValue), e);
+                String.format("Failed to read configuration property '%s' as requested type. Using default '%s'",
+                    name, defaultValue), e);
             return defaultValue;
         }
     }
 
     /**
-     * This method can be used to access a specific configuration parameter in the configuration in the
-     * yamlSection predefined in the constructor.
+     * This method can be used to access a specific configuration parameter in the configuration in the yamlSection predefined in the constructor.
      *
      * @param name         The name of the config
      * @param defaultValue A default value