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=========================================================
20 package org.onap.aai.serialization.engines.query;
22 import com.jayway.jsonpath.JsonPath;
23 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
24 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
25 import org.apache.tinkerpop.gremlin.structure.*;
26 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
27 import org.junit.Test;
28 import org.onap.aai.AAISetup;
29 import org.onap.aai.edges.exceptions.AmbiguousRuleChoiceException;
30 import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException;
31 import org.onap.aai.exceptions.AAIException;
32 import org.onap.aai.introspection.Loader;
33 import org.onap.aai.introspection.ModelType;
34 import org.onap.aai.serialization.db.EdgeSerializer;
35 import org.springframework.beans.factory.annotation.Autowired;
36 import org.springframework.test.annotation.DirtiesContext;
38 import java.io.InputStream;
41 import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
42 import static org.junit.Assert.assertThat;
43 import static org.junit.Assert.assertTrue;
44 import static org.onap.aai.edges.enums.EdgeField.CONTAINS;
46 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
47 public class GraphTraversalQueryEngineTest extends AAISetup {
50 EdgeSerializer edgeSer;
53 public void testFindParents() throws AAIException {
55 Graph graph = TinkerGraph.open();
57 Vertex cloudreg = graph.addVertex(T.id, "00", "aai-node-type", "cloud-region");
58 Vertex tenant = graph.addVertex(T.id, "10", "aai-node-type", "tenant");
59 Vertex vserver = graph.addVertex(T.id, "20", "aai-node-type", "vserver");
61 GraphTraversalSource g = graph.traversal();
63 edgeSer.addTreeEdge(g, cloudreg, tenant);
64 edgeSer.addTreeEdge(g, tenant, vserver);
66 //expect start vertex back plus any parents
67 List<Vertex> crExpected = new ArrayList<>(Arrays.asList(cloudreg)); //no parents
68 List<Vertex> tenExpected = new ArrayList<>(Arrays.asList(tenant, cloudreg)); //only has the immediate parent
69 List<Vertex> vsExpected = new ArrayList<>(Arrays.asList(vserver, tenant, cloudreg)); //parent & grandparent
71 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
74 List<Vertex> crRes = engine.findParents(cloudreg);
75 assertTrue(crRes.containsAll(crExpected) && crExpected.containsAll(crRes));
77 List<Vertex> tenRes = engine.findParents(tenant);
78 assertTrue(tenRes.containsAll(tenExpected) && tenExpected.containsAll(tenRes));
80 List<Vertex> vsRes = engine.findParents(vserver);
81 assertTrue(vsRes.containsAll(vsExpected) && vsExpected.containsAll(vsRes));
82 //verify expected ordering - start, parent, grandparent
83 assertTrue(vsRes.get(0).equals(vserver));
84 assertTrue(vsRes.get(1).equals(tenant));
85 assertTrue(vsRes.get(2).equals(cloudreg));
89 public void testFindAllChildren() throws AAIException {
91 Graph graph = TinkerGraph.open();
93 Vertex cloudreg = graph.addVertex(T.id, "00", "aai-node-type", "cloud-region");
94 Vertex tenant = graph.addVertex(T.id, "10", "aai-node-type", "tenant");
95 Vertex vserver = graph.addVertex(T.id, "20", "aai-node-type", "vserver");
96 Vertex vserver2 = graph.addVertex(T.id, "21", "aai-node-type", "vserver");
97 Vertex oam = graph.addVertex(T.id, "30", "aai-node-type", "oam-network");
99 GraphTraversalSource g = graph.traversal();
101 edgeSer.addTreeEdge(g, cloudreg, tenant);
102 edgeSer.addTreeEdge(g, tenant, vserver);
103 edgeSer.addTreeEdge(g, tenant, vserver2);
104 edgeSer.addTreeEdge(g, cloudreg, oam);
106 List<Vertex> crExpected = new ArrayList<>(Arrays.asList(cloudreg, tenant, vserver, vserver2, oam));
107 List<Vertex> vsExpected = new ArrayList<>(Arrays.asList(vserver));
109 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
112 List<Vertex> crRes = engine.findAllChildren(cloudreg);
113 assertTrue(crRes.containsAll(crExpected) && crExpected.containsAll(crRes));
115 List<Vertex> vsRes = engine.findAllChildren(vserver);
116 assertTrue(vsRes.containsAll(vsExpected) && vsExpected.containsAll(vsRes));
120 public void testFindChildrenOfType() throws AAIException {
122 Graph graph = TinkerGraph.open();
124 Vertex gv = graph.addVertex(T.id, "00", "aai-node-type", "generic-vnf");
125 Vertex lint1 = graph.addVertex(T.id, "10", "aai-node-type", "l-interface");
126 Vertex lint2 = graph.addVertex(T.id, "11", "aai-node-type", "l-interface");
127 Vertex lag = graph.addVertex(T.id, "20", "aai-node-type", "lag-interface");
128 Vertex lint3 = graph.addVertex(T.id, "12", "aai-node-type", "l-interface");
130 GraphTraversalSource g = graph.traversal();
132 edgeSer.addTreeEdge(g, gv, lint1);
133 edgeSer.addTreeEdge(g, gv, lint2);
134 edgeSer.addTreeEdge(g, gv, lag);
135 edgeSer.addTreeEdge(g, lag, lint3);
137 List<Vertex> expected = new ArrayList<>(Arrays.asList(lint1, lint2));
139 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
142 List<Vertex> results = engine.findChildrenOfType(gv, "l-interface");
143 assertTrue(results.containsAll(expected) && expected.containsAll(results));
147 public void testFindChildren() throws AAIException {
149 Graph graph = TinkerGraph.open();
151 Vertex gv = graph.addVertex(T.id, "00", "aai-node-type", "generic-vnf");
152 Vertex lint1 = graph.addVertex(T.id, "10", "aai-node-type", "l-interface");
153 Vertex lint2 = graph.addVertex(T.id, "11", "aai-node-type", "l-interface");
154 Vertex lag = graph.addVertex(T.id, "20", "aai-node-type", "lag-interface");
155 Vertex lint3 = graph.addVertex(T.id, "12", "aai-node-type", "l-interface");
157 GraphTraversalSource g = graph.traversal();
159 edgeSer.addTreeEdge(g, gv, lint1);
160 edgeSer.addTreeEdge(g, gv, lint2);
161 edgeSer.addTreeEdge(g, gv, lag);
162 edgeSer.addTreeEdge(g, lag, lint3);
164 List<Vertex> expected = new ArrayList<>(Arrays.asList(lint1, lint2, lag));
166 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
169 List<Vertex> results = engine.findChildren(gv);
170 assertTrue(results.containsAll(expected) && expected.containsAll(results));
174 public void testFindRelatedVertices() throws AAIException {
177 Graph graph = TinkerGraph.open();
179 Vertex gv = graph.addVertex(T.id, "00", "aai-node-type", "generic-vnf");
180 Vertex lint = graph.addVertex(T.id, "10", "aai-node-type", "l-interface");
181 Vertex lint2 = graph.addVertex(T.id, "11", "aai-node-type", "l-interface");
182 Vertex log = graph.addVertex(T.id, "20", "aai-node-type", "logical-link");
184 GraphTraversalSource g = graph.traversal();
186 edgeSer.addTreeEdge(g, gv, lint);
187 edgeSer.addEdge(g, lint, log);
188 edgeSer.addEdge(g, log, lint2);
190 List<Vertex> outExpected = new ArrayList<>(Arrays.asList(lint));
191 List<Vertex> inExpected = new ArrayList<>(Arrays.asList(lint, lint2));
192 List<Vertex> bothExpected = new ArrayList<>(Arrays.asList(log));
194 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
197 List<Vertex> outRes = engine.findRelatedVertices(gv, Direction.IN, "org.onap.relationships.inventory.BelongsTo", "l-interface");
198 assertTrue(outRes.containsAll(outExpected) && outExpected.containsAll(outRes));
200 List<Vertex> inRes = engine.findRelatedVertices(log, Direction.IN, "tosca.relationships.network.LinksTo", "l-interface");
201 assertTrue(inRes.containsAll(inExpected) && inExpected.containsAll(inRes));
203 List<Vertex> bothRes = engine.findRelatedVertices(lint, Direction.BOTH, "tosca.relationships.network.LinksTo", "logical-link");
204 assertTrue(bothRes.containsAll(bothExpected) && bothExpected.containsAll(bothRes));
208 public void testFindSubGraph() throws AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException {
210 Graph graph = TinkerGraph.open();
212 Vertex cr = graph.addVertex(T.id, "00", "aai-node-type", "cloud-region");
213 Vertex ten = graph.addVertex(T.id, "10", "aai-node-type", "tenant");
214 Vertex ten2 = graph.addVertex(T.id, "11", "aai-node-type", "tenant");
215 Vertex vs = graph.addVertex(T.id, "20", "aai-node-type", "vserver");
216 Vertex vs2 = graph.addVertex(T.id, "21", "aai-node-type", "vserver");
217 Vertex lint = graph.addVertex(T.id, "30", "aai-node-type", "l-interface");
218 Vertex comp = graph.addVertex(T.id, "40", "aai-node-type", "complex");
219 Vertex ctag = graph.addVertex(T.id, "50", "aai-node-type", "ctag-pool");
220 Vertex gv = graph.addVertex(T.id, "60", "aai-node-type", "generic-vnf");
221 Vertex lag = graph.addVertex(T.id, "70", "aai-node-type", "lag-interface");
222 Vertex lint2 = graph.addVertex(T.id, "31", "aai-node-type", "l-interface");
223 Vertex log = graph.addVertex(T.id, "80", "aai-node-type", "logical-link");
224 Vertex vnfc = graph.addVertex(T.id, "90", "aai-node-type", "vnfc");
225 Vertex modelVer = graph.addVertex(T.id, "100", "aai-node-type", "model-ver");
227 GraphTraversalSource g = graph.traversal();
229 Edge crTen = edgeSer.addTreeEdge(g, cr, ten);
230 Edge crTen2 = edgeSer.addTreeEdge(g, cr, ten2);
231 Edge tenVs = edgeSer.addTreeEdge(g, ten, vs);
232 Edge tenVs2 = edgeSer.addTreeEdge(g, ten, vs2);
233 Edge vsLInt = edgeSer.addTreeEdge(g, vs, lint);
234 Edge lintLog = edgeSer.addEdge(g, lint, log);
235 Edge vsGv = edgeSer.addEdge(g, vs, gv);
236 edgeSer.addEdge(g, gv, vnfc);
238 edgeSer.addTreeEdge(g, gv, lag);
239 edgeSer.addTreeEdge(g, lag, lint2);
240 Edge modelVerEdge = edgeSer.addPrivateEdge(g, gv, modelVer, null);
242 edgeSer.addTreeEdge(g, comp, ctag);
243 Edge crComp = edgeSer.addEdge(g, cr, comp);
245 //findSubGraph(cr, 0, true)
246 List<Element> expected1 = new ArrayList<>(Arrays.asList(cr));
247 //findSubGraph(cr, 2, true)
248 List<Element> expected2 = new ArrayList<>(Arrays.asList(cr, ten, ten2, vs, vs2,
249 crTen, crTen2, tenVs, tenVs2));
251 List<Element> expected3 = new ArrayList<>(Arrays.asList(cr, ten, ten2, comp, vs, vs2, lint, gv, log,
252 crTen, crTen2, crComp, tenVs, tenVs2, vsLInt,
255 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
258 Tree<Element> res1 = engine.findSubGraph(cr, 0, true);
259 Set<Element> resList1 = treeToList(res1);
260 assertTrue(resList1.containsAll(expected1) && expected1.containsAll(resList1));
262 Tree<Element> res2 = engine.findSubGraph(cr, 2, true);
263 Set<Element> resList2 = treeToList(res2);
264 assertTrue(resList2.containsAll(expected2) && expected2.containsAll(resList2));
266 Tree<Element> res3 = engine.findSubGraph(cr);
267 Set<Element> resList3 = treeToList(res3);
268 assertThat(resList3, containsInAnyOrder(expected3.toArray()));
269 // assertTrue(resList3.containsAll(expected3) && expected3.containsAll(resList3));
273 * convenience helper method to make it easier to check the contents of the tree against
274 * a list of expected results
275 * @param tree - the tree whose contents you want in collection form
276 * @return set of the contents of the tree
278 private Set<Element> treeToList(Tree<Element> tree) {
279 Set<Element> ret = new HashSet<>();
281 for (Element key : tree.keySet()) {
283 ret.addAll(treeToList(tree.get(key)));
290 public void testFindEdgesForVersion() throws AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException {
292 Graph graph = TinkerGraph.open();
294 Vertex gv = graph.addVertex(T.id, "00", "aai-node-type", "generic-vnf");
295 Vertex vnfc = graph.addVertex(T.id, "10", "aai-node-type", "vnfc");
296 Vertex lob = graph.addVertex(T.id, "20", "aai-node-type", "line-of-business");
297 Vertex lint = graph.addVertex(T.id, "30", "aai-node-type", "l-interface");
298 Vertex mv = graph.addVertex(T.id, "40", "aai-node-type", "model-ver");
299 Vertex cr = graph.addVertex(T.id, "50", "aai-node-type", "cloud-region");
300 Vertex tn = graph.addVertex(T.id, "60", "aai-node-type", "tenant");
302 Edge cloudRegionToTenantEdge = tn
303 .addEdge("some-edge", cr, CONTAINS.toString(), "NONE");
305 GraphTraversalSource g = graph.traversal();
307 edgeSer.addTreeEdge(g, gv, lint); //tree edge so shouldn't appear in results
308 Edge gvVnfc = edgeSer.addEdge(g, gv, vnfc);
309 edgeSer.addEdge(g, gv, lob); //v11/12 not v10
310 Edge gvMvEdge = edgeSer.addPrivateEdge(g, gv, mv, null);
312 List<Edge> expected = new ArrayList<>(Arrays.asList(gvVnfc));
314 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
317 Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getRelatedLinkVersion());
318 List<Edge> results = engine.findEdgesForVersion(gv, loader);
319 assertThat(results, containsInAnyOrder(expected.toArray()));
321 expected = new ArrayList<>(Arrays.asList(cloudRegionToTenantEdge));
322 results = engine.findEdgesForVersion(cr, loader);
323 assertThat(results, containsInAnyOrder(expected.toArray()));
327 public void testFindCousinVertices() throws AAIException {
329 Graph graph = TinkerGraph.open();
331 Vertex gv = graph.addVertex(T.id, "00", "aai-node-type", "generic-vnf");
332 Vertex vnfc = graph.addVertex(T.id, "10", "aai-node-type", "vnfc");
333 Vertex lob = graph.addVertex(T.id, "20", "aai-node-type", "line-of-business");
334 Vertex lint = graph.addVertex(T.id, "30", "aai-node-type", "l-interface");
336 GraphTraversalSource g = graph.traversal();
338 edgeSer.addTreeEdge(g, gv, lint); //tree edge so shouldn't appear in results
339 edgeSer.addEdge(g, gv, vnfc);
340 edgeSer.addEdge(g, gv, lob);
342 List<Vertex> expected = new ArrayList<>(Arrays.asList(vnfc, lob));
344 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
347 List<Vertex> results = engine.findCousinVertices(gv);
348 assertTrue(results.containsAll(expected) && expected.containsAll(results));