3 * Copyright (c) 2018 AT&T Intellectual Property.
7 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
15 * http://www.apache.org/licenses/LICENSE-2.0
19 * Unless required by applicable law or agreed to in writing, software
21 * distributed under the License is distributed on an "AS IS" BASIS,
23 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
25 * See the License for the specific language governing permissions and
27 * limitations under the License.
30 package org.openecomp.sdc.asdctool.impl.internal.tool;
32 import org.janusgraph.core.JanusGraphVertex;
33 import fj.data.Either;
34 import org.apache.tinkerpop.gremlin.structure.Direction;
35 import org.apache.tinkerpop.gremlin.structure.Edge;
36 import org.apache.tinkerpop.gremlin.structure.Vertex;
37 import org.openecomp.sdc.asdctool.utils.ConsoleWriter;
38 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
39 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
40 import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
41 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
42 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
43 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
44 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeTypeOperation;
45 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.TopologyTemplateOperation;
46 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaElementOperation;
47 import org.openecomp.sdc.common.log.wrappers.Logger;
48 import org.springframework.beans.factory.annotation.Autowired;
49 import org.springframework.stereotype.Component;
51 import java.io.IOException;
52 import java.util.Iterator;
54 import java.util.Scanner;
56 @Component("deleteComponentHandler")
57 public class DeleteComponentHandler extends CommonInternalTool{
59 private JanusGraphDao janusGraphDao;
61 private NodeTypeOperation nodeTypeOperation;
63 private TopologyTemplateOperation topologyTemplateOperation;
66 private static Logger log = Logger.getLogger(DeleteComponentHandler.class.getName());
69 public DeleteComponentHandler(){
72 public void deleteComponent(String id, Scanner scanner) {
73 JanusGraphOperationStatus status = JanusGraphOperationStatus.OK;
74 GraphVertex metadataVertex = janusGraphDao.getVertexById(id).either(l -> l, r -> null);
75 if (metadataVertex != null) {
76 status = handleComponent(scanner, metadataVertex);
78 ConsoleWriter.dataLine("No vertex for id", id);
80 if (status == JanusGraphOperationStatus.OK) {
81 janusGraphDao.commit();
83 janusGraphDao.rollback();
87 private JanusGraphOperationStatus handleComponent(Scanner scanner, GraphVertex metadataVertex) {
88 Map<GraphPropertyEnum, Object> metadataProperties = metadataVertex.getMetadataProperties();
89 JanusGraphOperationStatus status = JanusGraphOperationStatus.OK;
90 printComponentInfo(metadataProperties);
92 Iterator<Edge> edges = metadataVertex.getVertex().edges(Direction.OUT, EdgeLabelEnum.VERSION.name());
93 if (edges != null && edges.hasNext()) {
94 ConsoleWriter.dataLine("\ncomponent is not latest version and cannot be deleted");
96 ConsoleWriter.dataLine("\ncomponent is latest .");
97 if (isReferenceExist(metadataVertex)) {
98 ConsoleWriter.dataLine("\nExist reference on component ( istance, proxy or allotted). Component cannot be deleted");
100 ConsoleWriter.dataLine("\nNo references. Try to delete (yes/no)?");
101 String input = scanner.nextLine();
102 if (input.equalsIgnoreCase("yes")) {
103 status = handleComponent(metadataVertex);
110 private JanusGraphOperationStatus handleComponent(GraphVertex metadataVertex) {
111 ToscaElementOperation toscaElementOperation = getOperationByLabel(metadataVertex);
112 Iterator<Edge> edges = metadataVertex.getVertex().edges(Direction.IN, EdgeLabelEnum.VERSION.name());
113 if (edges != null && edges.hasNext()) {
114 JanusGraphOperationStatus status = updatePreviousVersion(metadataVertex, edges);
115 if ( status != JanusGraphOperationStatus.OK ){
119 toscaElementOperation.deleteToscaElement(metadataVertex)
122 ConsoleWriter.dataLine("\nDeleted");
123 report(metadataVertex);
124 return JanusGraphOperationStatus.OK;
128 ConsoleWriter.dataLine("\nFailed to delete. see log file");
131 return JanusGraphOperationStatus.OK;
134 private JanusGraphOperationStatus updatePreviousVersion(GraphVertex metadataVertex, Iterator<Edge> edges) {
135 Edge edge = edges.next();
136 JanusGraphVertex prevVersionVertex = (JanusGraphVertex) edge.outVertex();
137 // check if previous version is deleted
138 Boolean isDeleted = (Boolean) janusGraphDao.getProperty(prevVersionVertex, GraphPropertyEnum.IS_DELETED.getProperty());
139 if (isDeleted != null && isDeleted) {
140 ConsoleWriter.dataLine("\nPrevoius version is marked as deleted. Component cannot be deleted");
141 return JanusGraphOperationStatus.GENERAL_ERROR;
143 // update highest property for previous version
144 JanusGraphOperationStatus status = updateStateOfPreviuosVersion(prevVersionVertex);
145 if ( JanusGraphOperationStatus.OK != status ){
149 // connect to catalog or archive
150 return connectToCatalogAndArchive(metadataVertex, prevVersionVertex);
153 private JanusGraphOperationStatus updateStateOfPreviuosVersion(JanusGraphVertex prevVersionVertex) {
154 String prevId = (String) janusGraphDao.getProperty(prevVersionVertex, GraphPropertyEnum.UNIQUE_ID.getProperty());
155 Either<GraphVertex, JanusGraphOperationStatus> prevGraphVertex = janusGraphDao.getVertexById(prevId);
156 GraphVertex prevVertex = prevGraphVertex.left().value();
157 prevVertex.addMetadataProperty(GraphPropertyEnum.IS_HIGHEST_VERSION, true);
158 janusGraphDao.updateVertex(prevVertex);
160 Iterator<Edge> edgesIter = prevVersionVertex.edges(Direction.IN, EdgeLabelEnum.LAST_STATE.name());
161 if ( edgesIter.hasNext() ) {
162 Edge lastStateEdge = edgesIter.next();
163 Vertex lastModifier = lastStateEdge.outVertex();
164 JanusGraphOperationStatus
165 replaceRes = janusGraphDao
166 .replaceEdgeLabel(lastModifier, prevVersionVertex, lastStateEdge, EdgeLabelEnum.LAST_STATE, EdgeLabelEnum.STATE);
167 if (replaceRes != JanusGraphOperationStatus.OK) {
168 log.info("Failed to replace label from {} to {}. status = {}", EdgeLabelEnum.LAST_STATE, EdgeLabelEnum.STATE, replaceRes);
169 ConsoleWriter.dataLine("\nFailed to replace LAST_STATE edge . Failed to delete");
170 return JanusGraphOperationStatus.GENERAL_ERROR;
173 return JanusGraphOperationStatus.OK;
177 private JanusGraphOperationStatus connectToCatalogAndArchive(GraphVertex metadataVertex, JanusGraphVertex prevVersionVertex) {
179 JanusGraphOperationStatus
180 status = connectByLabel(metadataVertex, prevVersionVertex, EdgeLabelEnum.CATALOG_ELEMENT, VertexTypeEnum.CATALOG_ROOT);
181 if ( status == JanusGraphOperationStatus.OK ){
182 status = connectByLabel(metadataVertex, prevVersionVertex, EdgeLabelEnum.ARCHIVE_ELEMENT, VertexTypeEnum.ARCHIVE_ROOT);
187 private JanusGraphOperationStatus connectByLabel(GraphVertex metadataVertex, JanusGraphVertex prevVersionVertex, EdgeLabelEnum edgeLabel, VertexTypeEnum vertexlabel) {
188 Iterator<Edge> edgesToCatalog = metadataVertex.getVertex().edges(Direction.IN, edgeLabel.name());
189 if ( edgesToCatalog != null && edgesToCatalog.hasNext() ){
190 //exist edge move to prev version
191 Either<GraphVertex, JanusGraphOperationStatus> catalog = janusGraphDao.getVertexByLabel(vertexlabel);
192 if (catalog.isRight()) {
193 log.debug("Failed to fetch {} vertex, error {}", vertexlabel, catalog.right().value());
194 return catalog.right().value();
196 GraphVertex catalogV = catalog.left().value();
197 Edge edge = edgesToCatalog.next();
198 return janusGraphDao.createEdge(catalogV.getVertex(), prevVersionVertex, edgeLabel, edge );
200 return JanusGraphOperationStatus.OK;
203 private boolean isReferenceExist(GraphVertex metadataVertex) {
204 return existEdgeByLabel(metadataVertex, EdgeLabelEnum.INSTANCE_OF) || existEdgeByLabel(metadataVertex, EdgeLabelEnum.PROXY_OF) || existEdgeByLabel(metadataVertex, EdgeLabelEnum.ALLOTTED_OF);
207 private boolean existEdgeByLabel(GraphVertex metadataVertex, EdgeLabelEnum label) {
208 Iterator<Edge> edges = metadataVertex.getVertex().edges(Direction.IN, label.name());
209 return (edges != null && edges.hasNext());
212 private ToscaElementOperation getOperationByLabel(GraphVertex metadataVertex) {
213 VertexTypeEnum label = metadataVertex.getLabel();
214 if (label == VertexTypeEnum.NODE_TYPE) {
215 return nodeTypeOperation;
217 return topologyTemplateOperation;
221 private void report(GraphVertex metadataVertex) {
223 getReportWriter().report(metadataVertex.getMetadataProperties());
224 } catch (IOException e) {
225 ConsoleWriter.dataLine("\nFailed to created report file.");