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.EnumMap;
25 import java.util.HashMap;
26 import java.util.Iterator;
27 import java.util.LinkedHashMap;
28 import java.util.List;
30 import java.util.stream.Collectors;
31 import org.apache.commons.lang3.tuple.ImmutablePair;
32 import org.apache.tinkerpop.gremlin.structure.Vertex;
33 import org.janusgraph.core.JanusGraph;
34 import org.janusgraph.core.JanusGraphVertex;
35 import org.openecomp.sdc.be.config.ArtifactConfigManager;
36 import org.openecomp.sdc.be.config.ArtifactConfiguration;
37 import org.openecomp.sdc.be.config.Configuration;
38 import org.openecomp.sdc.be.config.ConfigurationManager;
39 import org.openecomp.sdc.be.dao.api.ActionStatus;
40 import org.openecomp.sdc.be.dao.graph.datatype.GraphEdge;
41 import org.openecomp.sdc.be.dao.graph.datatype.GraphNode;
42 import org.openecomp.sdc.be.dao.graph.datatype.GraphRelation;
43 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphGenericDao;
44 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
45 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
46 import org.openecomp.sdc.be.dao.jsongraph.HealingJanusGraphDao;
47 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
48 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
49 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
50 import org.openecomp.sdc.be.dao.neo4j.GraphEdgeLabels;
51 import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
52 import org.openecomp.sdc.be.datatypes.category.CategoryDataDefinition;
53 import org.openecomp.sdc.be.datatypes.category.GroupingDataDefinition;
54 import org.openecomp.sdc.be.datatypes.category.SubCategoryDataDefinition;
55 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
56 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
57 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
58 import org.openecomp.sdc.be.model.ArtifactType;
59 import org.openecomp.sdc.be.model.BaseType;
60 import org.openecomp.sdc.be.model.LifecycleStateEnum;
61 import org.openecomp.sdc.be.model.PropertyScope;
62 import org.openecomp.sdc.be.model.Tag;
63 import org.openecomp.sdc.be.model.category.CategoryDefinition;
64 import org.openecomp.sdc.be.model.category.GroupingDefinition;
65 import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
66 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
67 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
68 import org.openecomp.sdc.be.resources.data.TagData;
69 import org.openecomp.sdc.be.resources.data.category.CategoryData;
70 import org.openecomp.sdc.be.resources.data.category.GroupingData;
71 import org.openecomp.sdc.be.resources.data.category.SubCategoryData;
72 import org.openecomp.sdc.common.log.wrappers.Logger;
73 import org.openecomp.sdc.common.util.ValidationUtils;
74 import org.springframework.beans.factory.annotation.Qualifier;
75 import org.springframework.stereotype.Component;
77 @Component("element-operation")
78 public class ElementOperation implements IElementOperation {
80 private static final String COULDN_T_FETCH_janusGraph_GRAPH = "Couldn't fetch janusgraph graph";
81 private static final String UNKNOWN_CATEGORY_TYPE = "Unknown category type {}";
82 private static final Logger log = Logger.getLogger(ElementOperation.class.getName());
83 private JanusGraphGenericDao janusGraphGenericDao;
84 private HealingJanusGraphDao janusGraphDao;
86 public ElementOperation(@Qualifier("janusgraph-generic-dao") JanusGraphGenericDao janusGraphGenericDao, @Qualifier("janusgraph-dao") HealingJanusGraphDao janusGraphDao) {
88 this.janusGraphGenericDao = janusGraphGenericDao;
89 this.janusGraphDao = janusGraphDao;
92 private static NodeTypeEnum getChildNodeType(NodeTypeEnum parentTypeEnum) {
93 NodeTypeEnum res = null;
94 switch (parentTypeEnum) {
95 case ResourceNewCategory:
96 res = NodeTypeEnum.ResourceSubcategory;
99 res = NodeTypeEnum.ProductSubcategory;
101 case ProductSubcategory:
102 res = NodeTypeEnum.ProductGrouping;
114 public Either<List<CategoryDefinition>, ActionStatus> getAllServiceCategories() {
115 return getAllCategories(NodeTypeEnum.ServiceNewCategory, false);
119 public Either<List<CategoryDefinition>, ActionStatus> getAllResourceCategories() {
120 return getAllCategories(NodeTypeEnum.ResourceNewCategory, false);
124 public Either<List<CategoryDefinition>, ActionStatus> getAllProductCategories() {
125 return getAllCategories(NodeTypeEnum.ProductCategory, false);
132 public Either<CategoryDefinition, ActionStatus> createCategory(CategoryDefinition category, NodeTypeEnum nodeType) {
133 return createCategory(category, nodeType, false);
137 public Either<CategoryDefinition, ActionStatus> createCategory(CategoryDefinition category, NodeTypeEnum nodeType, boolean inTransaction) {
138 Either<CategoryDefinition, ActionStatus> result = null;
139 category.setUniqueId(UniqueIdBuilder.buildCategoryUid(category.getNormalizedName(), nodeType));
140 CategoryData categoryData = new CategoryData(nodeType, category);
142 Either<CategoryData, JanusGraphOperationStatus> createNode = janusGraphGenericDao.createNode(categoryData, CategoryData.class);
143 if (createNode.isRight()) {
144 JanusGraphOperationStatus value = createNode.right().value();
145 ActionStatus actionStatus = ActionStatus.GENERAL_ERROR;
146 log.debug("Problem while creating category, reason {}", value);
147 if (value == JanusGraphOperationStatus.JANUSGRAPH_SCHEMA_VIOLATION) {
148 actionStatus = ActionStatus.COMPONENT_CATEGORY_ALREADY_EXISTS;
150 result = Either.right(actionStatus);
153 CategoryDefinition created = new CategoryDefinition(createNode.left().value().getCategoryDataDefinition());
154 result = Either.left(created);
157 if (!inTransaction) {
158 if (result != null && result.isLeft()) {
159 janusGraphGenericDao.commit();
161 janusGraphGenericDao.rollback();
168 public Either<CategoryDefinition, ActionStatus> updateCategory(CategoryDefinition category, NodeTypeEnum nodeType) {
169 return updateCategory(category, nodeType, false);
173 public Either<CategoryDefinition, ActionStatus> updateCategory(CategoryDefinition category, NodeTypeEnum nodeType, boolean inTransaction) {
174 Either<CategoryDefinition, ActionStatus> result = null;
175 category.setUniqueId(UniqueIdBuilder.buildCategoryUid(category.getNormalizedName(), nodeType));
176 CategoryData categoryData = new CategoryData(nodeType, category);
178 Either<CategoryData, JanusGraphOperationStatus> updatedNode = janusGraphGenericDao.updateNode(categoryData, CategoryData.class);
179 if (updatedNode.isRight()) {
180 JanusGraphOperationStatus value = updatedNode.right().value();
181 ActionStatus actionStatus = ActionStatus.GENERAL_ERROR;
182 log.debug("Problem while creating category, reason {}", value);
183 result = Either.right(actionStatus);
186 CategoryDefinition created = new CategoryDefinition(updatedNode.left().value().getCategoryDataDefinition());
187 result = Either.left(created);
190 if (!inTransaction) {
191 if (result != null && result.isLeft()) {
192 janusGraphGenericDao.commit();
194 janusGraphGenericDao.rollback();
201 public Either<SubCategoryDefinition, ActionStatus> createSubCategory(String categoryId, SubCategoryDefinition subCategory,
202 NodeTypeEnum nodeType) {
203 return createSubCategory(categoryId, subCategory, nodeType, false);
207 public Either<SubCategoryDefinition, ActionStatus> createSubCategory(String categoryId, SubCategoryDefinition subCategory, NodeTypeEnum nodeType,
208 boolean inTransaction) {
209 Either<SubCategoryDefinition, ActionStatus> result = null;
211 // create edge from category to sub-category
212 Either<CategoryData, JanusGraphOperationStatus> categoryNode = janusGraphGenericDao
213 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), categoryId, CategoryData.class);
214 ActionStatus actionStatus = ActionStatus.GENERAL_ERROR;
215 if (categoryNode.isRight()) {
216 JanusGraphOperationStatus janusGraphOperationStatus = categoryNode.right().value();
217 log.debug("Problem while fetching category, reason {}", janusGraphOperationStatus);
218 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
219 actionStatus = ActionStatus.COMPONENT_CATEGORY_NOT_FOUND;
221 result = Either.right(actionStatus);
224 CategoryDataDefinition categoryDataDefinition = categoryNode.left().value().getCategoryDataDefinition();
225 subCategory.setUniqueId(UniqueIdBuilder.buildSubCategoryUid(categoryDataDefinition.getUniqueId(), subCategory.getNormalizedName()));
226 SubCategoryData subCategoryData = new SubCategoryData(nodeType, subCategory);
227 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryNode = janusGraphGenericDao
228 .createNode(subCategoryData, SubCategoryData.class);
229 if (subCategoryNode.isRight()) {
230 JanusGraphOperationStatus janusGraphOperationStatus = subCategoryNode.right().value();
231 log.debug("Problem while creating category, reason {}", janusGraphOperationStatus);
232 if (janusGraphOperationStatus == JanusGraphOperationStatus.JANUSGRAPH_SCHEMA_VIOLATION) {
233 actionStatus = ActionStatus.COMPONENT_SUB_CATEGORY_EXISTS_FOR_CATEGORY;
235 result = Either.right(actionStatus);
238 Either<GraphRelation, JanusGraphOperationStatus> relation = janusGraphGenericDao
239 .createRelation(categoryNode.left().value(), subCategoryNode.left().value(), GraphEdgeLabels.SUB_CATEGORY, null);
240 if (relation.isRight()) {
241 log.debug("Problem while create relation between category and sub-category ", relation.right().value());
242 result = Either.right(actionStatus);
245 SubCategoryDefinition subCategoryCreated = new SubCategoryDefinition(subCategoryNode.left().value().getSubCategoryDataDefinition());
246 result = Either.left(subCategoryCreated);
249 if (!inTransaction) {
250 if (result != null && result.isLeft()) {
251 janusGraphGenericDao.commit();
253 janusGraphGenericDao.rollback();
260 public Either<SubCategoryDefinition, ActionStatus> updateSubCategory(String subCategoryId, SubCategoryDefinition subCategory,
261 NodeTypeEnum nodeType) {
262 return updateSubCategory(subCategoryId, subCategory, nodeType, false);
266 public Either<SubCategoryDefinition, ActionStatus> updateSubCategory(String subCategoryId, SubCategoryDefinition subCategory,
267 NodeTypeEnum nodeType, boolean inTransaction) {
268 Either<SubCategoryDefinition, ActionStatus> result = null;
270 subCategory.setUniqueId(subCategoryId);
271 SubCategoryData subCategoryData = new SubCategoryData(nodeType, subCategory);
272 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryNode = janusGraphGenericDao
273 .updateNode(subCategoryData, SubCategoryData.class);
274 if (subCategoryNode.isRight()) {
275 JanusGraphOperationStatus janusGraphOperationStatus = subCategoryNode.right().value();
276 log.debug("Problem while updating sub category, reason {}", janusGraphOperationStatus);
277 result = Either.right(ActionStatus.GENERAL_ERROR);
280 SubCategoryDefinition subCategoryUpdated = new SubCategoryDefinition(subCategoryNode.left().value().getSubCategoryDataDefinition());
281 result = Either.left(subCategoryUpdated);
284 if (!inTransaction) {
285 if (result != null && result.isLeft()) {
286 janusGraphGenericDao.commit();
288 janusGraphGenericDao.rollback();
295 public Either<GroupingDefinition, ActionStatus> createGrouping(String subCategoryId, GroupingDefinition grouping, NodeTypeEnum nodeType) {
296 Either<GroupingDefinition, ActionStatus> result = null;
298 // create edge from sub-category to grouping
299 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryNode = janusGraphGenericDao
300 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId, SubCategoryData.class);
301 ActionStatus actionStatus = ActionStatus.GENERAL_ERROR;
302 if (subCategoryNode.isRight()) {
303 JanusGraphOperationStatus janusGraphOperationStatus = subCategoryNode.right().value();
304 log.debug("Problem while fetching category, reason {}", janusGraphOperationStatus);
305 if (janusGraphOperationStatus == JanusGraphOperationStatus.JANUSGRAPH_SCHEMA_VIOLATION) {
306 actionStatus = ActionStatus.COMPONENT_CATEGORY_NOT_FOUND;
308 result = Either.right(actionStatus);
311 SubCategoryDataDefinition subCatData = subCategoryNode.left().value().getSubCategoryDataDefinition();
312 grouping.setUniqueId(UniqueIdBuilder.buildGroupingUid(subCatData.getUniqueId(), grouping.getNormalizedName()));
313 GroupingData groupingData = new GroupingData(nodeType, grouping);
314 Either<GroupingData, JanusGraphOperationStatus> groupingNode = janusGraphGenericDao.createNode(groupingData, GroupingData.class);
315 if (groupingNode.isRight()) {
316 JanusGraphOperationStatus janusGraphOperationStatus = groupingNode.right().value();
317 log.debug("Problem while creating grouping, reason {}", janusGraphOperationStatus);
318 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
319 actionStatus = ActionStatus.COMPONENT_GROUPING_EXISTS_FOR_SUB_CATEGORY;
321 result = Either.right(actionStatus);
324 Either<GraphRelation, JanusGraphOperationStatus> relation = janusGraphGenericDao
325 .createRelation(subCategoryNode.left().value(), groupingNode.left().value(), GraphEdgeLabels.GROUPING, null);
326 if (relation.isRight()) {
327 log.debug("Problem while create relation between sub-category and grouping", relation.right().value());
328 result = Either.right(actionStatus);
331 GroupingDefinition groupingCreated = new GroupingDefinition(groupingNode.left().value().getGroupingDataDefinition());
332 result = Either.left(groupingCreated);
335 if (result != null && result.isLeft()) {
336 janusGraphGenericDao.commit();
338 janusGraphGenericDao.rollback();
344 public Either<List<CategoryDefinition>, ActionStatus> getAllCategories(NodeTypeEnum nodeType, boolean inTransaction) {
346 if (nodeType != NodeTypeEnum.ResourceNewCategory && nodeType != NodeTypeEnum.ServiceNewCategory
347 && nodeType != NodeTypeEnum.ProductCategory) {
348 log.debug(UNKNOWN_CATEGORY_TYPE, nodeType.name());
349 return Either.right(ActionStatus.GENERAL_ERROR);
351 Either<List<org.openecomp.sdc.be.resources.data.category.CategoryData>, JanusGraphOperationStatus> either = janusGraphGenericDao
352 .getAll(nodeType, org.openecomp.sdc.be.resources.data.category.CategoryData.class);
353 if (either.isRight() && (either.right().value() != JanusGraphOperationStatus.NOT_FOUND)) {
354 log.debug("Problem while get all categories. reason - {}", either.right().value());
355 return Either.right(ActionStatus.GENERAL_ERROR);
357 List<CategoryData> categoryDataList = either.isLeft() ? either.left().value() : null;
358 List<CategoryDefinition> categoryList = new ArrayList<>();
359 if (categoryDataList != null) {
360 for (CategoryData elem : categoryDataList) {
361 CategoryDataDefinition categoryDataDefinition = elem.getCategoryDataDefinition();
362 CategoryDefinition categoryDefinition = new CategoryDefinition(categoryDataDefinition);
363 String categoryName = categoryDataDefinition.getName();
364 log.trace("Found category {}, category type {}", categoryName, nodeType);
365 JanusGraphOperationStatus setSubCategories = setSubCategories(nodeType, categoryDefinition);
366 if (setSubCategories != JanusGraphOperationStatus.OK) {
367 log.debug("Failed to set sub-categories for category {}, category type {}, error {}", categoryName, nodeType,
369 return Either.right(ActionStatus.GENERAL_ERROR);
371 categoryList.add(categoryDefinition);
374 return Either.left(categoryList);
376 if (!inTransaction) {
377 janusGraphGenericDao.commit();
383 public List<BaseType> getBaseTypes(final String categoryName, final String modelName){
384 final ArrayList<BaseType> baseTypes = new ArrayList<>();
385 final Map<String, String> categoriesSpecificBaseTypes = ConfigurationManager.getConfigurationManager().getConfiguration().getServiceNodeTypes();
386 final String categorySpecificBaseType = categoriesSpecificBaseTypes == null ? null : categoriesSpecificBaseTypes.get(categoryName);
387 final String generalBaseType = ConfigurationManager.getConfigurationManager().getConfiguration().getGenericAssetNodeTypes().get("Service");
388 final String baseToscaResourceName = categorySpecificBaseType == null? generalBaseType : categorySpecificBaseType;
390 final Map<GraphPropertyEnum, Object> props = new EnumMap<>(GraphPropertyEnum.class);
391 props.put(GraphPropertyEnum.TOSCA_RESOURCE_NAME, baseToscaResourceName);
392 props.put(GraphPropertyEnum.STATE, LifecycleStateEnum.CERTIFIED.name());
393 final Either<List<GraphVertex>, JanusGraphOperationStatus> baseTypeVertex = janusGraphDao
394 .getByCriteria(VertexTypeEnum.NODE_TYPE, props, null, JsonParseFlagEnum.ParseAll, modelName);
396 if (baseTypeVertex.isLeft()) {
397 BaseType baseType = new BaseType(baseToscaResourceName);
398 baseTypes.add(baseType);
400 final Map<String, List<String>> typesDerivedFromBaseType = new LinkedHashMap<>();
401 baseTypeVertex.left().value().forEach(v -> {
402 baseType.addVersion((String)v.getMetadataProperty(GraphPropertyEnum.VERSION));
403 addTypesDerivedFromVertex(typesDerivedFromBaseType, v);
406 typesDerivedFromBaseType.forEach((k,v) -> baseTypes.add(new BaseType(k, v)));
412 private Map<String, List<String>> addTypesDerivedFromVertex(final Map<String, List<String>> types, final GraphVertex vertex) {
413 final Either<List<GraphVertex>, JanusGraphOperationStatus> derivedFromVertex =
414 janusGraphDao.getParentVertices(vertex, EdgeLabelEnum.DERIVED_FROM, JsonParseFlagEnum.ParseAll);
415 if (derivedFromVertex.isLeft()) {
416 derivedFromVertex.left().value().stream().filter(v -> v.getMetadataProperty(GraphPropertyEnum.STATE).equals(LifecycleStateEnum.CERTIFIED.name()))
418 addBaseTypeVersion(types, (String) v.getMetadataProperty(GraphPropertyEnum.TOSCA_RESOURCE_NAME), (String) v.getMetadataProperty(GraphPropertyEnum.VERSION));
419 addTypesDerivedFromVertex(types, v);
425 private void addBaseTypeVersion(final Map<String, List<String>> baseTypes, final String baseTypeToscaResourceName, final String baseTypeVersion) {
426 List<String> versions = baseTypes.get(baseTypeToscaResourceName) == null ? new ArrayList<>(): baseTypes.get(baseTypeToscaResourceName);
427 versions.add(baseTypeVersion);
428 baseTypes.put(baseTypeToscaResourceName, versions);
431 private JanusGraphOperationStatus setSubCategories(NodeTypeEnum parentNodeType, CategoryDefinition parentCategory) {
432 NodeTypeEnum childNodeType = getChildNodeType(parentNodeType);
433 if (childNodeType != null) {
434 String categoryName = parentCategory.getName();
435 log.trace("Getting sub-categories for category {}, category type {}", categoryName, parentNodeType);
436 Either<List<ImmutablePair<SubCategoryData, GraphEdge>>, JanusGraphOperationStatus> parentNode = janusGraphGenericDao
437 .getChildrenNodes(UniqueIdBuilder.getKeyByNodeType(parentNodeType), parentCategory.getUniqueId(), GraphEdgeLabels.SUB_CATEGORY,
438 childNodeType, SubCategoryData.class);
439 if (parentNode.isRight()) {
440 JanusGraphOperationStatus janusGraphOperationStatus = parentNode.right().value();
441 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
442 log.trace("Didn't find subcategories for category {}, category type {}", categoryName, parentNodeType);
443 janusGraphOperationStatus = JanusGraphOperationStatus.OK;
445 return janusGraphOperationStatus;
447 List<ImmutablePair<SubCategoryData, GraphEdge>> subsCategoriesData = parentNode.left().value();
448 List<SubCategoryDefinition> subCategoriesDefinitions = new ArrayList<>();
449 for (ImmutablePair<SubCategoryData, GraphEdge> subCatPair : subsCategoriesData) {
450 SubCategoryDataDefinition subCategoryDataDefinition = subCatPair.getLeft().getSubCategoryDataDefinition();
451 SubCategoryDefinition subCategoryDefinition = new SubCategoryDefinition(subCategoryDataDefinition);
452 log.trace("Found sub-category {} for category {}, category type {}", subCategoryDataDefinition.getName(), categoryName,
454 JanusGraphOperationStatus setGroupings = setGroupings(childNodeType, subCategoryDefinition);
455 if (setGroupings != JanusGraphOperationStatus.OK) {
456 log.debug("Failed to set groupings for sub-category {}, sub-category type {}, error {}", subCategoryDataDefinition.getName(),
457 childNodeType, setGroupings);
458 return JanusGraphOperationStatus.GENERAL_ERROR;
460 subCategoriesDefinitions.add(subCategoryDefinition);
462 parentCategory.setSubcategories(subCategoriesDefinitions);
464 return JanusGraphOperationStatus.OK;
467 private JanusGraphOperationStatus setGroupings(NodeTypeEnum parentNodeType, SubCategoryDefinition parentSubCategory) {
468 NodeTypeEnum childNodeType = getChildNodeType(parentNodeType);
469 if (childNodeType != null) {
470 String subCategoryName = parentSubCategory.getName();
471 log.trace("Getting groupings for subcategory {}, subcategory type {}", subCategoryName, parentNodeType);
472 Either<List<ImmutablePair<GroupingData, GraphEdge>>, JanusGraphOperationStatus> parentNode = janusGraphGenericDao
473 .getChildrenNodes(UniqueIdBuilder.getKeyByNodeType(parentNodeType), parentSubCategory.getUniqueId(), GraphEdgeLabels.GROUPING,
474 childNodeType, GroupingData.class);
475 if (parentNode.isRight()) {
476 JanusGraphOperationStatus janusGraphOperationStatus = parentNode.right().value();
477 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
478 log.trace("Didn't find groupings for subcategory {}, subcategory type {}", subCategoryName, parentNodeType);
479 janusGraphOperationStatus = JanusGraphOperationStatus.OK;
481 return janusGraphOperationStatus;
483 List<ImmutablePair<GroupingData, GraphEdge>> groupingData = parentNode.left().value();
484 List<GroupingDefinition> groupingDefinitions = new ArrayList<>();
485 for (ImmutablePair<GroupingData, GraphEdge> groupPair : groupingData) {
486 GroupingDataDefinition groupingDataDefinition = groupPair.getLeft().getGroupingDataDefinition();
487 log.trace("Found grouping {} for sub-category {}, sub-category type {}", groupingDataDefinition.getName(), subCategoryName,
489 groupingDefinitions.add(new GroupingDefinition(groupingDataDefinition));
491 parentSubCategory.setGroupings(groupingDefinitions);
493 return JanusGraphOperationStatus.OK;
497 public Either<CategoryDefinition, ActionStatus> getCategory(NodeTypeEnum nodeType, String categoryId) {
499 if (nodeType != NodeTypeEnum.ResourceNewCategory && nodeType != NodeTypeEnum.ServiceNewCategory
500 && nodeType != NodeTypeEnum.ProductCategory) {
501 log.debug(UNKNOWN_CATEGORY_TYPE, nodeType.name());
502 return Either.right(ActionStatus.GENERAL_ERROR);
504 Either<CategoryData, JanusGraphOperationStatus> categoryDataEither = janusGraphGenericDao
505 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), categoryId, CategoryData.class);
506 if (categoryDataEither.isRight()) {
507 JanusGraphOperationStatus janusGraphOperationStatus = categoryDataEither.right().value();
508 log.debug("Problem while get category by id {}. reason {}", categoryId, janusGraphOperationStatus);
509 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
510 return Either.right(ActionStatus.COMPONENT_CATEGORY_NOT_FOUND);
512 return Either.right(ActionStatus.GENERAL_ERROR);
514 CategoryDataDefinition categoryDataDefinition = categoryDataEither.left().value().getCategoryDataDefinition();
515 return Either.left(new CategoryDefinition(categoryDataDefinition));
517 janusGraphGenericDao.commit();
522 public Either<SubCategoryDefinition, ActionStatus> getSubCategory(NodeTypeEnum nodeType, String subCategoryId) {
524 if (nodeType != NodeTypeEnum.ResourceSubcategory && nodeType != NodeTypeEnum.ProductSubcategory) {
525 log.debug("Unknown sub-category type {}", nodeType.name());
526 return Either.right(ActionStatus.GENERAL_ERROR);
528 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryDataEither = janusGraphGenericDao
529 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId, SubCategoryData.class);
530 if (subCategoryDataEither.isRight()) {
531 JanusGraphOperationStatus janusGraphOperationStatus = subCategoryDataEither.right().value();
532 log.debug("Problem while get sub-category by id {}. reason {}", subCategoryId, janusGraphOperationStatus);
533 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
534 return Either.right(ActionStatus.COMPONENT_CATEGORY_NOT_FOUND);
536 return Either.right(ActionStatus.GENERAL_ERROR);
538 SubCategoryDataDefinition subCategoryDataDefinition = subCategoryDataEither.left().value().getSubCategoryDataDefinition();
539 return Either.left(new SubCategoryDefinition(subCategoryDataDefinition));
541 janusGraphGenericDao.commit();
546 public Either<CategoryDefinition, ActionStatus> deleteCategory(NodeTypeEnum nodeType, String categoryId) {
547 Either<CategoryDefinition, ActionStatus> result = null;
549 if (nodeType != NodeTypeEnum.ResourceNewCategory && nodeType != NodeTypeEnum.ServiceNewCategory
550 && nodeType != NodeTypeEnum.ProductCategory) {
551 log.debug(UNKNOWN_CATEGORY_TYPE, nodeType.name());
552 result = Either.right(ActionStatus.GENERAL_ERROR);
555 Either<CategoryData, JanusGraphOperationStatus> categoryDataEither = janusGraphGenericDao
556 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), categoryId, CategoryData.class);
557 if (categoryDataEither.isRight()) {
558 log.debug("Failed to retrieve category for id {} ", categoryId);
559 result = Either.right(ActionStatus.GENERAL_ERROR);
562 Either<JanusGraph, JanusGraphOperationStatus> graph = janusGraphGenericDao.getGraph();
563 if (graph.isRight()) {
564 log.debug(COULDN_T_FETCH_janusGraph_GRAPH);
565 result = Either.right(ActionStatus.GENERAL_ERROR);
568 JanusGraph tGraph = graph.left().value();
569 Iterable<JanusGraphVertex> verticesArtifact = tGraph.query().has(UniqueIdBuilder.getKeyByNodeType(nodeType), categoryId).vertices();
570 Iterator<JanusGraphVertex> iterator = verticesArtifact.iterator();
571 if (!iterator.hasNext()) {
572 log.debug("No category node for id = {}", categoryId);
573 result = Either.right(ActionStatus.GENERAL_ERROR);
576 Vertex artifactV = iterator.next();
578 CategoryDefinition deleted = new CategoryDefinition(categoryDataEither.left().value().getCategoryDataDefinition());
579 result = Either.left(deleted);
582 if (result != null && result.isLeft()) {
583 janusGraphGenericDao.commit();
585 janusGraphGenericDao.rollback();
591 public Either<SubCategoryDefinition, ActionStatus> deleteSubCategory(NodeTypeEnum nodeType, String subCategoryId) {
592 Either<SubCategoryDefinition, ActionStatus> result = null;
594 if (nodeType != NodeTypeEnum.ResourceSubcategory && nodeType != NodeTypeEnum.ProductSubcategory) {
595 log.debug("Unknown sub-category type {}", nodeType.name());
596 result = Either.right(ActionStatus.GENERAL_ERROR);
599 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryDataEither = janusGraphGenericDao
600 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId, SubCategoryData.class);
601 if (subCategoryDataEither.isRight()) {
602 log.debug("Failed to retrieve sub-category for id {}", subCategoryId);
603 result = Either.right(ActionStatus.GENERAL_ERROR);
606 Either<JanusGraph, JanusGraphOperationStatus> graph = janusGraphGenericDao.getGraph();
607 if (graph.isRight()) {
608 log.debug(COULDN_T_FETCH_janusGraph_GRAPH);
609 result = Either.right(ActionStatus.GENERAL_ERROR);
612 JanusGraph tGraph = graph.left().value();
613 Iterable<JanusGraphVertex> verticesArtifact = tGraph.query().has(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId).vertices();
614 Iterator<JanusGraphVertex> iterator = verticesArtifact.iterator();
615 if (!iterator.hasNext()) {
616 log.debug("No sub-category node for id {}", subCategoryId);
617 result = Either.right(ActionStatus.GENERAL_ERROR);
620 Vertex artifactV = iterator.next();
623 SubCategoryDefinition deleted = new SubCategoryDefinition(subCategoryDataEither.left().value().getSubCategoryDataDefinition());
624 result = Either.left(deleted);
627 if (result != null && result.isLeft()) {
628 janusGraphGenericDao.commit();
630 janusGraphGenericDao.rollback();
636 public Either<GroupingDefinition, ActionStatus> deleteGrouping(NodeTypeEnum nodeType, String groupingId) {
637 Either<GroupingDefinition, ActionStatus> result = null;
639 if (nodeType != NodeTypeEnum.ProductGrouping) {
640 log.debug("Unknown grouping type {}", nodeType.name());
641 result = Either.right(ActionStatus.GENERAL_ERROR);
644 Either<GroupingData, JanusGraphOperationStatus> groupingDataEither = janusGraphGenericDao
645 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), groupingId, GroupingData.class);
646 if (groupingDataEither.isRight()) {
647 log.debug("Failed to retrieve grouping for id {}", groupingId);
648 result = Either.right(ActionStatus.GENERAL_ERROR);
651 Either<JanusGraph, JanusGraphOperationStatus> graph = janusGraphGenericDao.getGraph();
652 if (graph.isRight()) {
653 log.debug(COULDN_T_FETCH_janusGraph_GRAPH);
654 result = Either.right(ActionStatus.GENERAL_ERROR);
657 JanusGraph tGraph = graph.left().value();
658 Iterable<JanusGraphVertex> verticesArtifact = tGraph.query().has(UniqueIdBuilder.getKeyByNodeType(nodeType), groupingId).vertices();
659 Iterator<JanusGraphVertex> iterator = verticesArtifact.iterator();
660 if (!iterator.hasNext()) {
661 log.debug("No grouping node for id {}", groupingId);
662 result = Either.right(ActionStatus.GENERAL_ERROR);
665 Vertex artifactV = iterator.next();
668 GroupingDefinition deleted = new GroupingDefinition(groupingDataEither.left().value().getGroupingDataDefinition());
669 result = Either.left(deleted);
672 if (result != null && result.isLeft()) {
673 janusGraphGenericDao.commit();
675 janusGraphGenericDao.rollback();
681 public Either<Boolean, ActionStatus> isCategoryUniqueForType(NodeTypeEnum nodeType, String normalizedName) {
682 Map<String, Object> properties = new HashMap<>();
683 properties.put(GraphPropertiesDictionary.NORMALIZED_NAME.getProperty(), normalizedName);
685 Either<List<CategoryData>, JanusGraphOperationStatus> categoryEither = janusGraphGenericDao
686 .getByCriteria(nodeType, properties, CategoryData.class);
687 if (categoryEither.isRight() && categoryEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
688 log.debug("Failed to get categories, nodeType {}, normalizedName {}, error {}", nodeType, normalizedName,
689 categoryEither.right().value());
690 return Either.right(ActionStatus.GENERAL_ERROR);
692 List<CategoryData> categoryList = (categoryEither.isLeft() ? categoryEither.left().value() : null);
693 if (categoryList != null && categoryList.size() > 0) {
694 log.debug("Found category for nodeType {} with normalizedName {}", nodeType, normalizedName);
695 if (categoryList.size() > 1) {
696 log.debug("Found more than 1 unique categories for nodeType {} with normalizedName", nodeType, normalizedName);
697 return Either.right(ActionStatus.GENERAL_ERROR);
699 return Either.left(false);
701 log.debug("Category for nodeType {} with normalizedName {} doesn't exist in graph", nodeType, normalizedName);
702 return Either.left(true);
705 janusGraphGenericDao.commit();
710 public Either<Boolean, ActionStatus> isSubCategoryUniqueForCategory(NodeTypeEnum nodeType, String subCategoryNormName, String parentCategoryId) {
711 String subCategoryId = UniqueIdBuilder.buildSubCategoryUid(parentCategoryId, subCategoryNormName);
713 Either<SubCategoryData, JanusGraphOperationStatus> subCategoryDataEither = janusGraphGenericDao
714 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), subCategoryId, SubCategoryData.class);
715 if (subCategoryDataEither.isRight() && subCategoryDataEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
716 log.debug("Failed to get sub-category with id {}, error {}", subCategoryId, subCategoryDataEither.right().value());
717 return Either.right(ActionStatus.GENERAL_ERROR);
719 SubCategoryData subCategoryData = (subCategoryDataEither.isLeft() ? subCategoryDataEither.left().value() : null);
720 if (subCategoryData != null) {
721 log.debug("Found sub-category with id {}", subCategoryId);
722 return Either.left(false);
724 log.debug("Sub-category for id {} doesn't exist in graph", subCategoryId);
725 return Either.left(true);
728 janusGraphGenericDao.commit();
733 public Either<Boolean, ActionStatus> isGroupingUniqueForSubCategory(NodeTypeEnum nodeType, String groupingNormName, String parentSubCategoryId) {
734 String groupingId = UniqueIdBuilder.buildGroupingUid(parentSubCategoryId, groupingNormName);
736 Either<GroupingData, JanusGraphOperationStatus> groupingDataEither = janusGraphGenericDao
737 .getNode(UniqueIdBuilder.getKeyByNodeType(nodeType), groupingId, GroupingData.class);
738 if (groupingDataEither.isRight() && groupingDataEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
739 log.debug("Failed to get grouping with id {}, error {}", groupingId, groupingDataEither.right().value());
740 return Either.right(ActionStatus.GENERAL_ERROR);
742 GroupingData groupingData = (groupingDataEither.isLeft() ? groupingDataEither.left().value() : null);
743 if (groupingData != null) {
744 log.debug("Found grouping with id {}", groupingId);
745 return Either.left(false);
747 log.debug("Grouping for id {} doesn't exist in graph", groupingId);
748 return Either.left(true);
751 janusGraphGenericDao.commit();
756 public Either<SubCategoryDefinition, ActionStatus> getSubCategoryUniqueForType(NodeTypeEnum nodeType, String normalizedName) {
757 Map<String, Object> properties = new HashMap<>();
758 properties.put(GraphPropertiesDictionary.NORMALIZED_NAME.getProperty(), normalizedName);
760 Either<List<SubCategoryData>, JanusGraphOperationStatus> subCategoryEither = janusGraphGenericDao
761 .getByCriteria(nodeType, properties, SubCategoryData.class);
762 if (subCategoryEither.isRight() && subCategoryEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
763 log.debug("Failed to get sub-categories, nodeType {}, normalizedName {}, error {}", nodeType, normalizedName,
764 subCategoryEither.right().value());
765 return Either.right(ActionStatus.GENERAL_ERROR);
767 List<SubCategoryData> subCategoryList = (subCategoryEither.isLeft() ? subCategoryEither.left().value() : null);
768 if (subCategoryList != null && subCategoryList.size() > 0) {
769 log.debug("Found sub-category for nodeType {} with normalizedName {}", nodeType, normalizedName);
770 SubCategoryData subCategoryData = subCategoryList.get(0);
771 SubCategoryDefinition subCategoryDefinition = new SubCategoryDefinition(subCategoryData.getSubCategoryDataDefinition());
772 return Either.left(subCategoryDefinition);
774 log.debug("Sub-category for nodeType {} with normalizedName {} doesn't exist in graph", nodeType, normalizedName);
775 return Either.left(null);
778 janusGraphGenericDao.commit();
783 public Either<GroupingDefinition, ActionStatus> getGroupingUniqueForType(NodeTypeEnum nodeType, String groupingNormalizedName) {
784 Map<String, Object> properties = new HashMap<>();
785 properties.put(GraphPropertiesDictionary.NORMALIZED_NAME.getProperty(), groupingNormalizedName);
787 Either<List<GroupingData>, JanusGraphOperationStatus> groupingEither = janusGraphGenericDao
788 .getByCriteria(nodeType, properties, GroupingData.class);
789 if (groupingEither.isRight() && groupingEither.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
790 log.debug("Failed to get grouping, nodeType {}, normalizedName {}, error {}", nodeType, groupingNormalizedName,
791 groupingEither.right().value());
792 return Either.right(ActionStatus.GENERAL_ERROR);
794 List<GroupingData> groupingList = (groupingEither.isLeft() ? groupingEither.left().value() : null);
795 if (groupingList != null && groupingList.size() > 0) {
796 log.debug("Found grouping for nodeType {} with normalizedName {}", nodeType, groupingNormalizedName);
797 GroupingData groupingData = groupingList.get(0);
798 GroupingDefinition groupingDefinition = new GroupingDefinition(groupingData.getGroupingDataDefinition());
799 return Either.left(groupingDefinition);
801 log.debug("Grouping for nodeType {} with normalizedName {} doesn't exist in graph", nodeType, groupingNormalizedName);
802 return Either.left(null);
805 janusGraphGenericDao.commit();
813 public Either<List<Tag>, ActionStatus> getAllTags() {
815 Either<List<TagData>, JanusGraphOperationStatus> either = janusGraphGenericDao.getAll(NodeTypeEnum.Tag, TagData.class);
816 if (either.isRight()) {
817 log.debug("Problem while get all tags. reason - {}", either.right().value());
818 return Either.right(ActionStatus.GENERAL_ERROR);
820 List<TagData> tagDataList = either.left().value();
821 List<Tag> tagList = convertToListOfTag(tagDataList);
822 return Either.left(tagList);
824 janusGraphGenericDao.commit();
829 public <T extends GraphNode> Either<org.openecomp.sdc.be.resources.data.CategoryData, StorageOperationStatus> getCategoryData(String name,
833 String categoryUid = null;
834 if (type == NodeTypeEnum.ResourceCategory) {
835 String[] categoryFields = name.split("/");
836 if (categoryFields.length != 2) {
837 return Either.right(StorageOperationStatus.CATEGORY_NOT_FOUND);
839 categoryUid = UniqueIdBuilder.buildResourceCategoryUid(categoryFields[0], categoryFields[1], type);
841 categoryUid = UniqueIdBuilder.buildServiceCategoryUid(name, type);
843 Either<T, JanusGraphOperationStatus> either = janusGraphGenericDao.getNode(UniqueIdBuilder.getKeyByNodeType(type), categoryUid, clazz);
844 if (either.isRight()) {
845 JanusGraphOperationStatus janusGraphOperationStatus = either.right().value();
846 log.debug("Problem while geting category with id {}. reason - {}", categoryUid, janusGraphOperationStatus.name());
847 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
848 return Either.right(StorageOperationStatus.CATEGORY_NOT_FOUND);
850 return Either.right(StorageOperationStatus.GENERAL_ERROR);
853 return Either.left((org.openecomp.sdc.be.resources.data.CategoryData) either.left().value());
855 return Either.right(StorageOperationStatus.GENERAL_ERROR);
859 private List<Tag> convertToListOfTag(List<TagData> tagDataList) {
860 List<Tag> tagList = new ArrayList<>();
861 for (TagData elem : tagDataList) {
863 tag.setName(elem.getName());
870 public Either<List<PropertyScope>, ActionStatus> getAllPropertyScopes() {
872 List<PropertyScope> propertyScopes = new ArrayList<>();
873 PropertyScope propertyScope1 = new PropertyScope();
874 propertyScope1.setName("A&AI");
875 PropertyScope propertyScope2 = new PropertyScope();
876 propertyScope2.setName("Order");
877 PropertyScope propertyScope3 = new PropertyScope();
878 propertyScope3.setName("Runtime");
879 propertyScopes.add(propertyScope1);
880 propertyScopes.add(propertyScope2);
881 propertyScopes.add(propertyScope3);
882 return Either.left(propertyScopes);
886 public List<ArtifactType> getAllArtifactTypes() {
887 final List<ArtifactConfiguration> artifactTypesList = ArtifactConfigManager.getInstance().getConfiguration();
888 return artifactTypesList.stream().map(artifactConfiguration -> {
889 final ArtifactType artifactType = new ArtifactType();
890 artifactType.setName(artifactConfiguration.getType());
892 }).collect(Collectors.toList());
896 public Either<Configuration.HeatDeploymentArtifactTimeout, ActionStatus> getDefaultHeatTimeout() {
897 return Either.left(ConfigurationManager.getConfigurationManager().getConfiguration().getHeatArtifactDeploymentTimeout());
901 public Either<Map<String, String>, ActionStatus> getResourceTypesMap() {
902 ResourceTypeEnum[] enumConstants = ResourceTypeEnum.class.getEnumConstants();
903 Map<String, String> resourceTypes = new HashMap<>();
904 if (enumConstants != null) {
905 for (int i = 0; i < enumConstants.length; ++i) {
906 resourceTypes.put(enumConstants[i].name(), enumConstants[i].getValue());
909 return Either.left(resourceTypes);
913 public <T extends GraphNode> Either<CategoryData, StorageOperationStatus> getNewCategoryData(String name, NodeTypeEnum type, Class<T> clazz) {
915 String categoryUid = UniqueIdBuilder.buildServiceCategoryUid(name, type);
916 Map props = new HashMap<>();
917 props.put(GraphPropertiesDictionary.NORMALIZED_NAME.getProperty(), ValidationUtils.normalizeCategoryName4Uniqueness(name));
918 Either<List<T>, JanusGraphOperationStatus> either = janusGraphGenericDao.getByCriteria(type, props, clazz);
919 if (either.isRight()) {
920 JanusGraphOperationStatus janusGraphOperationStatus = either.right().value();
921 log.debug("Problem while geting category with id {}. reason - {}", categoryUid, janusGraphOperationStatus.name());
922 if (janusGraphOperationStatus == JanusGraphOperationStatus.NOT_FOUND) {
923 return Either.right(StorageOperationStatus.CATEGORY_NOT_FOUND);
925 return Either.right(StorageOperationStatus.GENERAL_ERROR);
928 return Either.left((CategoryData) either.left().value().get(0));
930 return Either.right(StorageOperationStatus.GENERAL_ERROR);