Release 1.13.6 Docker Artifact
[aai/aai-common.git] / aai-core / src / test / java / org / onap / aai / serialization / engines / query / GraphTraversalQueryEngineTest.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
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
10  *
11  *    http://www.apache.org/licenses/LICENSE-2.0
12  *
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=========================================================
19  */
20
21 package org.onap.aai.serialization.engines.query;
22
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;
28
29 import java.util.*;
30
31 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
32 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
33 import org.apache.tinkerpop.gremlin.structure.*;
34 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
35 import org.junit.Test;
36 import org.onap.aai.AAISetup;
37 import org.onap.aai.edges.exceptions.AmbiguousRuleChoiceException;
38 import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException;
39 import org.onap.aai.exceptions.AAIException;
40 import org.onap.aai.introspection.Loader;
41 import org.onap.aai.introspection.ModelType;
42 import org.onap.aai.serialization.db.EdgeSerializer;
43 import org.springframework.beans.factory.annotation.Autowired;
44 import org.springframework.test.annotation.DirtiesContext;
45
46 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
47 public class GraphTraversalQueryEngineTest extends AAISetup {
48
49     @Autowired
50     EdgeSerializer edgeSer;
51
52     @Test
53     public void testFindParents() throws AAIException {
54         // setup
55         Graph graph = TinkerGraph.open();
56
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");
60
61         GraphTraversalSource g = graph.traversal();
62
63         edgeSer.addTreeEdge(g, cloudreg, tenant);
64         edgeSer.addTreeEdge(g, tenant, vserver);
65
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
70
71         GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
72
73         // test
74         List<Vertex> crRes = engine.findParents(cloudreg);
75         assertTrue(crRes.containsAll(crExpected) && crExpected.containsAll(crRes));
76
77         List<Vertex> tenRes = engine.findParents(tenant);
78         assertTrue(tenRes.containsAll(tenExpected) && tenExpected.containsAll(tenRes));
79
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));
86     }
87
88     @Test
89     public void testFindAllParentsGivenAaiUris() {
90
91         // setup
92         Graph graph = TinkerGraph.open();
93
94         Vertex cloudreg = graph.addVertex(T.id, "00", "aai-node-type", "cloud-region", "aai-uri",
95                 "/cloud-infrastructure/cloud-regions/cloud-region/testowner/testid");
96         Vertex tenant = graph.addVertex(T.id, "10", "aai-node-type", "tenant", "aai-uri",
97                 "/cloud-infrastructure/cloud-regions/cloud-region/testowner/testid/tenants/tenant/testTenant1");
98         Vertex vserver = graph.addVertex(T.id, "20", "aai-node-type", "vserver", "aai-uri",
99                 "/cloud-infrastructure/cloud-regions/cloud-region/testowner/testid/tenants/tenant/testTenant1/vservers/vserver/testVserver1");
100
101         String[] uris = new String[] {
102                 "/cloud-infrastructure/cloud-regions/cloud-region/testowner/testid/tenants/tenant/testTenant1",
103                 "/cloud-infrastructure/cloud-regions/cloud-region/testowner/testid/tenants/tenant/testTenant1/vservers/vserver/testVserver1",
104                 "/cloud-infrastructure/cloud-regions/cloud-region/testowner/testid"};
105
106         GraphTraversalSource g = graph.traversal();
107         GraphTraversalQueryEngine queryEngine = new GraphTraversalQueryEngine(g);
108         List<Vertex> vertices = queryEngine.findParents(uris);
109
110         assertThat("Returned vertices should be 3 cloud region, tenant and vserver", vertices.size(), is(3));
111         assertThat("Expected the first element back to be vserver", vertices.get(0), is(vserver));
112         assertThat("Expected the second element back to be tenant", vertices.get(1), is(tenant));
113         assertThat("Expected the element back to be cloud region", vertices.get(2), is(cloudreg));
114     }
115
116     @Test
117     public void testFindAllChildren() throws AAIException {
118         // setup
119         Graph graph = TinkerGraph.open();
120
121         Vertex cloudreg = graph.addVertex(T.id, "00", "aai-node-type", "cloud-region");
122         Vertex tenant = graph.addVertex(T.id, "10", "aai-node-type", "tenant");
123         Vertex vserver = graph.addVertex(T.id, "20", "aai-node-type", "vserver");
124         Vertex vserver2 = graph.addVertex(T.id, "21", "aai-node-type", "vserver");
125         Vertex oam = graph.addVertex(T.id, "30", "aai-node-type", "oam-network");
126
127         GraphTraversalSource g = graph.traversal();
128
129         edgeSer.addTreeEdge(g, cloudreg, tenant);
130         edgeSer.addTreeEdge(g, tenant, vserver);
131         edgeSer.addTreeEdge(g, tenant, vserver2);
132         edgeSer.addTreeEdge(g, cloudreg, oam);
133
134         List<Vertex> crExpected = new ArrayList<>(Arrays.asList(cloudreg, tenant, vserver, vserver2, oam));
135         List<Vertex> vsExpected = new ArrayList<>(Arrays.asList(vserver));
136
137         GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
138
139         // test
140         List<Vertex> crRes = engine.findAllChildren(cloudreg);
141         assertTrue(crRes.containsAll(crExpected) && crExpected.containsAll(crRes));
142
143         List<Vertex> vsRes = engine.findAllChildren(vserver);
144         assertTrue(vsRes.containsAll(vsExpected) && vsExpected.containsAll(vsRes));
145     }
146
147     @Test
148     public void testFindChildrenOfType() throws AAIException {
149         // setup
150         Graph graph = TinkerGraph.open();
151
152         Vertex gv = graph.addVertex(T.id, "00", "aai-node-type", "generic-vnf");
153         Vertex lint1 = graph.addVertex(T.id, "10", "aai-node-type", "l-interface");
154         Vertex lint2 = graph.addVertex(T.id, "11", "aai-node-type", "l-interface");
155         Vertex lag = graph.addVertex(T.id, "20", "aai-node-type", "lag-interface");
156         Vertex lint3 = graph.addVertex(T.id, "12", "aai-node-type", "l-interface");
157
158         GraphTraversalSource g = graph.traversal();
159
160         edgeSer.addTreeEdge(g, gv, lint1);
161         edgeSer.addTreeEdge(g, gv, lint2);
162         edgeSer.addTreeEdge(g, gv, lag);
163         edgeSer.addTreeEdge(g, lag, lint3);
164
165         List<Vertex> expected = new ArrayList<>(Arrays.asList(lint1, lint2));
166
167         GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
168
169         // test
170         List<Vertex> results = engine.findChildrenOfType(gv, "l-interface");
171         assertTrue(results.containsAll(expected) && expected.containsAll(results));
172     }
173
174     @Test
175     public void testFindChildren() throws AAIException {
176         // setup
177         Graph graph = TinkerGraph.open();
178
179         Vertex gv = graph.addVertex(T.id, "00", "aai-node-type", "generic-vnf");
180         Vertex lint1 = 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 lag = graph.addVertex(T.id, "20", "aai-node-type", "lag-interface");
183         Vertex lint3 = graph.addVertex(T.id, "12", "aai-node-type", "l-interface");
184
185         GraphTraversalSource g = graph.traversal();
186
187         edgeSer.addTreeEdge(g, gv, lint1);
188         edgeSer.addTreeEdge(g, gv, lint2);
189         edgeSer.addTreeEdge(g, gv, lag);
190         edgeSer.addTreeEdge(g, lag, lint3);
191
192         List<Vertex> expected = new ArrayList<>(Arrays.asList(lint1, lint2, lag));
193
194         GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
195
196         // test
197         List<Vertex> results = engine.findChildren(gv);
198         assertTrue(results.containsAll(expected) && expected.containsAll(results));
199     }
200
201     @Test
202     public void testFindRelatedVertices() throws AAIException {
203         // setup
204
205         Graph graph = TinkerGraph.open();
206
207         Vertex gv = graph.addVertex(T.id, "00", "aai-node-type", "generic-vnf");
208         Vertex lint = graph.addVertex(T.id, "10", "aai-node-type", "l-interface");
209         Vertex lint2 = graph.addVertex(T.id, "11", "aai-node-type", "l-interface");
210         Vertex log = graph.addVertex(T.id, "20", "aai-node-type", "logical-link");
211
212         GraphTraversalSource g = graph.traversal();
213
214         edgeSer.addTreeEdge(g, gv, lint);
215         edgeSer.addEdge(g, lint, log);
216         edgeSer.addEdge(g, log, lint2);
217
218         List<Vertex> outExpected = new ArrayList<>(Arrays.asList(lint));
219         List<Vertex> inExpected = new ArrayList<>(Arrays.asList(lint, lint2));
220         List<Vertex> bothExpected = new ArrayList<>(Arrays.asList(log));
221
222         GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
223
224         // test
225         List<Vertex> outRes = engine.findRelatedVertices(gv, Direction.IN, "org.onap.relationships.inventory.BelongsTo",
226                 "l-interface");
227         assertTrue(outRes.containsAll(outExpected) && outExpected.containsAll(outRes));
228
229         List<Vertex> inRes =
230                 engine.findRelatedVertices(log, Direction.IN, "tosca.relationships.network.LinksTo", "l-interface");
231         assertTrue(inRes.containsAll(inExpected) && inExpected.containsAll(inRes));
232
233         List<Vertex> bothRes =
234                 engine.findRelatedVertices(lint, Direction.BOTH, "tosca.relationships.network.LinksTo", "logical-link");
235         assertTrue(bothRes.containsAll(bothExpected) && bothExpected.containsAll(bothRes));
236     }
237
238     @Test
239     public void testFindSubGraph() throws AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException {
240         // setup
241         Graph graph = TinkerGraph.open();
242
243         Vertex cr = graph.addVertex(T.id, "00", "aai-node-type", "cloud-region");
244         Vertex ten = graph.addVertex(T.id, "10", "aai-node-type", "tenant");
245         Vertex ten2 = graph.addVertex(T.id, "11", "aai-node-type", "tenant");
246         Vertex vs = graph.addVertex(T.id, "20", "aai-node-type", "vserver");
247         Vertex vs2 = graph.addVertex(T.id, "21", "aai-node-type", "vserver");
248         Vertex lint = graph.addVertex(T.id, "30", "aai-node-type", "l-interface");
249         Vertex comp = graph.addVertex(T.id, "40", "aai-node-type", "complex");
250         Vertex ctag = graph.addVertex(T.id, "50", "aai-node-type", "ctag-pool");
251         Vertex gv = graph.addVertex(T.id, "60", "aai-node-type", "generic-vnf");
252         Vertex lag = graph.addVertex(T.id, "70", "aai-node-type", "lag-interface");
253         Vertex lint2 = graph.addVertex(T.id, "31", "aai-node-type", "l-interface");
254         Vertex log = graph.addVertex(T.id, "80", "aai-node-type", "logical-link");
255         Vertex vnfc = graph.addVertex(T.id, "90", "aai-node-type", "vnfc");
256         Vertex modelVer = graph.addVertex(T.id, "100", "aai-node-type", "model-ver");
257
258         GraphTraversalSource g = graph.traversal();
259
260         Edge crTen = edgeSer.addTreeEdge(g, cr, ten);
261         Edge crTen2 = edgeSer.addTreeEdge(g, cr, ten2);
262         Edge tenVs = edgeSer.addTreeEdge(g, ten, vs);
263         Edge tenVs2 = edgeSer.addTreeEdge(g, ten, vs2);
264         Edge vsLInt = edgeSer.addTreeEdge(g, vs, lint);
265         Edge lintLog = edgeSer.addEdge(g, lint, log);
266         Edge vsGv = edgeSer.addEdge(g, vs, gv);
267         edgeSer.addEdge(g, gv, vnfc);
268
269         edgeSer.addTreeEdge(g, gv, lag);
270         edgeSer.addTreeEdge(g, lag, lint2);
271         Edge modelVerEdge = edgeSer.addPrivateEdge(g, gv, modelVer, null);
272
273         edgeSer.addTreeEdge(g, comp, ctag);
274         Edge crComp = edgeSer.addEdge(g, cr, comp);
275
276         // findSubGraph(cr, 0, true)
277         List<Element> expected1 = new ArrayList<>(Arrays.asList(cr));
278         // findSubGraph(cr, 2, true)
279         List<Element> expected2 = new ArrayList<>(Arrays.asList(cr, ten, ten2, vs, vs2, crTen, crTen2, tenVs, tenVs2));
280         // findSubGraph(cr)
281         List<Element> expected3 = new ArrayList<>(Arrays.asList(cr, ten, ten2, comp, vs, vs2, lint, gv, log, crTen,
282                 crTen2, crComp, tenVs, tenVs2, vsLInt, vsGv, lintLog));
283
284         GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
285
286         // test
287         Tree<Element> res1 = engine.findSubGraph(cr, 0, true);
288         Set<Element> resList1 = treeToList(res1);
289         assertTrue(resList1.containsAll(expected1) && expected1.containsAll(resList1));
290
291         Tree<Element> res2 = engine.findSubGraph(cr, 2, true);
292         Set<Element> resList2 = treeToList(res2);
293         assertTrue(resList2.containsAll(expected2) && expected2.containsAll(resList2));
294
295         Tree<Element> res3 = engine.findSubGraph(cr);
296         Set<Element> resList3 = treeToList(res3);
297         assertThat(resList3, containsInAnyOrder(expected3.toArray()));
298         // assertTrue(resList3.containsAll(expected3) && expected3.containsAll(resList3));
299     }
300
301     /**
302      * convenience helper method to make it easier to check the contents of the tree against
303      * a list of expected results
304      * 
305      * @param tree - the tree whose contents you want in collection form
306      * @return set of the contents of the tree
307      */
308     private Set<Element> treeToList(Tree<Element> tree) {
309         Set<Element> ret = new HashSet<>();
310
311         for (Element key : tree.keySet()) {
312             ret.add(key);
313             ret.addAll(treeToList(tree.get(key)));
314         }
315
316         return ret;
317     }
318
319     @Test
320     public void testFindEdgesForVersion() throws AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException {
321         // setup
322         Graph graph = TinkerGraph.open();
323
324         Vertex gv = graph.addVertex(T.id, "00", "aai-node-type", "generic-vnf");
325         Vertex vnfc = graph.addVertex(T.id, "10", "aai-node-type", "vnfc");
326         Vertex lob = graph.addVertex(T.id, "20", "aai-node-type", "line-of-business");
327         Vertex lint = graph.addVertex(T.id, "30", "aai-node-type", "l-interface");
328         Vertex mv = graph.addVertex(T.id, "40", "aai-node-type", "model-ver");
329         Vertex cr = graph.addVertex(T.id, "50", "aai-node-type", "cloud-region");
330         Vertex tn = graph.addVertex(T.id, "60", "aai-node-type", "tenant");
331
332         Edge cloudRegionToTenantEdge = tn.addEdge("some-edge", cr, CONTAINS.toString(), "NONE");
333
334         GraphTraversalSource g = graph.traversal();
335
336         edgeSer.addTreeEdge(g, gv, lint); // tree edge so shouldn't appear in results
337         Edge gvVnfc = edgeSer.addEdge(g, gv, vnfc);
338         edgeSer.addEdge(g, gv, lob); // v11/12 not v10
339         Edge gvMvEdge = edgeSer.addPrivateEdge(g, gv, mv, null);
340
341         List<Edge> expected = new ArrayList<>(Arrays.asList(gvVnfc));
342
343         GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
344
345         // test
346         Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getRelatedLinkVersion());
347         List<Edge> results = engine.findEdgesForVersion(gv, loader);
348         assertThat(results, containsInAnyOrder(expected.toArray()));
349
350         expected = new ArrayList<>(Arrays.asList(cloudRegionToTenantEdge));
351         results = engine.findEdgesForVersion(cr, loader);
352         assertThat(results, containsInAnyOrder(expected.toArray()));
353     }
354
355     @Test
356     public void testFindCousinVertices() throws AAIException {
357         // setup
358         Graph graph = TinkerGraph.open();
359
360         Vertex gv = graph.addVertex(T.id, "00", "aai-node-type", "generic-vnf");
361         Vertex vnfc = graph.addVertex(T.id, "10", "aai-node-type", "vnfc");
362         Vertex lob = graph.addVertex(T.id, "20", "aai-node-type", "line-of-business");
363         Vertex lint = graph.addVertex(T.id, "30", "aai-node-type", "l-interface");
364
365         GraphTraversalSource g = graph.traversal();
366
367         edgeSer.addTreeEdge(g, gv, lint); // tree edge so shouldn't appear in results
368         edgeSer.addEdge(g, gv, vnfc);
369         edgeSer.addEdge(g, gv, lob);
370
371         List<Vertex> expected = new ArrayList<>(Arrays.asList(vnfc, lob));
372
373         GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
374
375         // test
376         List<Vertex> results = engine.findCousinVertices(gv);
377         assertTrue(results.containsAll(expected) && expected.containsAll(results));
378     }
379 }