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