2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdcrests.vsp.rest.services;
23 import org.openecomp.sdc.activityLog.ActivityLogManager;
24 import org.openecomp.sdc.activityLog.ActivityLogManagerFactory;
25 import org.openecomp.sdc.common.errors.CoreException;
26 import org.openecomp.sdc.common.errors.ErrorCode;
27 import org.openecomp.sdc.datatypes.error.ErrorLevel;
28 import org.openecomp.sdc.datatypes.error.ErrorMessage;
29 import org.openecomp.sdc.logging.api.Logger;
30 import org.openecomp.sdc.logging.api.LoggerFactory;
31 import org.openecomp.sdc.logging.context.MdcUtil;
32 import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage;
33 import org.openecomp.sdc.logging.messages.AuditMessages;
34 import org.openecomp.sdc.logging.types.LoggerConstants;
35 import org.openecomp.sdc.logging.types.LoggerErrorCode;
36 import org.openecomp.sdc.logging.types.LoggerServiceName;
37 import org.openecomp.sdc.logging.types.LoggerTragetServiceName;
38 import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductManager;
39 import org.openecomp.sdc.vendorsoftwareproduct.VspManagerFactory;
40 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComputeEntity;
41 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.PackageInfo;
42 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
43 import org.openecomp.sdc.vendorsoftwareproduct.errors.OnboardingMethodErrorBuilder;
44 import org.openecomp.sdc.vendorsoftwareproduct.types.QuestionnaireResponse;
45 import org.openecomp.sdc.vendorsoftwareproduct.types.ValidationResponse;
46 import org.openecomp.sdc.vendorsoftwareproduct.types.VersionedVendorSoftwareProductInfo;
47 import org.openecomp.sdc.versioning.dao.types.Version;
48 import org.openecomp.sdc.versioning.dao.types.VersionStatus;
49 import org.openecomp.sdc.versioning.types.VersionInfo;
50 import org.openecomp.sdc.versioning.types.VersionableEntityAction;
51 import org.openecomp.sdcrests.vendorsoftwareproducts.types.OnboardingMethod;
52 import org.openecomp.sdcrests.vendorsoftwareproducts.types.PackageInfoDto;
53 import org.openecomp.sdcrests.vendorsoftwareproducts.types.QuestionnaireResponseDto;
54 import org.openecomp.sdcrests.vendorsoftwareproducts.types.ValidationResponseDto;
55 import org.openecomp.sdcrests.vendorsoftwareproducts.types.VersionSoftwareProductActionRequestDto;
56 import org.openecomp.sdcrests.vendorsoftwareproducts.types.VspComputeDto;
57 import org.openecomp.sdcrests.vendorsoftwareproducts.types.VspCreationDto;
58 import org.openecomp.sdcrests.vendorsoftwareproducts.types.VspDescriptionDto;
59 import org.openecomp.sdcrests.vendorsoftwareproducts.types.VspDetailsDto;
60 import org.openecomp.sdcrests.vsp.rest.VendorSoftwareProducts;
61 import org.openecomp.sdcrests.vsp.rest.mapping.MapComputeEntityToVspComputeDto;
62 import org.openecomp.sdcrests.vsp.rest.mapping.MapPackageInfoToPackageInfoDto;
63 import org.openecomp.sdcrests.vsp.rest.mapping.MapQuestionnaireResponseToQuestionnaireResponseDto;
64 import org.openecomp.sdcrests.vsp.rest.mapping.MapValidationResponseToDto;
65 import org.openecomp.sdcrests.vsp.rest.mapping.MapVersionedVendorSoftwareProductInfoToVspDetailsDto;
66 import org.openecomp.sdcrests.vsp.rest.mapping.MapVspDescriptionDtoToVspDetails;
67 import org.openecomp.sdcrests.vsp.rest.mapping.MapVspDetailsToVspCreationDto;
68 import org.openecomp.sdcrests.wrappers.GenericCollectionWrapper;
69 import org.openecomp.sdcrests.wrappers.StringWrapperResponse;
71 import org.springframework.context.annotation.Scope;
72 import org.springframework.stereotype.Service;
74 import javax.inject.Named;
75 import javax.ws.rs.core.Response;
77 import java.io.IOException;
78 import java.util.Collection;
79 import java.util.List;
80 import java.util.Objects;
81 import java.util.stream.Collectors;
83 import static org.openecomp.sdc.logging.messages.AuditMessages.SUBMIT_VSP_ERROR;
87 @Service("vendorSoftwareProducts")
88 @Scope(value = "prototype")
89 public class VendorSoftwareProductsImpl implements VendorSoftwareProducts {
91 private VendorSoftwareProductManager vendorSoftwareProductManager =
92 VspManagerFactory.getInstance().createInterface();
94 private static final Logger logger =
95 LoggerFactory.getLogger(VendorSoftwareProductsImpl.class);
97 private ActivityLogManager activityLogManager =
98 ActivityLogManagerFactory.getInstance().createInterface();
101 public Response createVsp(VspDescriptionDto vspDescriptionDto, String user) {
102 MdcUtil.initMdc(LoggerServiceName.Create_VSP.toString());
103 logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.CREATE_VSP
104 + vspDescriptionDto.getName());
106 VspCreationDto vspCreationDto = null;
107 OnboardingMethod onboardingMethod =
108 OnboardingMethod.valueOf(vspDescriptionDto.getOnboardingMethod());
109 if (onboardingMethod == null) {
110 return handleUnkownOnboardingMethod();
112 switch (onboardingMethod) {
115 VspDetails vspDetails = new MapVspDescriptionDtoToVspDetails().
116 applyMapping(vspDescriptionDto, VspDetails.class);
118 vspDetails = vendorSoftwareProductManager.createVsp(vspDetails, user);
120 MapVspDetailsToVspCreationDto mapping = new MapVspDetailsToVspCreationDto();
121 vspCreationDto = mapping.applyMapping(vspDetails, VspCreationDto.class);
124 return handleUnkownOnboardingMethod();
127 return Response.ok(vspCreationDto).build();
130 private Response handleUnkownOnboardingMethod() {
131 ErrorCode onboardingMethodUpdateErrorCode = OnboardingMethodErrorBuilder
132 .getInvalidOnboardingMethodErrorBuilder();
133 MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_API,
134 LoggerTragetServiceName.ADD_VSP, ErrorLevel.ERROR.name(),
135 LoggerErrorCode.DATA_ERROR.getErrorCode(), onboardingMethodUpdateErrorCode.message());
136 throw new CoreException(onboardingMethodUpdateErrorCode);
140 public Response listVsps(String versionFilter, String user) {
141 MdcUtil.initMdc(LoggerServiceName.List_VSP.toString());
142 List<VersionedVendorSoftwareProductInfo> vspList =
143 vendorSoftwareProductManager.listVsps(versionFilter, user);
145 GenericCollectionWrapper<VspDetailsDto> results = new GenericCollectionWrapper<>();
146 if (!vspList.isEmpty()) {
147 MapVersionedVendorSoftwareProductInfoToVspDetailsDto mapper =
148 new MapVersionedVendorSoftwareProductInfoToVspDetailsDto();
149 for (VersionedVendorSoftwareProductInfo versionedVsp : vspList) {
150 results.add(mapper.applyMapping(versionedVsp, VspDetailsDto.class));
154 return Response.ok(results).build();
158 public Response getVsp(String vspId, String versionId, String user) {
159 MdcUtil.initMdc(LoggerServiceName.Get_VSP.toString());
162 VspDetails vspDetails =
163 vendorSoftwareProductManager
164 .getVsp(vspId, resolveVspVersion(vspId, versionId, user, VersionableEntityAction.Read),
167 VersionInfo versionInfo = getVersionInfo(vspId, VersionableEntityAction.Read, user);
170 if (vspDetails.getOldVersion() != null && !"".equals(vspDetails.getOldVersion())) {
171 if (Version.valueOf(versionId).equals(versionInfo.getActiveVersion())) {
173 Version healedVersion = vendorSoftwareProductManager.callAutoHeal(vspId, versionInfo,
176 vendorSoftwareProductManager
177 .getVsp(vspId, resolveVspVersion(vspId, healedVersion.toString(), user,
178 VersionableEntityAction.Read), user);
179 versionInfo = getVersionInfo(vspId, VersionableEntityAction.Read, user);
180 } catch (Exception e) {
181 logger.error(e.getMessage(), e);
186 VspDetailsDto vspDetailsDto = vspDetails == null
188 : new MapVersionedVendorSoftwareProductInfoToVspDetailsDto()
189 .applyMapping(new VersionedVendorSoftwareProductInfo(vspDetails, versionInfo),
190 VspDetailsDto.class);
192 return Response.ok(vspDetailsDto).build();
196 public Response updateVsp(String vspId, String versionId, VspDescriptionDto vspDescriptionDto,
198 MdcUtil.initMdc(LoggerServiceName.Update_VSP.toString());
199 VspDetails vspDetails =
200 new MapVspDescriptionDtoToVspDetails().applyMapping(vspDescriptionDto, VspDetails.class);
201 vspDetails.setId(vspId);
202 vspDetails.setVersion(resolveVspVersion(vspId, null, user, VersionableEntityAction.Write));
204 vendorSoftwareProductManager.updateVsp(vspDetails, user);
206 return Response.ok().build();
210 public Response deleteVsp(String vspId, String user) {
211 MdcUtil.initMdc(LoggerServiceName.Delete_VSP.toString());
212 vendorSoftwareProductManager.deleteVsp(vspId, user);
214 return Response.ok().build();
218 public Response actOnVendorSoftwareProduct(String vspId, String versionId,
219 VersionSoftwareProductActionRequestDto request,
220 String user) throws IOException {
222 switch (request.getAction()) {
224 MDC.put(LoggerConstants.SERVICE_NAME, LoggerServiceName.Checkout_VSP.toString());
225 vendorSoftwareProductManager.checkout(vspId, user);
226 logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.CHECK_OUT_VSP + vspId);
229 MDC.put(LoggerConstants.SERVICE_NAME, LoggerServiceName.Undo_Checkout_VSP.toString());
230 vendorSoftwareProductManager.undoCheckout(vspId, user);
233 MDC.put(LoggerConstants.SERVICE_NAME, LoggerServiceName.Checkin_VSP.toString());
234 vendorSoftwareProductManager.checkin(vspId, user);
235 logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.CHECK_IN_VSP + vspId);
238 MDC.put(LoggerConstants.SERVICE_NAME, LoggerServiceName.Submit_VSP.toString());
239 ValidationResponse validationResponse = vendorSoftwareProductManager.submit(vspId, user);
240 if (!validationResponse.isValid()) {
241 logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.SUBMIT_VSP_FAIL + vspId);
242 if (validationResponse.getVspErrors() != null) {
243 validationResponse.getVspErrors().forEach(errorCode -> logger.audit(AuditMessages
244 .AUDIT_MSG + String.format(SUBMIT_VSP_ERROR, errorCode.message(), vspId)));
246 if (validationResponse.getUploadDataErrors() != null) {
247 validationResponse.getUploadDataErrors().values().forEach(errorMessages
248 -> printAuditForErrors(errorMessages, vspId, SUBMIT_VSP_ERROR));
251 return Response.status(Response.Status.EXPECTATION_FAILED).entity(
252 new MapValidationResponseToDto()
253 .applyMapping(validationResponse, ValidationResponseDto.class)).build();
255 logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.SUBMIT_VSP + vspId);
258 MDC.put(LoggerConstants.SERVICE_NAME, LoggerServiceName.Create_Package.toString());
260 PackageInfo packageInfo = vendorSoftwareProductManager.createPackage(vspId,
261 resolveVspVersion(vspId, null, user, VersionableEntityAction.Read), user);
262 return Response.ok(packageInfo == null
264 : new MapPackageInfoToPackageInfoDto().applyMapping(packageInfo, PackageInfoDto.class))
269 return Response.ok().build();
273 public Response getValidationVsp(String user)
275 String validationVspId = vendorSoftwareProductManager.fetchValidationVsp(user);
276 StringWrapperResponse response = new StringWrapperResponse(validationVspId);
277 return Response.ok(response).build();
282 public Response getOrchestrationTemplate(String vspId, String versionId, String user) {
283 MdcUtil.initMdc(LoggerServiceName.Get_Uploaded_File.toString());
284 byte[] orchestrationTemplateFile =
285 vendorSoftwareProductManager
286 .getOrchestrationTemplateFile(vspId,
287 resolveVspVersion(vspId, versionId, user, VersionableEntityAction.Read), user);
289 if (orchestrationTemplateFile == null) {
290 return Response.status(Response.Status.NOT_FOUND).build();
292 Response.ResponseBuilder response = Response.ok(orchestrationTemplateFile);
293 response.header("Content-Disposition", "attachment; filename=LatestHeatPackage.zip");
294 return response.build();
298 public Response listPackages(String category, String subCategory, String user) {
299 MdcUtil.initMdc(LoggerServiceName.List_Packages.toString());
300 List<PackageInfo> packageInfoList =
301 vendorSoftwareProductManager.listPackages(category, subCategory);
303 GenericCollectionWrapper<PackageInfoDto> results = new GenericCollectionWrapper<>();
304 MapPackageInfoToPackageInfoDto mapper = new MapPackageInfoToPackageInfoDto();
306 if (packageInfoList != null) {
307 for (PackageInfo packageInfo : packageInfoList) {
308 results.add(mapper.applyMapping(packageInfo, PackageInfoDto.class));
311 return Response.ok(results).build();
315 public Response getTranslatedFile(String vspId, String versionId, String user) {
316 MdcUtil.initMdc(LoggerServiceName.Get_Translated_File.toString());
318 Version version = Version.valueOf(versionId);
319 Version resolvedVersion = version == null
320 ? getVersionInfo(vspId, VersionableEntityAction.Read, user).getLatestFinalVersion()
323 File zipFile = vendorSoftwareProductManager.getTranslatedFile(vspId, resolvedVersion, user);
325 Response.ResponseBuilder response = Response.ok(zipFile);
326 if (zipFile == null) {
327 logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.IMPORT_FAIL + vspId);
328 return Response.status(Response.Status.NOT_FOUND).build();
330 response.header("Content-Disposition", "attachment; filename=" + zipFile.getName());
332 logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.IMPORT_SUCCESS + vspId);
333 return response.build();
337 public Response getQuestionnaire(String vspId, String versionId, String user) {
338 MdcUtil.initMdc(LoggerServiceName.Get_Questionnaire_VSP.toString());
339 QuestionnaireResponse questionnaireResponse =
340 vendorSoftwareProductManager.getVspQuestionnaire(vspId,
341 resolveVspVersion(vspId, versionId, user, VersionableEntityAction.Read), user);
343 if (questionnaireResponse.getErrorMessage() != null) {
344 return Response.status(Response.Status.EXPECTATION_FAILED).entity(
345 new MapQuestionnaireResponseToQuestionnaireResponseDto()
346 .applyMapping(questionnaireResponse, QuestionnaireResponseDto.class)).build();
349 QuestionnaireResponseDto result = new MapQuestionnaireResponseToQuestionnaireResponseDto()
350 .applyMapping(questionnaireResponse, QuestionnaireResponseDto.class);
351 return Response.ok(result).build();
355 public Response updateQuestionnaire(String questionnaireData, String vspId, String
356 versionId, String user) {
357 MdcUtil.initMdc(LoggerServiceName.Update_Questionnaire_VSP.toString());
358 vendorSoftwareProductManager.updateVspQuestionnaire(vspId,
359 resolveVspVersion(vspId, null, user, VersionableEntityAction.Write),
360 questionnaireData, user);
361 return Response.ok().build();
365 public Response heal(String vspId, String versionId, String user) {
366 vendorSoftwareProductManager.heal(vspId, Version.valueOf(versionId), user);
368 return Response.ok().build();
372 public Response getVspInformationArtifact(String vspId, String versionId, String user) {
373 MdcUtil.initMdc(LoggerServiceName.Get_Information_Artifact.toString());
374 File textInformationArtifact =
375 vendorSoftwareProductManager.getInformationArtifact(vspId,
376 resolveVspVersion(vspId, versionId, user, VersionableEntityAction.Read), user);
378 Response.ResponseBuilder response = Response.ok(textInformationArtifact);
379 if (textInformationArtifact == null) {
380 return Response.status(Response.Status.NOT_FOUND).build();
383 .header("Content-Disposition", "attachment; filename=" + textInformationArtifact.getName());
384 return response.build();
387 public Response listCompute(String vspId, String version, String user) {
389 Collection<ComputeEntity> computes = vendorSoftwareProductManager.getComputeByVsp(vspId,
390 resolveVspVersion(vspId, version, user, VersionableEntityAction.Read), user);
392 MapComputeEntityToVspComputeDto mapper = new MapComputeEntityToVspComputeDto();
393 GenericCollectionWrapper<VspComputeDto> results = new GenericCollectionWrapper<>();
394 for (ComputeEntity compute : computes) {
395 results.add(mapper.applyMapping(compute, VspComputeDto.class));
398 return Response.ok(results).build();
402 public Response reSubmitAll(String user) throws IOException {
404 MDC.put(LoggerConstants.SERVICE_NAME, LoggerServiceName.Re_Submit_ALL_Final_VSPs.toString());
405 logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.RESUBMIT_ALL_FINAL_VSPS);
407 List<VersionedVendorSoftwareProductInfo> latestFinalVsps = Objects
408 .requireNonNull(vendorSoftwareProductManager.listVsps(VersionStatus.Final.name(), user));
410 List<VersionedVendorSoftwareProductInfo> nonLockedLatestFinalVsps = latestFinalVsps.stream()
412 !isVspLocked(vsp.getVspDetails().getId(), vsp.getVspDetails().getName(), user))
413 .collect(Collectors.toList());
415 logger.info("Removed {} VSPs out of {} from processing due to status LOCKED.\n" +
416 "Total number of VSPs: {}. Performing healing and resubmit for all non-Manual VSPs " +
417 "in submitted status.\n No need to pre-set oldVersion field",
418 latestFinalVsps.size() - nonLockedLatestFinalVsps.size(), latestFinalVsps.size(),
419 nonLockedLatestFinalVsps.size());
421 int healingCounter = 0;
422 int failedCounter = 0;
423 for (int counter = 0; counter < nonLockedLatestFinalVsps.size(); counter++) {
424 VersionedVendorSoftwareProductInfo versionVspInfo = nonLockedLatestFinalVsps.get(counter);
426 final VspDetails vspDetails = versionVspInfo.getVspDetails();
427 if (!OnboardingMethod.Manual.name().equals(vspDetails.getOnboardingMethod())) {
428 logger.info("Starting on healing and resubmit for VSP [{}], #{} out of total {}",
429 vspDetails.getName(), counter + 1, nonLockedLatestFinalVsps.size());
430 reSubmit(vspDetails, user);
433 } catch (Exception e) {
438 logger.info("Total VSPs processed {}. Completed running healing and resubmit for {} VSPs out" +
439 " of total # of {} submitted VSPs. Failures count during resubmitAll: {}",
440 nonLockedLatestFinalVsps.size(), healingCounter, latestFinalVsps.size(), failedCounter);
442 return Response.ok().build();
445 private boolean isVspLocked(String vspId, String vspName, String user) {
446 final VersionInfo versionInfo = getVersionInfo(vspId, VersionableEntityAction.Read, user);
448 if (versionInfo.getStatus().equals(VersionStatus.Locked)) {
449 logger.info("VSP name [{}]/id [{}] status is LOCKED", vspName, vspId);
452 logger.info("VSP Name {}, VSP id [{}], Active Version {} , Status {}, Latest Final Version {}",
453 vspName, vspId, versionInfo.getActiveVersion().toString(), versionInfo.getStatus(),
454 versionInfo.getLatestFinalVersion().toString());
459 private void reSubmit(VspDetails vspDetails, String user) throws Exception {
460 final Version versionBefore = vspDetails.getVersion();
461 vspDetails.setOldVersion("true");
463 Version finalVersion;
466 vendorSoftwareProductManager
467 .healAndAdvanceFinalVersion(vspDetails.getId(), vspDetails, user);
468 } catch (Exception e) {
469 logger.error("Failed during resubmit, VSP [{}] , version before:{}, version after:{}, " +
470 "status after:{}, with exception:{}",
471 vspDetails.getName(), versionBefore.toString(), vspDetails.getVersion().toString(),
473 .getVersion().getStatus().name(), e.getMessage());
477 logger.info("Completed healing and resubmit for VSP [{}], version before:{}, version after:" +
478 " {}", vspDetails.getName(), versionBefore.toString(), finalVersion);
481 private static void printAuditForErrors(List<ErrorMessage> errorList, String vspId,
483 errorList.forEach(errorMessage -> {
484 if (errorMessage.getLevel().equals(ErrorLevel.ERROR)) {
485 logger.audit(AuditMessages.AUDIT_MSG + String.format(auditType, errorMessage.getMessage(),