re base code
[sdc.git] / asdctool / src / main / java / org / openecomp / sdc / asdctool / impl / internal / tool / DeleteComponentHandler.java
1 package org.openecomp.sdc.asdctool.impl.internal.tool;
2
3 import com.thinkaurelius.titan.core.TitanVertex;
4 import fj.data.Either;
5 import org.apache.tinkerpop.gremlin.structure.Direction;
6 import org.apache.tinkerpop.gremlin.structure.Edge;
7 import org.apache.tinkerpop.gremlin.structure.Vertex;
8 import org.openecomp.sdc.asdctool.utils.ConsoleWriter;
9 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
10 import org.openecomp.sdc.be.dao.jsongraph.TitanDao;
11 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
12 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
13 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
14 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
15 import org.openecomp.sdc.be.model.jsontitan.operations.NodeTypeOperation;
16 import org.openecomp.sdc.be.model.jsontitan.operations.TopologyTemplateOperation;
17 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaElementOperation;
18 import org.openecomp.sdc.common.log.wrappers.Logger;
19 import org.springframework.beans.factory.annotation.Autowired;
20 import org.springframework.stereotype.Component;
21
22 import java.io.IOException;
23 import java.util.Iterator;
24 import java.util.Map;
25 import java.util.Scanner;
26
27 @Component("deleteComponentHandler")
28 public class DeleteComponentHandler extends CommonInternalTool{
29     @Autowired
30     private TitanDao titanDao;
31     @Autowired
32     private NodeTypeOperation nodeTypeOperation;
33     @Autowired
34     private TopologyTemplateOperation topologyTemplateOperation;
35     
36   
37     private static Logger log = Logger.getLogger(DeleteComponentHandler.class.getName());
38
39     
40     public DeleteComponentHandler(){
41         super("delete");
42     }
43     public void deleteComponent(String id, Scanner scanner) {
44         TitanOperationStatus status = TitanOperationStatus.OK;
45         GraphVertex metadataVertex = titanDao.getVertexById(id).either(l -> l, r -> null);
46         if (metadataVertex != null) {
47             status = handleComponent(scanner, metadataVertex);
48         } else {
49             ConsoleWriter.dataLine("No vertex for id", id);
50         }
51         if (status == TitanOperationStatus.OK) {
52             titanDao.commit();
53         } else {
54             titanDao.rollback();
55         }
56     }
57
58     private TitanOperationStatus handleComponent(Scanner scanner, GraphVertex metadataVertex) {
59         Map<GraphPropertyEnum, Object> metadataProperties = metadataVertex.getMetadataProperties();
60         TitanOperationStatus status = TitanOperationStatus.OK;
61         printComponentInfo(metadataProperties);
62
63         Iterator<Edge> edges = metadataVertex.getVertex().edges(Direction.OUT, EdgeLabelEnum.VERSION.name());
64         if (edges != null && edges.hasNext()) {
65             ConsoleWriter.dataLine("\ncomponent is not latest version and cannot be deleted");
66         } else {
67             ConsoleWriter.dataLine("\ncomponent is latest .");
68             if (isReferenceExist(metadataVertex)) {
69                 ConsoleWriter.dataLine("\nExist reference on component ( istance, proxy or allotted). Component cannot be deleted");
70             } else {
71                 ConsoleWriter.dataLine("\nNo references. Try to delete (yes/no)?");
72                 String input = scanner.nextLine();
73                 if (input.equalsIgnoreCase("yes")) {
74                     status = handleComponent(metadataVertex);
75                 }
76             }
77         }
78         return status;
79     }
80
81     private TitanOperationStatus handleComponent(GraphVertex metadataVertex) {
82         ToscaElementOperation toscaElementOperation = getOperationByLabel(metadataVertex);
83         Iterator<Edge> edges = metadataVertex.getVertex().edges(Direction.IN, EdgeLabelEnum.VERSION.name());
84         if (edges != null && edges.hasNext()) {
85             TitanOperationStatus status = updatePreviousVersion(metadataVertex, edges);
86             if ( status != TitanOperationStatus.OK ){
87                 return status;
88             }
89         }
90         toscaElementOperation.deleteToscaElement(metadataVertex)
91              .left()
92              .map(l -> {
93                  ConsoleWriter.dataLine("\nDeleted");
94                  report(metadataVertex);
95                  return TitanOperationStatus.OK;
96              })
97              .right()
98              .map(r-> {
99                  ConsoleWriter.dataLine("\nFailed to delete. see log file");
100                  return r;
101              });
102         return TitanOperationStatus.OK;
103     }
104
105     private TitanOperationStatus updatePreviousVersion(GraphVertex metadataVertex, Iterator<Edge> edges) {
106         Edge edge = edges.next();
107         TitanVertex prevVersionVertex = (TitanVertex) edge.outVertex();
108         // check if previous version is deleted
109         Boolean isDeleted = (Boolean) titanDao.getProperty(prevVersionVertex, GraphPropertyEnum.IS_DELETED.getProperty());
110         if (isDeleted != null && isDeleted) {
111             ConsoleWriter.dataLine("\nPrevoius version is marked as deleted. Component cannot be deleted");
112             return TitanOperationStatus.GENERAL_ERROR;
113         }
114         // update highest property for previous version
115         TitanOperationStatus status = updateStateOfPreviuosVersion(prevVersionVertex);
116         if ( TitanOperationStatus.OK != status ){
117             return status;
118         }
119         
120         // connect to catalog or archive
121         return connectToCatalogAndArchive(metadataVertex, prevVersionVertex);
122     }
123
124     private TitanOperationStatus updateStateOfPreviuosVersion(TitanVertex prevVersionVertex) {
125         String prevId = (String) titanDao.getProperty(prevVersionVertex, GraphPropertyEnum.UNIQUE_ID.getProperty());
126         Either<GraphVertex, TitanOperationStatus> prevGraphVertex = titanDao.getVertexById(prevId);
127         GraphVertex prevVertex = prevGraphVertex.left().value();
128         prevVertex.addMetadataProperty(GraphPropertyEnum.IS_HIGHEST_VERSION, true);
129         titanDao.updateVertex(prevVertex);
130   
131         Iterator<Edge> edgesIter = prevVersionVertex.edges(Direction.IN, EdgeLabelEnum.LAST_STATE.name());
132         if ( edgesIter.hasNext() ) {
133             Edge lastStateEdge = edgesIter.next();
134             Vertex lastModifier = lastStateEdge.outVertex();
135             TitanOperationStatus replaceRes = titanDao.replaceEdgeLabel(lastModifier, prevVersionVertex, lastStateEdge, EdgeLabelEnum.LAST_STATE, EdgeLabelEnum.STATE);
136             if (replaceRes != TitanOperationStatus.OK) {
137                 log.info("Failed to replace label from {} to {}. status = {}", EdgeLabelEnum.LAST_STATE, EdgeLabelEnum.STATE, replaceRes);
138                 ConsoleWriter.dataLine("\nFailed to replace LAST_STATE edge . Failed to delete");
139                 return TitanOperationStatus.GENERAL_ERROR;
140             }
141         }
142         return TitanOperationStatus.OK;
143     }
144
145    
146     private TitanOperationStatus connectToCatalogAndArchive(GraphVertex metadataVertex, TitanVertex prevVersionVertex) {
147         
148         TitanOperationStatus status = connectByLabel(metadataVertex, prevVersionVertex, EdgeLabelEnum.CATALOG_ELEMENT, VertexTypeEnum.CATALOG_ROOT);
149         if ( status == TitanOperationStatus.OK ){
150             status = connectByLabel(metadataVertex, prevVersionVertex, EdgeLabelEnum.ARCHIVE_ELEMENT, VertexTypeEnum.ARCHIVE_ROOT);
151         }
152         return status;
153     }
154
155     private TitanOperationStatus connectByLabel(GraphVertex metadataVertex, TitanVertex prevVersionVertex, EdgeLabelEnum edgeLabel, VertexTypeEnum vertexlabel) {
156         Iterator<Edge> edgesToCatalog = metadataVertex.getVertex().edges(Direction.IN, edgeLabel.name());
157         if ( edgesToCatalog != null && edgesToCatalog.hasNext() ){
158             //exist edge move to prev version
159             Either<GraphVertex, TitanOperationStatus> catalog = titanDao.getVertexByLabel(vertexlabel);
160             if (catalog.isRight()) {
161                 log.debug("Failed to fetch {} vertex, error {}", vertexlabel, catalog.right().value());
162                 return catalog.right().value();
163             }
164             GraphVertex catalogV = catalog.left().value();      
165             Edge edge = edgesToCatalog.next();
166             return titanDao.createEdge(catalogV.getVertex(), prevVersionVertex, edgeLabel, edge );
167         }
168         return TitanOperationStatus.OK;
169     }
170
171     private boolean isReferenceExist(GraphVertex metadataVertex) {
172         return existEdgeByLabel(metadataVertex, EdgeLabelEnum.INSTANCE_OF) || existEdgeByLabel(metadataVertex, EdgeLabelEnum.PROXY_OF) || existEdgeByLabel(metadataVertex, EdgeLabelEnum.ALLOTTED_OF);
173     }
174
175     private boolean existEdgeByLabel(GraphVertex metadataVertex, EdgeLabelEnum label) {
176         Iterator<Edge> edges = metadataVertex.getVertex().edges(Direction.IN, label.name());
177         return (edges != null && edges.hasNext());
178     }
179
180     private ToscaElementOperation getOperationByLabel(GraphVertex metadataVertex) {
181         VertexTypeEnum label = metadataVertex.getLabel();
182         if (label == VertexTypeEnum.NODE_TYPE) {
183             return nodeTypeOperation;
184         } else {
185             return topologyTemplateOperation;
186         }
187     }
188    
189     private void report(GraphVertex metadataVertex) {
190         try {
191             getReportWriter().report(metadataVertex.getMetadataProperties());
192         } catch (IOException e) {
193             ConsoleWriter.dataLine("\nFailed to created report file.");
194         }
195     }
196
197  
198
199
200 }