diff options
author | vasraz <vasyl.razinkov@est.tech> | 2022-02-26 17:22:58 +0000 |
---|---|---|
committer | Vasyl Razinkov <vasyl.razinkov@est.tech> | 2022-02-26 18:25:12 +0000 |
commit | 4b978c9cc115c4f4032d5f3dbc4d3cde002449cc (patch) | |
tree | b3986d499eb989c5210a25522258c6678b691dd3 /openecomp-be | |
parent | d0c2403f1f7088d60b135976c40917302daf8b9e (diff) |
Implement improved MinIo client
Change-Id: Ic9abd6b0bdaa17e9deff2279a64416d81f7ad606
Signed-off-by: Vasyl Razinkov <vasyl.razinkov@est.tech>
Issue-ID: SDC-3886
Diffstat (limited to 'openecomp-be')
8 files changed, 41 insertions, 18 deletions
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 b51583980d..01d2a59e45 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.PACKAGE_PROCESS_ERROR; 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 @@ public class OrchestrationTemplateCandidateImpl implements OrchestrationTemplate 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 @@ public class OrchestrationTemplateCandidateImpl implements OrchestrationTemplate 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 @@ public class OrchestrationTemplateCandidateImpl implements OrchestrationTemplate 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 @@ public class OrchestrationTemplateCandidateImpl implements OrchestrationTemplate 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 @@ public class OrchestrationTemplateCandidateImpl implements OrchestrationTemplate } throw ex; } + LOGGER.debug("FINISHED -> OrchestrationTemplateCandidateImpl.upload"); return response; } @@ -202,22 +208,26 @@ public class OrchestrationTemplateCandidateImpl implements OrchestrationTemplate 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 6c21cc471e..802d6d885a 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; 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 @@ class OrchestrationTemplateCandidateImplTest { private PackageSizeReducer packageSizeReducer; @Mock private OrchestrationTemplateCandidateUploadManager orchestrationTemplateCandidateUploadManager; + @Mock + private StorageFactory storageFactory; + @Mock + private Attachment fileToUpload; @InjectMocks private OrchestrationTemplateCandidateImpl orchestrationTemplateCandidate; @@ -178,9 +183,10 @@ class OrchestrationTemplateCandidateImplTest { @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 @@ class OrchestrationTemplateCandidateImplTest { 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 5f880701f3..25b9ff0f68 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 @@ class CsarSecurityValidatorTest { 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 afc43967c9..b9f3d8707f 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 @@ class SecurityManagerTest { 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 @@ class SecurityManagerTest { 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 34dd8e3e6c..49ae967d7f 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 3b02114334..ae07857585 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 @@ externalCsarStore: 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 dc68d6f3a5..0829fba3ae 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 @@ JAVA_OPTIONS="$JAVA_OPTIONS \ -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 46747fb881..92ace445da 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 @@ public class CommonConfigurationManager { return singletonInstance; } + public void reload() { + initConfiguration(); + } + private void initConfiguration() { YamlUtil yamlUtil = new YamlUtil(); readConfigurationFromStream(yamlUtil, (filename, stream) -> { @@ -106,7 +110,7 @@ public class CommonConfigurationManager { 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 @@ public class CommonConfigurationManager { 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 |