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.be.info;
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;
37 import java.util.ArrayList;
38 import java.util.HashMap;
39 import java.util.List;
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";
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";
59 private String fileName;
61 private boolean isBase;
62 private String groupName;
63 private String description;
65 private List<ArtifactTemplateInfo> relatedArtifactsInfo;
67 public ArtifactTemplateInfo() {}
69 public ArtifactTemplateInfo(String type, String fileName, String env, List<ArtifactTemplateInfo> relatedArtifactsInfo) {
71 this.fileName = fileName;
73 this.relatedArtifactsInfo = relatedArtifactsInfo;
76 public String getType() {
80 public void setType(String type) {
84 public String getFileName() {
88 public void setFileName(String fileName) {
89 this.fileName = fileName;
92 public String getEnv() {
96 public void setEnv(String env) {
100 public List<ArtifactTemplateInfo> getRelatedArtifactsInfo() {
101 return relatedArtifactsInfo;
104 public void setRelatedArtifactsInfo(List<ArtifactTemplateInfo> relatedArtifactsInfo) {
105 this.relatedArtifactsInfo = relatedArtifactsInfo;
108 public String getGroupName() {
112 public void setGroupName(String groupName) {
113 this.groupName = groupName;
116 public boolean isBase() {
120 public void setBase(boolean isBase) {
121 this.isBase = isBase;
124 public String getDescription() {
128 public void setDescription(String description) {
129 this.description = description;
133 public String toString() {
134 return "ArtifactTemplateInfo [type=" + type + ", fileName=" + fileName + ", env=" + env + ", isBase=" + isBase + ", groupName=" + groupName + ", description=" + description + ", relatedArtifactsInfo=" + relatedArtifactsInfo + "]";
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();
143 jsonElement = gson.fromJson(content, jsonElement.getClass());
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));
149 if (artifactTemplateMap.containsKey(FILE_NAME)) {
150 resourceInfo.setFileName((String) artifactTemplateMap.get(FILE_NAME));
152 if (artifactTemplateMap.containsKey(IS_BASE)) {
153 resourceInfo.setBase((Boolean) artifactTemplateMap.get(IS_BASE));
155 if (artifactTemplateMap.containsKey(ARTIFACT_TEMPLATE_ENV)) {
156 Object envObj = artifactTemplateMap.get(ARTIFACT_TEMPLATE_ENV);
158 if (envObj instanceof String) {
159 envStr = (String) envObj;
161 else if (envObj instanceof Map) {
162 Map envMap = (Map) envObj;
163 if (envMap.containsKey(FILE_NAME)) {
164 envStr = (String) envMap.get(FILE_NAME);
167 resourceInfo.setEnv(envStr);
169 if (artifactTemplateMap.containsKey(DESC)) {
170 resourceInfo.setDescription((String) artifactTemplateMap.get(DESC));
172 resourceInfo.setDescription((String) artifactTemplateMap.get(FILE_NAME));
175 boolean artifactTypeExist = false;
177 if (type.equalsIgnoreCase(CSAR_NESTED)) {
178 correctType = ArtifactTypeEnum.HEAT_NESTED.getType();
180 else if (type.equalsIgnoreCase(CSAR_VOLUME)) {
181 correctType = ArtifactTypeEnum.HEAT_VOL.getType();
183 else if (type.equalsIgnoreCase(CSAR_NETWORK)) {
184 correctType = ArtifactTypeEnum.HEAT_NET.getType();
186 else if (type.equalsIgnoreCase(CSAR_ARTIFACT)){
187 if( parentArtifact != null) {
188 correctType = ArtifactTypeEnum.HEAT_ARTIFACT.getType();
191 correctType = resourceInfo.type;
194 else if (type.equalsIgnoreCase(CSAR_HEAT)) {
195 correctType = ArtifactTypeEnum.HEAT.getType();
198 correctType = ArtifactTypeEnum.OTHER.getType();
200 Either<List<ArtifactType>, ActionStatus> allArtifactTypes = getDeploymentArtifactTypes(NodeTypeEnum.Resource);
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));
207 for (ArtifactType artType : allArtifactTypes.left().value()) {
209 if (artType.getName().contains(correctType)) {
210 resourceInfo.type = artType.getName();
211 artifactTypeExist = true;
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));
222 Either<Boolean, ResponseFormat> eitherNeedToCreate = validateEnv(componentsUtils, createdArtifactTemplateInfoList, resourceInfo);
223 if (eitherNeedToCreate.isRight()) {
224 return Either.right(eitherNeedToCreate.right().value());
226 eitherNeedToCreate = validateParentType(componentsUtils, resourceInfo, parentArtifact);
227 if (eitherNeedToCreate.isRight()) {
228 return Either.right(eitherNeedToCreate.right().value());
230 eitherNeedToCreate = validateIsAlreadyExist(componentsUtils, resourceInfo, createdArtifactTemplateInfoList, parentArtifact);
231 if (eitherNeedToCreate.isRight()) {
232 return Either.right(eitherNeedToCreate.right().value());
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;
243 if (resourceInfo.relatedArtifactsInfo == null) {
244 resourceInfo.relatedArtifactsInfo = new ArrayList<>();
246 resourceInfo.relatedArtifactsInfo.add(relatedArtifact.left().value());
250 return Either.left(resourceInfo);
253 private static Either<Boolean, ResponseFormat> validateIsAlreadyExist(ComponentsUtils componentsUtils, ArtifactTemplateInfo resourceInfo, List<ArtifactTemplateInfo> createdArtifactTemplateInfoList, ArtifactTemplateInfo parentArtifact) {
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));
263 return Either.left(true);
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()));
273 return Either.left(true);
277 private static Either<Boolean, ResponseFormat> validateParentType(ComponentsUtils componentsUtils, ArtifactTemplateInfo resourceInfo, ArtifactTemplateInfo parentArtifact) {
279 if (parentArtifact == null) {
280 return Either.left(true);
282 if (resourceInfo.getType().equalsIgnoreCase(ArtifactTypeEnum.HEAT_ARTIFACT.getType())) {
283 return Either.left(true);
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()));
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()));
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);
296 return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_VALID_IN_MASTER, resourceInfo.getFileName(), resourceInfo.getType(), parentArtifact.getFileName(), parentArtifact.getType()));
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()));
302 if (parentArtifact.getType().equalsIgnoreCase(ArtifactTypeEnum.HEAT.getType())) {
303 return Either.left(true);
305 return Either.left(true);
308 private static Either<Boolean, ResponseFormat> validateEnv(ComponentsUtils componentsUtils, List<ArtifactTemplateInfo> createdArtifactTemplateInfoList, ArtifactTemplateInfo resourceInfo) {
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()));
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()));
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()));
332 List<ArtifactTemplateInfo> relatedArtifacts = createdArtifactTemplateInfo.getRelatedArtifactsInfo();
333 Either<Boolean, ResponseFormat> status = validateEnv(componentsUtils, relatedArtifacts, resourceInfo);
334 if (status.isRight())
337 return Either.left(true);
340 private static Either<List<ArtifactType>, ActionStatus> getDeploymentArtifactTypes(NodeTypeEnum parentType) {
342 Map<String, ArtifactTypeConfig> deploymentArtifacts = null;
343 List<ArtifactType> artifactTypes = new ArrayList<>();
345 if (parentType.equals(NodeTypeEnum.Service)) {
346 deploymentArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration().getServiceDeploymentArtifacts();
348 deploymentArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration().getResourceDeploymentArtifacts();
350 if (deploymentArtifacts != null) {
351 for (String artifactType : deploymentArtifacts.keySet()) {
352 ArtifactType artifactT = new ArtifactType();
353 artifactT.setName(artifactType);
354 artifactTypes.add(artifactT);
356 return Either.left(artifactTypes);
358 return Either.right(ActionStatus.GENERAL_ERROR);
363 public static int compareByGroupName(ArtifactTemplateInfo art1, ArtifactTemplateInfo art2) {
364 return art1.isBase ? (art2.isBase ? 0 : -1) : (art2.isBase ? 1 : 0);