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