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