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.serialization.engines.query;
23 import static org.hamcrest.CoreMatchers.is;
24 import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
25 import static org.junit.Assert.assertThat;
26 import static org.junit.Assert.assertTrue;
27 import static org.onap.aai.edges.enums.EdgeField.CONTAINS;
29 import com.jayway.jsonpath.JsonPath;
31 import java.io.InputStream;
34 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
35 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
36 import org.apache.tinkerpop.gremlin.structure.*;
37 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
38 import org.junit.Test;
39 import org.onap.aai.AAISetup;
40 import org.onap.aai.edges.exceptions.AmbiguousRuleChoiceException;
41 import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException;
42 import org.onap.aai.exceptions.AAIException;
43 import org.onap.aai.introspection.Loader;
44 import org.onap.aai.introspection.ModelType;
45 import org.onap.aai.serialization.db.EdgeSerializer;
46 import org.springframework.beans.factory.annotation.Autowired;
47 import org.springframework.test.annotation.DirtiesContext;
49 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
50 public class GraphTraversalQueryEngineTest extends AAISetup {
53 EdgeSerializer edgeSer;
56 public void testFindParents() throws AAIException {
58 Graph graph = TinkerGraph.open();
60 Vertex cloudreg = graph.addVertex(T.id, "00", "aai-node-type", "cloud-region");
61 Vertex tenant = graph.addVertex(T.id, "10", "aai-node-type", "tenant");
62 Vertex vserver = graph.addVertex(T.id, "20", "aai-node-type", "vserver");
64 GraphTraversalSource g = graph.traversal();
66 edgeSer.addTreeEdge(g, cloudreg, tenant);
67 edgeSer.addTreeEdge(g, tenant, vserver);
69 // expect start vertex back plus any parents
70 List<Vertex> crExpected = new ArrayList<>(Arrays.asList(cloudreg)); // no parents
71 List<Vertex> tenExpected = new ArrayList<>(Arrays.asList(tenant, cloudreg)); // only has the immediate parent
72 List<Vertex> vsExpected = new ArrayList<>(Arrays.asList(vserver, tenant, cloudreg)); // parent & grandparent
74 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
77 List<Vertex> crRes = engine.findParents(cloudreg);
78 assertTrue(crRes.containsAll(crExpected) && crExpected.containsAll(crRes));
80 List<Vertex> tenRes = engine.findParents(tenant);
81 assertTrue(tenRes.containsAll(tenExpected) && tenExpected.containsAll(tenRes));
83 List<Vertex> vsRes = engine.findParents(vserver);
84 assertTrue(vsRes.containsAll(vsExpected) && vsExpected.containsAll(vsRes));
85 // verify expected ordering - start, parent, grandparent
86 assertTrue(vsRes.get(0).equals(vserver));
87 assertTrue(vsRes.get(1).equals(tenant));
88 assertTrue(vsRes.get(2).equals(cloudreg));
92 public void testFindAllParentsGivenAaiUris() {
95 Graph graph = TinkerGraph.open();
97 Vertex cloudreg = graph.addVertex(T.id, "00", "aai-node-type", "cloud-region", "aai-uri",
98 "/cloud-infrastructure/cloud-regions/cloud-region/testowner/testid");
99 Vertex tenant = graph.addVertex(T.id, "10", "aai-node-type", "tenant", "aai-uri",
100 "/cloud-infrastructure/cloud-regions/cloud-region/testowner/testid/tenants/tenant/testTenant1");
101 Vertex vserver = graph.addVertex(T.id, "20", "aai-node-type", "vserver", "aai-uri",
102 "/cloud-infrastructure/cloud-regions/cloud-region/testowner/testid/tenants/tenant/testTenant1/vservers/vserver/testVserver1");
104 String[] uris = new String[] {
105 "/cloud-infrastructure/cloud-regions/cloud-region/testowner/testid/tenants/tenant/testTenant1",
106 "/cloud-infrastructure/cloud-regions/cloud-region/testowner/testid/tenants/tenant/testTenant1/vservers/vserver/testVserver1",
107 "/cloud-infrastructure/cloud-regions/cloud-region/testowner/testid"};
109 GraphTraversalSource g = graph.traversal();
110 GraphTraversalQueryEngine queryEngine = new GraphTraversalQueryEngine(g);
111 List<Vertex> vertices = queryEngine.findParents(uris);
113 assertThat("Returned vertices should be 3 cloud region, tenant and vserver", vertices.size(), is(3));
114 assertThat("Expected the first element back to be vserver", vertices.get(0), is(vserver));
115 assertThat("Expected the second element back to be tenant", vertices.get(1), is(tenant));
116 assertThat("Expected the element back to be cloud region", vertices.get(2), is(cloudreg));
120 public void testFindAllChildren() throws AAIException {
122 Graph graph = TinkerGraph.open();
124 Vertex cloudreg = graph.addVertex(T.id, "00", "aai-node-type", "cloud-region");
125 Vertex tenant = graph.addVertex(T.id, "10", "aai-node-type", "tenant");
126 Vertex vserver = graph.addVertex(T.id, "20", "aai-node-type", "vserver");
127 Vertex vserver2 = graph.addVertex(T.id, "21", "aai-node-type", "vserver");
128 Vertex oam = graph.addVertex(T.id, "30", "aai-node-type", "oam-network");
130 GraphTraversalSource g = graph.traversal();
132 edgeSer.addTreeEdge(g, cloudreg, tenant);
133 edgeSer.addTreeEdge(g, tenant, vserver);
134 edgeSer.addTreeEdge(g, tenant, vserver2);
135 edgeSer.addTreeEdge(g, cloudreg, oam);
137 List<Vertex> crExpected = new ArrayList<>(Arrays.asList(cloudreg, tenant, vserver, vserver2, oam));
138 List<Vertex> vsExpected = new ArrayList<>(Arrays.asList(vserver));
140 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
143 List<Vertex> crRes = engine.findAllChildren(cloudreg);
144 assertTrue(crRes.containsAll(crExpected) && crExpected.containsAll(crRes));
146 List<Vertex> vsRes = engine.findAllChildren(vserver);
147 assertTrue(vsRes.containsAll(vsExpected) && vsExpected.containsAll(vsRes));
151 public void testFindChildrenOfType() throws AAIException {
153 Graph graph = TinkerGraph.open();
155 Vertex gv = graph.addVertex(T.id, "00", "aai-node-type", "generic-vnf");
156 Vertex lint1 = graph.addVertex(T.id, "10", "aai-node-type", "l-interface");
157 Vertex lint2 = graph.addVertex(T.id, "11", "aai-node-type", "l-interface");
158 Vertex lag = graph.addVertex(T.id, "20", "aai-node-type", "lag-interface");
159 Vertex lint3 = graph.addVertex(T.id, "12", "aai-node-type", "l-interface");
161 GraphTraversalSource g = graph.traversal();
163 edgeSer.addTreeEdge(g, gv, lint1);
164 edgeSer.addTreeEdge(g, gv, lint2);
165 edgeSer.addTreeEdge(g, gv, lag);
166 edgeSer.addTreeEdge(g, lag, lint3);
168 List<Vertex> expected = new ArrayList<>(Arrays.asList(lint1, lint2));
170 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
173 List<Vertex> results = engine.findChildrenOfType(gv, "l-interface");
174 assertTrue(results.containsAll(expected) && expected.containsAll(results));
178 public void testFindChildren() throws AAIException {
180 Graph graph = TinkerGraph.open();
182 Vertex gv = graph.addVertex(T.id, "00", "aai-node-type", "generic-vnf");
183 Vertex lint1 = graph.addVertex(T.id, "10", "aai-node-type", "l-interface");
184 Vertex lint2 = graph.addVertex(T.id, "11", "aai-node-type", "l-interface");
185 Vertex lag = graph.addVertex(T.id, "20", "aai-node-type", "lag-interface");
186 Vertex lint3 = graph.addVertex(T.id, "12", "aai-node-type", "l-interface");
188 GraphTraversalSource g = graph.traversal();
190 edgeSer.addTreeEdge(g, gv, lint1);
191 edgeSer.addTreeEdge(g, gv, lint2);
192 edgeSer.addTreeEdge(g, gv, lag);
193 edgeSer.addTreeEdge(g, lag, lint3);
195 List<Vertex> expected = new ArrayList<>(Arrays.asList(lint1, lint2, lag));
197 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
200 List<Vertex> results = engine.findChildren(gv);
201 assertTrue(results.containsAll(expected) && expected.containsAll(results));
205 public void testFindRelatedVertices() throws AAIException {
208 Graph graph = TinkerGraph.open();
210 Vertex gv = graph.addVertex(T.id, "00", "aai-node-type", "generic-vnf");
211 Vertex lint = graph.addVertex(T.id, "10", "aai-node-type", "l-interface");
212 Vertex lint2 = graph.addVertex(T.id, "11", "aai-node-type", "l-interface");
213 Vertex log = graph.addVertex(T.id, "20", "aai-node-type", "logical-link");
215 GraphTraversalSource g = graph.traversal();
217 edgeSer.addTreeEdge(g, gv, lint);
218 edgeSer.addEdge(g, lint, log);
219 edgeSer.addEdge(g, log, lint2);
221 List<Vertex> outExpected = new ArrayList<>(Arrays.asList(lint));
222 List<Vertex> inExpected = new ArrayList<>(Arrays.asList(lint, lint2));
223 List<Vertex> bothExpected = new ArrayList<>(Arrays.asList(log));
225 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
228 List<Vertex> outRes = engine.findRelatedVertices(gv, Direction.IN, "org.onap.relationships.inventory.BelongsTo",
230 assertTrue(outRes.containsAll(outExpected) && outExpected.containsAll(outRes));
233 engine.findRelatedVertices(log, Direction.IN, "tosca.relationships.network.LinksTo", "l-interface");
234 assertTrue(inRes.containsAll(inExpected) && inExpected.containsAll(inRes));
236 List<Vertex> bothRes =
237 engine.findRelatedVertices(lint, Direction.BOTH, "tosca.relationships.network.LinksTo", "logical-link");
238 assertTrue(bothRes.containsAll(bothExpected) && bothExpected.containsAll(bothRes));
242 public void testFindSubGraph() throws AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException {
244 Graph graph = TinkerGraph.open();
246 Vertex cr = graph.addVertex(T.id, "00", "aai-node-type", "cloud-region");
247 Vertex ten = graph.addVertex(T.id, "10", "aai-node-type", "tenant");
248 Vertex ten2 = graph.addVertex(T.id, "11", "aai-node-type", "tenant");
249 Vertex vs = graph.addVertex(T.id, "20", "aai-node-type", "vserver");
250 Vertex vs2 = graph.addVertex(T.id, "21", "aai-node-type", "vserver");
251 Vertex lint = graph.addVertex(T.id, "30", "aai-node-type", "l-interface");
252 Vertex comp = graph.addVertex(T.id, "40", "aai-node-type", "complex");
253 Vertex ctag = graph.addVertex(T.id, "50", "aai-node-type", "ctag-pool");
254 Vertex gv = graph.addVertex(T.id, "60", "aai-node-type", "generic-vnf");
255 Vertex lag = graph.addVertex(T.id, "70", "aai-node-type", "lag-interface");
256 Vertex lint2 = graph.addVertex(T.id, "31", "aai-node-type", "l-interface");
257 Vertex log = graph.addVertex(T.id, "80", "aai-node-type", "logical-link");
258 Vertex vnfc = graph.addVertex(T.id, "90", "aai-node-type", "vnfc");
259 Vertex modelVer = graph.addVertex(T.id, "100", "aai-node-type", "model-ver");
261 GraphTraversalSource g = graph.traversal();
263 Edge crTen = edgeSer.addTreeEdge(g, cr, ten);
264 Edge crTen2 = edgeSer.addTreeEdge(g, cr, ten2);
265 Edge tenVs = edgeSer.addTreeEdge(g, ten, vs);
266 Edge tenVs2 = edgeSer.addTreeEdge(g, ten, vs2);
267 Edge vsLInt = edgeSer.addTreeEdge(g, vs, lint);
268 Edge lintLog = edgeSer.addEdge(g, lint, log);
269 Edge vsGv = edgeSer.addEdge(g, vs, gv);
270 edgeSer.addEdge(g, gv, vnfc);
272 edgeSer.addTreeEdge(g, gv, lag);
273 edgeSer.addTreeEdge(g, lag, lint2);
274 Edge modelVerEdge = edgeSer.addPrivateEdge(g, gv, modelVer, null);
276 edgeSer.addTreeEdge(g, comp, ctag);
277 Edge crComp = edgeSer.addEdge(g, cr, comp);
279 // findSubGraph(cr, 0, true)
280 List<Element> expected1 = new ArrayList<>(Arrays.asList(cr));
281 // findSubGraph(cr, 2, true)
282 List<Element> expected2 = new ArrayList<>(Arrays.asList(cr, ten, ten2, vs, vs2, crTen, crTen2, tenVs, tenVs2));
284 List<Element> expected3 = new ArrayList<>(Arrays.asList(cr, ten, ten2, comp, vs, vs2, lint, gv, log, crTen,
285 crTen2, crComp, tenVs, tenVs2, vsLInt, vsGv, lintLog));
287 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
290 Tree<Element> res1 = engine.findSubGraph(cr, 0, true);
291 Set<Element> resList1 = treeToList(res1);
292 assertTrue(resList1.containsAll(expected1) && expected1.containsAll(resList1));
294 Tree<Element> res2 = engine.findSubGraph(cr, 2, true);
295 Set<Element> resList2 = treeToList(res2);
296 assertTrue(resList2.containsAll(expected2) && expected2.containsAll(resList2));
298 Tree<Element> res3 = engine.findSubGraph(cr);
299 Set<Element> resList3 = treeToList(res3);
300 assertThat(resList3, containsInAnyOrder(expected3.toArray()));
301 // assertTrue(resList3.containsAll(expected3) && expected3.containsAll(resList3));
305 * convenience helper method to make it easier to check the contents of the tree against
306 * a list of expected results
308 * @param tree - the tree whose contents you want in collection form
309 * @return set of the contents of the tree
311 private Set<Element> treeToList(Tree<Element> tree) {
312 Set<Element> ret = new HashSet<>();
314 for (Element key : tree.keySet()) {
316 ret.addAll(treeToList(tree.get(key)));
323 public void testFindEdgesForVersion() throws AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException {
325 Graph graph = TinkerGraph.open();
327 Vertex gv = graph.addVertex(T.id, "00", "aai-node-type", "generic-vnf");
328 Vertex vnfc = graph.addVertex(T.id, "10", "aai-node-type", "vnfc");
329 Vertex lob = graph.addVertex(T.id, "20", "aai-node-type", "line-of-business");
330 Vertex lint = graph.addVertex(T.id, "30", "aai-node-type", "l-interface");
331 Vertex mv = graph.addVertex(T.id, "40", "aai-node-type", "model-ver");
332 Vertex cr = graph.addVertex(T.id, "50", "aai-node-type", "cloud-region");
333 Vertex tn = graph.addVertex(T.id, "60", "aai-node-type", "tenant");
335 Edge cloudRegionToTenantEdge = tn.addEdge("some-edge", cr, CONTAINS.toString(), "NONE");
337 GraphTraversalSource g = graph.traversal();
339 edgeSer.addTreeEdge(g, gv, lint); // tree edge so shouldn't appear in results
340 Edge gvVnfc = edgeSer.addEdge(g, gv, vnfc);
341 edgeSer.addEdge(g, gv, lob); // v11/12 not v10
342 Edge gvMvEdge = edgeSer.addPrivateEdge(g, gv, mv, null);
344 List<Edge> expected = new ArrayList<>(Arrays.asList(gvVnfc));
346 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
349 Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getRelatedLinkVersion());
350 List<Edge> results = engine.findEdgesForVersion(gv, loader);
351 assertThat(results, containsInAnyOrder(expected.toArray()));
353 expected = new ArrayList<>(Arrays.asList(cloudRegionToTenantEdge));
354 results = engine.findEdgesForVersion(cr, loader);
355 assertThat(results, containsInAnyOrder(expected.toArray()));
359 public void testFindCousinVertices() throws AAIException {
361 Graph graph = TinkerGraph.open();
363 Vertex gv = graph.addVertex(T.id, "00", "aai-node-type", "generic-vnf");
364 Vertex vnfc = graph.addVertex(T.id, "10", "aai-node-type", "vnfc");
365 Vertex lob = graph.addVertex(T.id, "20", "aai-node-type", "line-of-business");
366 Vertex lint = graph.addVertex(T.id, "30", "aai-node-type", "l-interface");
368 GraphTraversalSource g = graph.traversal();
370 edgeSer.addTreeEdge(g, gv, lint); // tree edge so shouldn't appear in results
371 edgeSer.addEdge(g, gv, vnfc);
372 edgeSer.addEdge(g, gv, lob);
374 List<Vertex> expected = new ArrayList<>(Arrays.asList(vnfc, lob));
376 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
379 List<Vertex> results = engine.findCousinVertices(gv);
380 assertTrue(results.containsAll(expected) && expected.containsAll(results));