204f0a5fc80b8d4b4468b4099da752ab2740d321
[sdc.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.asdctool.impl.migration.v1707;
22
23 import java.util.EnumMap;
24 import java.util.Iterator;
25 import java.util.List;
26 import java.util.Map;
27 import org.apache.tinkerpop.gremlin.structure.Direction;
28 import org.apache.tinkerpop.gremlin.structure.Edge;
29 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
30 import org.openecomp.sdc.be.dao.jsongraph.TitanDao;
31 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
32 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
33 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
34 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
35 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
36 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
39 import org.springframework.beans.factory.annotation.Autowired;
40 import org.springframework.stereotype.Component;
41
42 import fj.data.Either;
43 @Component("migration1707relationsFix")
44 public class Migration1707RelationsFix {
45
46         private static Logger LOGGER = LoggerFactory.getLogger(Migration1707RelationsFix.class);
47         
48         @Autowired
49     private TitanDao titanDao;
50
51         public boolean migrate() {
52                 boolean result = true;
53
54                 try{
55                         Map<GraphPropertyEnum, Object> propsHasNot = new EnumMap<>(GraphPropertyEnum.class);
56                         propsHasNot.put(GraphPropertyEnum.IS_DELETED, true);
57                         Either<List<GraphVertex>, TitanOperationStatus> getAllTopologyTemplatesRes = titanDao.getByCriteria(VertexTypeEnum.TOPOLOGY_TEMPLATE, null, propsHasNot, JsonParseFlagEnum.ParseMetadata);
58                         if (getAllTopologyTemplatesRes.isRight() && getAllTopologyTemplatesRes.right().value() != TitanOperationStatus.NOT_FOUND) {
59                                 LOGGER.debug("Failed to fetch all non marked as deleted topology templates , error {}", getAllTopologyTemplatesRes.right().value());
60                                 result = false;
61                         }
62                         if(getAllTopologyTemplatesRes.isLeft()){
63                                 fixComponentsRelations(getAllTopologyTemplatesRes.left().value());
64                         }
65                         if(result){
66                                 Either<List<GraphVertex>, TitanOperationStatus> getAllNodeTypesRes = titanDao.getByCriteria(VertexTypeEnum.NODE_TYPE, null, propsHasNot, JsonParseFlagEnum.ParseMetadata);
67                                 if (getAllNodeTypesRes.isRight() && getAllNodeTypesRes.right().value() != TitanOperationStatus.NOT_FOUND) {
68                                         LOGGER.debug("Failed to fetch all non marked as deleted node types , error {}", getAllNodeTypesRes.right().value());
69                                         result = false;
70                                 }
71                                 if(getAllNodeTypesRes.isLeft()){
72                                         fixComponentsRelations(getAllNodeTypesRes.left().value());
73                                 }
74                         }
75                 } catch (Exception e){
76                         LOGGER.debug("The exception {} occured upon migration 1707 relations fixing. ", e.getMessage());
77                         e.printStackTrace();
78                         result = false;
79                 }
80                 finally{
81                         if(result){
82                                 titanDao.commit();
83                         } else {
84                                 titanDao.rollback();
85                         }
86                 }
87                 return result;
88         }
89         
90         private void fixComponentsRelations(List<GraphVertex> notDeletedComponentVerticies) {
91                 notDeletedComponentVerticies.stream().forEach(this::fixComponentRelations);
92         }
93         
94         private void fixComponentRelations(GraphVertex componentV) {
95                 fixCreatorComponentRelation(componentV);
96                 fixLastModifierComponentRelation(componentV);
97                 fixStateComponentRelation(componentV);
98         }
99         
100         private void fixStateComponentRelation(GraphVertex componentV) {
101                 boolean relevantEdgeFound = false;
102                 Iterator<Edge> edges = componentV.getVertex().edges(Direction.IN, EdgeLabelEnum.STATE.name());
103                 String getState = (String) componentV.getJsonMetadataField(JsonPresentationFields.LIFECYCLE_STATE);
104                 while(edges.hasNext()){
105                         Edge edge = edges.next();
106                         String edgeState = (String) edge.property(GraphPropertyEnum.STATE.getProperty()).orElse(null);
107                         if(getState.equals(edgeState) && !relevantEdgeFound){
108                                 relevantEdgeFound = true;
109                         } else {
110                                 removeEdge(edge);
111                         }
112                 }
113         }
114
115         private void fixCreatorComponentRelation(GraphVertex componentV) {
116                 boolean relevantUserFound = false;
117                 Iterator<Edge> edges = componentV.getVertex().edges(Direction.IN, EdgeLabelEnum.CREATOR.name());
118                 String getCreatorUserId = (String) componentV.getJsonMetadataField(JsonPresentationFields.USER_ID_CREATOR);
119                 while(edges.hasNext()){
120                         Edge edge = edges.next();
121                         String userId = (String) edge.outVertex().property(GraphPropertyEnum.USERID.getProperty()).orElse(null);
122                         if(getCreatorUserId.equals(userId) && !relevantUserFound){
123                                 relevantUserFound = true;
124                         } else {
125                                 removeEdge(edge);
126                         }
127                 }
128         }
129         
130         private void fixLastModifierComponentRelation(GraphVertex componentV) {
131                 boolean relevantUserFound = false;
132                 Iterator<Edge> edges = componentV.getVertex().edges(Direction.IN, EdgeLabelEnum.LAST_MODIFIER.name());
133                 String getLastUpdaterUserId = (String) componentV.getJsonMetadataField(JsonPresentationFields.USER_ID_LAST_UPDATER);
134                 while(edges.hasNext()){
135                         Edge edge = edges.next();
136                         String updaterId = (String) edge.outVertex().property(GraphPropertyEnum.USERID.getProperty()).orElse(null);
137                         if(getLastUpdaterUserId.equals(updaterId) && !relevantUserFound){
138                                 relevantUserFound = true;
139                         } else {
140                                 removeEdge(edge);
141                         }
142                 }
143         }
144
145         private void removeEdge(Edge edge) {
146                 LOGGER.debug("Going to remove edge {} upon migration 1707 relations fixing. ", edge.id());
147                 edge.remove();
148                 LOGGER.debug("The edge {} has been removed. ", edge.id());
149         }
150         
151 }