[AAI] Fix doc config files
[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 com.jayway.jsonpath.JsonPath;
30
31 import java.io.InputStream;
32 import java.util.*;
33
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;
48
49 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
50 public class GraphTraversalQueryEngineTest extends AAISetup {
51
52     @Autowired
53     EdgeSerializer edgeSer;
54
55     @Test
56     public void testFindParents() throws AAIException {
57         // setup
58         Graph graph = TinkerGraph.open();
59
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");
63
64         GraphTraversalSource g = graph.traversal();
65
66         edgeSer.addTreeEdge(g, cloudreg, tenant);
67         edgeSer.addTreeEdge(g, tenant, vserver);
68
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
73
74         GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
75
76         // test
77         List<Vertex> crRes = engine.findParents(cloudreg);
78         assertTrue(crRes.containsAll(crExpected) && crExpected.containsAll(crRes));
79
80         List<Vertex> tenRes = engine.findParents(tenant);
81         assertTrue(tenRes.containsAll(tenExpected) && tenExpected.containsAll(tenRes));
82
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));
89     }
90
91     @Test
92     public void testFindAllParentsGivenAaiUris() {
93
94         // setup
95         Graph graph = TinkerGraph.open();
96
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");
103
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"};
108
109         GraphTraversalSource g = graph.traversal();
110         GraphTraversalQueryEngine queryEngine = new GraphTraversalQueryEngine(g);
111         List<Vertex> vertices = queryEngine.findParents(uris);
112
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));
117     }
118
119     @Test
120     public void testFindAllChildren() throws AAIException {
121         // setup
122         Graph graph = TinkerGraph.open();
123
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");
129
130         GraphTraversalSource g = graph.traversal();
131
132         edgeSer.addTreeEdge(g, cloudreg, tenant);
133         edgeSer.addTreeEdge(g, tenant, vserver);
134         edgeSer.addTreeEdge(g, tenant, vserver2);
135         edgeSer.addTreeEdge(g, cloudreg, oam);
136
137         List<Vertex> crExpected = new ArrayList<>(Arrays.asList(cloudreg, tenant, vserver, vserver2, oam));
138         List<Vertex> vsExpected = new ArrayList<>(Arrays.asList(vserver));
139
140         GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
141
142         // test
143         List<Vertex> crRes = engine.findAllChildren(cloudreg);
144         assertTrue(crRes.containsAll(crExpected) && crExpected.containsAll(crRes));
145
146         List<Vertex> vsRes = engine.findAllChildren(vserver);
147         assertTrue(vsRes.containsAll(vsExpected) && vsExpected.containsAll(vsRes));
148     }
149
150     @Test
151     public void testFindChildrenOfType() throws AAIException {
152         // setup
153         Graph graph = TinkerGraph.open();
154
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");
160
161         GraphTraversalSource g = graph.traversal();
162
163         edgeSer.addTreeEdge(g, gv, lint1);
164         edgeSer.addTreeEdge(g, gv, lint2);
165         edgeSer.addTreeEdge(g, gv, lag);
166         edgeSer.addTreeEdge(g, lag, lint3);
167
168         List<Vertex> expected = new ArrayList<>(Arrays.asList(lint1, lint2));
169
170         GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
171
172         // test
173         List<Vertex> results = engine.findChildrenOfType(gv, "l-interface");
174         assertTrue(results.containsAll(expected) && expected.containsAll(results));
175     }
176
177     @Test
178     public void testFindChildren() throws AAIException {
179         // setup
180         Graph graph = TinkerGraph.open();
181
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");
187
188         GraphTraversalSource g = graph.traversal();
189
190         edgeSer.addTreeEdge(g, gv, lint1);
191         edgeSer.addTreeEdge(g, gv, lint2);
192         edgeSer.addTreeEdge(g, gv, lag);
193         edgeSer.addTreeEdge(g, lag, lint3);
194
195         List<Vertex> expected = new ArrayList<>(Arrays.asList(lint1, lint2, lag));
196
197         GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
198
199         // test
200         List<Vertex> results = engine.findChildren(gv);
201         assertTrue(results.containsAll(expected) && expected.containsAll(results));
202     }
203
204     @Test
205     public void testFindRelatedVertices() throws AAIException {
206         // setup
207
208         Graph graph = TinkerGraph.open();
209
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");
214
215         GraphTraversalSource g = graph.traversal();
216
217         edgeSer.addTreeEdge(g, gv, lint);
218         edgeSer.addEdge(g, lint, log);
219         edgeSer.addEdge(g, log, lint2);
220
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));
224
225         GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
226
227         // test
228         List<Vertex> outRes = engine.findRelatedVertices(gv, Direction.IN, "org.onap.relationships.inventory.BelongsTo",
229                 "l-interface");
230         assertTrue(outRes.containsAll(outExpected) && outExpected.containsAll(outRes));
231
232         List<Vertex> inRes =
233                 engine.findRelatedVertices(log, Direction.IN, "tosca.relationships.network.LinksTo", "l-interface");
234         assertTrue(inRes.containsAll(inExpected) && inExpected.containsAll(inRes));
235
236         List<Vertex> bothRes =
237                 engine.findRelatedVertices(lint, Direction.BOTH, "tosca.relationships.network.LinksTo", "logical-link");
238         assertTrue(bothRes.containsAll(bothExpected) && bothExpected.containsAll(bothRes));
239     }
240
241     @Test
242     public void testFindSubGraph() throws AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException {
243         // setup
244         Graph graph = TinkerGraph.open();
245
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");
260
261         GraphTraversalSource g = graph.traversal();
262
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);
271
272         edgeSer.addTreeEdge(g, gv, lag);
273         edgeSer.addTreeEdge(g, lag, lint2);
274         Edge modelVerEdge = edgeSer.addPrivateEdge(g, gv, modelVer, null);
275
276         edgeSer.addTreeEdge(g, comp, ctag);
277         Edge crComp = edgeSer.addEdge(g, cr, comp);
278
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));
283         // findSubGraph(cr)
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));
286
287         GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
288
289         // test
290         Tree<Element> res1 = engine.findSubGraph(cr, 0, true);
291         Set<Element> resList1 = treeToList(res1);
292         assertTrue(resList1.containsAll(expected1) && expected1.containsAll(resList1));
293
294         Tree<Element> res2 = engine.findSubGraph(cr, 2, true);
295         Set<Element> resList2 = treeToList(res2);
296         assertTrue(resList2.containsAll(expected2) && expected2.containsAll(resList2));
297
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));
302     }
303
304     /**
305      * convenience helper method to make it easier to check the contents of the tree against
306      * a list of expected results
307      * 
308      * @param tree - the tree whose contents you want in collection form
309      * @return set of the contents of the tree
310      */
311     private Set<Element> treeToList(Tree<Element> tree) {
312         Set<Element> ret = new HashSet<>();
313
314         for (Element key : tree.keySet()) {
315             ret.add(key);
316             ret.addAll(treeToList(tree.get(key)));
317         }
318
319         return ret;
320     }
321
322     @Test
323     public void testFindEdgesForVersion() throws AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException {
324         // setup
325         Graph graph = TinkerGraph.open();
326
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");
334
335         Edge cloudRegionToTenantEdge = tn.addEdge("some-edge", cr, CONTAINS.toString(), "NONE");
336
337         GraphTraversalSource g = graph.traversal();
338
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);
343
344         List<Edge> expected = new ArrayList<>(Arrays.asList(gvVnfc));
345
346         GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
347
348         // test
349         Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getRelatedLinkVersion());
350         List<Edge> results = engine.findEdgesForVersion(gv, loader);
351         assertThat(results, containsInAnyOrder(expected.toArray()));
352
353         expected = new ArrayList<>(Arrays.asList(cloudRegionToTenantEdge));
354         results = engine.findEdgesForVersion(cr, loader);
355         assertThat(results, containsInAnyOrder(expected.toArray()));
356     }
357
358     @Test
359     public void testFindCousinVertices() throws AAIException {
360         // setup
361         Graph graph = TinkerGraph.open();
362
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");
367
368         GraphTraversalSource g = graph.traversal();
369
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);
373
374         List<Vertex> expected = new ArrayList<>(Arrays.asList(vnfc, lob));
375
376         GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
377
378         // test
379         List<Vertex> results = engine.findCousinVertices(gv);
380         assertTrue(results.containsAll(expected) && expected.containsAll(results));
381     }
382 }