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=========================================================
20 package org.openecomp.sdc.be.model.operations.impl;
22 import fj.data.Either;
23 import java.util.ArrayList;
24 import java.util.Collections;
25 import java.util.EnumMap;
26 import java.util.HashMap;
27 import java.util.Iterator;
28 import java.util.LinkedHashMap;
29 import java.util.List;
31 import java.util.Optional;
32 import java.util.stream.Collectors;
33 import org.apache.commons.collections4.CollectionUtils;
34 import org.apache.commons.collections4.MapUtils;
35 import org.apache.commons.lang3.tuple.ImmutablePair;
36 import org.apache.tinkerpop.gremlin.structure.Vertex;
37 import org.janusgraph.core.JanusGraph;
38 import org.janusgraph.core.JanusGraphVertex;
39 import org.openecomp.sdc.be.config.ArtifactConfigManager;
40 import org.openecomp.sdc.be.config.ArtifactConfiguration;
41 import org.openecomp.sdc.be.config.CategoryBaseTypeConfig;
42 import org.openecomp.sdc.be.config.Configuration;
43 import org.openecomp.sdc.be.config.ConfigurationManager;
44 import org.openecomp.sdc.be.dao.api.ActionStatus;
45 import org.openecomp.sdc.be.dao.graph.datatype.GraphEdge;
46 import org.openecomp.sdc.be.dao.graph.datatype.GraphNode;
47 import org.openecomp.sdc.be.dao.graph.datatype.GraphRelation;
48 import org.openecomp.sdc.be.dao.janusgraph.HealingJanusGraphDao;
49 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphGenericDao;
50 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
51 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
52 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
53 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
54 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
55 import org.openecomp.sdc.be.dao.neo4j.GraphEdgeLabels;
56 import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
57 import org.openecomp.sdc.be.datatypes.category.CategoryDataDefinition;
58 import org.openecomp.sdc.be.datatypes.category.GroupingDataDefinition;
59 import org.openecomp.sdc.be.datatypes.category.SubCategoryDataDefinition;
60 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
61 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
62 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
63 import org.openecomp.sdc.be.model.ArtifactType;
64 import org.openecomp.sdc.be.model.BaseType;
65 import org.openecomp.sdc.be.model.LifecycleStateEnum;
66 import org.openecomp.sdc.be.model.PropertyScope;
67 import org.openecomp.sdc.be.model.Tag;
68 import org.openecomp.sdc.be.model.category.CategoryDefinition;
69 import org.openecomp.sdc.be.model.category.GroupingDefinition;
70 import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
71 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
72 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
73 import org.openecomp.sdc.be.resources.data.TagData;
74 import org.openecomp.sdc.be.resources.data.category.CategoryData;
75 import org.openecomp.sdc.be.resources.data.category.GroupingData;
76 import org.openecomp.sdc.be.resources.data.category.SubCategoryData;
77 import org.openecomp.sdc.common.log.wrappers.Logger;
78 import org.openecomp.sdc.common.util.ValidationUtils;
79 import org.springframework.beans.factory.annotation.Qualifier;
80 import org.springframework.stereotype.Component;
82 @Component("element-operation")
83 public class ElementOperation implements IElementOperation {
85 private static final String COULDN_T_FETCH_janusGraph_GRAPH = "Couldn't fetch janusgraph graph";
86 private static final String UNKNOWN_CATEGORY_TYPE = "Unknown category type {}";
87 private static final Logger log = Logger.getLogger(ElementOperation.class.getName());
88 private static final String PROBLEM_WHILE_CREATING_CATEGORY_REASON = "Problem while creating category, reason {}";
89 private JanusGraphGenericDao janusGraphGenericDao;
90 private HealingJanusGraphDao janusGraphDao;
92 public ElementOperation(@Qualifier("janusgraph-generic-dao") JanusGraphGenericDao janusGraphGenericDao,
93 @Qualifier("janusgraph-dao") HealingJanusGraphDao janusGraphDao) {
95 this.janusGraphGenericDao = janusGraphGenericDao;
96 this.janusGraphDao = janusGraphDao;
99 private static NodeTypeEnum getChildNodeType(NodeTypeEnum parentTypeEnum) {
100 NodeTypeEnum res = null;
101 switch (parentTypeEnum) {
102 case ResourceNewCategory:
103 res = NodeTypeEnum.ResourceSubcategory;
105 case ProductCategory:
106 res = NodeTypeEnum.ProductSubcategory;
108 case ProductSubcategory:
109 res = NodeTypeEnum.ProductGrouping;
121 public Either<List<CategoryDefinition>, ActionStatus> getAllServiceCategories() {
122 return getAllCategories(NodeTypeEnum.ServiceNewCategory, false);
126 public Either<List<CategoryDefinition>, ActionStatus> getAllResourceCategories() {
127 return getAllCategories(NodeTypeEnum.ResourceNewCategory, false);
131 public Either<List<CategoryDefinition>, ActionStatus> getAllProductCategories() {
132 return getAllCategories(NodeTypeEnum.ProductCategory, false);
139 public Either<CategoryDefinition, ActionStatus> createCategory(CategoryDefinition category, NodeTypeEnum nodeType) {
140 return createCategory(category, nodeType, false);
144 public Either<CategoryDefinition, ActionStatus> createCategory(CategoryDefinition category, NodeTypeEnum nodeType, boolean inTransaction) {
145 Either<CategoryDefinition, ActionStatus> result = null;
146 category.setUniqueId(UniqueIdBuilder.buildCategoryUid(category.getNormalizedName(), nodeType));
147 CategoryData categoryData = new CategoryData(nodeType, category);
149 Either<CategoryData, JanusGraphOperationStatus> createNode = janusGraphGenericDao.createNode(categoryData, CategoryData.class);
150 if (createNode.isRight()) {
151 JanusGraphOperationStatus value = createNode.right().value();
152 ActionStatus actionStatus = ActionStatus.GENERAL_ERROR;
153 log.debug(PROBLEM_WHILE_CREATING_CATEGORY_REASON, value);
154 if (value == JanusGraphOperationStatus.JANUSGRAPH_SCHEMA_VIOLATION) {
155 actionStatus = ActionStatus.COMPONENT_CATEGORY_ALREADY_EXISTS;
157 result = Either.right(actionStatus);
160 CategoryDefinition created = new CategoryDefinition(createNode.left().value().getCategoryDataDefinition());
161 result = Either.left(created);
164 if (!inTransaction) {
165 if (result != null && result.isLeft()) {
166 janusGraphGenericDao.commit();
168 janusGraphGenericDao.rollback();
175 public Either<CategoryDefinition, ActionStatus> updateCategory(CategoryDefinition category, NodeTypeEnum nodeType) {
176 return updateCategory(category, nodeType, false);
180 public Either<CategoryDefinition, ActionStatus> updateCategory(CategoryDefinition category, NodeTypeEnum nodeType, boolean inTransaction) {
181 Either<CategoryDefinition, ActionStatus> result = null;
182 category.setUniqueId(UniqueIdBuilder.buildCategoryUid(category.getNormalizedName(), nodeType));
183 CategoryData categoryData = new CategoryData(nodeType, category);
185 Either<CategoryData, JanusGraphOperationStatus> updatedNode = janusGraphGenericDao.updateNode(categoryData, CategoryData.class);
186 if (updatedNode.isRight()) {
187 JanusGraphOperationStatus value = updatedNode.right().value();
188 ActionStatus actionStatus = ActionStatus.GENERAL_ERROR;
189 log.debug(PROBLEM_WHILE_CREATING_CATEGORY_REASON, value);
190 result = Either.right(actionStatus);
193 CategoryDefinition created = new CategoryDefinition(updatedNode.left().value().getCategoryDataDefinition());
194 result = Either.left(created);
197 if (!inTransaction) {
198 if (result != null && result.isLeft()) {
199 janusGraphGenericDao.commit();
201 janusGraphGenericDao.rollback();
208 public Either<SubCategoryDefinition, ActionStatus> createSubCategory(String categoryId, SubCategoryDefinition subCategory,
209 NodeTypeEnum nodeType) {
210 return createSubCategory(categoryId, subCategory, nodeType, false);
214 public Either<SubCategoryDefinition, ActionStatus> createSubCategory(String categoryId, SubCategoryDefinition subCategory, NodeTypeEnum nodeType,
215 boolean inTransaction) {
216 Either<SubCategoryDefinition, ActionStatus> result = null;
218 // create edge from category to sub-category
219 Either<CategoryData, JanusGraphOperationStatus> categoryNode = janusGraphGenericDao
220 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), categoryId, CategoryData.class);
221 ActionStatus actionStatus = ActionStatus.GENERAL_ERROR;
222 if (categoryNode.isRight()) {
223 JanusGraphOperationStatus janusGraphOperationStatus = categoryNode.right().value();
224 log.debug("Problem while fetching category, reason {}", janusGraphOperationStatus);
225 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
226 actionStatus = ActionStatus.COMPONENT_CATEGORY_NOT_FOUND;
228 result = Either.right(actionStatus);
231 CategoryDataDefinition categoryDataDefinition = categoryNode.left().value().getCategoryDataDefinition();
232 subCategory.setUniqueId(UniqueIdBuilder.buildSubCategoryUid(categoryDataDefinition.getUniqueId(), subCategory.getNormalizedName()));
233 SubCategoryData subCategoryData = new SubCategoryData(nodeType, subCategory);
234 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryNode = janusGraphGenericDao
235 .createNode(subCategoryData, SubCategoryData.class);
236 if (subCategoryNode.isRight()) {
237 JanusGraphOperationStatus janusGraphOperationStatus = subCategoryNode.right().value();
238 log.debug(PROBLEM_WHILE_CREATING_CATEGORY_REASON, janusGraphOperationStatus);
239 if (janusGraphOperationStatus == JanusGraphOperationStatus.JANUSGRAPH_SCHEMA_VIOLATION) {
240 actionStatus = ActionStatus.COMPONENT_SUB_CATEGORY_EXISTS_FOR_CATEGORY;
242 result = Either.right(actionStatus);
245 Either<GraphRelation, JanusGraphOperationStatus> relation = janusGraphGenericDao
246 .createRelation(categoryNode.left().value(), subCategoryNode.left().value(), GraphEdgeLabels.SUB_CATEGORY, null);
247 if (relation.isRight()) {
248 log.debug("Problem while create relation between category and sub-category ", relation.right().value());
249 result = Either.right(actionStatus);
252 SubCategoryDefinition subCategoryCreated = new SubCategoryDefinition(subCategoryNode.left().value().getSubCategoryDataDefinition());
253 result = Either.left(subCategoryCreated);
256 if (!inTransaction) {
257 if (result != null && result.isLeft()) {
258 janusGraphGenericDao.commit();
260 janusGraphGenericDao.rollback();
267 public Either<SubCategoryDefinition, ActionStatus> updateSubCategory(String subCategoryId, SubCategoryDefinition subCategory,
268 NodeTypeEnum nodeType) {
269 return updateSubCategory(subCategoryId, subCategory, nodeType, false);
273 public Either<SubCategoryDefinition, ActionStatus> updateSubCategory(String subCategoryId, SubCategoryDefinition subCategory,
274 NodeTypeEnum nodeType, boolean inTransaction) {
275 Either<SubCategoryDefinition, ActionStatus> result = null;
277 subCategory.setUniqueId(subCategoryId);
278 SubCategoryData subCategoryData = new SubCategoryData(nodeType, subCategory);
279 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryNode = janusGraphGenericDao
280 .updateNode(subCategoryData, SubCategoryData.class);
281 if (subCategoryNode.isRight()) {
282 JanusGraphOperationStatus janusGraphOperationStatus = subCategoryNode.right().value();
283 log.debug("Problem while updating sub category, reason {}", janusGraphOperationStatus);
284 result = Either.right(ActionStatus.GENERAL_ERROR);
287 SubCategoryDefinition subCategoryUpdated = new SubCategoryDefinition(subCategoryNode.left().value().getSubCategoryDataDefinition());
288 result = Either.left(subCategoryUpdated);
291 if (!inTransaction) {
292 if (result != null && result.isLeft()) {
293 janusGraphGenericDao.commit();
295 janusGraphGenericDao.rollback();
302 public Either<GroupingDefinition, ActionStatus> createGrouping(String subCategoryId, GroupingDefinition grouping, NodeTypeEnum nodeType) {
303 Either<GroupingDefinition, ActionStatus> result = null;
305 // create edge from sub-category to grouping
306 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryNode = janusGraphGenericDao
307 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId, SubCategoryData.class);
308 ActionStatus actionStatus = ActionStatus.GENERAL_ERROR;
309 if (subCategoryNode.isRight()) {
310 JanusGraphOperationStatus janusGraphOperationStatus = subCategoryNode.right().value();
311 log.debug("Problem while fetching category, reason {}", janusGraphOperationStatus);
312 if (janusGraphOperationStatus == JanusGraphOperationStatus.JANUSGRAPH_SCHEMA_VIOLATION) {
313 actionStatus = ActionStatus.COMPONENT_CATEGORY_NOT_FOUND;
315 result = Either.right(actionStatus);
318 SubCategoryDataDefinition subCatData = subCategoryNode.left().value().getSubCategoryDataDefinition();
319 grouping.setUniqueId(UniqueIdBuilder.buildGroupingUid(subCatData.getUniqueId(), grouping.getNormalizedName()));
320 GroupingData groupingData = new GroupingData(nodeType, grouping);
321 Either<GroupingData, JanusGraphOperationStatus> groupingNode = janusGraphGenericDao.createNode(groupingData, GroupingData.class);
322 if (groupingNode.isRight()) {
323 JanusGraphOperationStatus janusGraphOperationStatus = groupingNode.right().value();
324 log.debug("Problem while creating grouping, reason {}", janusGraphOperationStatus);
325 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
326 actionStatus = ActionStatus.COMPONENT_GROUPING_EXISTS_FOR_SUB_CATEGORY;
328 result = Either.right(actionStatus);
331 Either<GraphRelation, JanusGraphOperationStatus> relation = janusGraphGenericDao
332 .createRelation(subCategoryNode.left().value(), groupingNode.left().value(), GraphEdgeLabels.GROUPING, null);
333 if (relation.isRight()) {
334 log.debug("Problem while create relation between sub-category and grouping", relation.right().value());
335 result = Either.right(actionStatus);
338 GroupingDefinition groupingCreated = new GroupingDefinition(groupingNode.left().value().getGroupingDataDefinition());
339 result = Either.left(groupingCreated);
342 if (result != null && result.isLeft()) {
343 janusGraphGenericDao.commit();
345 janusGraphGenericDao.rollback();
351 public Either<List<CategoryDefinition>, ActionStatus> getAllCategories(NodeTypeEnum nodeType, boolean inTransaction) {
353 if (nodeType != NodeTypeEnum.ResourceNewCategory && nodeType != NodeTypeEnum.ServiceNewCategory
354 && nodeType != NodeTypeEnum.ProductCategory) {
355 log.debug(UNKNOWN_CATEGORY_TYPE, nodeType.name());
356 return Either.right(ActionStatus.GENERAL_ERROR);
358 Either<List<org.openecomp.sdc.be.resources.data.category.CategoryData>, JanusGraphOperationStatus> either = janusGraphGenericDao
359 .getAll(nodeType, org.openecomp.sdc.be.resources.data.category.CategoryData.class);
360 if (either.isRight() && (either.right().value() != JanusGraphOperationStatus.NOT_FOUND)) {
361 log.debug("Problem while get all categories. reason - {}", either.right().value());
362 return Either.right(ActionStatus.GENERAL_ERROR);
364 List<CategoryData> categoryDataList = either.isLeft() ? either.left().value() : null;
365 List<CategoryDefinition> categoryList = new ArrayList<>();
366 if (categoryDataList != null) {
367 for (CategoryData elem : categoryDataList) {
368 CategoryDataDefinition categoryDataDefinition = elem.getCategoryDataDefinition();
369 CategoryDefinition categoryDefinition = new CategoryDefinition(categoryDataDefinition);
370 String categoryName = categoryDataDefinition.getName();
371 log.trace("Found category {}, category type {}", categoryName, nodeType);
372 JanusGraphOperationStatus setSubCategories = setSubCategories(nodeType, categoryDefinition);
373 if (setSubCategories != JanusGraphOperationStatus.OK) {
374 log.debug("Failed to set sub-categories for category {}, category type {}, error {}", categoryName, nodeType,
376 return Either.right(ActionStatus.GENERAL_ERROR);
378 categoryList.add(categoryDefinition);
381 return Either.left(categoryList);
383 if (!inTransaction) {
384 janusGraphGenericDao.commit();
390 public List<BaseType> getServiceBaseTypes(final String categoryName, final String modelName) {
392 final CategoryBaseTypeConfig categoryBaseTypeConfig = getCategoryBaseTypeConfig(categoryName).orElse(null);
393 final List<String> baseToscaResourceNames;
394 if (categoryBaseTypeConfig == null) {
395 final String generalBaseType = getConfiguration().getGenericAssetNodeTypes().get("Service");
396 baseToscaResourceNames = List.of(generalBaseType);
398 baseToscaResourceNames = getCategoryBaseTypes(categoryName);
401 final ArrayList<BaseType> baseTypes = new ArrayList<>();
402 baseToscaResourceNames.forEach(baseToscaResourceName -> {
403 final Map<GraphPropertyEnum, Object> props = new EnumMap<>(GraphPropertyEnum.class);
404 props.put(GraphPropertyEnum.TOSCA_RESOURCE_NAME, baseToscaResourceName);
405 props.put(GraphPropertyEnum.STATE, LifecycleStateEnum.CERTIFIED.name());
406 final Either<List<GraphVertex>, JanusGraphOperationStatus> baseTypeVertex = janusGraphDao
407 .getByCriteria(VertexTypeEnum.NODE_TYPE, props, null, JsonParseFlagEnum.ParseAll, modelName);
409 if (baseTypeVertex.isLeft()) {
410 BaseType baseType = new BaseType(baseToscaResourceName);
411 baseTypes.add(baseType);
413 final Map<String, List<String>> typesDerivedFromBaseType = new LinkedHashMap<>();
414 baseTypeVertex.left().value().forEach(v -> {
415 baseType.addVersion((String) v.getMetadataProperty(GraphPropertyEnum.VERSION));
416 addTypesDerivedFromVertex(typesDerivedFromBaseType, v);
419 typesDerivedFromBaseType.forEach((k, v) -> baseTypes.add(new BaseType(k, v)));
426 private Configuration getConfiguration() {
427 return ConfigurationManager.getConfigurationManager().getConfiguration();
431 public boolean isBaseTypeRequired(final String categoryName) {
432 final Map<String, CategoryBaseTypeConfig> categoriesSpecificBaseTypeMap = getConfiguration().getServiceBaseNodeTypes();
433 if (MapUtils.isEmpty(categoriesSpecificBaseTypeMap)) {
437 final CategoryBaseTypeConfig categoryBaseTypeConfig = categoriesSpecificBaseTypeMap.get(categoryName);
438 if (categoryBaseTypeConfig == null) {
442 return categoryBaseTypeConfig.isRequired();
445 private List<String> getCategoryBaseTypes(final String categoryName) {
446 final Optional<CategoryBaseTypeConfig> categoryBaseTypeConfigOptional = getCategoryBaseTypeConfig(categoryName);
447 if (categoryBaseTypeConfigOptional.isEmpty()) {
448 return Collections.emptyList();
451 final CategoryBaseTypeConfig categoryBaseTypeConfig = categoryBaseTypeConfigOptional.get();
452 if (CollectionUtils.isEmpty(categoryBaseTypeConfig.getBaseTypes())) {
453 return Collections.emptyList();
456 return categoryBaseTypeConfig.getBaseTypes();
459 private Optional<CategoryBaseTypeConfig> getCategoryBaseTypeConfig(final String categoryName) {
460 final Map<String, CategoryBaseTypeConfig> categoriesSpecificBaseTypes = getConfiguration().getServiceBaseNodeTypes();
461 if (categoriesSpecificBaseTypes == null) {
462 return Optional.empty();
465 return Optional.ofNullable(categoriesSpecificBaseTypes.get(categoryName));
468 private Map<String, List<String>> addTypesDerivedFromVertex(final Map<String, List<String>> types, final GraphVertex vertex) {
469 final Either<List<GraphVertex>, JanusGraphOperationStatus> derivedFromVertex =
470 janusGraphDao.getParentVertices(vertex, EdgeLabelEnum.DERIVED_FROM, JsonParseFlagEnum.ParseAll);
471 if (derivedFromVertex.isLeft()) {
472 derivedFromVertex.left().value().stream()
473 .filter(v -> v.getMetadataProperty(GraphPropertyEnum.STATE).equals(LifecycleStateEnum.CERTIFIED.name()))
475 addBaseTypeVersion(types, (String) v.getMetadataProperty(GraphPropertyEnum.TOSCA_RESOURCE_NAME),
476 (String) v.getMetadataProperty(GraphPropertyEnum.VERSION));
477 addTypesDerivedFromVertex(types, v);
483 private void addBaseTypeVersion(final Map<String, List<String>> baseTypes, final String baseTypeToscaResourceName, final String baseTypeVersion) {
484 List<String> versions = baseTypes.get(baseTypeToscaResourceName) == null ? new ArrayList<>() : baseTypes.get(baseTypeToscaResourceName);
485 versions.add(baseTypeVersion);
486 baseTypes.put(baseTypeToscaResourceName, versions);
489 private JanusGraphOperationStatus setSubCategories(NodeTypeEnum parentNodeType, CategoryDefinition parentCategory) {
490 NodeTypeEnum childNodeType = getChildNodeType(parentNodeType);
491 if (childNodeType != null) {
492 String categoryName = parentCategory.getName();
493 log.trace("Getting sub-categories for category {}, category type {}", categoryName, parentNodeType);
494 Either<List<ImmutablePair<SubCategoryData, GraphEdge>>, JanusGraphOperationStatus> parentNode = janusGraphGenericDao
495 .getChildrenNodes(UniqueIdBuilder.getKeyByNodeType(parentNodeType), parentCategory.getUniqueId(), GraphEdgeLabels.SUB_CATEGORY,
496 childNodeType, SubCategoryData.class);
497 if (parentNode.isRight()) {
498 JanusGraphOperationStatus janusGraphOperationStatus = parentNode.right().value();
499 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
500 log.trace("Didn't find subcategories for category {}, category type {}", categoryName, parentNodeType);
501 janusGraphOperationStatus = JanusGraphOperationStatus.OK;
503 return janusGraphOperationStatus;
505 List<ImmutablePair<SubCategoryData, GraphEdge>> subsCategoriesData = parentNode.left().value();
506 List<SubCategoryDefinition> subCategoriesDefinitions = new ArrayList<>();
507 for (ImmutablePair<SubCategoryData, GraphEdge> subCatPair : subsCategoriesData) {
508 SubCategoryDataDefinition subCategoryDataDefinition = subCatPair.getLeft().getSubCategoryDataDefinition();
509 SubCategoryDefinition subCategoryDefinition = new SubCategoryDefinition(subCategoryDataDefinition);
510 log.trace("Found sub-category {} for category {}, category type {}", subCategoryDataDefinition.getName(), categoryName,
512 JanusGraphOperationStatus setGroupings = setGroupings(childNodeType, subCategoryDefinition);
513 if (setGroupings != JanusGraphOperationStatus.OK) {
514 log.debug("Failed to set groupings for sub-category {}, sub-category type {}, error {}", subCategoryDataDefinition.getName(),
515 childNodeType, setGroupings);
516 return JanusGraphOperationStatus.GENERAL_ERROR;
518 subCategoriesDefinitions.add(subCategoryDefinition);
520 parentCategory.setSubcategories(subCategoriesDefinitions);
522 return JanusGraphOperationStatus.OK;
525 private JanusGraphOperationStatus setGroupings(NodeTypeEnum parentNodeType, SubCategoryDefinition parentSubCategory) {
526 NodeTypeEnum childNodeType = getChildNodeType(parentNodeType);
527 if (childNodeType != null) {
528 String subCategoryName = parentSubCategory.getName();
529 log.trace("Getting groupings for subcategory {}, subcategory type {}", subCategoryName, parentNodeType);
530 Either<List<ImmutablePair<GroupingData, GraphEdge>>, JanusGraphOperationStatus> parentNode = janusGraphGenericDao
531 .getChildrenNodes(UniqueIdBuilder.getKeyByNodeType(parentNodeType), parentSubCategory.getUniqueId(), GraphEdgeLabels.GROUPING,
532 childNodeType, GroupingData.class);
533 if (parentNode.isRight()) {
534 JanusGraphOperationStatus janusGraphOperationStatus = parentNode.right().value();
535 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
536 log.trace("Didn't find groupings for subcategory {}, subcategory type {}", subCategoryName, parentNodeType);
537 janusGraphOperationStatus = JanusGraphOperationStatus.OK;
539 return janusGraphOperationStatus;
541 List<ImmutablePair<GroupingData, GraphEdge>> groupingData = parentNode.left().value();
542 List<GroupingDefinition> groupingDefinitions = new ArrayList<>();
543 for (ImmutablePair<GroupingData, GraphEdge> groupPair : groupingData) {
544 GroupingDataDefinition groupingDataDefinition = groupPair.getLeft().getGroupingDataDefinition();
545 log.trace("Found grouping {} for sub-category {}, sub-category type {}", groupingDataDefinition.getName(), subCategoryName,
547 groupingDefinitions.add(new GroupingDefinition(groupingDataDefinition));
549 parentSubCategory.setGroupings(groupingDefinitions);
551 return JanusGraphOperationStatus.OK;
555 public Either<CategoryDefinition, ActionStatus> getCategory(NodeTypeEnum nodeType, String categoryId) {
557 if (nodeType != NodeTypeEnum.ResourceNewCategory && nodeType != NodeTypeEnum.ServiceNewCategory
558 && nodeType != NodeTypeEnum.ProductCategory) {
559 log.debug(UNKNOWN_CATEGORY_TYPE, nodeType.name());
560 return Either.right(ActionStatus.GENERAL_ERROR);
562 Either<CategoryData, JanusGraphOperationStatus> categoryDataEither = janusGraphGenericDao
563 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), categoryId, CategoryData.class);
564 if (categoryDataEither.isRight()) {
565 JanusGraphOperationStatus janusGraphOperationStatus = categoryDataEither.right().value();
566 log.debug("Problem while get category by id {}. reason {}", categoryId, janusGraphOperationStatus);
567 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
568 return Either.right(ActionStatus.COMPONENT_CATEGORY_NOT_FOUND);
570 return Either.right(ActionStatus.GENERAL_ERROR);
572 CategoryDataDefinition categoryDataDefinition = categoryDataEither.left().value().getCategoryDataDefinition();
573 return Either.left(new CategoryDefinition(categoryDataDefinition));
575 janusGraphGenericDao.commit();
580 public Either<SubCategoryDefinition, ActionStatus> getSubCategory(NodeTypeEnum nodeType, String subCategoryId) {
582 if (nodeType != NodeTypeEnum.ResourceSubcategory && nodeType != NodeTypeEnum.ProductSubcategory) {
583 log.debug("Unknown sub-category type {}", nodeType.name());
584 return Either.right(ActionStatus.GENERAL_ERROR);
586 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryDataEither = janusGraphGenericDao
587 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId, SubCategoryData.class);
588 if (subCategoryDataEither.isRight()) {
589 JanusGraphOperationStatus janusGraphOperationStatus = subCategoryDataEither.right().value();
590 log.debug("Problem while get sub-category by id {}. reason {}", subCategoryId, janusGraphOperationStatus);
591 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
592 return Either.right(ActionStatus.COMPONENT_CATEGORY_NOT_FOUND);
594 return Either.right(ActionStatus.GENERAL_ERROR);
596 SubCategoryDataDefinition subCategoryDataDefinition = subCategoryDataEither.left().value().getSubCategoryDataDefinition();
597 return Either.left(new SubCategoryDefinition(subCategoryDataDefinition));
599 janusGraphGenericDao.commit();
604 public Either<CategoryDefinition, ActionStatus> deleteCategory(NodeTypeEnum nodeType, String categoryId) {
605 Either<CategoryDefinition, ActionStatus> result = null;
607 if (nodeType != NodeTypeEnum.ResourceNewCategory && nodeType != NodeTypeEnum.ServiceNewCategory
608 && nodeType != NodeTypeEnum.ProductCategory) {
609 log.debug(UNKNOWN_CATEGORY_TYPE, nodeType.name());
610 result = Either.right(ActionStatus.GENERAL_ERROR);
613 Either<CategoryData, JanusGraphOperationStatus> categoryDataEither = janusGraphGenericDao
614 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), categoryId, CategoryData.class);
615 if (categoryDataEither.isRight()) {
616 log.debug("Failed to retrieve category for id {} ", categoryId);
617 result = Either.right(ActionStatus.GENERAL_ERROR);
620 Either<JanusGraph, JanusGraphOperationStatus> graph = janusGraphGenericDao.getGraph();
621 if (graph.isRight()) {
622 log.debug(COULDN_T_FETCH_janusGraph_GRAPH);
623 result = Either.right(ActionStatus.GENERAL_ERROR);
626 JanusGraph tGraph = graph.left().value();
627 Iterable<JanusGraphVertex> verticesArtifact = tGraph.query().has(UniqueIdBuilder.getKeyByNodeType(nodeType), categoryId).vertices();
628 Iterator<JanusGraphVertex> iterator = verticesArtifact.iterator();
629 if (!iterator.hasNext()) {
630 log.debug("No category node for id = {}", categoryId);
631 result = Either.right(ActionStatus.GENERAL_ERROR);
634 Vertex artifactV = iterator.next();
636 CategoryDefinition deleted = new CategoryDefinition(categoryDataEither.left().value().getCategoryDataDefinition());
637 result = Either.left(deleted);
640 if (result != null && result.isLeft()) {
641 janusGraphGenericDao.commit();
643 janusGraphGenericDao.rollback();
649 public Either<SubCategoryDefinition, ActionStatus> deleteSubCategory(NodeTypeEnum nodeType, String subCategoryId) {
650 Either<SubCategoryDefinition, ActionStatus> result = null;
652 if (nodeType != NodeTypeEnum.ResourceSubcategory && nodeType != NodeTypeEnum.ProductSubcategory) {
653 log.debug("Unknown sub-category type {}", nodeType.name());
654 result = Either.right(ActionStatus.GENERAL_ERROR);
657 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryDataEither = janusGraphGenericDao
658 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId, SubCategoryData.class);
659 if (subCategoryDataEither.isRight()) {
660 log.debug("Failed to retrieve sub-category for id {}", subCategoryId);
661 result = Either.right(ActionStatus.GENERAL_ERROR);
664 Either<JanusGraph, JanusGraphOperationStatus> graph = janusGraphGenericDao.getGraph();
665 if (graph.isRight()) {
666 log.debug(COULDN_T_FETCH_janusGraph_GRAPH);
667 result = Either.right(ActionStatus.GENERAL_ERROR);
670 JanusGraph tGraph = graph.left().value();
671 Iterable<JanusGraphVertex> verticesArtifact = tGraph.query().has(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId).vertices();
672 Iterator<JanusGraphVertex> iterator = verticesArtifact.iterator();
673 if (!iterator.hasNext()) {
674 log.debug("No sub-category node for id {}", subCategoryId);
675 result = Either.right(ActionStatus.GENERAL_ERROR);
678 Vertex artifactV = iterator.next();
681 SubCategoryDefinition deleted = new SubCategoryDefinition(subCategoryDataEither.left().value().getSubCategoryDataDefinition());
682 result = Either.left(deleted);
685 if (result != null && result.isLeft()) {
686 janusGraphGenericDao.commit();
688 janusGraphGenericDao.rollback();
694 public Either<GroupingDefinition, ActionStatus> deleteGrouping(NodeTypeEnum nodeType, String groupingId) {
695 Either<GroupingDefinition, ActionStatus> result = null;
697 if (nodeType != NodeTypeEnum.ProductGrouping) {
698 log.debug("Unknown grouping type {}", nodeType.name());
699 result = Either.right(ActionStatus.GENERAL_ERROR);
702 Either<GroupingData, JanusGraphOperationStatus> groupingDataEither = janusGraphGenericDao
703 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), groupingId, GroupingData.class);
704 if (groupingDataEither.isRight()) {
705 log.debug("Failed to retrieve grouping for id {}", groupingId);
706 result = Either.right(ActionStatus.GENERAL_ERROR);
709 Either<JanusGraph, JanusGraphOperationStatus> graph = janusGraphGenericDao.getGraph();
710 if (graph.isRight()) {
711 log.debug(COULDN_T_FETCH_janusGraph_GRAPH);
712 result = Either.right(ActionStatus.GENERAL_ERROR);
715 JanusGraph tGraph = graph.left().value();
716 Iterable<JanusGraphVertex> verticesArtifact = tGraph.query().has(UniqueIdBuilder.getKeyByNodeType(nodeType), groupingId).vertices();
717 Iterator<JanusGraphVertex> iterator = verticesArtifact.iterator();
718 if (!iterator.hasNext()) {
719 log.debug("No grouping node for id {}", groupingId);
720 result = Either.right(ActionStatus.GENERAL_ERROR);
723 Vertex artifactV = iterator.next();
726 GroupingDefinition deleted = new GroupingDefinition(groupingDataEither.left().value().getGroupingDataDefinition());
727 result = Either.left(deleted);
730 if (result != null && result.isLeft()) {
731 janusGraphGenericDao.commit();
733 janusGraphGenericDao.rollback();
739 public Either<Boolean, ActionStatus> isCategoryUniqueForType(NodeTypeEnum nodeType, String normalizedName) {
740 Map<String, Object> properties = new HashMap<>();
741 properties.put(GraphPropertiesDictionary.NORMALIZED_NAME.getProperty(), normalizedName);
743 Either<List<CategoryData>, JanusGraphOperationStatus> categoryEither = janusGraphGenericDao
744 .getByCriteria(nodeType, properties, CategoryData.class);
745 if (categoryEither.isRight() && categoryEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
746 log.debug("Failed to get categories, nodeType {}, normalizedName {}, error {}", nodeType, normalizedName,
747 categoryEither.right().value());
748 return Either.right(ActionStatus.GENERAL_ERROR);
750 List<CategoryData> categoryList = (categoryEither.isLeft() ? categoryEither.left().value() : null);
751 if (categoryList != null && categoryList.size() > 0) {
752 log.debug("Found category for nodeType {} with normalizedName {}", nodeType, normalizedName);
753 if (categoryList.size() > 1) {
754 log.debug("Found more than 1 unique categories for nodeType {} with normalizedName", nodeType, normalizedName);
755 return Either.right(ActionStatus.GENERAL_ERROR);
757 return Either.left(false);
759 log.debug("Category for nodeType {} with normalizedName {} doesn't exist in graph", nodeType, normalizedName);
760 return Either.left(true);
763 janusGraphGenericDao.commit();
768 public Either<Boolean, ActionStatus> isSubCategoryUniqueForCategory(NodeTypeEnum nodeType, String subCategoryNormName, String parentCategoryId) {
769 String subCategoryId = UniqueIdBuilder.buildSubCategoryUid(parentCategoryId, subCategoryNormName);
771 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryDataEither = janusGraphGenericDao
772 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId, SubCategoryData.class);
773 if (subCategoryDataEither.isRight() && subCategoryDataEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
774 log.debug("Failed to get sub-category with id {}, error {}", subCategoryId, subCategoryDataEither.right().value());
775 return Either.right(ActionStatus.GENERAL_ERROR);
777 SubCategoryData subCategoryData = (subCategoryDataEither.isLeft() ? subCategoryDataEither.left().value() : null);
778 if (subCategoryData != null) {
779 log.debug("Found sub-category with id {}", subCategoryId);
780 return Either.left(false);
782 log.debug("Sub-category for id {} doesn't exist in graph", subCategoryId);
783 return Either.left(true);
786 janusGraphGenericDao.commit();
791 public Either<Boolean, ActionStatus> isGroupingUniqueForSubCategory(NodeTypeEnum nodeType, String groupingNormName, String parentSubCategoryId) {
792 String groupingId = UniqueIdBuilder.buildGroupingUid(parentSubCategoryId, groupingNormName);
794 Either<GroupingData, JanusGraphOperationStatus> groupingDataEither = janusGraphGenericDao
795 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), groupingId, GroupingData.class);
796 if (groupingDataEither.isRight() && groupingDataEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
797 log.debug("Failed to get grouping with id {}, error {}", groupingId, groupingDataEither.right().value());
798 return Either.right(ActionStatus.GENERAL_ERROR);
800 GroupingData groupingData = (groupingDataEither.isLeft() ? groupingDataEither.left().value() : null);
801 if (groupingData != null) {
802 log.debug("Found grouping with id {}", groupingId);
803 return Either.left(false);
805 log.debug("Grouping for id {} doesn't exist in graph", groupingId);
806 return Either.left(true);
809 janusGraphGenericDao.commit();
814 public Either<SubCategoryDefinition, ActionStatus> getSubCategoryUniqueForType(NodeTypeEnum nodeType, String normalizedName) {
815 Map<String, Object> properties = new HashMap<>();
816 properties.put(GraphPropertiesDictionary.NORMALIZED_NAME.getProperty(), normalizedName);
818 Either<List<SubCategoryData>, JanusGraphOperationStatus> subCategoryEither = janusGraphGenericDao
819 .getByCriteria(nodeType, properties, SubCategoryData.class);
820 if (subCategoryEither.isRight() && subCategoryEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
821 log.debug("Failed to get sub-categories, nodeType {}, normalizedName {}, error {}", nodeType, normalizedName,
822 subCategoryEither.right().value());
823 return Either.right(ActionStatus.GENERAL_ERROR);
825 List<SubCategoryData> subCategoryList = (subCategoryEither.isLeft() ? subCategoryEither.left().value() : null);
826 if (subCategoryList != null && subCategoryList.size() > 0) {
827 log.debug("Found sub-category for nodeType {} with normalizedName {}", nodeType, normalizedName);
828 SubCategoryData subCategoryData = subCategoryList.get(0);
829 SubCategoryDefinition subCategoryDefinition = new SubCategoryDefinition(subCategoryData.getSubCategoryDataDefinition());
830 return Either.left(subCategoryDefinition);
832 log.debug("Sub-category for nodeType {} with normalizedName {} doesn't exist in graph", nodeType, normalizedName);
833 return Either.left(null);
836 janusGraphGenericDao.commit();
841 public Either<GroupingDefinition, ActionStatus> getGroupingUniqueForType(NodeTypeEnum nodeType, String groupingNormalizedName) {
842 Map<String, Object> properties = new HashMap<>();
843 properties.put(GraphPropertiesDictionary.NORMALIZED_NAME.getProperty(), groupingNormalizedName);
845 Either<List<GroupingData>, JanusGraphOperationStatus> groupingEither = janusGraphGenericDao
846 .getByCriteria(nodeType, properties, GroupingData.class);
847 if (groupingEither.isRight() && groupingEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
848 log.debug("Failed to get grouping, nodeType {}, normalizedName {}, error {}", nodeType, groupingNormalizedName,
849 groupingEither.right().value());
850 return Either.right(ActionStatus.GENERAL_ERROR);
852 List<GroupingData> groupingList = (groupingEither.isLeft() ? groupingEither.left().value() : null);
853 if (groupingList != null && groupingList.size() > 0) {
854 log.debug("Found grouping for nodeType {} with normalizedName {}", nodeType, groupingNormalizedName);
855 GroupingData groupingData = groupingList.get(0);
856 GroupingDefinition groupingDefinition = new GroupingDefinition(groupingData.getGroupingDataDefinition());
857 return Either.left(groupingDefinition);
859 log.debug("Grouping for nodeType {} with normalizedName {} doesn't exist in graph", nodeType, groupingNormalizedName);
860 return Either.left(null);
863 janusGraphGenericDao.commit();
871 public Either<List<Tag>, ActionStatus> getAllTags() {
873 Either<List<TagData>, JanusGraphOperationStatus> either = janusGraphGenericDao.getAll(NodeTypeEnum.Tag, TagData.class);
874 if (either.isRight()) {
875 log.debug("Problem while get all tags. reason - {}", either.right().value());
876 return Either.right(ActionStatus.GENERAL_ERROR);
878 List<TagData> tagDataList = either.left().value();
879 List<Tag> tagList = convertToListOfTag(tagDataList);
880 return Either.left(tagList);
882 janusGraphGenericDao.commit();
887 public <T extends GraphNode> Either<org.openecomp.sdc.be.resources.data.CategoryData, StorageOperationStatus> getCategoryData(String name,
891 String categoryUid = null;
892 if (type == NodeTypeEnum.ResourceCategory) {
893 String[] categoryFields = name.split("/");
894 if (categoryFields.length != 2) {
895 return Either.right(StorageOperationStatus.CATEGORY_NOT_FOUND);
897 categoryUid = UniqueIdBuilder.buildResourceCategoryUid(categoryFields[0], categoryFields[1], type);
899 categoryUid = UniqueIdBuilder.buildServiceCategoryUid(name, type);
901 Either<T, JanusGraphOperationStatus> either = janusGraphGenericDao.getNode(UniqueIdBuilder.getKeyByNodeType(type), categoryUid, clazz);
902 if (either.isRight()) {
903 JanusGraphOperationStatus janusGraphOperationStatus = either.right().value();
904 log.debug("Problem while geting category with id {}. reason - {}", categoryUid, janusGraphOperationStatus.name());
905 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
906 return Either.right(StorageOperationStatus.CATEGORY_NOT_FOUND);
908 return Either.right(StorageOperationStatus.GENERAL_ERROR);
911 return Either.left((org.openecomp.sdc.be.resources.data.CategoryData) either.left().value());
913 return Either.right(StorageOperationStatus.GENERAL_ERROR);
917 private List<Tag> convertToListOfTag(List<TagData> tagDataList) {
918 List<Tag> tagList = new ArrayList<>();
919 for (TagData elem : tagDataList) {
921 tag.setName(elem.getName());
928 public Either<List<PropertyScope>, ActionStatus> getAllPropertyScopes() {
930 List<PropertyScope> propertyScopes = new ArrayList<>();
931 PropertyScope propertyScope1 = new PropertyScope();
932 propertyScope1.setName("A&AI");
933 PropertyScope propertyScope2 = new PropertyScope();
934 propertyScope2.setName("Order");
935 PropertyScope propertyScope3 = new PropertyScope();
936 propertyScope3.setName("Runtime");
937 propertyScopes.add(propertyScope1);
938 propertyScopes.add(propertyScope2);
939 propertyScopes.add(propertyScope3);
940 return Either.left(propertyScopes);
944 public List<ArtifactType> getAllArtifactTypes() {
945 final List<ArtifactConfiguration> artifactTypesList = ArtifactConfigManager.getInstance().getConfiguration();
946 return artifactTypesList.stream().map(artifactConfiguration -> {
947 final ArtifactType artifactType = new ArtifactType();
948 artifactType.setName(artifactConfiguration.getType());
950 }).collect(Collectors.toList());
954 public Either<Configuration.HeatDeploymentArtifactTimeout, ActionStatus> getDefaultHeatTimeout() {
955 return Either.left(getConfiguration().getHeatArtifactDeploymentTimeout());
959 public Either<Map<String, String>, ActionStatus> getResourceTypesMap() {
960 ResourceTypeEnum[] enumConstants = ResourceTypeEnum.class.getEnumConstants();
961 Map<String, String> resourceTypes = new HashMap<>();
962 if (enumConstants != null) {
963 for (int i = 0; i < enumConstants.length; ++i) {
964 resourceTypes.put(enumConstants[i].name(), enumConstants[i].getValue());
967 return Either.left(resourceTypes);
971 public <T extends GraphNode> Either<CategoryData, StorageOperationStatus> getNewCategoryData(String name, NodeTypeEnum type, Class<T> clazz) {
973 String categoryUid = UniqueIdBuilder.buildServiceCategoryUid(name, type);
974 Map props = new HashMap<>();
975 props.put(GraphPropertiesDictionary.NORMALIZED_NAME.getProperty(), ValidationUtils.normalizeCategoryName4Uniqueness(name));
976 Either<List<T>, JanusGraphOperationStatus> either = janusGraphGenericDao.getByCriteria(type, props, clazz);
977 if (either.isRight()) {
978 JanusGraphOperationStatus janusGraphOperationStatus = either.right().value();
979 log.debug("Problem while geting category with id {}. reason - {}", categoryUid, janusGraphOperationStatus.name());
980 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
981 return Either.right(StorageOperationStatus.CATEGORY_NOT_FOUND);
983 return Either.right(StorageOperationStatus.GENERAL_ERROR);
986 return Either.left((CategoryData) either.left().value().get(0));
988 return Either.right(StorageOperationStatus.GENERAL_ERROR);