Create new VSP, onboard from TOSCA file - UI
[sdc.git] / openecomp-be / backend / openecomp-sdc-vendor-software-product-manager / src / main / java / org / openecomp / sdc / vendorsoftwareproduct / impl / orchestration / process / OrchestrationTemplateProcessZipHandler.java
1 package org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.process;
2
3 import org.apache.commons.collections4.CollectionUtils;
4 import org.apache.commons.collections4.MapUtils;
5 import org.openecomp.core.model.dao.ServiceModelDao;
6 import org.openecomp.core.model.dao.ServiceModelDaoFactory;
7 import org.openecomp.core.translator.datatypes.TranslatorOutput;
8 import org.openecomp.core.utilities.file.FileContentHandler;
9 import org.openecomp.core.utilities.json.JsonUtil;
10 import org.openecomp.core.utilities.orchestration.OnboardingTypesEnum;
11 import org.openecomp.core.validation.util.MessageContainerUtil;
12 import org.openecomp.sdc.activityLog.ActivityLogManager;
13 import org.openecomp.sdc.activityLog.ActivityLogManagerFactory;
14 import org.openecomp.sdc.activitylog.dao.type.ActivityLogEntity;
15 import org.openecomp.sdc.common.errors.Messages;
16 import org.openecomp.sdc.common.utils.SdcCommon;
17 import org.openecomp.sdc.datatypes.error.ErrorLevel;
18 import org.openecomp.sdc.datatypes.error.ErrorMessage;
19 import org.openecomp.sdc.heat.datatypes.structure.HeatStructureTree;
20 import org.openecomp.sdc.logging.api.Logger;
21 import org.openecomp.sdc.logging.api.LoggerFactory;
22 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
23 import org.openecomp.sdc.logging.messages.AuditMessages;
24 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
25 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
26 import org.openecomp.sdc.validation.util.ValidationManagerUtil;
27 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentMonitoringUploadEntity;
28 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.OrchestrationTemplateCandidateData;
29 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ProcessEntity;
30 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
31 import org.openecomp.sdc.vendorsoftwareproduct.factory.CandidateServiceFactory;
32 import org.openecomp.sdc.vendorsoftwareproduct.factory.CompositionDataExtractorFactory;
33 import org.openecomp.sdc.vendorsoftwareproduct.factory.CompositionEntityDataManagerFactory;
34 import org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.OrchestrationUtil;
35 import org.openecomp.sdc.vendorsoftwareproduct.services.composition.CompositionDataExtractor;
36 import org.openecomp.sdc.vendorsoftwareproduct.services.composition.CompositionEntityDataManager;
37 import org.openecomp.sdc.vendorsoftwareproduct.services.filedatastructuremodule.CandidateService;
38 import org.openecomp.sdc.vendorsoftwareproduct.types.OrchestrationTemplateActionResponse;
39 import org.openecomp.sdc.vendorsoftwareproduct.types.UploadFileResponse;
40 import org.openecomp.sdc.vendorsoftwareproduct.types.candidateheat.FilesDataStructure;
41 import org.openecomp.sdc.vendorsoftwareproduct.utils.VendorSoftwareProductUtils;
42 import org.openecomp.sdc.versioning.dao.types.Version;
43 import org.openecomp.sdcrests.activitylog.types.ActivityType;
44
45 import java.io.ByteArrayInputStream;
46 import java.util.Collection;
47 import java.util.HashMap;
48 import java.util.List;
49 import java.util.Map;
50 import java.util.Optional;
51
52 import static org.openecomp.sdc.logging.messages.AuditMessages.HEAT_VALIDATION_ERROR;
53
54 public class OrchestrationTemplateProcessZipHandler implements OrchestrationTemplateProcessHandler {
55   Logger logger = LoggerFactory.getLogger(OrchestrationTemplateProcessZipHandler.class);
56   private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
57   private CandidateService candidateService =
58       CandidateServiceFactory.getInstance().createInterface();
59   private ServiceModelDao serviceModelDao = ServiceModelDaoFactory.getInstance().createInterface();
60   private CompositionEntityDataManager compositionEntityDataManager =
61       CompositionEntityDataManagerFactory.getInstance().createInterface();
62   private CompositionDataExtractor compositionDataExtractor =
63       CompositionDataExtractorFactory.getInstance().createInterface();
64   private ActivityLogManager activityLogManager =
65       ActivityLogManagerFactory.getInstance().createInterface();
66
67
68   public OrchestrationTemplateProcessZipHandler(){}
69
70   public OrchestrationTemplateActionResponse process(VspDetails vspDetails,
71                                                      OrchestrationTemplateCandidateData candidateData,
72                                                      String user) {
73     String vspId = vspDetails.getId();
74     Version version = vspDetails.getVersion();
75     logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.HEAT_VALIDATION_STARTED +
76         vspId);
77     OrchestrationTemplateActionResponse response = new OrchestrationTemplateActionResponse();
78     UploadFileResponse uploadFileResponse = new UploadFileResponse();
79     Optional<FileContentHandler> fileContent =
80         OrchestrationUtil
81             .getFileContentMap(
82                 OnboardingTypesEnum.ZIP, uploadFileResponse, candidateData.getContentData().array());
83     if (!fileContent.isPresent()) {
84       response.addStructureErrors(uploadFileResponse.getErrors());
85       mdcDataDebugMessage.debugExitMessage("VSP id", vspId);
86       response.getErrors().values().forEach(errorList -> printAuditForErrors(errorList,vspId,
87           HEAT_VALIDATION_ERROR));
88       return response;
89     }
90
91     Map<String, List<ErrorMessage>> uploadErrors = uploadFileResponse.getErrors();
92     FileContentHandler fileContentMap = fileContent.get();
93     FilesDataStructure structure =
94         JsonUtil.json2Object(candidateData.getFilesDataStructure(), FilesDataStructure.class);
95
96     if (CollectionUtils.isNotEmpty(structure.getUnassigned())) {
97       response.addErrorMessageToMap(SdcCommon.UPLOAD_FILE,
98           Messages.FOUND_UNASSIGNED_FILES.getErrorMessage(), ErrorLevel.ERROR);
99
100       mdcDataDebugMessage.debugExitMessage("VSP id", vspId);
101       response.getErrors().values().forEach(errorList -> printAuditForErrors(errorList,vspId,
102           HEAT_VALIDATION_ERROR));
103       return response;
104     }
105
106
107     String manifest = candidateService.createManifest(vspDetails, structure);
108     fileContentMap.addFile(SdcCommon.MANIFEST_NAME, manifest.getBytes());
109
110     Optional<ByteArrayInputStream> zipByteArrayInputStream = candidateService
111         .fetchZipFileByteArrayInputStream(
112             vspId, candidateData, manifest, OnboardingTypesEnum.ZIP, uploadErrors);
113     if (!zipByteArrayInputStream.isPresent()) {
114       response.getErrors().values().forEach(errorList -> printAuditForErrors(errorList,vspId,
115           HEAT_VALIDATION_ERROR));
116       return response;
117     }
118
119     HeatStructureTree tree = createAndValidateHeatTree(response, fileContentMap);
120
121     Map<String, String> componentsQuestionnaire = new HashMap<>();
122     Map<String, Map<String, String>> componentNicsQuestionnaire = new HashMap<>();
123     Map<String, Collection<ComponentMonitoringUploadEntity>> componentMibList = new HashMap<>();
124     Map<String, Collection<ProcessEntity>> processes = new HashMap<>();
125     Map<String, ProcessEntity> processArtifact = new HashMap<>();
126
127     OrchestrationUtil.backupComponentsQuestionnaireBeforeDelete(vspId,
128         version, componentsQuestionnaire,
129         componentNicsQuestionnaire, componentMibList, processes, processArtifact);
130
131     OrchestrationUtil.deleteUploadDataAndContent(vspId, version);
132     OrchestrationUtil.saveUploadData(vspId, version, zipByteArrayInputStream.get(), fileContentMap,
133         tree);
134
135     response.getErrors().values().forEach(errorList -> printAuditForErrors(errorList,vspId,
136         HEAT_VALIDATION_ERROR));
137     if ( MapUtils.isEmpty(MessageContainerUtil.getMessageByLevel(ErrorLevel.ERROR, response.getErrors
138         ()))) {
139       logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.HEAT_VALIDATION_COMPLETED + vspId);
140     }
141
142     logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.HEAT_TRANSLATION_STARTED + vspId);
143
144     TranslatorOutput translatorOutput =
145         HeatToToscaUtil.loadAndTranslateTemplateData(fileContentMap);
146
147     ToscaServiceModel toscaServiceModel = translatorOutput.getToscaServiceModel();
148     OrchestrationUtil.saveServiceModel(vspId, version, translatorOutput
149         .getNonUnifiedToscaServiceModel(), toscaServiceModel);
150     OrchestrationUtil.retainComponentQuestionnaireData(vspId, version, componentsQuestionnaire,
151         componentNicsQuestionnaire, componentMibList, processes, processArtifact);
152
153     logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.HEAT_TRANSLATION_COMPLETED + vspId);
154     uploadFileResponse.addStructureErrors(uploadErrors);
155
156     ActivityLogEntity activityLogEntity =
157         new ActivityLogEntity(vspId, String.valueOf(version.getMajor() + 1),
158             ActivityType.UPLOAD_HEAT.toString(), user, true, "", "");
159     activityLogManager.addActionLog(activityLogEntity, user);
160
161     mdcDataDebugMessage.debugExitMessage("VSP id", vspId);
162     return response;
163   }
164
165   private HeatStructureTree createAndValidateHeatTree(OrchestrationTemplateActionResponse response,
166                                                       FileContentHandler fileContentMap) {
167     VendorSoftwareProductUtils.addFileNamesToUploadFileResponse(fileContentMap, response);
168     Map<String, List<ErrorMessage>> validationErrors =
169         ValidationManagerUtil.initValidationManager(fileContentMap).validate();
170     response.getErrors().putAll(validationErrors);
171
172     return OrchestrationUtil.createHeatTree(fileContentMap, validationErrors);
173   }
174
175   private void printAuditForErrors(List<ErrorMessage> errorList, String vspId, String auditType) {
176
177     errorList.forEach(errorMessage -> {
178       if (errorMessage.getLevel().equals(ErrorLevel.ERROR)) {
179         logger.audit(AuditMessages.AUDIT_MSG + String.format(auditType, errorMessage.getMessage(),
180             vspId));
181       }
182     });
183   }
184 }