1 package org.openecomp.sdc.asdctool.impl.internal.tool;
3 import com.thinkaurelius.titan.core.TitanVertex;
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;
22 import java.io.IOException;
23 import java.util.Iterator;
25 import java.util.Scanner;
27 @Component("deleteComponentHandler")
28 public class DeleteComponentHandler extends CommonInternalTool{
30 private TitanDao titanDao;
32 private NodeTypeOperation nodeTypeOperation;
34 private TopologyTemplateOperation topologyTemplateOperation;
37 private static Logger log = Logger.getLogger(DeleteComponentHandler.class.getName());
40 public DeleteComponentHandler(){
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);
49 ConsoleWriter.dataLine("No vertex for id", id);
51 if (status == TitanOperationStatus.OK) {
58 private TitanOperationStatus handleComponent(Scanner scanner, GraphVertex metadataVertex) {
59 Map<GraphPropertyEnum, Object> metadataProperties = metadataVertex.getMetadataProperties();
60 TitanOperationStatus status = TitanOperationStatus.OK;
61 printComponentInfo(metadataProperties);
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");
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");
71 ConsoleWriter.dataLine("\nNo references. Try to delete (yes/no)?");
72 String input = scanner.nextLine();
73 if (input.equalsIgnoreCase("yes")) {
74 status = handleComponent(metadataVertex);
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 ){
90 toscaElementOperation.deleteToscaElement(metadataVertex)
93 ConsoleWriter.dataLine("\nDeleted");
94 report(metadataVertex);
95 return TitanOperationStatus.OK;
99 ConsoleWriter.dataLine("\nFailed to delete. see log file");
102 return TitanOperationStatus.OK;
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;
114 // update highest property for previous version
115 TitanOperationStatus status = updateStateOfPreviuosVersion(prevVersionVertex);
116 if ( TitanOperationStatus.OK != status ){
120 // connect to catalog or archive
121 return connectToCatalogAndArchive(metadataVertex, prevVersionVertex);
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);
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;
142 return TitanOperationStatus.OK;
146 private TitanOperationStatus connectToCatalogAndArchive(GraphVertex metadataVertex, TitanVertex prevVersionVertex) {
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);
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();
164 GraphVertex catalogV = catalog.left().value();
165 Edge edge = edgesToCatalog.next();
166 return titanDao.createEdge(catalogV.getVertex(), prevVersionVertex, edgeLabel, edge );
168 return TitanOperationStatus.OK;
171 private boolean isReferenceExist(GraphVertex metadataVertex) {
172 return existEdgeByLabel(metadataVertex, EdgeLabelEnum.INSTANCE_OF) || existEdgeByLabel(metadataVertex, EdgeLabelEnum.PROXY_OF) || existEdgeByLabel(metadataVertex, EdgeLabelEnum.ALLOTTED_OF);
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());
180 private ToscaElementOperation getOperationByLabel(GraphVertex metadataVertex) {
181 VertexTypeEnum label = metadataVertex.getLabel();
182 if (label == VertexTypeEnum.NODE_TYPE) {
183 return nodeTypeOperation;
185 return topologyTemplateOperation;
189 private void report(GraphVertex metadataVertex) {
191 getReportWriter().report(metadataVertex.getMetadataProperties());
192 } catch (IOException e) {
193 ConsoleWriter.dataLine("\nFailed to created report file.");