summaryrefslogtreecommitdiffstats
path: root/openecomp-be/api/openecomp-sdc-rest-webapp
diff options
context:
space:
mode:
Diffstat (limited to 'openecomp-be/api/openecomp-sdc-rest-webapp')
-rw-r--r--openecomp-be/api/openecomp-sdc-rest-webapp/onboarding-rest-war/src/main/webapp/WEB-INF/beans-services.xml6
-rw-r--r--openecomp-be/api/openecomp-sdc-rest-webapp/openecomp-sdc-common-rest/src/main/java/org/openecomp/sdcrests/errors/DefaultExceptionMapper.java40
-rw-r--r--openecomp-be/api/openecomp-sdc-rest-webapp/openecomp-sdc-common-rest/src/main/java/org/openecomp/sdcrests/mapping/MappingBase.java2
-rw-r--r--openecomp-be/api/openecomp-sdc-rest-webapp/openecomp-sdc-common-rest/src/main/resources/errorCodesToResponseStatusMapping.json6
-rw-r--r--openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/OrchestrationTemplateCandidateUploadManagerController.java65
-rw-r--r--openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/controllers/OrchestrationTemplateCandidateUploadManagerControllerImpl.java71
-rw-r--r--openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/exception/OrchestrationTemplateCandidateUploadManagerExceptionSupplier.java84
-rw-r--r--openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/mapping/VspUploadStatusRecordMapper.java40
-rw-r--r--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.java144
-rw-r--r--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/OrchestrationTemplateCandidateUploadManager.java63
-rw-r--r--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/OrchestrationTemplateCandidateUploadManagerImpl.java171
-rw-r--r--openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/test/java/org/openecomp/sdcrests/vsp/rest/controllers/OrchestrationTemplateCandidateUploadManagerControllerImplTest.java92
-rw-r--r--openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/test/java/org/openecomp/sdcrests/vsp/rest/mapping/VspUploadStatusRecordMapperTest.java59
-rw-r--r--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.java23
-rw-r--r--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/OrchestrationTemplateCandidateUploadManagerImplTest.java312
-rw-r--r--openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-types/src/main/java/org/openecomp/sdcrests/vendorsoftwareproducts/types/VspUploadStatusDto.java44
16 files changed, 1134 insertions, 88 deletions
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/onboarding-rest-war/src/main/webapp/WEB-INF/beans-services.xml b/openecomp-be/api/openecomp-sdc-rest-webapp/onboarding-rest-war/src/main/webapp/WEB-INF/beans-services.xml
index 62ae816cea..f4a84a0056 100644
--- a/openecomp-be/api/openecomp-sdc-rest-webapp/onboarding-rest-war/src/main/webapp/WEB-INF/beans-services.xml
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/onboarding-rest-war/src/main/webapp/WEB-INF/beans-services.xml
@@ -14,6 +14,7 @@
<!-- CXF -->
<context:component-scan base-package="org.openecomp.sdcrests"/>
+ <context:component-scan base-package="org.openecomp.sdc.vendorsoftwareproduct.dao"/>
<!-- Needed for JSR-303 validations. May be removed when moving to JAX-RS 2.0 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
@@ -60,6 +61,7 @@
<ref bean="licenseKeyGroups"/>
<ref bean="licenseKeyGroupLimits"/>
<ref bean="vendorSoftwareProducts"/>
+ <ref bean="packageUploadManagerController"/>
<ref bean="networks"/>
<ref bean="components"/>
<ref bean="nics"/>
@@ -72,9 +74,9 @@
<ref bean="applicationConfiguration"/>
<ref bean="componentMonitoringUploads"/>
<ref bean="deploymentFlavors"/>
- <ref bean="images"/>
+ <ref bean="images"/>
<ref bean="orchestrationTemplateCandidate"/>
- <ref bean="vnfPackageRepository"/>
+ <ref bean="vnfPackageRepository"/>
<ref bean="componentDependencies"/>
<ref bean="healthCheck"/>
<ref bean="itemPermissions"/>
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/openecomp-sdc-common-rest/src/main/java/org/openecomp/sdcrests/errors/DefaultExceptionMapper.java b/openecomp-be/api/openecomp-sdc-rest-webapp/openecomp-sdc-common-rest/src/main/java/org/openecomp/sdcrests/errors/DefaultExceptionMapper.java
index 0546180575..a256af785c 100644
--- a/openecomp-be/api/openecomp-sdc-rest-webapp/openecomp-sdc-common-rest/src/main/java/org/openecomp/sdcrests/errors/DefaultExceptionMapper.java
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/openecomp-sdc-common-rest/src/main/java/org/openecomp/sdcrests/errors/DefaultExceptionMapper.java
@@ -25,6 +25,7 @@ import javax.validation.ConstraintViolationException;
import javax.validation.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import org.apache.commons.collections4.CollectionUtils;
import org.hibernate.validator.internal.engine.path.PathImpl;
@@ -52,11 +53,11 @@ public class DefaultExceptionMapper implements ExceptionMapper<Exception> {
public Response toResponse(Exception exception) {
Response response;
if (exception instanceof CoreException) {
- response = transform(CoreException.class.cast(exception));
+ response = transform((CoreException) exception);
} else if (exception instanceof ConstraintViolationException) {
- response = transform(ConstraintViolationException.class.cast(exception));
+ response = transform((ConstraintViolationException) exception);
} else if (exception instanceof JsonMappingException) {
- response = transform(JsonMappingException.class.cast(exception));
+ response = transform((JsonMappingException) exception);
} else {
response = transform(exception);
}
@@ -66,22 +67,21 @@ public class DefaultExceptionMapper implements ExceptionMapper<Exception> {
return response;
}
- private Response transform(CoreException coreException) {
- Response response;
- ErrorCode code = coreException.code();
+ private Response transform(final CoreException coreException) {
+ final ErrorCode code = coreException.code();
LOGGER.error(code.message(), coreException);
if (coreException.code().category().equals(ErrorCategory.APPLICATION)) {
- if (Response.Status.NOT_FOUND.name().equals(ERROR_CODE_TO_RESPONSE_STATUS.get(code.id()))) {
- response = Response.status(Response.Status.NOT_FOUND).entity(toEntity(Response.Status.NOT_FOUND, code)).build();
- } else if (Response.Status.BAD_REQUEST.name().equals(ERROR_CODE_TO_RESPONSE_STATUS.get(code.id()))) {
- response = Response.status(Response.Status.BAD_REQUEST).entity(toEntity(Response.Status.BAD_REQUEST, code)).build();
- } else {
- response = Response.status(Response.Status.EXPECTATION_FAILED).entity(toEntity(Response.Status.EXPECTATION_FAILED, code)).build();
+ final Status errorStatus = Status.valueOf(ERROR_CODE_TO_RESPONSE_STATUS.get(code.id()));
+ if (List.of(Status.BAD_REQUEST, Status.FORBIDDEN, Status.NOT_FOUND, Status.INTERNAL_SERVER_ERROR).contains(errorStatus)) {
+ return buildResponse(errorStatus, code);
}
- } else {
- response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(toEntity(Response.Status.INTERNAL_SERVER_ERROR, code)).build();
+ return buildResponse(Status.EXPECTATION_FAILED, code);
}
- return response;
+ return buildResponse(Status.INTERNAL_SERVER_ERROR, code);
+ }
+
+ private Response buildResponse(Status notFound, ErrorCode code) {
+ return Response.status(notFound).entity(toEntity(notFound, code)).build();
}
private Response transform(ConstraintViolationException validationException) {
@@ -98,28 +98,26 @@ public class DefaultExceptionMapper implements ExceptionMapper<Exception> {
}
ErrorCode validationErrorCode = new ValidationErrorBuilder(message, fieldName).build();
LOGGER.error(validationErrorCode.message(), validationException);
- return Response.status(Response.Status.EXPECTATION_FAILED) //error 417
- .entity(toEntity(Response.Status.EXPECTATION_FAILED, validationErrorCode)).build();
+ return buildResponse(Status.EXPECTATION_FAILED, validationErrorCode);
}
private Response transform(JsonMappingException jsonMappingException) {
ErrorCode jsonMappingErrorCode = new JsonMappingErrorBuilder().build();
LOGGER.error(jsonMappingErrorCode.message(), jsonMappingException);
- return Response.status(Response.Status.EXPECTATION_FAILED) //error 417
- .entity(toEntity(Response.Status.EXPECTATION_FAILED, jsonMappingErrorCode)).build();
+ return buildResponse(Status.EXPECTATION_FAILED, jsonMappingErrorCode);
}
private Response transform(Exception exception) {
ErrorCode errorCode = new GeneralErrorBuilder().build();
LOGGER.error(errorCode.message(), exception);
- return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(toEntity(Response.Status.INTERNAL_SERVER_ERROR, errorCode)).build();
+ return buildResponse(Status.INTERNAL_SERVER_ERROR, errorCode);
}
private String getFieldName(Path propertyPath) {
return ((PathImpl) propertyPath).getLeafNode().toString();
}
- private Object toEntity(Response.Status status, ErrorCode code) {
+ private Object toEntity(final Status status, final ErrorCode code) {
return new ErrorCodeAndMessage(status, code);
}
}
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/openecomp-sdc-common-rest/src/main/java/org/openecomp/sdcrests/mapping/MappingBase.java b/openecomp-be/api/openecomp-sdc-rest-webapp/openecomp-sdc-common-rest/src/main/java/org/openecomp/sdcrests/mapping/MappingBase.java
index 68a16e854c..133f2e4e6f 100644
--- a/openecomp-be/api/openecomp-sdc-rest-webapp/openecomp-sdc-common-rest/src/main/java/org/openecomp/sdcrests/mapping/MappingBase.java
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/openecomp-sdc-common-rest/src/main/java/org/openecomp/sdcrests/mapping/MappingBase.java
@@ -37,7 +37,7 @@ public abstract class MappingBase<S, T> {
*/
public final T applyMapping(final S source, Class<T> clazz) {
T target = (T) instantiateTarget(clazz);
- if (source != null && target != null) {
+ if (source != null) {
preMapping(source, target);
doMapping(source, target);
postMapping(source, target);
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/openecomp-sdc-common-rest/src/main/resources/errorCodesToResponseStatusMapping.json b/openecomp-be/api/openecomp-sdc-rest-webapp/openecomp-sdc-common-rest/src/main/resources/errorCodesToResponseStatusMapping.json
index 979b6c6047..95b2c07c64 100644
--- a/openecomp-be/api/openecomp-sdc-rest-webapp/openecomp-sdc-common-rest/src/main/resources/errorCodesToResponseStatusMapping.json
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/openecomp-sdc-common-rest/src/main/resources/errorCodesToResponseStatusMapping.json
@@ -1,6 +1,12 @@
{
"VSP_NOT_FOUND": "NOT_FOUND",
"VSP_INVALID": "BAD_REQUEST",
+ "VSP_PROCESSING_IN_PROGRESS": "FORBIDDEN",
+ "VSP_CREATE_UPLOAD_LOCK_ERROR": "INTERNAL_SERVER_ERROR",
+ "VSP_UPDATE_UPLOAD_LOCK_ERROR": "INTERNAL_SERVER_ERROR",
+ "VSP_UPLOAD_LOCK_NOT_FOUND_ERROR": "NOT_FOUND",
+ "VSP_UPLOAD_ALREADY_FINISHED_ERROR": "INTERNAL_SERVER_ERROR",
+ "ORCHESTRATION_NOT_FOUND": "NOT_FOUND",
"UPLOAD_INVALID" : "PRECONDITION_FAILED",
"PACKAGE_NOT_FOUND": "NOT_FOUND",
"PACKAGE_INVALID": "BAD_REQUEST",
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/OrchestrationTemplateCandidateUploadManagerController.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/OrchestrationTemplateCandidateUploadManagerController.java
new file mode 100644
index 0000000000..971a1c42b5
--- /dev/null
+++ 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/OrchestrationTemplateCandidateUploadManagerController.java
@@ -0,0 +1,65 @@
+/*
+ * -
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2022 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdcrests.vsp.rest;
+
+import static org.openecomp.sdcrests.common.RestConstants.USER_ID_HEADER_PARAM;
+import static org.openecomp.sdcrests.common.RestConstants.USER_MISSING_ERROR_MSG;
+import static org.openecomp.sdcrests.vsp.rest.OrchestrationTemplateCandidateUploadManagerController.URL;
+
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import javax.validation.constraints.NotNull;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.springframework.validation.annotation.Validated;
+
+@Path(URL)
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+@Tag(name = "SDCE-1 APIs")
+@Tag(name = "Package Upload Manager")
+@Validated
+public interface OrchestrationTemplateCandidateUploadManagerController extends VspEntities {
+
+ String URL = "/v1.0/vendor-software-products/{vspId}/versions/{versionId}/orchestration-template-candidate/upload";
+
+ /**
+ * Gets the latest package upload status for a Vendor Software Product version.
+ *
+ * @param vspId the vsp id
+ * @param versionId the vsp version id
+ * @param user the username accessing the API
+ * @return if successful, an OK response with the latest VspUploadStatus information
+ */
+ @GET
+ @Path("/")
+ Response getLatestStatus(@Parameter(description = "Vendor Software Product id") @PathParam("vspId") String vspId,
+ @Parameter(description = "Vendor Software Product version id") @PathParam("versionId") String versionId,
+ @NotNull(message = USER_MISSING_ERROR_MSG) @HeaderParam(USER_ID_HEADER_PARAM) String user);
+
+}
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/controllers/OrchestrationTemplateCandidateUploadManagerControllerImpl.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/controllers/OrchestrationTemplateCandidateUploadManagerControllerImpl.java
new file mode 100644
index 0000000000..f96522aa75
--- /dev/null
+++ 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/controllers/OrchestrationTemplateCandidateUploadManagerControllerImpl.java
@@ -0,0 +1,71 @@
+/*
+ * -
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2022 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdcrests.vsp.rest.controllers;
+
+import java.util.Optional;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import org.openecomp.sdc.common.util.ValidationUtils;
+import org.openecomp.sdcrests.vendorsoftwareproducts.types.VspUploadStatusDto;
+import org.openecomp.sdcrests.vsp.rest.OrchestrationTemplateCandidateUploadManagerController;
+import org.openecomp.sdcrests.vsp.rest.services.OrchestrationTemplateCandidateUploadManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+
+@Controller("packageUploadManagerController")
+public class OrchestrationTemplateCandidateUploadManagerControllerImpl implements OrchestrationTemplateCandidateUploadManagerController {
+
+ private final OrchestrationTemplateCandidateUploadManager orchestrationTemplateCandidateUploadManager;
+
+ @Autowired
+ public OrchestrationTemplateCandidateUploadManagerControllerImpl(final OrchestrationTemplateCandidateUploadManager orchestrationTemplateCandidateUploadManager) {
+ this.orchestrationTemplateCandidateUploadManager = orchestrationTemplateCandidateUploadManager;
+ }
+
+ @Override
+ public Response getLatestStatus(String vspId, String versionId, String user) {
+ vspId = ValidationUtils.sanitizeInputString(vspId);
+ versionId = ValidationUtils.sanitizeInputString(versionId);
+ user = ValidationUtils.sanitizeInputString(user);
+
+ final Optional<VspUploadStatusDto> vspUploadStatus = orchestrationTemplateCandidateUploadManager.findLatestStatus(vspId, versionId, user);
+ if (vspUploadStatus.isEmpty()) {
+ return Response.status(Status.NOT_FOUND).build();
+ }
+
+ return Response.ok(vspUploadStatus.get()).build();
+ }
+
+ /**
+ * Builds the string representing the get API url.
+ *
+ * @param vspId the vsp id
+ * @param vspVersionId the vsp version id
+ * @return the string representing the get API url
+ */
+ public static String buildGetUrl(final String vspId, final String vspVersionId) {
+ return OrchestrationTemplateCandidateUploadManagerController.URL
+ .replace("{vspId}", vspId)
+ .replace("{versionId}", vspVersionId);
+ }
+
+}
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/exception/OrchestrationTemplateCandidateUploadManagerExceptionSupplier.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/exception/OrchestrationTemplateCandidateUploadManagerExceptionSupplier.java
new file mode 100644
index 0000000000..2eb0261a1b
--- /dev/null
+++ 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/exception/OrchestrationTemplateCandidateUploadManagerExceptionSupplier.java
@@ -0,0 +1,84 @@
+/*
+ * -
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2022 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdcrests.vsp.rest.exception;
+
+import static org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductErrorCodes.VSP_CREATE_UPLOAD_LOCK_ERROR;
+import static org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductErrorCodes.VSP_PROCESSING_IN_PROGRESS;
+import static org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductErrorCodes.VSP_UPDATE_UPLOAD_LOCK_ERROR;
+import static org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductErrorCodes.VSP_UPLOAD_ALREADY_FINISHED_ERROR;
+import static org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductErrorCodes.VSP_UPLOAD_LOCK_NOT_FOUND_ERROR;
+
+import java.util.UUID;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+import org.openecomp.sdc.common.errors.CoreException;
+import org.openecomp.sdc.common.errors.ErrorCode;
+import org.openecomp.sdc.common.errors.ErrorCode.ErrorCodeBuilder;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.errors.VendorSoftwareProductNotFoundErrorBuilder;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspUploadStatus;
+
+public class OrchestrationTemplateCandidateUploadManagerExceptionSupplier {
+
+ private OrchestrationTemplateCandidateUploadManagerExceptionSupplier() {
+ }
+
+ public static Supplier<CoreException> vspUploadAlreadyInProgress(final String vspId, final String vspVersionId) {
+ final String errorMsg = String.format("There is a processing in progress for the VSP %s, version %s", vspId, vspVersionId);
+ return () -> new CoreException(new ErrorCodeBuilder().withId(VSP_PROCESSING_IN_PROGRESS).withMessage(errorMsg).build());
+ }
+
+ public static Supplier<CoreException> couldNotCreateLock(final String vspId, final String vspVersionId, final Exception exception) {
+ final String errorMsg = String.format("Could not create a lock for the VSP %s, version %s", vspId, vspVersionId);
+ final ErrorCode errorCode = new ErrorCodeBuilder().withId(VSP_CREATE_UPLOAD_LOCK_ERROR).withMessage(errorMsg).build();
+ return () -> new CoreException(errorCode, exception);
+ }
+
+ public static Supplier<CoreException> couldNotUpdateLock(final UUID lockId, final String vspId, final String vspVersionId, final Exception exception) {
+ final String errorMsg = String.format("Could not update the lock %s for the VSP %s, version %s", lockId, vspId, vspVersionId);
+ final ErrorCode errorCode = new ErrorCodeBuilder().withId(VSP_UPDATE_UPLOAD_LOCK_ERROR).withMessage(errorMsg).build();
+ return () -> new CoreException(errorCode, exception);
+ }
+
+ public static Supplier<CoreException> couldNotFindLock(final UUID lockId, final String vspId, final String vspVersionId) {
+ final String errorMsg = String.format("Could not find lock '%s' for the VSP %s, version %s", lockId, vspId, vspVersionId);
+ final ErrorCode errorCode = new ErrorCodeBuilder().withId(VSP_UPLOAD_LOCK_NOT_FOUND_ERROR).withMessage(errorMsg).build();
+ return () -> new CoreException(errorCode);
+ }
+
+ public static Supplier<CoreException> uploadAlreadyFinished(final UUID lockId, final String vspId, final String vspVersionId) {
+ final String errorMsg = String.format("The upload was already finished for lock '%s', VSP '%s', version '%s'", lockId, vspId, vspVersionId);
+ final ErrorCode errorCode = new ErrorCodeBuilder().withId(VSP_UPLOAD_ALREADY_FINISHED_ERROR).withMessage(errorMsg).build();
+ return () -> new CoreException(errorCode);
+ }
+
+ public static Supplier<CoreException> vspNotFound(final String vspId, final String vspVersionId) {
+ return () -> new CoreException(new VendorSoftwareProductNotFoundErrorBuilder(vspId, vspVersionId).build());
+ }
+
+ public static Supplier<IllegalArgumentException> invalidCompleteStatus(final VspUploadStatus status) {
+ String errorMsg = String.format("Invalid complete status '%s'. Expecting one of: %s",
+ status,
+ VspUploadStatus.getCompleteStatus().stream().map(Enum::name).collect(Collectors.joining(", "))
+ );
+ return () -> new IllegalArgumentException(errorMsg);
+ }
+}
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/mapping/VspUploadStatusRecordMapper.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/mapping/VspUploadStatusRecordMapper.java
new file mode 100644
index 0000000000..9cc3b591aa
--- /dev/null
+++ 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/mapping/VspUploadStatusRecordMapper.java
@@ -0,0 +1,40 @@
+/*
+ * -
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2022 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdcrests.vsp.rest.mapping;
+
+import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspUploadStatusRecord;
+import org.openecomp.sdcrests.mapping.MappingBase;
+import org.openecomp.sdcrests.vendorsoftwareproducts.types.VspUploadStatusDto;
+
+public class VspUploadStatusRecordMapper extends MappingBase<VspUploadStatusRecord, VspUploadStatusDto> {
+
+ @Override
+ public void doMapping(final VspUploadStatusRecord source, final VspUploadStatusDto target) {
+ target.setVspId(source.getVspId());
+ target.setVspVersionId(source.getVspVersionId());
+ target.setStatus(source.getStatus());
+ target.setLockId(source.getLockId());
+ target.setComplete(source.getIsComplete());
+ target.setCreated(source.getCreated());
+ target.setUpdated(source.getUpdated());
+ }
+}
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 e8ee6b3c4b..1477ce1414 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
@@ -22,7 +22,6 @@
package org.openecomp.sdcrests.vsp.rest.services;
import static javax.ws.rs.core.Response.Status.EXPECTATION_FAILED;
-import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR;
import static javax.ws.rs.core.Response.Status.NOT_ACCEPTABLE;
import static javax.ws.rs.core.Response.Status.NOT_FOUND;
import static org.openecomp.core.validation.errors.ErrorMessagesFormatBuilder.getErrorWithParameters;
@@ -59,6 +58,7 @@ import org.openecomp.sdc.be.csar.storage.ArtifactStorageConfig;
import org.openecomp.sdc.be.csar.storage.ArtifactStorageManager;
import org.openecomp.sdc.be.csar.storage.PackageSizeReducer;
import org.openecomp.sdc.be.csar.storage.StorageFactory;
+import org.openecomp.sdc.be.csar.storage.exception.ArtifactStorageException;
import org.openecomp.sdc.common.util.ValidationUtils;
import org.openecomp.sdc.common.utils.SdcCommon;
import org.openecomp.sdc.datatypes.error.ErrorLevel;
@@ -70,6 +70,7 @@ import org.openecomp.sdc.vendorsoftwareproduct.OrchestrationTemplateCandidateMan
import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductManager;
import org.openecomp.sdc.vendorsoftwareproduct.VspManagerFactory;
import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspUploadStatus;
import org.openecomp.sdc.vendorsoftwareproduct.impl.onboarding.OnboardingPackageProcessor;
import org.openecomp.sdc.vendorsoftwareproduct.impl.onboarding.validation.CnfPackageValidator;
import org.openecomp.sdc.vendorsoftwareproduct.types.OnboardPackageInfo;
@@ -82,10 +83,12 @@ import org.openecomp.sdcrests.vendorsoftwareproducts.types.FileDataStructureDto;
import org.openecomp.sdcrests.vendorsoftwareproducts.types.OrchestrationTemplateActionResponseDto;
import org.openecomp.sdcrests.vendorsoftwareproducts.types.UploadFileResponseDto;
import org.openecomp.sdcrests.vendorsoftwareproducts.types.ValidationResponseDto;
+import org.openecomp.sdcrests.vendorsoftwareproducts.types.VspUploadStatusDto;
import org.openecomp.sdcrests.vsp.rest.OrchestrationTemplateCandidate;
import org.openecomp.sdcrests.vsp.rest.mapping.MapFilesDataStructureToDto;
import org.openecomp.sdcrests.vsp.rest.mapping.MapUploadFileResponseToUploadFileResponseDto;
import org.openecomp.sdcrests.vsp.rest.mapping.MapValidationResponseToDto;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
@@ -100,8 +103,10 @@ public class OrchestrationTemplateCandidateImpl implements OrchestrationTemplate
private final ActivityLogManager activityLogManager;
private final ArtifactStorageManager artifactStorageManager;
private final PackageSizeReducer packageSizeReducer;
+ private final OrchestrationTemplateCandidateUploadManager orchestrationTemplateCandidateUploadManager;
- public OrchestrationTemplateCandidateImpl() {
+ @Autowired
+ public OrchestrationTemplateCandidateImpl(final OrchestrationTemplateCandidateUploadManager orchestrationTemplateCandidateUploadManager) {
this.candidateManager = OrchestrationTemplateCandidateManagerFactory.getInstance().createInterface();
this.vendorSoftwareProductManager = VspManagerFactory.getInstance().createInterface();
this.activityLogManager = ActivityLogManagerFactory.getInstance().createInterface();
@@ -110,6 +115,7 @@ public class OrchestrationTemplateCandidateImpl implements OrchestrationTemplate
this.artifactStorageManager = storageFactory.createArtifactStorageManager();
LOGGER.info("Instantiating packageSizeReducer");
this.packageSizeReducer = storageFactory.createPackageSizeReducer().orElse(null);
+ this.orchestrationTemplateCandidateUploadManager = orchestrationTemplateCandidateUploadManager;
}
// Constructor used in test to avoid mock static
@@ -117,81 +123,101 @@ public class OrchestrationTemplateCandidateImpl implements OrchestrationTemplate
final VendorSoftwareProductManager vendorSoftwareProductManager,
final ActivityLogManager activityLogManager,
final ArtifactStorageManager artifactStorageManager,
- final PackageSizeReducer packageSizeReducer) {
+ final PackageSizeReducer packageSizeReducer,
+ final OrchestrationTemplateCandidateUploadManager orchestrationTemplateCandidateUploadManager) {
this.candidateManager = candidateManager;
this.vendorSoftwareProductManager = vendorSoftwareProductManager;
this.activityLogManager = activityLogManager;
this.artifactStorageManager = artifactStorageManager;
this.packageSizeReducer = packageSizeReducer;
+ this.orchestrationTemplateCandidateUploadManager = orchestrationTemplateCandidateUploadManager;
}
@Override
public Response upload(String vspId, String versionId, final Attachment fileToUpload, final String user) {
vspId = ValidationUtils.sanitizeInputString(vspId);
versionId = ValidationUtils.sanitizeInputString(versionId);
- final byte[] fileToUploadBytes;
- final DataHandler dataHandler = fileToUpload.getDataHandler();
- final var filename = ValidationUtils.sanitizeInputString(dataHandler.getName());
- ArtifactInfo artifactInfo = null;
- if (artifactStorageManager.isEnabled()) {
- final Path tempArtifactPath;
- try {
- final ArtifactStorageConfig storageConfiguration = artifactStorageManager.getStorageConfiguration();
+ final Response response;
+ VspUploadStatusDto vspUploadStatus = null;
+ try {
+ vspUploadStatus = orchestrationTemplateCandidateUploadManager.putUploadInProgress(vspId, versionId, user);
+ final byte[] fileToUploadBytes;
+ final DataHandler dataHandler = fileToUpload.getDataHandler();
+ final var filename = ValidationUtils.sanitizeInputString(dataHandler.getName());
+ ArtifactInfo artifactInfo = null;
+ if (artifactStorageManager.isEnabled()) {
+ artifactInfo = handleArtifactStorage(vspId, versionId, filename, dataHandler);
+ fileToUploadBytes = artifactInfo.getBytes();
+ } else {
+ fileToUploadBytes = fileToUpload.getObject(byte[].class);
+ }
- final Path folder = Path.of(storageConfiguration.getTempPath()).resolve(vspId).resolve(versionId);
- tempArtifactPath = folder.resolve(UUID.randomUUID().toString());
- Files.createDirectories(folder);
- try (final InputStream packageInputStream = dataHandler.getInputStream();
- final var fileOutputStream = new FileOutputStream(tempArtifactPath.toFile())) {
- packageInputStream.transferTo(fileOutputStream);
- }
- } catch (final Exception e) {
- return Response.status(INTERNAL_SERVER_ERROR).entity(buildUploadResponseWithError(
- new ErrorMessage(ErrorLevel.ERROR, UNEXPECTED_PROBLEM_HAPPENED_WHILE_GETTING.formatMessage(filename)))).build();
+ final var onboardingPackageProcessor =
+ new OnboardingPackageProcessor(filename, fileToUploadBytes, new CnfPackageValidator(), artifactInfo);
+ final ErrorMessage[] errorMessages = onboardingPackageProcessor.getErrorMessages().toArray(new ErrorMessage[0]);
+ if (onboardingPackageProcessor.hasErrors()) {
+ return Response.status(NOT_ACCEPTABLE).entity(buildUploadResponseWithError(errorMessages)).build();
}
- try (final InputStream inputStream = Files.newInputStream(tempArtifactPath)) {
- artifactInfo = artifactStorageManager.upload(vspId, versionId, inputStream);
- } catch (final Exception e) {
- LOGGER.error("Package Size Reducer not configured", e);
- return Response.status(INTERNAL_SERVER_ERROR).entity(buildUploadResponseWithError(
- new ErrorMessage(ErrorLevel.ERROR, ERROR_HAS_OCCURRED_WHILE_PERSISTING_THE_ARTIFACT.formatMessage(filename)))).build();
+ final var onboardPackageInfo = onboardingPackageProcessor.getOnboardPackageInfo().orElse(null);
+ if (onboardPackageInfo == null) {
+ final UploadFileResponseDto uploadFileResponseDto = buildUploadResponseWithError(
+ new ErrorMessage(ErrorLevel.ERROR, PACKAGE_PROCESS_ERROR.formatMessage(filename)));
+ return Response.ok(uploadFileResponseDto).build();
}
- try {
- fileToUploadBytes = packageSizeReducer.reduce(tempArtifactPath);
- Files.delete(tempArtifactPath);
- } catch (final Exception e) {
- LOGGER.error("Package Size Reducer not configured", e);
- return Response.status(INTERNAL_SERVER_ERROR).entity(buildUploadResponseWithError(
- new ErrorMessage(ErrorLevel.ERROR,
- ERROR_HAS_OCCURRED_WHILE_REDUCING_THE_ARTIFACT_SIZE.formatMessage(tempArtifactPath.toString())))).build();
+ final var version = new Version(versionId);
+ final var vspDetails = vendorSoftwareProductManager.getVsp(vspId, version);
+ response = processOnboardPackage(onboardPackageInfo, vspDetails, errorMessages);
+ final UploadFileResponseDto entity = (UploadFileResponseDto) response.getEntity();
+ if (artifactStorageManager.isEnabled()) {
+ if (!entity.getErrors().isEmpty()) {
+ artifactStorageManager.delete(artifactInfo);
+ } else {
+ artifactStorageManager.put(vspId, versionId + ".reduced", new ByteArrayInputStream(fileToUploadBytes));
+ }
}
- } else {
- fileToUploadBytes = fileToUpload.getObject(byte[].class);
+ orchestrationTemplateCandidateUploadManager
+ .putUploadAsFinished(vspId, versionId, vspUploadStatus.getLockId(), VspUploadStatus.SUCCESS, user);
+ } catch (final Exception ex) {
+ if (vspUploadStatus != null) {
+ orchestrationTemplateCandidateUploadManager
+ .putUploadAsFinished(vspId, versionId, vspUploadStatus.getLockId(), VspUploadStatus.ERROR, user);
+ }
+ throw ex;
}
+ return response;
+ }
+
+ private ArtifactInfo handleArtifactStorage(final String vspId, final String versionId, final String filename,
+ final DataHandler artifactDataHandler) {
+ final Path tempArtifactPath;
+ try {
+ final ArtifactStorageConfig storageConfiguration = artifactStorageManager.getStorageConfiguration();
- final var onboardingPackageProcessor = new OnboardingPackageProcessor(filename, fileToUploadBytes, new CnfPackageValidator(), artifactInfo);
- final ErrorMessage[] errorMessages = onboardingPackageProcessor.getErrorMessages().toArray(new ErrorMessage[0]);
- if (onboardingPackageProcessor.hasErrors()) {
- return Response.status(NOT_ACCEPTABLE).entity(buildUploadResponseWithError(errorMessages)).build();
+ final Path folder = Path.of(storageConfiguration.getTempPath()).resolve(vspId).resolve(versionId);
+ tempArtifactPath = folder.resolve(UUID.randomUUID().toString());
+ Files.createDirectories(folder);
+ try (final InputStream packageInputStream = artifactDataHandler.getInputStream();
+ final var fileOutputStream = new FileOutputStream(tempArtifactPath.toFile())) {
+ packageInputStream.transferTo(fileOutputStream);
+ }
+ } catch (final Exception e) {
+ throw new ArtifactStorageException(UNEXPECTED_PROBLEM_HAPPENED_WHILE_GETTING.formatMessage(filename));
}
- final var onboardPackageInfo = onboardingPackageProcessor.getOnboardPackageInfo().orElse(null);
- if (onboardPackageInfo == null) {
- final UploadFileResponseDto uploadFileResponseDto = buildUploadResponseWithError(
- new ErrorMessage(ErrorLevel.ERROR, PACKAGE_PROCESS_ERROR.formatMessage(filename)));
- return Response.ok(uploadFileResponseDto).build();
+ final ArtifactInfo artifactInfo;
+ try (final InputStream inputStream = Files.newInputStream(tempArtifactPath)) {
+ 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));
}
- final var version = new Version(versionId);
- final var vspDetails = vendorSoftwareProductManager.getVsp(vspId, version);
- final Response response = processOnboardPackage(onboardPackageInfo, vspDetails, errorMessages);
- final UploadFileResponseDto entity = (UploadFileResponseDto) response.getEntity();
- if (artifactStorageManager.isEnabled()) {
- if (!entity.getErrors().isEmpty()) {
- artifactStorageManager.delete(artifactInfo);
- } else {
- artifactStorageManager.put(vspId, versionId + ".reduced", new ByteArrayInputStream(fileToUploadBytes));
- }
+ try {
+ artifactInfo.setBytes(packageSizeReducer.reduce(tempArtifactPath));
+ Files.delete(tempArtifactPath);
+ } catch (final Exception e) {
+ LOGGER.error("Package Size Reducer not configured", e);
+ throw new ArtifactStorageException(ERROR_HAS_OCCURRED_WHILE_REDUCING_THE_ARTIFACT_SIZE.formatMessage(filename));
}
- return response;
+ return artifactInfo;
}
private Response processOnboardPackage(final OnboardPackageInfo onboardPackageInfo, final VspDetails vspDetails,
@@ -227,7 +253,7 @@ public class OrchestrationTemplateCandidateImpl implements OrchestrationTemplate
fileName = "Candidate." + zipFile.get().getLeft();
} else {
zipFile = vendorSoftwareProductManager.get(vspId, new Version((versionId)));
- if (!zipFile.isPresent()) {
+ if (zipFile.isEmpty()) {
ErrorMessage errorMessage = new ErrorMessage(ErrorLevel.ERROR,
getErrorWithParameters(NO_FILE_WAS_UPLOADED_OR_FILE_NOT_EXIST.getErrorMessage(), ""));
LOGGER.error(errorMessage.getMessage());
@@ -270,7 +296,7 @@ public class OrchestrationTemplateCandidateImpl implements OrchestrationTemplate
@Override
public Response getFilesDataStructure(String vspId, String versionId, String user) {
Optional<FilesDataStructure> filesDataStructure = candidateManager.getFilesDataStructure(vspId, new Version(versionId));
- if (!filesDataStructure.isPresent()) {
+ if (filesDataStructure.isEmpty()) {
filesDataStructure = vendorSoftwareProductManager.getOrchestrationTemplateStructure(vspId, new Version(versionId));
}
FileDataStructureDto fileDataStructureDto = filesDataStructure
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/OrchestrationTemplateCandidateUploadManager.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/OrchestrationTemplateCandidateUploadManager.java
new file mode 100644
index 0000000000..0f33580099
--- /dev/null
+++ 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/OrchestrationTemplateCandidateUploadManager.java
@@ -0,0 +1,63 @@
+/*
+ * -
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2022 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdcrests.vsp.rest.services;
+
+import java.util.Optional;
+import java.util.UUID;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspUploadStatus;
+import org.openecomp.sdcrests.vendorsoftwareproducts.types.VspUploadStatusDto;
+
+public interface OrchestrationTemplateCandidateUploadManager {
+
+ /**
+ * Creates a lock to start uploading a package.
+ *
+ * @param vspId the Vendor Software Product id
+ * @param vspVersionId the Vendor Software Product version id
+ * @param user the current user
+ * @return a new upload status containing the lock
+ */
+ VspUploadStatusDto putUploadInProgress(String vspId, String vspVersionId, String user);
+
+ /**
+ * Finishes the upload process, applying the given VspUploadStatusType completion status.
+ *
+ * @param vspId the Vendor Software Product id
+ * @param vspVersionId the Vendor Software Product version id
+ * @param lockId the upload lock id
+ * @param completionStatus any status that represents a completion
+ * @param user the current user
+ * @return the updated status
+ */
+ VspUploadStatusDto putUploadAsFinished(final String vspId, final String vspVersionId, final UUID lockId, final VspUploadStatus completionStatus,
+ final String user);
+
+ /**
+ * Finds the latest upload status for a given Vendor Software Product version.
+ *
+ * @param vspId the Vendor Software Product id
+ * @param vspVersionId the Vendor Software Product version id
+ * @param user the current user
+ * @return the latest upload status for the requested Vendor Software Product version
+ */
+ Optional<VspUploadStatusDto> findLatestStatus(String vspId, String vspVersionId, String user);
+}
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/OrchestrationTemplateCandidateUploadManagerImpl.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/OrchestrationTemplateCandidateUploadManagerImpl.java
new file mode 100644
index 0000000000..d7cfe041c2
--- /dev/null
+++ 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/OrchestrationTemplateCandidateUploadManagerImpl.java
@@ -0,0 +1,171 @@
+/*
+ * -
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2022 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdcrests.vsp.rest.services;
+
+import static org.openecomp.sdcrests.vsp.rest.exception.OrchestrationTemplateCandidateUploadManagerExceptionSupplier.couldNotCreateLock;
+import static org.openecomp.sdcrests.vsp.rest.exception.OrchestrationTemplateCandidateUploadManagerExceptionSupplier.couldNotFindLock;
+import static org.openecomp.sdcrests.vsp.rest.exception.OrchestrationTemplateCandidateUploadManagerExceptionSupplier.couldNotUpdateLock;
+import static org.openecomp.sdcrests.vsp.rest.exception.OrchestrationTemplateCandidateUploadManagerExceptionSupplier.uploadAlreadyFinished;
+import static org.openecomp.sdcrests.vsp.rest.exception.OrchestrationTemplateCandidateUploadManagerExceptionSupplier.vspUploadAlreadyInProgress;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+import org.openecomp.sdc.common.errors.CoreException;
+import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductManager;
+import org.openecomp.sdc.vendorsoftwareproduct.VspManagerFactory;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.VspUploadStatusRecordDao;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspUploadStatus;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspUploadStatusRecord;
+import org.openecomp.sdc.versioning.dao.types.Version;
+import org.openecomp.sdcrests.vendorsoftwareproducts.types.VspUploadStatusDto;
+import org.openecomp.sdcrests.vsp.rest.exception.OrchestrationTemplateCandidateUploadManagerExceptionSupplier;
+import org.openecomp.sdcrests.vsp.rest.mapping.VspUploadStatusRecordMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+
+/**
+ * Manages the package upload process status.
+ */
+@Service
+public class OrchestrationTemplateCandidateUploadManagerImpl implements OrchestrationTemplateCandidateUploadManager {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(OrchestrationTemplateCandidateUploadManagerImpl.class);
+
+ private final VspUploadStatusRecordDao uploadManagerDao;
+ private final VspUploadStatusRecordMapper vspUploadStatusRecordMapper;
+ private final VendorSoftwareProductManager vendorSoftwareProductManager;
+ private final Lock startUploadLock;
+
+ @Autowired
+ public OrchestrationTemplateCandidateUploadManagerImpl(
+ @Qualifier("vsp-upload-status-record-dao-impl") final VspUploadStatusRecordDao uploadManagerDao) {
+
+ this.uploadManagerDao = uploadManagerDao;
+ this.vendorSoftwareProductManager = VspManagerFactory.getInstance().createInterface();
+ this.vspUploadStatusRecordMapper = new VspUploadStatusRecordMapper();
+ startUploadLock = new ReentrantLock();
+ }
+
+ //for tests purpose
+ OrchestrationTemplateCandidateUploadManagerImpl(final VspUploadStatusRecordDao uploadManagerDao,
+ final VendorSoftwareProductManager vendorSoftwareProductManager) {
+ this.uploadManagerDao = uploadManagerDao;
+ this.vendorSoftwareProductManager = vendorSoftwareProductManager;
+ this.vspUploadStatusRecordMapper = new VspUploadStatusRecordMapper();
+ startUploadLock = new ReentrantLock();
+ }
+
+ @Override
+ public VspUploadStatusDto putUploadInProgress(final String vspId, final String vspVersionId, final String user) {
+ checkVspExists(vspId, vspVersionId);
+ LOGGER.debug("Start uploading for VSP id '{}', version '{}', triggered by user '{}'", vspId, vspVersionId, user);
+
+ final VspUploadStatusRecord vspUploadStatusRecord;
+ startUploadLock.lock();
+ try {
+ final List<VspUploadStatusRecord> uploadInProgressList = uploadManagerDao.findAllInProgress(vspId, vspVersionId);
+ if (!uploadInProgressList.isEmpty()) {
+ throw vspUploadAlreadyInProgress(vspId, vspVersionId).get();
+ }
+
+ vspUploadStatusRecord = new VspUploadStatusRecord();
+ vspUploadStatusRecord.setStatus(VspUploadStatus.UPLOADING);
+ vspUploadStatusRecord.setVspId(vspId);
+ vspUploadStatusRecord.setVspVersionId(vspVersionId);
+ vspUploadStatusRecord.setLockId(UUID.randomUUID());
+ vspUploadStatusRecord.setCreated(new Date());
+
+ uploadManagerDao.create(vspUploadStatusRecord);
+ LOGGER.debug("Upload lock '{}' created for VSP id '{}', version '{}'", vspUploadStatusRecord.getLockId(), vspId, vspVersionId);
+ } catch (final CoreException e) {
+ throw e;
+ } catch (final Exception e) {
+ throw couldNotCreateLock(vspId, vspVersionId, e).get();
+ } finally {
+ startUploadLock.unlock();
+ }
+
+ return vspUploadStatusRecordMapper.applyMapping(vspUploadStatusRecord, VspUploadStatusDto.class);
+ }
+
+ @Override
+ public VspUploadStatusDto putUploadAsFinished(final String vspId, final String vspVersionId, final UUID lockId, final VspUploadStatus completionStatus,
+ final String user) {
+
+ if (!completionStatus.isCompleteStatus()) {
+ throw OrchestrationTemplateCandidateUploadManagerExceptionSupplier.invalidCompleteStatus(completionStatus).get();
+ }
+ final Optional<VspUploadStatusRecord> vspUploadStatusOptional =
+ uploadManagerDao.findByVspIdAndVersionIdAndLockId(vspId, vspVersionId, lockId);
+ if (vspUploadStatusOptional.isEmpty()) {
+ throw couldNotFindLock(lockId, vspId, vspVersionId).get();
+ }
+ final VspUploadStatusRecord vspUploadStatusRecord = vspUploadStatusOptional.get();
+ if (vspUploadStatusRecord.getIsComplete()) {
+ throw uploadAlreadyFinished(lockId, vspId, vspVersionId).get();
+ }
+ LOGGER.debug("Finishing the upload for VSP id '{}', version '{}', lock '{}', triggered by user '{}'",
+ vspUploadStatusRecord.getVspId(), vspUploadStatusRecord.getVspVersionId(), vspUploadStatusRecord.getLockId(), user);
+ vspUploadStatusRecord.setStatus(completionStatus);
+ vspUploadStatusRecord.setUpdated(new Date());
+ vspUploadStatusRecord.setIsComplete(true);
+
+ try {
+ uploadManagerDao.update(vspUploadStatusRecord);
+ LOGGER.debug("Upload complete for VSP '{}', version '{}', lock '{}'",
+ vspUploadStatusRecord.getLockId(), vspUploadStatusRecord.getVspId(), vspUploadStatusRecord.getVspVersionId());
+ } catch (final Exception e) {
+ throw couldNotUpdateLock(vspUploadStatusRecord.getLockId(), vspUploadStatusRecord.getVspId(), vspUploadStatusRecord.getVspVersionId(), e)
+ .get();
+ }
+
+ return vspUploadStatusRecordMapper.applyMapping(vspUploadStatusRecord, VspUploadStatusDto.class);
+ }
+
+ private void checkVspExists(final String vspId, final String vspVersionId) {
+ final VspDetails vspDetails = vendorSoftwareProductManager.getVsp(vspId, new Version(vspVersionId));
+ if (vspDetails == null) {
+ throw OrchestrationTemplateCandidateUploadManagerExceptionSupplier.vspNotFound(vspId, vspVersionId).get();
+ }
+ }
+
+ @Override
+ public Optional<VspUploadStatusDto> findLatestStatus(final String vspId, final String vspVersionId, final String user) {
+ checkVspExists(vspId, vspVersionId);
+
+ final Optional<VspUploadStatusRecord> vspUploadStatus = uploadManagerDao.findLatest(vspId, vspVersionId);
+ if (vspUploadStatus.isEmpty()) {
+ return Optional.empty();
+ }
+
+ return Optional.of(vspUploadStatusRecordMapper.applyMapping(vspUploadStatus.get(), VspUploadStatusDto.class));
+ }
+
+}
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/controllers/OrchestrationTemplateCandidateUploadManagerControllerImplTest.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/controllers/OrchestrationTemplateCandidateUploadManagerControllerImplTest.java
new file mode 100644
index 0000000000..db66f91473
--- /dev/null
+++ 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/controllers/OrchestrationTemplateCandidateUploadManagerControllerImplTest.java
@@ -0,0 +1,92 @@
+/*
+ * -
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2022 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdcrests.vsp.rest.controllers;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.when;
+
+import java.util.Date;
+import java.util.Optional;
+import java.util.UUID;
+import javax.ws.rs.core.Response;
+import org.apache.http.HttpStatus;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspUploadStatus;
+import org.openecomp.sdcrests.vendorsoftwareproducts.types.VspUploadStatusDto;
+import org.openecomp.sdcrests.vsp.rest.services.OrchestrationTemplateCandidateUploadManager;
+
+class OrchestrationTemplateCandidateUploadManagerControllerImplTest {
+
+ @Mock
+ private OrchestrationTemplateCandidateUploadManager orchestrationTemplateCandidateUploadManager;
+
+ @InjectMocks
+ private OrchestrationTemplateCandidateUploadManagerControllerImpl packageUploadManagerControllerImpl;
+
+ @BeforeEach
+ void setUp() {
+ MockitoAnnotations.openMocks(this);
+ }
+
+ @Test
+ void getLatestSuccessTest() {
+ //given
+ final String vspId = "vspId";
+ final String vspVersionId = "vspVersionId";
+ final String username = "username";
+ final VspUploadStatusDto vspUploadStatusDto = buildDefaultVspUploadStatus(vspId, vspVersionId);
+ //when
+ when(orchestrationTemplateCandidateUploadManager.findLatestStatus(vspId, vspVersionId, username)).thenReturn(Optional.of(vspUploadStatusDto));
+
+ final Response response = packageUploadManagerControllerImpl.getLatestStatus(vspId, vspVersionId, username);
+ //then
+ assertEquals(HttpStatus.SC_OK, response.getStatus());
+ final Object actualEntity = response.getEntity();
+ assertTrue(actualEntity instanceof VspUploadStatusDto);
+ assertEquals(vspUploadStatusDto, actualEntity);
+ }
+
+ private VspUploadStatusDto buildDefaultVspUploadStatus(final String vspId, final String vspVersionId) {
+ final var vspUploadStatusDto = new VspUploadStatusDto();
+ vspUploadStatusDto.setStatus(VspUploadStatus.UPLOADING);
+ vspUploadStatusDto.setLockId(UUID.randomUUID());
+ vspUploadStatusDto.setVspId(vspId);
+ vspUploadStatusDto.setVspVersionId(vspVersionId);
+ vspUploadStatusDto.setCreated(new Date());
+ vspUploadStatusDto.setComplete(false);
+ return vspUploadStatusDto;
+ }
+
+ @Test
+ void buildGetUrlSuccessTest() {
+ final String vspId = "vspId";
+ final String vspVersionId = "vspVersionId";
+ final String actualGetUrl = OrchestrationTemplateCandidateUploadManagerControllerImpl.buildGetUrl(vspId, vspVersionId);
+ assertEquals("/v1.0/vendor-software-products/vspId/versions/vspVersionId/orchestration-template-candidate/upload", actualGetUrl);
+ }
+
+} \ No newline at end of file
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/mapping/VspUploadStatusRecordMapperTest.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/mapping/VspUploadStatusRecordMapperTest.java
new file mode 100644
index 0000000000..9bba87b38e
--- /dev/null
+++ 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/mapping/VspUploadStatusRecordMapperTest.java
@@ -0,0 +1,59 @@
+/*
+ * -
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2022 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdcrests.vsp.rest.mapping;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Date;
+import java.util.UUID;
+import org.junit.jupiter.api.Test;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspUploadStatusRecord;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspUploadStatus;
+import org.openecomp.sdcrests.vendorsoftwareproducts.types.VspUploadStatusDto;
+
+class VspUploadStatusRecordMapperTest {
+
+ @Test
+ void fullMappingTest() {
+ //given
+ final VspUploadStatusRecordMapper vspUploadStatusRecordMapper = new VspUploadStatusRecordMapper();
+ final var vspUploadStatus = new VspUploadStatusRecord();
+ vspUploadStatus.setVspId("vspId");
+ vspUploadStatus.setVspVersionId("vspVersionId");
+ vspUploadStatus.setStatus(VspUploadStatus.UPLOADING);
+ vspUploadStatus.setLockId(UUID.randomUUID());
+ vspUploadStatus.setIsComplete(true);
+ vspUploadStatus.setCreated(new Date());
+ vspUploadStatus.setUpdated(new Date());
+ final var vspUploadStatusDto = new VspUploadStatusDto();
+ //when
+ vspUploadStatusRecordMapper.doMapping(vspUploadStatus, vspUploadStatusDto);
+ //then
+ assertEquals(vspUploadStatus.getVspId(), vspUploadStatusDto.getVspId());
+ assertEquals(vspUploadStatus.getVspVersionId(), vspUploadStatusDto.getVspVersionId());
+ assertEquals(vspUploadStatus.getStatus(), vspUploadStatusDto.getStatus());
+ assertEquals(vspUploadStatus.getLockId(), vspUploadStatusDto.getLockId());
+ assertEquals(vspUploadStatus.getIsComplete(), vspUploadStatusDto.isComplete());
+ assertEquals(vspUploadStatus.getCreated(), vspUploadStatusDto.getCreated());
+ assertEquals(vspUploadStatus.getUpdated(), vspUploadStatusDto.getUpdated());
+ }
+} \ No newline at end of file
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 2d2c30865a..6e0231aaf7 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
@@ -28,7 +28,7 @@ import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
import java.io.IOException;
@@ -76,6 +76,7 @@ import org.openecomp.sdc.vendorsoftwareproduct.types.candidateheat.Module;
import org.openecomp.sdcrests.vendorsoftwareproducts.types.FileDataStructureDto;
import org.openecomp.sdcrests.vendorsoftwareproducts.types.OrchestrationTemplateActionResponseDto;
import org.openecomp.sdcrests.vendorsoftwareproducts.types.UploadFileResponseDto;
+import org.openecomp.sdcrests.vendorsoftwareproducts.types.VspUploadStatusDto;
class OrchestrationTemplateCandidateImplTest {
@@ -94,6 +95,8 @@ class OrchestrationTemplateCandidateImplTest {
private ArtifactStorageManager artifactStorageManager;
@Mock
private PackageSizeReducer packageSizeReducer;
+ @Mock
+ private OrchestrationTemplateCandidateUploadManager orchestrationTemplateCandidateUploadManager;
@InjectMocks
private OrchestrationTemplateCandidateImpl orchestrationTemplateCandidate;
@@ -146,15 +149,21 @@ class OrchestrationTemplateCandidateImplTest {
@Test
void uploadSignedTest() throws IOException {
+ final String vspId = "vspId";
+ final String versionId = "versionId";
+ when(orchestrationTemplateCandidateUploadManager.putUploadInProgress(vspId, versionId, user)).thenReturn(new VspUploadStatusDto());
Response response = orchestrationTemplateCandidate
- .upload("1", "1", mockAttachment("filename.zip", this.getClass().getResource("/files/sample-signed.zip")), user);
+ .upload(vspId, versionId, mockAttachment("filename.zip", this.getClass().getResource("/files/sample-signed.zip")), user);
assertEquals(Status.OK.getStatusCode(), response.getStatus());
assertTrue(((UploadFileResponseDto) response.getEntity()).getErrors().isEmpty());
}
@Test
void uploadNotSignedTest() throws IOException {
- Response response = orchestrationTemplateCandidate.upload("1", "1",
+ final String vspId = "vspId";
+ final String versionId = "versionId";
+ when(orchestrationTemplateCandidateUploadManager.putUploadInProgress(vspId, versionId, user)).thenReturn(new VspUploadStatusDto());
+ Response response = orchestrationTemplateCandidate.upload(vspId, versionId,
mockAttachment("filename.csar", this.getClass().getResource("/files/sample-not-signed.csar")), user);
assertEquals(Status.OK.getStatusCode(), response.getStatus());
assertTrue(((UploadFileResponseDto) response.getEntity()).getErrors().isEmpty());
@@ -167,11 +176,15 @@ class OrchestrationTemplateCandidateImplTest {
new MinIoStorageArtifactStorageConfig(true, new EndPoint("host", 9000, false), new Credentials("accessKey", "secretKey"), "tempPath"));
final Path path = Path.of("src/test/resources/files/sample-not-signed.csar");
- when(artifactStorageManager.upload(anyString(), anyString(), any())).thenReturn(new MinIoArtifactInfo("vspId", "name"));
+ final String vspId = "vspId";
+ final String versionId = "versionId";
+ when(artifactStorageManager.upload(eq(vspId), eq(versionId), any())).thenReturn(new MinIoArtifactInfo("vspId", "name"));
final byte[] bytes = Files.readAllBytes(path);
when(packageSizeReducer.reduce(any())).thenReturn(bytes);
- Response response = orchestrationTemplateCandidate.upload("1", "1",
+ when(orchestrationTemplateCandidateUploadManager.putUploadInProgress(vspId, versionId, user)).thenReturn(new VspUploadStatusDto());
+
+ Response response = orchestrationTemplateCandidate.upload(vspId, versionId,
mockAttachment("filename.csar", this.getClass().getResource("/files/sample-not-signed.csar")), user);
assertEquals(Status.OK.getStatusCode(), response.getStatus());
assertTrue(((UploadFileResponseDto) response.getEntity()).getErrors().isEmpty());
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/OrchestrationTemplateCandidateUploadManagerImplTest.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/OrchestrationTemplateCandidateUploadManagerImplTest.java
new file mode 100644
index 0000000000..9a7629f563
--- /dev/null
+++ 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/OrchestrationTemplateCandidateUploadManagerImplTest.java
@@ -0,0 +1,312 @@
+/*
+ * -
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2022 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdcrests.vsp.rest.services;
+
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.when;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.sdc.common.errors.CoreException;
+import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductManager;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.VspUploadStatusRecordDao;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspUploadStatus;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspUploadStatusRecord;
+import org.openecomp.sdc.versioning.dao.types.Version;
+import org.openecomp.sdcrests.vendorsoftwareproducts.types.VspUploadStatusDto;
+import org.openecomp.sdcrests.vsp.rest.exception.OrchestrationTemplateCandidateUploadManagerExceptionSupplier;
+
+class OrchestrationTemplateCandidateUploadManagerImplTest {
+
+ @Mock
+ private VspUploadStatusRecordDao vspUploadStatusRecordDao;
+ @Mock
+ private VendorSoftwareProductManager vendorSoftwareProductManager;
+ @InjectMocks
+ private OrchestrationTemplateCandidateUploadManagerImpl packageUploadManagerImpl;
+
+ @BeforeEach
+ void setUp() {
+ MockitoAnnotations.openMocks(this);
+ }
+
+ @Test
+ void startUploadSuccessTest() {
+ //given
+ final String vspId = "vspId";
+ final String vspVersionId = "vspVersionId";
+ final String username = "username";
+ when(vendorSoftwareProductManager.getVsp(vspId, new Version(vspVersionId))).thenReturn(new VspDetails());
+ //when
+ final VspUploadStatusDto vspUploadStatusDto = packageUploadManagerImpl.putUploadInProgress(vspId, vspVersionId, username);
+ //then
+ assertEquals(vspId, vspUploadStatusDto.getVspId());
+ assertEquals(vspVersionId, vspUploadStatusDto.getVspVersionId());
+ assertEquals(VspUploadStatus.UPLOADING, vspUploadStatusDto.getStatus());
+ assertFalse(vspUploadStatusDto.isComplete());
+ assertNotNull(vspUploadStatusDto.getLockId());
+ assertNotNull(vspUploadStatusDto.getCreated());
+ }
+
+ @Test
+ void startUpload_uploadAlreadyInProgressTest() {
+ //given
+ final String vspId = "vspId";
+ final String vspVersionId = "vspVersionId";
+ final String username = "username";
+ when(vspUploadStatusRecordDao.findAllInProgress(vspId, vspVersionId)).thenReturn(List.of(new VspUploadStatusRecord()));
+ when(vendorSoftwareProductManager.getVsp(vspId, new Version(vspVersionId))).thenReturn(new VspDetails());
+ //when/then
+ final CoreException actualCoreException =
+ assertThrows(CoreException.class, () -> packageUploadManagerImpl.putUploadInProgress(vspId, vspVersionId, username));
+ final CoreException expectedCoreException = OrchestrationTemplateCandidateUploadManagerExceptionSupplier.vspUploadAlreadyInProgress(vspId,
+ vspVersionId).get();
+ assertEquals(expectedCoreException.code().id(), actualCoreException.code().id());
+ assertEquals(expectedCoreException.code().message(), actualCoreException.code().message());
+ }
+
+ @Test
+ void startUpload_vspNotFoundTest() {
+ //given
+ final String vspId = "vspId";
+ final String vspVersionId = "vspVersionId";
+ final String username = "username";
+ //when/then
+ final CoreException actualCoreException =
+ assertThrows(CoreException.class, () -> packageUploadManagerImpl.putUploadInProgress(vspId, vspVersionId, username));
+ final CoreException expectedCoreException = OrchestrationTemplateCandidateUploadManagerExceptionSupplier.vspNotFound(vspId, vspVersionId)
+ .get();
+ assertEquals(expectedCoreException.code().id(), actualCoreException.code().id());
+ assertEquals(expectedCoreException.code().message(), actualCoreException.code().message());
+ }
+
+ @Test
+ void startUpload_createLockErrorTest() {
+ //given
+ final String vspId = "vspId";
+ final String vspVersionId = "vspVersionId";
+ final String username = "username";
+ //when/then
+ when(vendorSoftwareProductManager.getVsp(vspId, new Version(vspVersionId))).thenReturn(new VspDetails());
+ doThrow(new RuntimeException()).when(vspUploadStatusRecordDao).create(any(VspUploadStatusRecord.class));
+ final CoreException actualCoreException =
+ assertThrows(CoreException.class, () -> packageUploadManagerImpl.putUploadInProgress(vspId, vspVersionId, username));
+ final CoreException expectedCoreException =
+ OrchestrationTemplateCandidateUploadManagerExceptionSupplier.couldNotCreateLock(vspId, vspVersionId, new RuntimeException()).get();
+ assertEquals(expectedCoreException.code().id(), actualCoreException.code().id());
+ assertEquals(expectedCoreException.code().message(), actualCoreException.code().message());
+ }
+
+ @Test
+ void finishUploadSuccessTest() {
+ //given
+ final String vspId = "vspId";
+ final String vspVersionId = "vspVersionId";
+ final UUID lockId = UUID.randomUUID();
+ final String username = "username";
+ final VspUploadStatusRecord vspUploadStatusRecord = new VspUploadStatusRecord();
+ vspUploadStatusRecord.setVspId(vspId);
+ vspUploadStatusRecord.setVspVersionId(vspVersionId);
+ vspUploadStatusRecord.setLockId(lockId);
+ vspUploadStatusRecord.setStatus(VspUploadStatus.UPLOADING);
+ vspUploadStatusRecord.setCreated(new Date());
+ when(vspUploadStatusRecordDao.findByVspIdAndVersionIdAndLockId(vspId, vspVersionId, lockId))
+ .thenReturn(Optional.of(vspUploadStatusRecord));
+ //when
+ final VspUploadStatusDto actualVspUploadStatus = packageUploadManagerImpl
+ .putUploadAsFinished(vspId, vspVersionId, lockId, VspUploadStatus.SUCCESS, username);
+ //then
+ assertEquals(vspId, actualVspUploadStatus.getVspId());
+ assertEquals(vspVersionId, actualVspUploadStatus.getVspVersionId());
+ assertEquals(VspUploadStatus.SUCCESS, actualVspUploadStatus.getStatus());
+ assertEquals(vspUploadStatusRecord.getLockId(), actualVspUploadStatus.getLockId());
+ assertEquals(vspUploadStatusRecord.getCreated(), actualVspUploadStatus.getCreated());
+ assertNotNull(actualVspUploadStatus.getUpdated());
+ assertTrue(actualVspUploadStatus.isComplete());
+ }
+
+ @Test
+ void finishUploadIllegalStatusTest() {
+ final UUID lockId = UUID.randomUUID();
+ IllegalArgumentException actualException = assertThrows(IllegalArgumentException.class,
+ () -> packageUploadManagerImpl.putUploadAsFinished("vspId", "vspVersionId", lockId, VspUploadStatus.UPLOADING, "username"));
+ IllegalArgumentException expectedException = OrchestrationTemplateCandidateUploadManagerExceptionSupplier.invalidCompleteStatus(
+ VspUploadStatus.UPLOADING).get();
+ assertEquals(expectedException.getMessage(), actualException.getMessage());
+
+ actualException = assertThrows(IllegalArgumentException.class,
+ () -> packageUploadManagerImpl
+ .putUploadAsFinished("vspId", "vspVersionId", lockId, VspUploadStatus.PROCESSING, "username")
+ );
+ expectedException = OrchestrationTemplateCandidateUploadManagerExceptionSupplier.invalidCompleteStatus(
+ VspUploadStatus.PROCESSING).get();
+ assertEquals(expectedException.getMessage(), actualException.getMessage());
+ }
+
+ @Test
+ void finishUploadCouldNotFindLockTest() {
+ //given
+ final String vspId = "vspId";
+ final String vspVersionId = "vspVersionId";
+ final UUID lockId = UUID.randomUUID();
+ final String username = "username";
+ final VspUploadStatusRecord vspUploadStatusRecord = new VspUploadStatusRecord();
+ vspUploadStatusRecord.setVspId(vspId);
+ vspUploadStatusRecord.setVspVersionId(vspVersionId);
+ vspUploadStatusRecord.setLockId(lockId);
+ vspUploadStatusRecord.setStatus(VspUploadStatus.UPLOADING);
+ vspUploadStatusRecord.setCreated(new Date());
+ when(vspUploadStatusRecordDao.findByVspIdAndVersionIdAndLockId(vspId, vspVersionId, lockId))
+ .thenReturn(Optional.empty());
+ //when/then
+ final CoreException actualException = assertThrows(CoreException.class,
+ () -> packageUploadManagerImpl.putUploadAsFinished(vspId, vspVersionId, lockId, VspUploadStatus.SUCCESS, username));
+
+ final CoreException expectedException =
+ OrchestrationTemplateCandidateUploadManagerExceptionSupplier.couldNotFindLock(lockId, vspId, vspVersionId).get();
+ assertEquals(expectedException.getMessage(), actualException.getMessage());
+ }
+
+ @Test
+ void finishUpload_uploadAlreadyFinishedTest() {
+ //given
+ final String vspId = "vspId";
+ final String vspVersionId = "vspVersionId";
+ final UUID lockId = UUID.randomUUID();
+ final String username = "username";
+ final VspUploadStatusRecord vspUploadStatusRecord = new VspUploadStatusRecord();
+ vspUploadStatusRecord.setVspId(vspId);
+ vspUploadStatusRecord.setVspVersionId(vspVersionId);
+ vspUploadStatusRecord.setLockId(lockId);
+ vspUploadStatusRecord.setIsComplete(true);
+ when(vspUploadStatusRecordDao.findByVspIdAndVersionIdAndLockId(vspId, vspVersionId, lockId))
+ .thenReturn(Optional.of(vspUploadStatusRecord));
+ //when/then
+ final CoreException actualException = assertThrows(CoreException.class, () -> packageUploadManagerImpl
+ .putUploadAsFinished(vspId, vspVersionId, lockId, VspUploadStatus.SUCCESS, username));
+
+ final CoreException expectedException =
+ OrchestrationTemplateCandidateUploadManagerExceptionSupplier.uploadAlreadyFinished(lockId, vspId, vspVersionId).get();
+ assertEquals(expectedException.getMessage(), actualException.getMessage());
+ }
+
+ @Test
+ void finishUploadCouldNotUpdateLockTest() {
+ //given
+ final String vspId = "vspId";
+ final String vspVersionId = "vspVersionId";
+ final UUID lockId = UUID.randomUUID();
+ final String username = "username";
+ final VspUploadStatusRecord vspUploadStatusRecord = new VspUploadStatusRecord();
+ vspUploadStatusRecord.setVspId(vspId);
+ vspUploadStatusRecord.setVspVersionId(vspVersionId);
+ vspUploadStatusRecord.setLockId(lockId);
+ vspUploadStatusRecord.setStatus(VspUploadStatus.UPLOADING);
+ vspUploadStatusRecord.setCreated(new Date());
+ when(vspUploadStatusRecordDao.findByVspIdAndVersionIdAndLockId(vspId, vspVersionId, lockId))
+ .thenReturn(Optional.of(vspUploadStatusRecord));
+ doThrow(new RuntimeException()).when(vspUploadStatusRecordDao).update(vspUploadStatusRecord);
+ //when/then
+ final CoreException actualException = assertThrows(CoreException.class, () -> packageUploadManagerImpl
+ .putUploadAsFinished(vspId, vspVersionId, lockId, VspUploadStatus.SUCCESS, username));
+
+ final CoreException expectedException =
+ OrchestrationTemplateCandidateUploadManagerExceptionSupplier
+ .couldNotUpdateLock(lockId, vspId, vspVersionId, new RuntimeException()).get();
+ assertEquals(expectedException.getMessage(), actualException.getMessage());
+ }
+
+ @Test
+ void findLatestSuccessTest() {
+ //given
+ final String vspId = "vspId";
+ final String vspVersionId = "vspVersionId";
+ final String username = "username";
+ when(vendorSoftwareProductManager.getVsp(vspId, new Version(vspVersionId))).thenReturn(new VspDetails());
+ final var expectedVspUploadStatus = new VspUploadStatusRecord();
+ expectedVspUploadStatus.setStatus(VspUploadStatus.UPLOADING);
+ expectedVspUploadStatus.setLockId(UUID.randomUUID());
+ expectedVspUploadStatus.setVspId(vspId);
+ expectedVspUploadStatus.setVspVersionId(vspVersionId);
+ expectedVspUploadStatus.setCreated(new Date());
+ expectedVspUploadStatus.setUpdated(new Date());
+ expectedVspUploadStatus.setIsComplete(true);
+ when(vspUploadStatusRecordDao.findLatest(vspId, vspVersionId)).thenReturn(Optional.of(expectedVspUploadStatus));
+ //when
+ final Optional<VspUploadStatusDto> actualVspUploadStatusDtoOpt = packageUploadManagerImpl.findLatestStatus(vspId, vspVersionId, username);
+ //then
+ assertTrue(actualVspUploadStatusDtoOpt.isPresent());
+ final VspUploadStatusDto actualVspUploadStatusDto = actualVspUploadStatusDtoOpt.get();
+ assertEquals(expectedVspUploadStatus.getVspId(), actualVspUploadStatusDto.getVspId());
+ assertEquals(expectedVspUploadStatus.getVspVersionId(), actualVspUploadStatusDto.getVspVersionId());
+ assertEquals(expectedVspUploadStatus.getLockId(), actualVspUploadStatusDto.getLockId());
+ assertEquals(expectedVspUploadStatus.getIsComplete(), actualVspUploadStatusDto.isComplete());
+ assertEquals(expectedVspUploadStatus.getCreated(), actualVspUploadStatusDto.getCreated());
+ assertEquals(expectedVspUploadStatus.getUpdated(), actualVspUploadStatusDto.getUpdated());
+ assertEquals(expectedVspUploadStatus.getStatus(), actualVspUploadStatusDto.getStatus());
+ }
+
+ @Test
+ void findLatest_noStatusFoundTest() {
+ //given
+ final String vspId = "vspId";
+ final String vspVersionId = "vspVersionId";
+ final String username = "username";
+ when(vendorSoftwareProductManager.getVsp(vspId, new Version(vspVersionId))).thenReturn(new VspDetails());
+ when(vspUploadStatusRecordDao.findLatest(vspId, vspVersionId)).thenReturn(Optional.empty());
+ //when
+ final Optional<VspUploadStatusDto> actualVspUploadStatusDtoOpt = packageUploadManagerImpl.findLatestStatus(vspId, vspVersionId, username);
+ //then
+ assertTrue(actualVspUploadStatusDtoOpt.isEmpty());
+ }
+
+ @Test
+ void findLatest_vspNotFoundTest() {
+ //given
+ final String vspId = "vspId";
+ final String vspVersionId = "vspVersionId";
+ final String username = "username";
+ //when/then
+ final CoreException actualCoreException =
+ assertThrows(CoreException.class, () -> packageUploadManagerImpl.findLatestStatus(vspId, vspVersionId, username));
+ final CoreException expectedCoreException = OrchestrationTemplateCandidateUploadManagerExceptionSupplier.vspNotFound(vspId, vspVersionId)
+ .get();
+ assertEquals(expectedCoreException.code().id(), actualCoreException.code().id());
+ assertEquals(expectedCoreException.code().message(), actualCoreException.code().message());
+ }
+
+} \ No newline at end of file
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-types/src/main/java/org/openecomp/sdcrests/vendorsoftwareproducts/types/VspUploadStatusDto.java b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-types/src/main/java/org/openecomp/sdcrests/vendorsoftwareproducts/types/VspUploadStatusDto.java
new file mode 100644
index 0000000000..7ff46e794d
--- /dev/null
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-types/src/main/java/org/openecomp/sdcrests/vendorsoftwareproducts/types/VspUploadStatusDto.java
@@ -0,0 +1,44 @@
+/*
+ * -
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2022 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdcrests.vendorsoftwareproducts.types;
+
+import java.util.Date;
+import java.util.UUID;
+import lombok.Data;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspUploadStatusRecord;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspUploadStatus;
+
+/**
+ * DTO for class {@link VspUploadStatusRecord}
+ */
+@Data
+public class VspUploadStatusDto {
+
+ private String vspId;
+ private String vspVersionId;
+ private UUID lockId;
+ private boolean isComplete;
+ private VspUploadStatus status;
+ private Date created;
+ private Date updated;
+
+}