2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 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.asdctool.impl.internal.tool;
22 import org.janusgraph.core.JanusGraphVertex;
23 import fj.data.Either;
24 import org.apache.tinkerpop.gremlin.structure.Direction;
25 import org.apache.tinkerpop.gremlin.structure.Edge;
26 import org.apache.tinkerpop.gremlin.structure.Vertex;
27 import org.openecomp.sdc.asdctool.utils.ConsoleWriter;
28 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
29 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
30 import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
31 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
32 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
33 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
34 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeTypeOperation;
35 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.TopologyTemplateOperation;
36 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaElementOperation;
37 import org.openecomp.sdc.common.log.wrappers.Logger;
38 import org.springframework.beans.factory.annotation.Autowired;
39 import org.springframework.stereotype.Component;
41 import java.io.IOException;
42 import java.util.Iterator;
44 import java.util.Scanner;
46 @Component("deleteComponentHandler")
47 public class DeleteComponentHandler extends CommonInternalTool{
49 private JanusGraphDao janusGraphDao;
51 private NodeTypeOperation nodeTypeOperation;
53 private TopologyTemplateOperation topologyTemplateOperation;
56 private static Logger log = Logger.getLogger(DeleteComponentHandler.class.getName());
59 public DeleteComponentHandler(){
62 public void deleteComponent(String id, Scanner scanner) {
63 JanusGraphOperationStatus status = JanusGraphOperationStatus.OK;
64 GraphVertex metadataVertex = janusGraphDao.getVertexById(id).either(l -> l, r -> null);
65 if (metadataVertex != null) {
66 status = handleComponent(scanner, metadataVertex);
68 ConsoleWriter.dataLine("No vertex for id", id);
70 if (status == JanusGraphOperationStatus.OK) {
71 janusGraphDao.commit();
73 janusGraphDao.rollback();
77 private JanusGraphOperationStatus handleComponent(Scanner scanner, GraphVertex metadataVertex) {
78 Map<GraphPropertyEnum, Object> metadataProperties = metadataVertex.getMetadataProperties();
79 JanusGraphOperationStatus status = JanusGraphOperationStatus.OK;
80 printComponentInfo(metadataProperties);
82 Iterator<Edge> edges = metadataVertex.getVertex().edges(Direction.OUT, EdgeLabelEnum.VERSION.name());
83 if (edges != null && edges.hasNext()) {
84 ConsoleWriter.dataLine("\ncomponent is not latest version and cannot be deleted");
86 ConsoleWriter.dataLine("\ncomponent is latest .");
87 if (isReferenceExist(metadataVertex)) {
88 ConsoleWriter.dataLine("\nExist reference on component ( istance, proxy or allotted). Component cannot be deleted");
90 ConsoleWriter.dataLine("\nNo references. Try to delete (yes/no)?");
91 String input = scanner.nextLine();
92 if (input.equalsIgnoreCase("yes")) {
93 status = handleComponent(metadataVertex);
100 private JanusGraphOperationStatus handleComponent(GraphVertex metadataVertex) {
101 ToscaElementOperation toscaElementOperation = getOperationByLabel(metadataVertex);
102 Iterator<Edge> edges = metadataVertex.getVertex().edges(Direction.IN, EdgeLabelEnum.VERSION.name());
103 if (edges != null && edges.hasNext()) {
104 JanusGraphOperationStatus status = updatePreviousVersion(metadataVertex, edges);
105 if ( status != JanusGraphOperationStatus.OK ){
109 toscaElementOperation.deleteToscaElement(metadataVertex)
112 ConsoleWriter.dataLine("\nDeleted");
113 report(metadataVertex);
114 return JanusGraphOperationStatus.OK;
118 ConsoleWriter.dataLine("\nFailed to delete. see log file");
121 return JanusGraphOperationStatus.OK;
124 private JanusGraphOperationStatus updatePreviousVersion(GraphVertex metadataVertex, Iterator<Edge> edges) {
125 Edge edge = edges.next();
126 JanusGraphVertex prevVersionVertex = (JanusGraphVertex) edge.outVertex();
127 // check if previous version is deleted
128 Boolean isDeleted = (Boolean) janusGraphDao.getProperty(prevVersionVertex, GraphPropertyEnum.IS_DELETED.getProperty());
129 if (isDeleted != null && isDeleted) {
130 ConsoleWriter.dataLine("\nPrevoius version is marked as deleted. Component cannot be deleted");
131 return JanusGraphOperationStatus.GENERAL_ERROR;
133 // update highest property for previous version
134 JanusGraphOperationStatus status = updateStateOfPreviuosVersion(prevVersionVertex);
135 if ( JanusGraphOperationStatus.OK != status ){
139 // connect to catalog or archive
140 return connectToCatalogAndArchive(metadataVertex, prevVersionVertex);
143 private JanusGraphOperationStatus updateStateOfPreviuosVersion(JanusGraphVertex prevVersionVertex) {
144 String prevId = (String) janusGraphDao.getProperty(prevVersionVertex, GraphPropertyEnum.UNIQUE_ID.getProperty());
145 Either<GraphVertex, JanusGraphOperationStatus> prevGraphVertex = janusGraphDao.getVertexById(prevId);
146 GraphVertex prevVertex = prevGraphVertex.left().value();
147 prevVertex.addMetadataProperty(GraphPropertyEnum.IS_HIGHEST_VERSION, true);
148 janusGraphDao.updateVertex(prevVertex);
150 Iterator<Edge> edgesIter = prevVersionVertex.edges(Direction.IN, EdgeLabelEnum.LAST_STATE.name());
151 if ( edgesIter.hasNext() ) {
152 Edge lastStateEdge = edgesIter.next();
153 Vertex lastModifier = lastStateEdge.outVertex();
154 JanusGraphOperationStatus
155 replaceRes = janusGraphDao
156 .replaceEdgeLabel(lastModifier, prevVersionVertex, lastStateEdge, EdgeLabelEnum.LAST_STATE, EdgeLabelEnum.STATE);
157 if (replaceRes != JanusGraphOperationStatus.OK) {
158 log.info("Failed to replace label from {} to {}. status = {}", EdgeLabelEnum.LAST_STATE, EdgeLabelEnum.STATE, replaceRes);
159 ConsoleWriter.dataLine("\nFailed to replace LAST_STATE edge . Failed to delete");
160 return JanusGraphOperationStatus.GENERAL_ERROR;
163 return JanusGraphOperationStatus.OK;
167 private JanusGraphOperationStatus connectToCatalogAndArchive(GraphVertex metadataVertex, JanusGraphVertex prevVersionVertex) {
169 JanusGraphOperationStatus
170 status = connectByLabel(metadataVertex, prevVersionVertex, EdgeLabelEnum.CATALOG_ELEMENT, VertexTypeEnum.CATALOG_ROOT);
171 if ( status == JanusGraphOperationStatus.OK ){
172 status = connectByLabel(metadataVertex, prevVersionVertex, EdgeLabelEnum.ARCHIVE_ELEMENT, VertexTypeEnum.ARCHIVE_ROOT);
177 private JanusGraphOperationStatus connectByLabel(GraphVertex metadataVertex, JanusGraphVertex prevVersionVertex, EdgeLabelEnum edgeLabel, VertexTypeEnum vertexlabel) {
178 Iterator<Edge> edgesToCatalog = metadataVertex.getVertex().edges(Direction.IN, edgeLabel.name());
179 if ( edgesToCatalog != null && edgesToCatalog.hasNext() ){
180 //exist edge move to prev version
181 Either<GraphVertex, JanusGraphOperationStatus> catalog = janusGraphDao.getVertexByLabel(vertexlabel);
182 if (catalog.isRight()) {
183 log.debug("Failed to fetch {} vertex, error {}", vertexlabel, catalog.right().value());
184 return catalog.right().value();
186 GraphVertex catalogV = catalog.left().value();
187 Edge edge = edgesToCatalog.next();
188 return janusGraphDao.createEdge(catalogV.getVertex(), prevVersionVertex, edgeLabel, edge );
190 return JanusGraphOperationStatus.OK;
193 private boolean isReferenceExist(GraphVertex metadataVertex) {
194 return existEdgeByLabel(metadataVertex, EdgeLabelEnum.INSTANCE_OF) || existEdgeByLabel(metadataVertex, EdgeLabelEnum.PROXY_OF) || existEdgeByLabel(metadataVertex, EdgeLabelEnum.ALLOTTED_OF);
197 private boolean existEdgeByLabel(GraphVertex metadataVertex, EdgeLabelEnum label) {
198 Iterator<Edge> edges = metadataVertex.getVertex().edges(Direction.IN, label.name());
199 return (edges != null && edges.hasNext());
202 private ToscaElementOperation getOperationByLabel(GraphVertex metadataVertex) {
203 VertexTypeEnum label = metadataVertex.getLabel();
204 if (label == VertexTypeEnum.NODE_TYPE) {
205 return nodeTypeOperation;
207 return topologyTemplateOperation;
211 private void report(GraphVertex metadataVertex) {
213 getReportWriter().report(metadataVertex.getMetadataProperties());
214 } catch (IOException e) {
215 ConsoleWriter.dataLine("\nFailed to created report file.");