2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright © 2017-2018 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.onap.aai.introspection.sideeffect;
23 import static org.hamcrest.MatcherAssert.assertThat;
24 import static org.hamcrest.Matchers.*;
25 import static org.junit.Assert.*;
26 import static org.mockito.Mockito.spy;
27 import static org.mockito.Mockito.when;
29 import java.io.UnsupportedEncodingException;
30 import java.lang.reflect.InvocationTargetException;
31 import java.net.MalformedURLException;
32 import java.net.URISyntaxException;
33 import java.util.Arrays;
34 import java.util.Collection;
35 import java.util.Iterator;
36 import java.util.List;
38 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
39 import org.apache.tinkerpop.gremlin.structure.Direction;
40 import org.apache.tinkerpop.gremlin.structure.Edge;
41 import org.apache.tinkerpop.gremlin.structure.Graph;
42 import org.apache.tinkerpop.gremlin.structure.Vertex;
43 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
44 import org.janusgraph.core.JanusGraph;
45 import org.janusgraph.core.JanusGraphFactory;
47 import org.junit.rules.ExpectedException;
48 import org.junit.runner.RunWith;
49 import org.junit.runners.Parameterized;
50 import org.mockito.Mock;
51 import org.mockito.MockitoAnnotations;
52 import org.onap.aai.AAISetup;
53 import org.onap.aai.DataLinkSetup;
54 import org.onap.aai.db.props.AAIProperties;
55 import org.onap.aai.dbmap.DBConnectionType;
56 import org.onap.aai.edges.enums.EdgeProperty;
57 import org.onap.aai.exceptions.AAIException;
58 import org.onap.aai.introspection.*;
59 import org.onap.aai.parsers.query.QueryParser;
60 import org.onap.aai.serialization.db.DBSerializer;
61 import org.onap.aai.serialization.engines.JanusGraphDBEngine;
62 import org.onap.aai.serialization.engines.QueryStyle;
63 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
65 @RunWith(value = Parameterized.class)
66 public class DataLinkTest extends DataLinkSetup {
68 private static JanusGraph graph;
69 private final static ModelType introspectorFactoryType = ModelType.MOXY;
70 private final static DBConnectionType type = DBConnectionType.REALTIME;
71 private static Loader loader;
72 private static TransactionalGraphEngine dbEngine;
74 private QueryParser parser;
78 private VertexProperty<String> prop;
80 public ExpectedException thrown = ExpectedException.none();
82 @Parameterized.Parameter(value = 0)
83 public QueryStyle queryStyle;
85 @Parameterized.Parameters(name = "QueryStyle.{0}")
86 public static Collection<Object[]> data() {
87 return Arrays.asList(new Object[][] {{QueryStyle.TRAVERSAL}, {QueryStyle.TRAVERSAL_URI}});
91 public static void setup() throws NoSuchFieldException, SecurityException, Exception {
92 graph = JanusGraphFactory.build().set("storage.backend", "inmemory").open();
95 .addV("aai-node-type", "vpn-binding", "vpn-id", "addKey", AAIProperties.AAI_URI,
96 "/network/vpn-bindings/vpn-binding/addKey")
98 .addV("aai-node-type", "vpn-binding", "vpn-id", "modifyKey", AAIProperties.AAI_URI,
99 "/network/vpn-bindings/vpn-binding/modifyKey")
101 .addV("aai-node-type", "route-target", "global-route-target", "modifyTargetKey", "route-target-role",
102 "modifyRoleKey", "linked", true, AAIProperties.AAI_URI,
103 "/network/vpn-bindings/vpn-binding/modifyKey/route-targets/route-target/modifyTargetKey/modifyRoleKey")
104 .addOutE("org.onap.relationships.inventory.BelongsTo", "v2", EdgeProperty.CONTAINS.toString(), true)
105 .addV("aai-node-type", "vpn-binding", "vpn-id", "deleteKey", AAIProperties.AAI_URI,
106 "/network/vpn-bindings/vpn-binding/deleteKey")
108 .addV("aai-node-type", "route-target", "global-route-target", "deleteTargetKey", "route-target-role",
109 "deleteRoleKey", "linked", true, AAIProperties.AAI_URI,
110 "/network/vpn-bindings/vpn-binding/deleteKey/route-targets/route-target/deleteTargetKey/deleteRoleKey")
111 .addOutE("org.onap.relationships.inventory.BelongsTo", "v3", EdgeProperty.CONTAINS.toString(), true)
112 .addV("aai-node-type", "vpn-binding", "vpn-id", "getKey", AAIProperties.AAI_URI,
113 "/network/vpn-bindings/vpn-binding/getKey")
115 .addV("aai-node-type", "route-target", "global-route-target", "getTargetKey", "route-target-role",
116 "getRoleKey", "linked", true, AAIProperties.AAI_URI,
117 "/network/vpn-bindings/vpn-binding/getKey/route-targets/route-target/getTargetKeyNoLink/getRoleKeyNoLink")
118 .addOutE("org.onap.relationships.inventory.BelongsTo", "v4", EdgeProperty.CONTAINS.toString(), true)
119 .addV("aai-node-type", "vpn-binding", "vpn-id", "getKeyNoLink", AAIProperties.AAI_URI,
120 "/network/vpn-bindings/vpn-binding/getKeyNoLink")
122 .addV("aai-node-type", "route-target", "global-route-target", "getTargetKeyNoLink", "route-target-role",
123 "getRoleKeyNoLink", AAIProperties.AAI_URI,
124 "/network/vpn-bindings/vpn-binding/getKeyNoLink/route-targets/route-target/getTargetKeyNoLink/getRoleKeyNoLink")
125 .addOutE("org.onap.relationships.inventory.BelongsTo", "v5", EdgeProperty.CONTAINS.toString(), true)
130 * Commented for SysOut issues
132 // graph.traversal().V().has("aai-uri","/network/vpn-bindings/vpn-binding/deleteKey").properties().forEachRemaining(p->System.out.println(p.key()
133 // +" : " + p.value()));
138 public static void tearDown() {
139 graph.tx().rollback();
144 public void initMock() {
145 loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
146 MockitoAnnotations.initMocks(this);
147 dbEngine = new JanusGraphDBEngine(queryStyle, type, loader);
151 public void verifyCreationOfVertex() throws URISyntaxException, AAIException, UnsupportedEncodingException,
152 IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException,
153 InstantiationException, NoSuchMethodException, MalformedURLException {
155 final Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getDepthVersion());
156 final Introspector obj = loader.introspectorFromName("vpn-binding");
157 obj.setValue("vpn-id", "addKey");
158 obj.setValue("global-route-target", "key1");
159 obj.setValue("route-target-role", "key2");
160 TransactionalGraphEngine spy = spy(dbEngine);
161 TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
162 Graph g = graph.newTransaction();
163 GraphTraversalSource traversal = g.traversal();
164 // Graph g = graph.newTransaction();
165 // GraphTraversalSource traversal = g;
166 // System.out.println("Begin method inventory:");
167 Iterator<Vertex> vertexItr = traversal.V();
168 while (vertexItr != null && vertexItr.hasNext()) {
169 Vertex v = vertexItr.next();
170 // System.out.println("\nnodeType="+v.<String>property("aai-node-type"));
171 for (String key : v.keys()) {
172 // System.out.println("label="+v.label()+";key= "+key+";value= "+v.value(key)+";id= "+v.id());
175 Iterator<Edge> edgeItr = v.edges(Direction.BOTH);
176 while (edgeItr != null && edgeItr.hasNext()) {
177 Edge e = edgeItr.next();
178 // System.out.println("outV="+e.outVertex().property(AAIProperties.NODE_TYPE)+"/"+e.outVertex().id()+";inV=
179 // "+e.inVertex().property(AAIProperties.NODE_TYPE)+"/"+e.inVertex().id());
182 // System.out.println("End method inventory:");
183 when(spy.asAdmin()).thenReturn(adminSpy);
184 when(adminSpy.getTraversalSource()).thenReturn(traversal);
185 when(spy.tx()).thenReturn(g);
186 when(self.<String>property(AAIProperties.AAI_URI)).thenReturn(prop);
187 when(prop.orElse(null)).thenReturn(obj.getURI());
188 DBSerializer serializer =
189 new DBSerializer(schemaVersions.getDefaultVersion(), spy, introspectorFactoryType, "AAI_TEST");
190 SideEffectRunner runner =
191 new SideEffectRunner.Builder(spy, serializer).addSideEffect(DataLinkWriter.class).build();
193 runner.execute(obj, self);
195 assertEquals("route-target vertex found", true, traversal.V().has(AAIProperties.NODE_TYPE, "route-target")
196 .has("global-route-target", "key1").has("route-target-role", "key2").has("linked", true).hasNext());
202 public void verifyModificationOfVertex() throws URISyntaxException, AAIException, UnsupportedEncodingException,
203 IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException,
204 InstantiationException, NoSuchMethodException, MalformedURLException {
206 final Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getDepthVersion());
207 final Introspector obj = loader.introspectorFromName("vpn-binding");
208 obj.setValue("vpn-id", "modifyKey");
209 obj.setValue("global-route-target", "modifyTargetKey2");
210 obj.setValue("route-target-role", "modifyRoleKey2");
211 TransactionalGraphEngine spy = spy(dbEngine);
212 TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
213 // Graph g = graph.newTransaction();
214 // GraphTraversalSource traversal = g;
215 Graph g = graph.newTransaction();
216 GraphTraversalSource traversal = g.traversal();
217 Iterator<Vertex> vertexItr = traversal.V();
218 while (vertexItr != null && vertexItr.hasNext()) {
219 Vertex v = vertexItr.next();
220 // System.out.println("\nnodeType="+v.<String>property("aai-node-type"));
221 for (String key : v.keys()) {
222 // System.out.println("label="+v.label()+";key= "+key+";value= "+v.value(key)+"/"+v.id());
225 Iterator<Edge> edgeItr = v.edges(Direction.BOTH);
226 while (edgeItr != null && edgeItr.hasNext()) {
227 Edge e = edgeItr.next();
228 // System.out.println("outV="+e.outVertex().property(AAIProperties.NODE_TYPE)+"/"+e.outVertex().id()+";inV=
229 // "+e.inVertex().property(AAIProperties.NODE_TYPE)+"/"+e.inVertex().id());
232 // System.out.println("End method inventory:");
234 when(spy.asAdmin()).thenReturn(adminSpy);
235 when(adminSpy.getTraversalSource()).thenReturn(traversal);
236 // when(spy.tx()).thenReturn(graph);
237 when(spy.tx()).thenReturn(g);
238 when(self.<String>property(AAIProperties.AAI_URI)).thenReturn(prop);
239 when(prop.orElse(null)).thenReturn(obj.getURI());
240 DBSerializer serializer =
241 new DBSerializer(schemaVersions.getDefaultVersion(), spy, introspectorFactoryType, "AAI_TEST");
242 SideEffectRunner runner =
243 new SideEffectRunner.Builder(spy, serializer).addSideEffect(DataLinkWriter.class).build();
244 // System.out.println("Traversal Source: "+traversal.toString());
245 vertexItr = traversal.V();
246 // System.out.println("Begin method inventory:");
247 while (vertexItr != null && vertexItr.hasNext()) {
248 Vertex v = vertexItr.next();
249 // System.out.println("\nnodeType="+v.<String>property("aai-node-type"));
250 for (String key : v.keys()) {
251 // System.out.println("label="+v.label()+";key= "+key+";value= "+v.value(key)+"/"+v.id());
253 Iterator<Edge> edgeItr = v.edges(Direction.BOTH);
254 while (edgeItr != null && edgeItr.hasNext()) {
255 Edge e = edgeItr.next();
256 // System.out.println("outV="+e.outVertex().property(AAIProperties.NODE_TYPE)+"/"+e.outVertex().id()+";inV=
257 // "+e.inVertex().property(AAIProperties.NODE_TYPE)+"/"+e.inVertex().id());
260 // System.out.println("End method inventory:");
262 runner.execute(obj, self);
263 } catch (Exception e) {
266 // runner.execute(obj, self);
267 // System.out.println("=================\n");
268 vertexItr = traversal.V();
269 while (vertexItr != null && vertexItr.hasNext()) {
270 Vertex v = vertexItr.next();
271 // System.out.println("\nnodeType="+v.<String>property("aai-node-type"));
272 for (String key : v.keys()) {
273 // System.out.println("label="+v.label()+";key= "+key+";value= "+v.value(key)+"/"+v.id());
275 Iterator<Edge> edgeItr = v.edges(Direction.BOTH);
276 while (edgeItr != null && edgeItr.hasNext()) {
277 Edge e = edgeItr.next();
278 // System.out.println("outV="+e.outVertex().property(AAIProperties.NODE_TYPE)+"/"+e.outVertex().id()+";inV=
279 // "+e.inVertex().property(AAIProperties.NODE_TYPE)+"/"+e.inVertex().id());
282 assertThat("new route-target vertex found with/or without link",
283 traversal.V().has(AAIProperties.NODE_TYPE, "route-target")
284 .has("global-route-target", "modifyTargetKey2").has("route-target-role", "modifyRoleKey2")
287 assertThat("new route-target vertex found",
288 traversal.V().has(AAIProperties.NODE_TYPE, "route-target")
289 .has("global-route-target", "modifyTargetKey2").has("route-target-role", "modifyRoleKey2")
290 .has("linked", true).hasNext(),
292 assertThat("previous link removed",
293 traversal.V().has(AAIProperties.NODE_TYPE, "route-target").has("global-route-target", "modifyTargetKey")
294 .has("route-target-role", "modifyRoleKey").has("linked").hasNext(),
296 assertThat("previous vertex still exists", traversal.V().has(AAIProperties.NODE_TYPE, "route-target")
297 .has("global-route-target", "modifyTargetKey").has("route-target-role", "modifyRoleKey").hasNext(),
304 public void verifyDeleteOfVertex() throws URISyntaxException, AAIException, UnsupportedEncodingException,
305 IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException,
306 InstantiationException, NoSuchMethodException, MalformedURLException {
308 final Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getDepthVersion());
309 final Introspector obj = loader.introspectorFromName("vpn-binding");
310 obj.setValue("vpn-id", "deleteKey");
311 TransactionalGraphEngine spy = spy(dbEngine);
312 TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
313 Graph g = graph.newTransaction();
314 GraphTraversalSource traversal = g.traversal();
315 when(spy.asAdmin()).thenReturn(adminSpy);
316 when(adminSpy.getTraversalSource()).thenReturn(traversal);
317 when(adminSpy.getReadOnlyTraversalSource()).thenReturn(traversal);
318 when(spy.tx()).thenReturn(g);
319 when(self.<String>property(AAIProperties.AAI_URI)).thenReturn(prop);
320 when(prop.orElse(null)).thenReturn(obj.getURI());
321 DBSerializer serializer =
322 new DBSerializer(schemaVersions.getDefaultVersion(), spy, introspectorFactoryType, "AAI_TEST");
323 SideEffectRunner runner =
324 new SideEffectRunner.Builder(spy, serializer).addSideEffect(DataLinkWriter.class).build();
326 runner.execute(obj, self);
328 assertEquals("route-target vertex not found", false,
329 traversal.V().has(AAIProperties.NODE_TYPE, "route-target").has("global-route-target", "deleteTargetKey")
330 .has("route-target-role", "deleteRoleKey").has("linked", true).hasNext());
337 public void verifyPropertyPopulation() throws URISyntaxException, AAIException, UnsupportedEncodingException,
338 IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException,
339 InstantiationException, NoSuchMethodException, MalformedURLException {
341 final Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getDepthVersion());
342 final Introspector obj = loader.introspectorFromName("vpn-binding");
343 obj.setValue("vpn-id", "getKey");
344 TransactionalGraphEngine spy = spy(dbEngine);
345 TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
346 Graph g = graph.newTransaction();
347 GraphTraversalSource traversal = g.traversal();
348 when(spy.asAdmin()).thenReturn(adminSpy);
349 when(adminSpy.getTraversalSource()).thenReturn(traversal);
350 when(spy.tx()).thenReturn(g);
351 when(self.<String>property(AAIProperties.AAI_URI)).thenReturn(prop);
352 when(prop.orElse(null)).thenReturn(obj.getURI());
353 DBSerializer serializer =
354 new DBSerializer(schemaVersions.getDefaultVersion(), spy, introspectorFactoryType, "AAI_TEST");
355 SideEffectRunner runner =
356 new SideEffectRunner.Builder(spy, serializer).addSideEffect(DataLinkReader.class).build();
358 runner.execute(obj, self);
360 assertEquals("both properties have been populated in target object", true,
361 obj.getValue("global-route-target").equals("getTargetKey")
362 && obj.getValue("route-target-role").equals("getRoleKey"));
368 public void verifyPropertyPopulationWithV10OnlyPut() throws URISyntaxException, AAIException,
369 UnsupportedEncodingException, IllegalAccessException, IllegalArgumentException, InvocationTargetException,
370 SecurityException, InstantiationException, NoSuchMethodException, MalformedURLException {
371 final Introspector obj = loader.introspectorFromName("vpn-binding");
372 obj.setValue("vpn-id", "getKeyNoLink");
373 final Introspector routeTargets = loader.introspectorFromName("route-targets");
374 obj.setValue("route-targets", routeTargets.getUnderlyingObject());
375 List<Object> targets = routeTargets.getValue("route-target");
376 final Introspector routeTargetOne = loader.introspectorFromName("route-target");
377 routeTargetOne.setValue("global-route-target", "getTargetKeyNoLink");
378 routeTargetOne.setValue("route-target-role", "getRoleKeyNoLink");
379 targets.add(routeTargetOne.getUnderlyingObject());
380 final Introspector routeTargetTwo = loader.introspectorFromName("route-target");
381 routeTargetTwo.setValue("global-route-target", "getTargetKeyNoLink2");
382 routeTargetTwo.setValue("route-target-role", "getRoleKeyNoLink2");
383 targets.add(routeTargetTwo.getUnderlyingObject());
384 TransactionalGraphEngine spy = spy(dbEngine);
385 TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
386 Graph g = graph.newTransaction();
387 GraphTraversalSource traversal = g.traversal();
388 when(spy.tx()).thenReturn(g);
389 when(spy.asAdmin()).thenReturn(adminSpy);
390 when(adminSpy.getTraversalSource()).thenReturn(traversal);
391 when(spy.tx()).thenReturn(g);
392 when(parser.isDependent()).thenReturn(false);
393 when(self.<String>property(AAIProperties.AAI_URI)).thenReturn(prop);
394 when(prop.orElse(null)).thenReturn(obj.getURI());
395 DBSerializer serializer =
396 new DBSerializer(schemaVersions.getDefaultVersion(), spy, introspectorFactoryType, "AAI_TEST");
397 Vertex v = serializer.createNewVertex(obj);
398 serializer.serializeToDb(obj, v, parser, obj.getURI(), "testing");
399 Vertex routeTargetOneV = traversal.V().has("global-route-target", "getTargetKeyNoLink").next();
400 Vertex routeTargetTwoV = traversal.V().has("global-route-target", "getTargetKeyNoLink2").next();
402 assertEquals("first route target put has linked", true,
403 routeTargetOneV.property(AAIProperties.LINKED).orElse(false));
404 assertEquals("second route target put does not have linked", false,
405 routeTargetTwoV.property(AAIProperties.LINKED).orElse(false));