0450244355ed62332dae0d00d16fb4af52057aa6
[sdc.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
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=========================================================
19  */
20
21 package org.openecomp.sdcrests.vsp.rest.services;
22
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;
70 import org.slf4j.MDC;
71 import org.springframework.context.annotation.Scope;
72 import org.springframework.stereotype.Service;
73
74 import javax.inject.Named;
75 import javax.ws.rs.core.Response;
76 import java.io.File;
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;
82
83 import static org.openecomp.sdc.logging.messages.AuditMessages.SUBMIT_VSP_ERROR;
84
85
86 @Named
87 @Service("vendorSoftwareProducts")
88 @Scope(value = "prototype")
89 public class VendorSoftwareProductsImpl implements VendorSoftwareProducts {
90
91   private VendorSoftwareProductManager vendorSoftwareProductManager =
92       VspManagerFactory.getInstance().createInterface();
93
94   private static final Logger logger =
95       LoggerFactory.getLogger(VendorSoftwareProductsImpl.class);
96
97   private ActivityLogManager activityLogManager =
98       ActivityLogManagerFactory.getInstance().createInterface();
99
100   @Override
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());
105
106     VspCreationDto vspCreationDto = null;
107     OnboardingMethod onboardingMethod =
108         OnboardingMethod.valueOf(vspDescriptionDto.getOnboardingMethod());
109     if (onboardingMethod == null) {
110       return handleUnkownOnboardingMethod();
111     }
112     switch (onboardingMethod) {
113       case NetworkPackage:
114       case Manual:
115         VspDetails vspDetails = new MapVspDescriptionDtoToVspDetails().
116             applyMapping(vspDescriptionDto, VspDetails.class);
117
118         vspDetails = vendorSoftwareProductManager.createVsp(vspDetails, user);
119
120         MapVspDetailsToVspCreationDto mapping = new MapVspDetailsToVspCreationDto();
121         vspCreationDto = mapping.applyMapping(vspDetails, VspCreationDto.class);
122         break;
123       default:
124         return handleUnkownOnboardingMethod();
125     }
126
127     return Response.ok(vspCreationDto).build();
128   }
129
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);
137   }
138
139   @Override
140   public Response listVsps(String versionFilter, String user) {
141     MdcUtil.initMdc(LoggerServiceName.List_VSP.toString());
142     List<VersionedVendorSoftwareProductInfo> vspList =
143         vendorSoftwareProductManager.listVsps(versionFilter, user);
144
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));
151       }
152     }
153
154     return Response.ok(results).build();
155   }
156
157   @Override
158   public Response getVsp(String vspId, String versionId, String user) {
159     MdcUtil.initMdc(LoggerServiceName.Get_VSP.toString());
160
161
162     VspDetails vspDetails =
163         vendorSoftwareProductManager
164             .getVsp(vspId, resolveVspVersion(vspId, versionId, user, VersionableEntityAction.Read),
165                 user);
166
167     VersionInfo versionInfo = getVersionInfo(vspId, VersionableEntityAction.Read, user);
168
169
170     if (vspDetails.getOldVersion() != null && !"".equals(vspDetails.getOldVersion())) {
171       if (Version.valueOf(versionId).equals(versionInfo.getActiveVersion())) {
172         try {
173           Version healedVersion = vendorSoftwareProductManager.callAutoHeal(vspId, versionInfo,
174               vspDetails, user);
175           vspDetails =
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);
182         }
183       }
184     }
185
186     VspDetailsDto vspDetailsDto = vspDetails == null
187         ? null
188         : new MapVersionedVendorSoftwareProductInfoToVspDetailsDto()
189             .applyMapping(new VersionedVendorSoftwareProductInfo(vspDetails, versionInfo),
190                 VspDetailsDto.class);
191
192     return Response.ok(vspDetailsDto).build();
193   }
194
195   @Override
196   public Response updateVsp(String vspId, String versionId, VspDescriptionDto vspDescriptionDto,
197                             String user) {
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));
203
204     vendorSoftwareProductManager.updateVsp(vspDetails, user);
205
206     return Response.ok().build();
207   }
208
209   @Override
210   public Response deleteVsp(String vspId, String user) {
211     MdcUtil.initMdc(LoggerServiceName.Delete_VSP.toString());
212     vendorSoftwareProductManager.deleteVsp(vspId, user);
213
214     return Response.ok().build();
215   }
216
217   @Override
218   public Response actOnVendorSoftwareProduct(String vspId, String versionId,
219                                              VersionSoftwareProductActionRequestDto request,
220                                              String user) throws IOException {
221
222     switch (request.getAction()) {
223       case Checkout:
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);
227         break;
228       case Undo_Checkout:
229         MDC.put(LoggerConstants.SERVICE_NAME, LoggerServiceName.Undo_Checkout_VSP.toString());
230         vendorSoftwareProductManager.undoCheckout(vspId, user);
231         break;
232       case Checkin:
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);
236         break;
237       case Submit:
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)));
245           }
246           if (validationResponse.getUploadDataErrors() != null) {
247             validationResponse.getUploadDataErrors().values().forEach(errorMessages
248                 -> printAuditForErrors(errorMessages, vspId, SUBMIT_VSP_ERROR));
249           }
250
251           return Response.status(Response.Status.EXPECTATION_FAILED).entity(
252               new MapValidationResponseToDto()
253                   .applyMapping(validationResponse, ValidationResponseDto.class)).build();
254         }
255         logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.SUBMIT_VSP + vspId);
256         break;
257       case Create_Package:
258         MDC.put(LoggerConstants.SERVICE_NAME, LoggerServiceName.Create_Package.toString());
259
260         PackageInfo packageInfo = vendorSoftwareProductManager.createPackage(vspId,
261             resolveVspVersion(vspId, null, user, VersionableEntityAction.Read), user);
262         return Response.ok(packageInfo == null
263             ? null
264             : new MapPackageInfoToPackageInfoDto().applyMapping(packageInfo, PackageInfoDto.class))
265             .build();
266       default:
267     }
268
269     return Response.ok().build();
270   }
271
272   @Override
273   public Response getValidationVsp(String user)
274       throws Exception {
275     String validationVspId = vendorSoftwareProductManager.fetchValidationVsp(user);
276     StringWrapperResponse response = new StringWrapperResponse(validationVspId);
277     return Response.ok(response).build();
278   }
279
280
281   @Override
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);
288
289     if (orchestrationTemplateFile == null) {
290       return Response.status(Response.Status.NOT_FOUND).build();
291     }
292     Response.ResponseBuilder response = Response.ok(orchestrationTemplateFile);
293     response.header("Content-Disposition", "attachment; filename=LatestHeatPackage.zip");
294     return response.build();
295   }
296
297   @Override
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);
302
303     GenericCollectionWrapper<PackageInfoDto> results = new GenericCollectionWrapper<>();
304     MapPackageInfoToPackageInfoDto mapper = new MapPackageInfoToPackageInfoDto();
305
306     if (packageInfoList != null) {
307       for (PackageInfo packageInfo : packageInfoList) {
308         results.add(mapper.applyMapping(packageInfo, PackageInfoDto.class));
309       }
310     }
311     return Response.ok(results).build();
312   }
313
314   @Override
315   public Response getTranslatedFile(String vspId, String versionId, String user) {
316     MdcUtil.initMdc(LoggerServiceName.Get_Translated_File.toString());
317
318     Version version = Version.valueOf(versionId);
319     Version resolvedVersion = version == null
320         ? getVersionInfo(vspId, VersionableEntityAction.Read, user).getLatestFinalVersion()
321         : version;
322
323     File zipFile = vendorSoftwareProductManager.getTranslatedFile(vspId, resolvedVersion, user);
324
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();
329     }
330     response.header("Content-Disposition", "attachment; filename=" + zipFile.getName());
331
332     logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.IMPORT_SUCCESS + vspId);
333     return response.build();
334   }
335
336   @Override
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);
342
343     if (questionnaireResponse.getErrorMessage() != null) {
344       return Response.status(Response.Status.EXPECTATION_FAILED).entity(
345           new MapQuestionnaireResponseToQuestionnaireResponseDto()
346               .applyMapping(questionnaireResponse, QuestionnaireResponseDto.class)).build();
347     }
348
349     QuestionnaireResponseDto result = new MapQuestionnaireResponseToQuestionnaireResponseDto()
350         .applyMapping(questionnaireResponse, QuestionnaireResponseDto.class);
351     return Response.ok(result).build();
352   }
353
354   @Override
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();
362   }
363
364   @Override
365   public Response heal(String vspId, String versionId, String user) {
366     vendorSoftwareProductManager.heal(vspId, Version.valueOf(versionId), user);
367
368     return Response.ok().build();
369   }
370
371   @Override
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);
377
378     Response.ResponseBuilder response = Response.ok(textInformationArtifact);
379     if (textInformationArtifact == null) {
380       return Response.status(Response.Status.NOT_FOUND).build();
381     }
382     response
383         .header("Content-Disposition", "attachment; filename=" + textInformationArtifact.getName());
384     return response.build();
385   }
386
387   public Response listCompute(String vspId, String version, String user) {
388
389     Collection<ComputeEntity> computes = vendorSoftwareProductManager.getComputeByVsp(vspId,
390         resolveVspVersion(vspId, version, user, VersionableEntityAction.Read), user);
391
392     MapComputeEntityToVspComputeDto mapper = new MapComputeEntityToVspComputeDto();
393     GenericCollectionWrapper<VspComputeDto> results = new GenericCollectionWrapper<>();
394     for (ComputeEntity compute : computes) {
395       results.add(mapper.applyMapping(compute, VspComputeDto.class));
396     }
397
398     return Response.ok(results).build();
399   }
400
401   @Override
402   public Response reSubmitAll(String user) throws IOException {
403
404     MDC.put(LoggerConstants.SERVICE_NAME, LoggerServiceName.Re_Submit_ALL_Final_VSPs.toString());
405     logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.RESUBMIT_ALL_FINAL_VSPS);
406
407     List<VersionedVendorSoftwareProductInfo> latestFinalVsps = Objects
408         .requireNonNull(vendorSoftwareProductManager.listVsps(VersionStatus.Final.name(), user));
409
410     List<VersionedVendorSoftwareProductInfo> nonLockedLatestFinalVsps = latestFinalVsps.stream()
411         .filter(vsp ->
412             !isVspLocked(vsp.getVspDetails().getId(), vsp.getVspDetails().getName(), user))
413         .collect(Collectors.toList());
414
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());
420
421     int healingCounter = 0;
422     int failedCounter = 0;
423     for (int counter = 0; counter < nonLockedLatestFinalVsps.size(); counter++) {
424       VersionedVendorSoftwareProductInfo versionVspInfo = nonLockedLatestFinalVsps.get(counter);
425       try {
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);
431           healingCounter++;
432         }
433       } catch (Exception e) {
434         failedCounter++;
435       }
436     }
437
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);
441
442     return Response.ok().build();
443   }
444
445   private boolean isVspLocked(String vspId, String vspName, String user) {
446     final VersionInfo versionInfo = getVersionInfo(vspId, VersionableEntityAction.Read, user);
447
448     if (versionInfo.getStatus().equals(VersionStatus.Locked)) {
449       logger.info("VSP name [{}]/id [{}] status is LOCKED", vspName, vspId);
450       return true;
451     }
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());
455     return false;
456   }
457
458
459   private void reSubmit(VspDetails vspDetails, String user) throws Exception {
460     final Version versionBefore = vspDetails.getVersion();
461     vspDetails.setOldVersion("true");
462
463     Version finalVersion;
464     try {
465       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(),
472           vspDetails
473               .getVersion().getStatus().name(), e.getMessage());
474       throw e;
475     }
476
477     logger.info("Completed healing and resubmit for VSP [{}], version before:{}, version after:" +
478         " {}", vspDetails.getName(), versionBefore.toString(), finalVersion);
479   }
480
481   private static void printAuditForErrors(List<ErrorMessage> errorList, String vspId,
482                                           String auditType) {
483     errorList.forEach(errorMessage -> {
484       if (errorMessage.getLevel().equals(ErrorLevel.ERROR)) {
485         logger.audit(AuditMessages.AUDIT_MSG + String.format(auditType, errorMessage.getMessage(),
486             vspId));
487       }
488     });
489   }
490 }