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=========================================================
21 package org.openecomp.sdc.be.model.jsonjanusgraph.operations;
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNotNull;
26 import static org.junit.Assert.assertTrue;
28 import org.janusgraph.core.JanusGraph;
29 import org.janusgraph.core.JanusGraphVertex;
30 import fj.data.Either;
31 import java.io.BufferedOutputStream;
33 import java.io.FileOutputStream;
34 import java.io.OutputStream;
35 import java.util.ArrayList;
36 import java.util.HashMap;
37 import java.util.Iterator;
38 import java.util.List;
40 import javax.annotation.Resource;
41 import org.apache.tinkerpop.gremlin.structure.Direction;
42 import org.apache.tinkerpop.gremlin.structure.Edge;
43 import org.apache.tinkerpop.gremlin.structure.Vertex;
44 import org.apache.tinkerpop.gremlin.structure.io.IoCore;
45 import org.junit.After;
46 import org.junit.Before;
47 import org.junit.BeforeClass;
48 import org.junit.Test;
49 import org.junit.runner.RunWith;
50 import org.openecomp.sdc.be.dao.config.JanusGraphSpringConfig;
51 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
52 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
53 import org.openecomp.sdc.be.dao.janusgraph.HealingJanusGraphDao;
54 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
55 import org.openecomp.sdc.be.dao.jsongraph.types.EdgePropertyEnum;
56 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
57 import org.openecomp.sdc.be.datatypes.elements.ComponentInstanceDataDefinition;
58 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
59 import org.openecomp.sdc.be.model.ModelTestBase;
60 import org.openecomp.sdc.be.model.config.ModelOperationsSpringConfig;
61 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
62 import org.springframework.test.context.ContextConfiguration;
63 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
65 @RunWith(SpringJUnit4ClassRunner.class)
66 @ContextConfiguration(classes = {JanusGraphSpringConfig.class, ModelOperationsSpringConfig.class})
67 public class NodeTemplateOperationGraphTest extends ModelTestBase{
69 private HealingJanusGraphDao janusGraphDao;
71 private NodeTemplateOperation nodeTemplateOperation;
73 private JanusGraph graphT;
74 private GraphVertex containerVertex;
75 private String containeId;
78 public static void setupBeforeClass() {
85 Either<JanusGraph, JanusGraphOperationStatus> graph = janusGraphDao.getGraph();
86 graphT = graph.left().value();
88 containerVertex = new GraphVertex(VertexTypeEnum.TOPOLOGY_TEMPLATE);
89 containeId = "containerId";
90 containerVertex.setUniqueId(containeId);
91 Either<GraphVertex, JanusGraphOperationStatus> createVertex = janusGraphDao.createVertex(containerVertex);
92 assertTrue(createVertex.isLeft());
97 janusGraphDao.rollback();
102 String outputDirectory = "C:\\Output";
105 public void testCreateInstanceEdge(){
107 Map<String, List<String>> mapOriginToInstId = new HashMap<>();
108 createIntancesFromSameResource(mapOriginToInstId, 1, 3);
109 createIntancesFromSameResource(mapOriginToInstId, 2, 4);
110 createIntancesFromSameResource(mapOriginToInstId, 3, 1);
112 // exportGraphMl(graphT);
114 validateOnGraph(mapOriginToInstId, 3);
118 public void testRemoveInstanceEdge(){
119 //create 3 instances from same resource orig1
120 Map<String, List<String>> mapOriginToInstId = new HashMap<>();
121 String originId = createIntancesFromSameResource(mapOriginToInstId, 1, 3);
122 validateOnGraph(mapOriginToInstId, 1);
125 String instanceId = removeInstanceEdge(containerVertex, originId, 1, 1);
126 mapOriginToInstId.get(originId).remove(instanceId);
127 validateOnGraph(mapOriginToInstId, 1);
129 //create new instance from orig1
130 instanceId = createInstanceEdge(containerVertex, originId, 1, 4, false, null);
131 mapOriginToInstId.get(originId).add(instanceId);
132 validateOnGraph(mapOriginToInstId, 1);
134 //create 1 instance from same resource orig2
135 originId = createIntancesFromSameResource(mapOriginToInstId, 2, 1);
136 validateOnGraph(mapOriginToInstId, 2);
138 //remove instance of orig 2
139 instanceId = removeInstanceEdge(containerVertex, originId, 2, 1);
140 mapOriginToInstId.get(originId).remove(instanceId);
141 validateOnGraph(mapOriginToInstId, 1);
146 public void testProxyInstanceEdge(){
147 Map<String, List<String>> mapOriginToInstId = new HashMap<>();
148 String proxyId = createOrigin(2);
149 createIntancesFromSameResource(mapOriginToInstId, 1, 1, true, proxyId);
151 validateOnGraph(mapOriginToInstId, 1);
153 private void validateOnGraph(Map<String, List<String>> mapOriginToInstId, int expectedEdgeCount) {
154 validateOnGraph(mapOriginToInstId, expectedEdgeCount, false);
156 private void validateOnGraph(Map<String, List<String>> mapOriginToInstId, int expectedEdgeCount, boolean validateProxy) {
157 Iterable vertices = graphT.query().has(GraphPropertyEnum.UNIQUE_ID.getProperty(), containeId).vertices();
158 assertNotNull(vertices);
159 Iterator<JanusGraphVertex> iterator = vertices.iterator();
160 assertTrue(iterator.hasNext());
161 Vertex containerV = iterator.next();
162 validatePerEdgeType(mapOriginToInstId, expectedEdgeCount, containerV, EdgeLabelEnum.INSTANCE_OF);
163 if ( validateProxy ){
164 validatePerEdgeType(mapOriginToInstId, expectedEdgeCount, containerV, EdgeLabelEnum.PROXY_OF);
167 private void validatePerEdgeType(Map<String, List<String>> mapOriginToInstId, int expectedEdgeCount, Vertex containerV, EdgeLabelEnum edgeLabel) {
168 Iterator<Edge> edges = containerV.edges(Direction.OUT, edgeLabel.name());
169 assertNotNull(edges);
172 while (edges.hasNext()){
173 Edge edge = edges.next();
175 validateEdge(edge, mapOriginToInstId);
177 assertEquals("check edge size", expectedEdgeCount, counter);
181 private String createIntancesFromSameResource(Map<String, List<String>> mapOriginToInstId, int originIndex, int countInstances) {
182 return createIntancesFromSameResource(mapOriginToInstId, originIndex, countInstances, false, null);
185 private String createIntancesFromSameResource(Map<String, List<String>> mapOriginToInstId, int originIndex, int countInstances, boolean isProxy, String proxyId) {
187 List<String> exp = new ArrayList();
188 String originId = createOrigin(originIndex);
190 for ( int i = 0; i < countInstances; i++){
191 String instanceId = createInstanceEdge(containerVertex, originId, originIndex, i+1, isProxy, proxyId);
194 mapOriginToInstId.put(originId, exp);
196 mapOriginToInstId.put(proxyId, exp);
201 private String createInstanceEdge(GraphVertex containerVertex, String originId, int originIndex, int insIndex, boolean isProxy, String proxyId) {
202 ComponentInstanceDataDefinition componentInstance = new ComponentInstanceDataDefinition();
203 componentInstance.setComponentUid(originId);
204 String instanceId = buildInstanceId(originIndex, insIndex);
205 componentInstance.setUniqueId(instanceId);
206 componentInstance.setIsProxy(isProxy);
207 componentInstance.setSourceModelUid(proxyId);
208 StorageOperationStatus edgeStatus = nodeTemplateOperation.createInstanceEdge(containerVertex, componentInstance);
209 assertEquals("assertion createInstanceEdge", StorageOperationStatus.OK, edgeStatus);
213 private String buildInstanceId(int originIndex, int insIndex) {
214 StringBuilder sb = new StringBuilder("instanceId_");
215 sb.append(originIndex).append("-").append(insIndex);
216 return sb.toString();
218 private String removeInstanceEdge(GraphVertex containerVertex, String originId, int originIndex, int insIndex) {
219 ComponentInstanceDataDefinition componentInstance = new ComponentInstanceDataDefinition();
220 componentInstance.setComponentUid(originId);
221 String instanceId = buildInstanceId(originIndex, insIndex);
222 componentInstance.setUniqueId(instanceId);
223 StorageOperationStatus edgeStatus = nodeTemplateOperation.removeInstanceEdge(containerVertex, componentInstance);
224 assertEquals("assertion removeInstanceEdge", StorageOperationStatus.OK, edgeStatus);
229 private String createOrigin(int index) {
230 Either<GraphVertex, JanusGraphOperationStatus> createVertex;
231 GraphVertex originVertex = new GraphVertex(VertexTypeEnum.NODE_TYPE);
232 String originId = "originId_" + index;
233 originVertex.setUniqueId(originId);
234 createVertex = janusGraphDao.createVertex(originVertex);
235 assertTrue(createVertex.isLeft());
238 private void validateEdge(Edge edge, Map<String, List<String>> mapOriginToInstId) {
239 List<String> expextedInList;
241 Vertex originV = edge.inVertex();
242 String id = (String) janusGraphDao.getProperty((JanusGraphVertex)originV, GraphPropertyEnum.UNIQUE_ID.getProperty());
243 expextedInList = mapOriginToInstId.get(id);
245 List<String> list = (List<String>) janusGraphDao.getProperty(edge, EdgePropertyEnum.INSTANCES);
246 assertThat(list).hasSameSizeAs(expextedInList);
247 assertThat(list).containsOnlyElementsOf(expextedInList);
250 private String exportGraphMl(JanusGraph graph) {
251 String result = null;
252 String outputFile = outputDirectory + File.separator + "exportGraph." + System.currentTimeMillis() + ".graphml";
254 try (final OutputStream os = new BufferedOutputStream(new FileOutputStream(outputFile))) {
255 graph.io(IoCore.graphml()).writer().normalize(true).create().writeGraph(os, graph);
258 } catch (Exception e) {