a24855b8c23be0b492d2922b7258cea766ab71d4
[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 package org.onap.aai.serialization.engines.query;
21
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;
37
38 import java.io.InputStream;
39 import java.util.*;
40
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;
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 testFindAllChildren() throws AAIException {
90                 //setup
91                 Graph graph = TinkerGraph.open();
92                 
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");
98                 
99                 GraphTraversalSource g = graph.traversal();
100                 
101                 edgeSer.addTreeEdge(g, cloudreg, tenant);
102                 edgeSer.addTreeEdge(g, tenant, vserver);
103                 edgeSer.addTreeEdge(g, tenant, vserver2);
104                 edgeSer.addTreeEdge(g, cloudreg, oam);
105                 
106                 List<Vertex> crExpected = new ArrayList<>(Arrays.asList(cloudreg, tenant, vserver, vserver2, oam));
107                 List<Vertex> vsExpected = new ArrayList<>(Arrays.asList(vserver));
108                 
109                 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
110                 
111                 //test
112                 List<Vertex> crRes = engine.findAllChildren(cloudreg);
113                 assertTrue(crRes.containsAll(crExpected) && crExpected.containsAll(crRes));
114                 
115                 List<Vertex> vsRes = engine.findAllChildren(vserver);
116                 assertTrue(vsRes.containsAll(vsExpected) && vsExpected.containsAll(vsRes));
117         }
118         
119         @Test
120         public void testFindChildrenOfType() throws AAIException {
121                 //setup
122                 Graph graph = TinkerGraph.open();
123                 
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");
129                 
130                 GraphTraversalSource g = graph.traversal();
131                 
132                 edgeSer.addTreeEdge(g, gv, lint1);
133                 edgeSer.addTreeEdge(g, gv, lint2);
134                 edgeSer.addTreeEdge(g, gv, lag);
135                 edgeSer.addTreeEdge(g, lag, lint3);
136                 
137                 List<Vertex> expected = new ArrayList<>(Arrays.asList(lint1, lint2));
138                 
139                 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
140                 
141                 //test
142                 List<Vertex> results = engine.findChildrenOfType(gv, "l-interface");
143                 assertTrue(results.containsAll(expected) && expected.containsAll(results));
144         }
145         
146         @Test
147         public void testFindChildren() throws AAIException {
148                 //setup
149                 Graph graph = TinkerGraph.open();
150                 
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");
156                 
157                 GraphTraversalSource g = graph.traversal();
158                 
159                 edgeSer.addTreeEdge(g, gv, lint1);
160                 edgeSer.addTreeEdge(g, gv, lint2);
161                 edgeSer.addTreeEdge(g, gv, lag);
162                 edgeSer.addTreeEdge(g, lag, lint3);
163                 
164                 List<Vertex> expected = new ArrayList<>(Arrays.asList(lint1, lint2, lag));
165                 
166                 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
167                 
168                 //test
169                 List<Vertex> results = engine.findChildren(gv);
170                 assertTrue(results.containsAll(expected) && expected.containsAll(results));
171         }
172         
173         @Test
174         public void testFindRelatedVertices() throws AAIException {
175                 //setup
176                 
177                 Graph graph = TinkerGraph.open();
178                 
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");
183                 
184                 GraphTraversalSource g = graph.traversal();
185                 
186                 edgeSer.addTreeEdge(g, gv, lint);
187                 edgeSer.addEdge(g, lint, log);
188                 edgeSer.addEdge(g, log, lint2);
189                 
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));
193                 
194                 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
195                         
196                 //test
197                 List<Vertex> outRes = engine.findRelatedVertices(gv, Direction.IN, "org.onap.relationships.inventory.BelongsTo", "l-interface");
198                 assertTrue(outRes.containsAll(outExpected) && outExpected.containsAll(outRes));
199
200                 List<Vertex> inRes = engine.findRelatedVertices(log, Direction.IN, "tosca.relationships.network.LinksTo", "l-interface");
201                 assertTrue(inRes.containsAll(inExpected) && inExpected.containsAll(inRes));
202                 
203                 List<Vertex> bothRes = engine.findRelatedVertices(lint, Direction.BOTH, "tosca.relationships.network.LinksTo", "logical-link");
204                 assertTrue(bothRes.containsAll(bothExpected) && bothExpected.containsAll(bothRes));
205         }
206         
207         @Test
208         public void testFindSubGraph() throws AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException {
209                 //setup
210                 Graph graph = TinkerGraph.open();
211                 
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");
226
227                 GraphTraversalSource g = graph.traversal();
228                 
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);
237                 
238                 edgeSer.addTreeEdge(g, gv, lag);
239                 edgeSer.addTreeEdge(g, lag, lint2);
240         Edge modelVerEdge = edgeSer.addPrivateEdge(g, gv, modelVer, null);
241
242                 edgeSer.addTreeEdge(g, comp, ctag);
243                 Edge crComp = edgeSer.addEdge(g, cr, comp);
244                 
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));
250                 //findSubGraph(cr)
251                 List<Element> expected3 = new ArrayList<>(Arrays.asList(cr, ten, ten2, comp, vs, vs2, lint, gv, log,
252                                                                                                                                 crTen, crTen2, crComp, tenVs, tenVs2, vsLInt, 
253                                                                                                                                 vsGv, lintLog));
254                 
255                 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
256                 
257                 //test
258                 Tree<Element> res1 = engine.findSubGraph(cr, 0, true);
259                 Set<Element> resList1 = treeToList(res1);
260                 assertTrue(resList1.containsAll(expected1) && expected1.containsAll(resList1));
261                 
262                 Tree<Element> res2 = engine.findSubGraph(cr, 2, true);
263                 Set<Element> resList2 = treeToList(res2);
264                 assertTrue(resList2.containsAll(expected2) && expected2.containsAll(resList2));
265                 
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));
270         }
271         
272         /**
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
277          */
278         private Set<Element> treeToList(Tree<Element> tree) {
279                 Set<Element> ret = new HashSet<>();
280                 
281                 for (Element key : tree.keySet()) {
282                         ret.add(key);
283                         ret.addAll(treeToList(tree.get(key)));
284                 }
285                 
286                 return ret;
287         }
288         
289         @Test
290         public void testFindEdgesForVersion() throws AAIException, EdgeRuleNotFoundException, AmbiguousRuleChoiceException {
291                 //setup
292                 Graph graph = TinkerGraph.open();
293                 
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");
301
302                 Edge cloudRegionToTenantEdge = tn
303                          .addEdge("some-edge", cr, CONTAINS.toString(), "NONE");
304
305                 GraphTraversalSource g = graph.traversal();
306                 
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);
311
312                 List<Edge> expected = new ArrayList<>(Arrays.asList(gvVnfc));
313                 
314                 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
315                 
316                 //test
317                 Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getRelatedLinkVersion());
318                 List<Edge> results = engine.findEdgesForVersion(gv, loader);
319                 assertThat(results, containsInAnyOrder(expected.toArray()));
320
321         expected = new ArrayList<>(Arrays.asList(cloudRegionToTenantEdge));
322                 results = engine.findEdgesForVersion(cr, loader);
323                 assertThat(results, containsInAnyOrder(expected.toArray()));
324         }
325         
326         @Test
327         public void testFindCousinVertices() throws AAIException {
328                 //setup
329                 Graph graph = TinkerGraph.open();
330                 
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");
335                 
336                 GraphTraversalSource g = graph.traversal();
337                 
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);
341                 
342                 List<Vertex> expected = new ArrayList<>(Arrays.asList(vnfc, lob));
343                 
344                 GraphTraversalQueryEngine engine = new GraphTraversalQueryEngine(g);
345                 
346                 //test
347                 List<Vertex> results = engine.findCousinVertices(gv);
348                 assertTrue(results.containsAll(expected) && expected.containsAll(results));
349         }
350 }