Catalog alignment
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / info / ArtifactTemplateInfo.java
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.sdc.be.info;
22
23 import com.google.gson.Gson;
24 import com.google.gson.JsonObject;
25 import fj.data.Either;
26 import org.openecomp.sdc.be.config.BeEcompErrorManager;
27 import org.openecomp.sdc.be.config.Configuration.ArtifactTypeConfig;
28 import org.openecomp.sdc.be.config.ConfigurationManager;
29 import org.openecomp.sdc.be.dao.api.ActionStatus;
30 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
31 import org.openecomp.sdc.be.impl.ComponentsUtils;
32 import org.openecomp.sdc.be.model.ArtifactType;
33 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
34 import org.openecomp.sdc.common.log.wrappers.Logger;
35 import org.openecomp.sdc.exception.ResponseFormat;
36
37 import java.util.ArrayList;
38 import java.util.HashMap;
39 import java.util.List;
40 import java.util.Map;
41 import java.util.Set;
42
43 public class ArtifactTemplateInfo {
44     private static final Logger log = Logger.getLogger(ArtifactTemplateInfo.class);
45     private static final Gson gson = new Gson();
46     public static final String CSAR_ARTIFACT = "artifacts";
47
48     private static final String ARTIFACT_TEMPLATE_TYPE = "type";
49     private static final String FILE_NAME = "fileName";
50     private static final String ARTIFACT_TEMPLATE_ENV = "env";
51     private static final String IS_BASE = "isBase";
52     private static final String CSAR_HEAT = "HEAT";
53     private static final String CSAR_NETWORK = "network";
54     private static final String CSAR_VOLUME = "volume";
55     private static final String CSAR_NESTED = "nested";
56     private static final String DESC = "description";
57
58     private String type;
59     private String fileName;
60     private String env;
61     private boolean isBase;
62     private String groupName;
63     private String description;
64
65     private List<ArtifactTemplateInfo> relatedArtifactsInfo;
66
67     public ArtifactTemplateInfo() {}
68
69     public ArtifactTemplateInfo(String type, String fileName, String env, List<ArtifactTemplateInfo> relatedArtifactsInfo) {
70         this.type = type;
71         this.fileName = fileName;
72         this.env = env;
73         this.relatedArtifactsInfo = relatedArtifactsInfo;
74     }
75
76     public String getType() {
77         return type;
78     }
79
80     public void setType(String type) {
81         this.type = type;
82     }
83
84     public String getFileName() {
85         return fileName;
86     }
87
88     public void setFileName(String fileName) {
89         this.fileName = fileName;
90     }
91
92     public String getEnv() {
93         return env;
94     }
95
96     public void setEnv(String env) {
97         this.env = env;
98     }
99
100     public List<ArtifactTemplateInfo> getRelatedArtifactsInfo() {
101         return relatedArtifactsInfo;
102     }
103
104     public void setRelatedArtifactsInfo(List<ArtifactTemplateInfo> relatedArtifactsInfo) {
105         this.relatedArtifactsInfo = relatedArtifactsInfo;
106     }
107
108     public String getGroupName() {
109         return groupName;
110     }
111
112     public void setGroupName(String groupName) {
113         this.groupName = groupName;
114     }
115
116     public boolean isBase() {
117         return isBase;
118     }
119
120     public void setBase(boolean isBase) {
121         this.isBase = isBase;
122     }
123
124     public String getDescription() {
125         return description;
126     }
127
128     public void setDescription(String description) {
129         this.description = description;
130     }
131
132     @Override
133     public String toString() {
134         return "ArtifactTemplateInfo [type=" + type + ", fileName=" + fileName + ", env=" + env + ", isBase=" + isBase + ", groupName=" + groupName + ", description=" + description + ", relatedArtifactsInfo=" + relatedArtifactsInfo + "]";
135     }
136
137     public static Either<ArtifactTemplateInfo, ResponseFormat> createArtifactTemplateInfoFromJson(ComponentsUtils componentsUtils, String type, Map<String, Object> o, List<ArtifactTemplateInfo> createdArtifactTemplateInfoList,
138             ArtifactTemplateInfo parentArtifact) {
139         String content = gson.toJson(o);
140         JsonObject jsonElement = new JsonObject();
141         ArtifactTemplateInfo resourceInfo = new ArtifactTemplateInfo();
142
143         jsonElement = gson.fromJson(content, jsonElement.getClass());
144
145         Map<String, Object> artifactTemplateMap = ComponentsUtils.parseJsonToObject(jsonElement.toString(), HashMap.class);
146         if (artifactTemplateMap.containsKey(ARTIFACT_TEMPLATE_TYPE)) {
147             resourceInfo.setType((String) artifactTemplateMap.get(ARTIFACT_TEMPLATE_TYPE));
148         }
149         if (artifactTemplateMap.containsKey(FILE_NAME)) {
150             resourceInfo.setFileName((String) artifactTemplateMap.get(FILE_NAME));
151         }
152         if (artifactTemplateMap.containsKey(IS_BASE)) {
153             resourceInfo.setBase((Boolean) artifactTemplateMap.get(IS_BASE));
154         }
155         if (artifactTemplateMap.containsKey(ARTIFACT_TEMPLATE_ENV)) {
156             Object envObj = artifactTemplateMap.get(ARTIFACT_TEMPLATE_ENV);
157             String envStr = "";
158             if (envObj instanceof String) {
159                 envStr = (String) envObj;
160             }
161             else if (envObj instanceof Map) {
162                 Map envMap = (Map) envObj;
163                 if (envMap.containsKey(FILE_NAME)) {
164                     envStr = (String) envMap.get(FILE_NAME);
165                 }
166             }
167             resourceInfo.setEnv(envStr);
168         }
169         if (artifactTemplateMap.containsKey(DESC)) {
170             resourceInfo.setDescription((String) artifactTemplateMap.get(DESC));
171         } else {
172             resourceInfo.setDescription((String) artifactTemplateMap.get(FILE_NAME));
173         }
174
175         boolean artifactTypeExist = false;
176         String correctType;
177         if (type.equalsIgnoreCase(CSAR_NESTED)) {
178             correctType = ArtifactTypeEnum.HEAT_NESTED.getType();
179         }
180         else if (type.equalsIgnoreCase(CSAR_VOLUME)) {
181             correctType = ArtifactTypeEnum.HEAT_VOL.getType();
182         }
183         else if (type.equalsIgnoreCase(CSAR_NETWORK)) {
184             correctType = ArtifactTypeEnum.HEAT_NET.getType();
185         }
186         else if (type.equalsIgnoreCase(CSAR_ARTIFACT)){
187             if( parentArtifact != null) {
188                 correctType = ArtifactTypeEnum.HEAT_ARTIFACT.getType();
189             }
190             else {
191                 correctType = resourceInfo.type;
192             }
193         }
194         else if (type.equalsIgnoreCase(CSAR_HEAT)) {
195             correctType = ArtifactTypeEnum.HEAT.getType();
196         }
197         else {
198             correctType = ArtifactTypeEnum.OTHER.getType();
199         }
200         Either<List<ArtifactType>, ActionStatus> allArtifactTypes = getDeploymentArtifactTypes(NodeTypeEnum.Resource);
201
202         if (allArtifactTypes.isRight()) {
203             BeEcompErrorManager.getInstance().logBeInvalidConfigurationError("Artifact Upload / Update", "artifactTypes", allArtifactTypes.right().value().name());
204             return Either.right(componentsUtils.getResponseFormat(ActionStatus.FAILED_RETRIVE_ARTIFACTS_TYPES));
205         }
206
207         for (ArtifactType artType : allArtifactTypes.left().value()) {
208
209             if (artType.getName().contains(correctType)) {
210                 resourceInfo.type = artType.getName();
211                 artifactTypeExist = true;
212                 break;
213             }
214         }
215
216         if (!artifactTypeExist) {
217             BeEcompErrorManager.getInstance().logBeInvalidTypeError("Artifact", "-Not supported artifact type ", correctType);
218             log.debug("Not supported artifact type = {}" , correctType);
219             return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_TYPE_NOT_SUPPORTED, correctType));
220         }
221
222         Either<Boolean, ResponseFormat> eitherNeedToCreate = validateEnv(componentsUtils, createdArtifactTemplateInfoList, resourceInfo);
223         if (eitherNeedToCreate.isRight()) {
224             return Either.right(eitherNeedToCreate.right().value());
225         }
226         eitherNeedToCreate = validateParentType(componentsUtils, resourceInfo, parentArtifact);
227         if (eitherNeedToCreate.isRight()) {
228             return Either.right(eitherNeedToCreate.right().value());
229         }
230         eitherNeedToCreate = validateIsAlreadyExist(componentsUtils, resourceInfo, createdArtifactTemplateInfoList, parentArtifact);
231         if (eitherNeedToCreate.isRight()) {
232             return Either.right(eitherNeedToCreate.right().value());
233         }
234         Set<String> keys = o.keySet();
235         for (String key : keys) {
236             if (o.get(key) instanceof List) {
237                 List<Map<String, Object>> artifList = (List<Map<String, Object>>) o.get(key);
238                 for (Map<String, Object> relatedArtifactsMap : artifList) {
239                     Either<ArtifactTemplateInfo, ResponseFormat> relatedArtifact = ArtifactTemplateInfo.createArtifactTemplateInfoFromJson(componentsUtils, key, relatedArtifactsMap, createdArtifactTemplateInfoList, resourceInfo);
240                     if (relatedArtifact.isRight()) {
241                         return relatedArtifact;
242                     }
243                     if (resourceInfo.relatedArtifactsInfo == null) {
244                         resourceInfo.relatedArtifactsInfo = new ArrayList<>();
245                     }
246                     resourceInfo.relatedArtifactsInfo.add(relatedArtifact.left().value());
247                 }
248             }
249         }
250         return Either.left(resourceInfo);
251     }
252
253     private static Either<Boolean, ResponseFormat> validateIsAlreadyExist(ComponentsUtils componentsUtils, ArtifactTemplateInfo resourceInfo, List<ArtifactTemplateInfo> createdArtifactTemplateInfoList, ArtifactTemplateInfo parentArtifact) {
254
255         if (parentArtifact == null) {
256             if (createdArtifactTemplateInfoList == null || createdArtifactTemplateInfoList.isEmpty())
257                 return Either.left(true);
258             for (ArtifactTemplateInfo createdArtifact : createdArtifactTemplateInfoList) {
259                 if (createdArtifact.getType().equalsIgnoreCase(resourceInfo.getType()) && createdArtifact.getFileName().equalsIgnoreCase(resourceInfo.getFileName())) {
260                     return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_ALRADY_EXIST_IN_MASTER_IN_CSAR, resourceInfo.getFileName(), createdArtifact.type));
261                 }
262             }
263             return Either.left(true);
264         } else {
265             List<ArtifactTemplateInfo> relatedArtifacts = parentArtifact.getRelatedArtifactsInfo();
266             if (relatedArtifacts == null || relatedArtifacts.isEmpty())
267                 return Either.left(true);
268             for (ArtifactTemplateInfo relatedArtifact : relatedArtifacts) {
269                 if (relatedArtifact.getType().equalsIgnoreCase(resourceInfo.getType()) && relatedArtifact.getFileName().equalsIgnoreCase(resourceInfo.getFileName())) {
270                     return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_ALRADY_EXIST_IN_MASTER_IN_CSAR, resourceInfo.getFileName(), parentArtifact.getFileName()));
271                 }
272             }
273             return Either.left(true);
274         }
275     }
276
277     private static Either<Boolean, ResponseFormat> validateParentType(ComponentsUtils componentsUtils, ArtifactTemplateInfo resourceInfo, ArtifactTemplateInfo parentArtifact) {
278
279         if (parentArtifact == null) {
280             return Either.left(true);
281         }
282         if (resourceInfo.getType().equalsIgnoreCase(ArtifactTypeEnum.HEAT_ARTIFACT.getType())) {
283             return Either.left(true);
284         }
285         if (resourceInfo.getType().equalsIgnoreCase(ArtifactTypeEnum.HEAT.getType())) {
286             return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_VALID_IN_MASTER, resourceInfo.getFileName(), resourceInfo.getType(), parentArtifact.getFileName(), parentArtifact.getType()));
287         }
288         if ((resourceInfo.getType().equalsIgnoreCase(ArtifactTypeEnum.HEAT_NET.getType()) || resourceInfo.getType().equalsIgnoreCase(ArtifactTypeEnum.HEAT_VOL.getType()))
289                 && !parentArtifact.getType().equalsIgnoreCase(ArtifactTypeEnum.HEAT.getType())) {
290             return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_VALID_IN_MASTER, resourceInfo.getFileName(), resourceInfo.getType(), parentArtifact.getFileName(), parentArtifact.getType()));
291         }
292         if (parentArtifact.getType().equalsIgnoreCase(ArtifactTypeEnum.HEAT_NESTED.getType())) {
293             if (resourceInfo.getType().equalsIgnoreCase(ArtifactTypeEnum.HEAT_ARTIFACT.getType()) || resourceInfo.getType().equalsIgnoreCase(ArtifactTypeEnum.HEAT_NESTED.getType())) {
294                 return Either.left(true);
295             }
296             return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_VALID_IN_MASTER, resourceInfo.getFileName(), resourceInfo.getType(), parentArtifact.getFileName(), parentArtifact.getType()));
297         }
298         if (parentArtifact.getType().equalsIgnoreCase(ArtifactTypeEnum.HEAT.getType()) && resourceInfo.getType().equalsIgnoreCase(ArtifactTypeEnum.HEAT.getType())) {
299             return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_VALID_IN_MASTER, resourceInfo.getFileName(), resourceInfo.getType(), parentArtifact.getFileName(), parentArtifact.getType()));
300         }
301
302         if (parentArtifact.getType().equalsIgnoreCase(ArtifactTypeEnum.HEAT.getType())) {
303             return Either.left(true);
304         }
305         return Either.left(true);
306     }
307
308     private static Either<Boolean, ResponseFormat> validateEnv(ComponentsUtils componentsUtils, List<ArtifactTemplateInfo> createdArtifactTemplateInfoList, ArtifactTemplateInfo resourceInfo) {
309
310         if (createdArtifactTemplateInfoList == null || createdArtifactTemplateInfoList.isEmpty())
311             return Either.left(true);
312         if (resourceInfo.getType().equalsIgnoreCase(ArtifactTypeEnum.HEAT_NESTED.getType()) || resourceInfo.getType().equalsIgnoreCase(ArtifactTypeEnum.HEAT_ARTIFACT.getType()))
313             return Either.left(true);
314         for (ArtifactTemplateInfo createdArtifactTemplateInfo : createdArtifactTemplateInfoList) {
315             // check if artifact with this name already parsed. If parsed check
316             // env name. it must be the same.
317             if (resourceInfo.getFileName().equalsIgnoreCase(createdArtifactTemplateInfo.getFileName())) {
318                 if ((resourceInfo.getEnv() == null || resourceInfo.getEnv().isEmpty()) && (createdArtifactTemplateInfo.getEnv() != null && !createdArtifactTemplateInfo.getEnv().isEmpty())) {
319                     log.debug("Artifact  file with name {} type{}  already parsed but with env {}", resourceInfo.getFileName(), resourceInfo.getType(), createdArtifactTemplateInfo.getEnv());
320                     return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_VALID_ENV, resourceInfo.getFileName(), resourceInfo.getType(), resourceInfo.getEnv(), createdArtifactTemplateInfo.getEnv()));
321                 }
322                 if (resourceInfo.getEnv() != null && !resourceInfo.getEnv().isEmpty() && createdArtifactTemplateInfo.getEnv() != null && !createdArtifactTemplateInfo.getEnv().isEmpty()
323                         && !createdArtifactTemplateInfo.getEnv().equalsIgnoreCase(resourceInfo.getEnv())) {
324                     log.debug("Artifact  file with name {} type{} env {} already parsed but with env {}", resourceInfo.getFileName(), resourceInfo.getType(), resourceInfo.getEnv(), createdArtifactTemplateInfo.getEnv());
325                     return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_VALID_ENV, resourceInfo.getFileName(), resourceInfo.getType(), resourceInfo.getEnv(), createdArtifactTemplateInfo.getEnv()));
326                 }
327                 if ((resourceInfo.getEnv() != null && !resourceInfo.getEnv().isEmpty()) && (createdArtifactTemplateInfo.getEnv() == null || createdArtifactTemplateInfo.getEnv().isEmpty())) {
328                     log.debug("Artifact  file with name {} type{} env {} already parsed but with env {}", resourceInfo.getFileName(), resourceInfo.getType(), resourceInfo.getEnv(), createdArtifactTemplateInfo.getEnv());
329                     return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_VALID_ENV, resourceInfo.getFileName(), resourceInfo.getType(), resourceInfo.getEnv(), createdArtifactTemplateInfo.getEnv()));
330                 }
331             }
332             List<ArtifactTemplateInfo> relatedArtifacts = createdArtifactTemplateInfo.getRelatedArtifactsInfo();
333             Either<Boolean, ResponseFormat> status = validateEnv(componentsUtils, relatedArtifacts, resourceInfo);
334             if (status.isRight())
335                 return status;
336         }
337         return Either.left(true);
338     }
339
340     private static Either<List<ArtifactType>, ActionStatus> getDeploymentArtifactTypes(NodeTypeEnum parentType) {
341
342         Map<String, ArtifactTypeConfig> deploymentArtifacts = null;
343         List<ArtifactType> artifactTypes = new ArrayList<>();
344
345         if (parentType.equals(NodeTypeEnum.Service)) {
346             deploymentArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration().getServiceDeploymentArtifacts();
347         } else {
348             deploymentArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration().getResourceDeploymentArtifacts();
349         }
350         if (deploymentArtifacts != null) {
351             for (String artifactType : deploymentArtifacts.keySet()) {
352                 ArtifactType artifactT = new ArtifactType();
353                 artifactT.setName(artifactType);
354                 artifactTypes.add(artifactT);
355             }
356             return Either.left(artifactTypes);
357         } else {
358             return Either.right(ActionStatus.GENERAL_ERROR);
359         }
360
361     }
362
363     public static int compareByGroupName(ArtifactTemplateInfo art1, ArtifactTemplateInfo art2) {
364         return art1.isBase ? (art2.isBase ? 0 : -1) : (art2.isBase ? 1 : 0);
365     }
366
367 }