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.sdc.vendorsoftwareproduct.services.impl.filedatastructuremodule;
23 import org.apache.commons.collections4.CollectionUtils;
24 import org.openecomp.core.utilities.file.FileContentHandler;
25 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
26 import org.openecomp.sdc.heat.datatypes.manifest.ManifestContent;
27 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
28 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
29 import org.openecomp.sdc.vendorsoftwareproduct.services.HeatFileAnalyzer;
30 import org.openecomp.sdc.vendorsoftwareproduct.services.filedatastructuremodule.ManifestCreator;
31 import org.openecomp.sdc.vendorsoftwareproduct.types.candidateheat.AnalyzedZipHeatFiles;
32 import org.openecomp.sdc.vendorsoftwareproduct.types.candidateheat.Constants;
33 import org.openecomp.sdc.vendorsoftwareproduct.types.candidateheat.FilesDataStructure;
34 import org.openecomp.sdc.vendorsoftwareproduct.types.candidateheat.Module;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
38 import java.util.ArrayList;
39 import java.util.Collection;
40 import java.util.HashSet;
41 import java.util.List;
43 import java.util.Objects;
44 import java.util.Optional;
46 import java.util.regex.Pattern;
48 public class ManifestCreatorNamingConventionImpl implements ManifestCreator {
49 protected static final Logger logger =
50 LoggerFactory.getLogger(ManifestCreatorNamingConventionImpl.class);
51 private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
55 public Optional<ManifestContent> createManifest(
56 VspDetails vspDetails, FilesDataStructure filesDataStructure) {
59 mdcDataDebugMessage.debugEntryMessage(null, null);
61 if (Objects.isNull(filesDataStructure)) {
62 return Optional.empty();
65 List<FileData> fileDataList = new ArrayList<>();
66 addModulesToManifestFileDataList(filesDataStructure, fileDataList);
67 addNestedToManifest(filesDataStructure, fileDataList);
68 addArtifactsToManifestFileDataList(filesDataStructure, fileDataList);
69 ManifestContent manifestContent = createManifest(vspDetails, fileDataList);
71 mdcDataDebugMessage.debugExitMessage(null, null);
72 return Optional.of(manifestContent);
75 private void addNestedToManifest(
76 FilesDataStructure filesDataStructure, List<FileData> fileDataList) {
79 mdcDataDebugMessage.debugEntryMessage(null, null);
81 if (CollectionUtils.isNotEmpty(filesDataStructure.getNested())) {
82 for (String nested : filesDataStructure.getNested()) {
83 fileDataList.add(createBaseFileData(FileData.Type.HEAT, nested));
87 mdcDataDebugMessage.debugExitMessage(null, null);
91 public Optional<ManifestContent> createManifest(VspDetails vspDetails,
92 FileContentHandler fileContentHandler,
93 AnalyzedZipHeatFiles analyzedZipHeatFiles) {
94 logger.info("Trying to generate manifest");
95 if (Objects.isNull(fileContentHandler)
96 || CollectionUtils.isEmpty(fileContentHandler.getFileList())) {
97 logger.info("fileContentHandler or filesList is empty. ManifestContent will not be created");
98 return Optional.empty();
101 Map<String, byte[]> files = fileContentHandler.getFiles();
103 List<FileData> fileDataList =
104 createFileDataListFromZipFiles(fileContentHandler, files,
105 analyzedZipHeatFiles.getFilesNotEligbleForModules());
106 ManifestContent manifestContent = createManifest(vspDetails, fileDataList);
108 return Optional.of(manifestContent);
111 private ManifestContent createManifest(VspDetails vspDetails, List<FileData> fileDataList) {
112 ManifestContent manifestContent = new ManifestContent();
113 manifestContent.setName(vspDetails.getName());
114 manifestContent.setDescription(vspDetails.getDescription());
116 .setVersion(vspDetails.getVersion() == null ? null : vspDetails.getVersion().toString());
117 // vsp version, need to check in confluence
118 manifestContent.setData(fileDataList);
119 return manifestContent;
122 private List<FileData> createFileDataListFromZipFiles(FileContentHandler fileContentHandler,
123 Map<String, byte[]> files,
124 Collection<String> filesNotEligibleForModules) {
126 Set<String> processedFiles = new HashSet<>();
127 List<FileData> fileDataList = new ArrayList<>();
128 for (String fileName : files.keySet()) {
129 if (processedFiles.contains(fileName)) {
132 if (isFileBaseFile(fileName)) {
134 .add(createModuleFileData(
135 fileName, true, processedFiles, fileContentHandler.getFileList(), fileDataList));
136 } else if (isFileModuleFile(fileName, filesNotEligibleForModules)) {
138 .add(createModuleFileData(
139 fileName, false, processedFiles, fileContentHandler.getFileList(), fileDataList));
141 if (HeatFileAnalyzer.isYamlFile(fileName)) {
142 fileDataList.add(createBasicFileData(fileName, FileData.Type.HEAT, null));
143 } else if (HeatFileAnalyzer.isEnvFile(fileName)) {
144 fileDataList.add(createBasicFileData(fileName, FileData.Type.HEAT_ENV, null));
146 fileDataList.add(createBasicFileData(fileName, FileData.Type.OTHER, null));
153 private boolean doesHeatTemplateVersionExist(byte[] value) {
157 private boolean isFileModuleFile(String fileName, Collection<String> filesCannotBeModule) {
158 return !filesCannotBeModule.contains(fileName);
162 public boolean isFileBaseFile(String fileName) {
163 return Pattern.matches(Constants.BASE_HEAT_REGEX, fileName) && !isVolFile(fileName);
167 private void addArtifactsToManifestFileDataList(
168 FilesDataStructure filesDataStructure, List<FileData> fileDataList) {
171 mdcDataDebugMessage.debugEntryMessage(null, null);
173 Collection<String> forArtifacts = CollectionUtils
174 .union(filesDataStructure.getArtifacts(), filesDataStructure.getUnassigned());
175 if (CollectionUtils.isNotEmpty(forArtifacts)) {
176 for (String artifact : forArtifacts) {
177 fileDataList.add(createBaseFileData(FileData.Type.OTHER, artifact));
181 mdcDataDebugMessage.debugExitMessage(null, null);
184 private void addModulesToManifestFileDataList(
185 FilesDataStructure filesDataStructure, List<FileData> fileDataList) {
188 mdcDataDebugMessage.debugEntryMessage(null, null);
190 if (CollectionUtils.isNotEmpty(filesDataStructure.getModules())) {
191 for (Module module : filesDataStructure.getModules()) {
192 FileData fileData = createBaseFileData(FileData.Type.HEAT, module.getYaml());
193 fileData.setBase(module.getIsBase());
194 addEnv(module, fileData);
195 addVolume(module, fileData);
196 fileDataList.add(fileData);
200 mdcDataDebugMessage.debugExitMessage(null, null);
203 private void addEnv(Module module, FileData fileData) {
204 if (Objects.nonNull(module.getEnv())) {
205 FileData env = createBaseFileData(FileData.Type.HEAT_ENV, module.getEnv());
206 fileData.addFileData(env);
210 private void addVolume(Module module, FileData fileData) {
211 String volModule = module.getVol();
212 if (Objects.nonNull(volModule)) {
213 FileData vol = createBaseFileData(FileData.Type.HEAT_VOL, volModule);
214 if (Objects.nonNull(module.getVolEnv())) {
215 vol.addFileData(createBaseFileData(FileData.Type.HEAT_ENV, module.getVolEnv()));
217 fileData.addFileData(vol);
221 private FileData createBaseFileData(FileData.Type heat, String yaml) {
222 FileData fileData = new FileData();
223 fileData.setType(heat);
224 fileData.setFile(yaml);
228 private FileData createModuleFileData(
229 String moduleFileName, boolean isBase, Set<String> processedFiles,
230 Set<String> fileNames, List<FileData> fileDataList) {
231 FileData moduleFileData = createBasicFileData(moduleFileName, FileData.Type.HEAT, isBase);
232 Optional<String> volFile = fetchRelatedVolume(moduleFileName, fileNames);
233 volFile.ifPresent(vol -> {
234 markFileAsProcessed(vol, processedFiles);
235 removeFromFileDataListIfAlreadyProcessed(fileDataList, vol);
236 FileData volFileData = createBasicFileData(vol, FileData.Type.HEAT_VOL, null);
237 Optional<String> envFile = fetchRelatedEnv(vol, fileNames);
238 envFile.ifPresent(env -> {
239 markFileAsProcessed(env, processedFiles);
240 removeFromFileDataListIfAlreadyProcessed(fileDataList, env);
241 FileData envFileData = createBasicFileData(env, FileData.Type.HEAT_ENV, null);
242 volFileData.addFileData(envFileData);
244 moduleFileData.addFileData(volFileData);
246 Optional<String> envFile = fetchRelatedEnv(moduleFileName, fileNames);
247 envFile.ifPresent(env -> {
248 markFileAsProcessed(env, processedFiles);
249 FileData envFileData = createBasicFileData(env, FileData.Type.HEAT_ENV, null);
250 moduleFileData.addFileData(envFileData);
252 return moduleFileData;
255 private void removeFromFileDataListIfAlreadyProcessed(List<FileData> fileDataList, String vol) {
256 fileDataList.removeIf(fileData -> fileData.getFile().equals(vol));
259 private FileData createBasicFileData(String fileName, FileData.Type type, Boolean isBase) {
260 FileData fileData = new FileData();
261 if (isBase != null) {
262 fileData.setBase(isBase);
264 fileData.setType(type);
265 fileData.setFile(fileName);
269 private Optional<String> fetchRelatedEnv(String fileName, Set<String> fileNames) {
271 = fileName.substring(0, fileName.lastIndexOf(".")) + Constants.ENV_FILE_EXTENSION;
272 return fileNames.contains(envFileName) ? Optional.of(envFileName) : Optional.empty();
275 private Optional<String> fetchRelatedVolume(String fileName, Set<String> fileNames) {
277 String volFile1stExt =
278 extractVolFileName(fileName, ".yaml");
279 String volFile2ndExt =
280 extractVolFileName(fileName, ".yml");
282 if (fileNames.contains(volFile1stExt)) {
283 return Optional.of(volFile1stExt);
285 if (fileNames.contains(volFile2ndExt)) {
286 return Optional.of(volFile2ndExt);
288 return Optional.empty();
291 private String extractVolFileName(String fileName, String fileExt) {
292 return fileName.substring(
293 0, fileName.lastIndexOf("."))
294 + Constants.VOL_FILE_NAME_SUFFIX + fileExt;
298 private boolean isVolFile(String fileName) {
301 Constants.VOL_FILE_NAME_SUFFIX + ".yaml")
302 || fileName.endsWith(Constants.VOL_FILE_NAME_SUFFIX + ".yml");
306 private void markFileAsProcessed(String fileName, Set<String> processedFiles) {
307 processedFiles.add(fileName);