2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 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.parsers.query;
23 import static org.hamcrest.CoreMatchers.startsWith;
24 import static org.junit.Assert.assertEquals;
26 import java.io.UnsupportedEncodingException;
29 import javax.ws.rs.core.MultivaluedHashMap;
30 import javax.ws.rs.core.MultivaluedMap;
32 import org.junit.BeforeClass;
33 import org.junit.Rule;
34 import org.junit.Test;
35 import org.junit.rules.ExpectedException;
37 import org.onap.aai.db.AAIProperties;
38 import org.onap.aai.exceptions.AAIException;
39 import org.onap.aai.introspection.LoaderFactory;
40 import org.onap.aai.introspection.ModelType;
41 import org.onap.aai.introspection.Version;
42 import org.onap.aai.logging.LogLineBuilder;
43 import org.onap.aai.serialization.engines.QueryStyle;
44 import org.onap.aai.serialization.engines.JanusGraphDBEngine;
45 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
47 import com.tinkerpop.gremlin.java.GremlinPipeline;
48 import com.tinkerpop.pipes.IdentityPipe;
50 public class GremlinPipelineTraversalTest {
52 private TransactionalGraphEngine dbEngine =
53 new JanusGraphDBEngine(QueryStyle.GREMLINPIPELINE_TRAVERSAL,
54 LoaderFactory.createLoaderForVersion(ModelType.MOXY, Version.v7, new LogLineBuilder("TEST", "TEST")),
57 private TransactionalGraphEngine dbEnginev6 =
58 new JanusGraphDBEngine(QueryStyle.GREMLINPIPELINE_TRAVERSAL,
59 LoaderFactory.createLoaderForVersion(ModelType.MOXY, Version.v6, new LogLineBuilder("TEST", "TEST")),
63 public ExpectedException thrown = ExpectedException.none();
66 public static void configure() {
67 System.setProperty("AJSC_HOME", ".");
68 System.setProperty("BUNDLECONFIG_DIR", "bundleconfig-local");
72 public void parentQuery() throws UnsupportedEncodingException, AAIException {
73 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1").build();
75 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
77 GremlinPipeline expected = new GremlinPipeline(new IdentityPipe()).V().has("physical-location-id", "key1").has("aai-node-type", "complex");
79 "gremlin query should be " + expected.toString(),
81 query.getQueryBuilder().getQuery().toString());
83 "parent gremlin query should be equal to normal query",
85 query.getQueryBuilder().getParentQuery().toString());
87 "result type should be complex",
89 query.getResultType());
91 "result type should be empty",
93 query.getParentResultType());
94 assertEquals("dependent",false, query.isDependent());
100 public void childQuery() throws UnsupportedEncodingException, AAIException {
101 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/ctag-pools/ctag-pool/key2/key3").build();
102 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
103 GremlinPipeline expected = new GremlinPipeline(new IdentityPipe()).V()
104 .has("physical-location-id", "key1").has("aai-node-type", "complex")
105 .in("org.onap.relationships.inventory.BelongsTo")
106 .has("target-pe", "key2").has("availability-zone-name", "key3");
107 GremlinPipeline expectedParent = new GremlinPipeline(new IdentityPipe()).V()
108 .has("physical-location-id", "key1").has("aai-node-type", "complex");
110 "gremlin query should be " + expected.toString(),
112 query.getQueryBuilder().getQuery().toString());
114 "parent gremlin query should be equal the query for complex",
115 expectedParent.toString(),
116 query.getQueryBuilder().getParentQuery().toString());
118 "result type should be complex",
120 query.getParentResultType());
122 "result type should be ctag-pool",
124 query.getResultType());
125 assertEquals("dependent",true, query.isDependent());
131 public void namingExceptions() throws UnsupportedEncodingException, AAIException {
132 URI uri = UriBuilder.fromPath("network/vces/vce/key1/port-groups/port-group/key2/cvlan-tags/cvlan-tag/655").build();
133 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
134 GremlinPipeline expected = new GremlinPipeline(new IdentityPipe()).V()
135 .has("vnf-id", "key1").has("aai-node-type", "vce")
136 .in("org.onap.relationships.inventory.BelongsTo")
137 .has("interface-id", "key2").in("org.onap.relationships.inventory.BelongsTo")
138 .has("cvlan-tag", 655);
139 GremlinPipeline expectedParent = new GremlinPipeline(new IdentityPipe()).V()
140 .has("vnf-id", "key1").has("aai-node-type", "vce")
141 .in("org.onap.relationships.inventory.BelongsTo")
142 .has("interface-id", "key2");
144 "gremlin query should be " + expected.toString(),
146 query.getQueryBuilder().getQuery().toString());
148 "parent gremlin query should be equal the query for port group",
149 expectedParent.toString(),
150 query.getQueryBuilder().getParentQuery().toString());
152 "result type should be cvlan-tag",
154 query.getResultType());
156 "result type should be port-group",
158 query.getParentResultType());
160 "contaner type should be empty",
162 query.getContainerType());
163 assertEquals("dependent",true, query.isDependent());
169 public void getAll() throws UnsupportedEncodingException, AAIException {
170 URI uri = UriBuilder.fromPath("network/vces/vce/key1/port-groups/port-group/key2/cvlan-tags").build();
171 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
172 GremlinPipeline expected = new GremlinPipeline(new IdentityPipe()).V()
173 .has("vnf-id", "key1").has("aai-node-type", "vce")
174 .in("org.onap.relationships.inventory.BelongsTo")
175 .has("interface-id", "key2").in("org.onap.relationships.inventory.BelongsTo")
176 .has("aai-node-type", "cvlan-tag");
177 GremlinPipeline expectedParent = new GremlinPipeline(new IdentityPipe()).V()
178 .has("vnf-id", "key1").has("aai-node-type", "vce")
179 .in("org.onap.relationships.inventory.BelongsTo")
180 .has("interface-id", "key2");
182 "gremlin query should be " + expected.toString(),
184 query.getQueryBuilder().getQuery().toString());
186 "parent gremlin query should be equal the query for port group",
187 expectedParent.toString(),
188 query.getQueryBuilder().getParentQuery().toString());
190 "result type should be port-group",
192 query.getParentResultType());
194 "result type should be cvlan-tag",
196 query.getResultType());
198 "container type should be cvlan-tags",
200 query.getContainerType());
201 assertEquals("dependent",true, query.isDependent());
207 public void getItemAffectedByDefaultCloudRegion() throws UnsupportedEncodingException, AAIException {
208 URI uri = UriBuilder.fromPath("cloud-infrastructure/tenants/tenant/key1/vservers/vserver/key2/l-interfaces/l-interface/key3").build();
209 QueryParser query = dbEnginev6.getQueryBuilder().createQueryFromURI(uri);
210 GremlinPipeline expected = new GremlinPipeline(new IdentityPipe()).V()
211 .has("cloud-owner", "att-aic").has("aai-node-type", "cloud-region")
212 .has("cloud-region-id", "AAIAIC25")
213 .in("org.onap.relationships.inventory.BelongsTo")
214 .has("tenant-id", "key1")
215 .in("org.onap.relationships.inventory.BelongsTo")
216 .has("vserver-id", "key2")
217 .in("org.onap.relationships.inventory.BelongsTo")
218 .has("interface-name", "key3");
219 GremlinPipeline expectedParent = new GremlinPipeline(new IdentityPipe()).V()
220 .has("cloud-owner", "att-aic").has("aai-node-type", "cloud-region")
221 .has("cloud-region-id", "AAIAIC25")
222 .in("org.onap.relationships.inventory.BelongsTo")
223 .has("tenant-id", "key1")
224 .in("org.onap.relationships.inventory.BelongsTo")
225 .has("vserver-id", "key2");
227 "gremlin query should be " + expected.toString(),
229 query.getQueryBuilder().getQuery().toString());
231 "parent gremlin query should be equal the query for vserver",
232 expectedParent.toString(),
233 query.getQueryBuilder().getParentQuery().toString());
235 "result type should be vserver",
237 query.getParentResultType());
239 "result type should be l-interface",
241 query.getResultType());
243 "container type should be empty",
245 query.getContainerType());
246 assertEquals("dependent",true, query.isDependent());
251 public void getViaQueryParam() throws UnsupportedEncodingException, AAIException {
252 URI uri = UriBuilder.fromPath("cloud-infrastructure/tenants/tenant").build();
253 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
255 .has("tenant-name", "Tenant1");
257 .has("tenant-name", "Tenant2");
259 GremlinPipeline expectedParent = new GremlinPipeline(new IdentityPipe()).V()
260 .has("cloud-owner", "att-aic").has("aai-node-type", "cloud-region")
261 .has("cloud-region-id", "AAIAIC25");
264 "gremlin query should be " + expected.toString(),
266 query.getQueryBuilder().getQuery().toString());
268 "parent gremlin query should be equal the query for cloud-region",
269 expectedParent.toString(),
270 query.getQueryBuilder().getParentQuery().toString());
272 "result type should be cloud-region",
274 query.getParentResultType());
276 "result type should be tenant",
278 query.getResultType());
280 "container type should be empty",
282 query.getContainerType());
283 assertEquals("dependent",true, query.isDependent());
288 public void getPluralViaQueryParam() throws UnsupportedEncodingException, AAIException {
289 URI uri = UriBuilder.fromPath("network/vnfcs").build();
290 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
291 map.putSingle("prov-status", "up");
292 QueryParser query = dbEnginev6.getQueryBuilder().createQueryFromURI(uri, map);
293 GremlinPipeline expected = new GremlinPipeline(new IdentityPipe()).V()
294 .has("aai-node-type", "vnfc")
295 .has("prov-status", "up");
297 GremlinPipeline expectedParent = new GremlinPipeline(new IdentityPipe()).V()
298 .has("aai-node-type", "vnfc");
301 "gremlin query should be " + expected.toString(),
303 query.getQueryBuilder().getQuery().toString());
306 expectedParent.toString(),
307 query.getQueryBuilder().getParentQuery().toString());
309 "parent result type should be empty",
311 query.getParentResultType());
313 "result type should be vnfc",
315 query.getResultType());
317 "container type should be empty",
319 query.getContainerType());
320 assertEquals("dependent",true, query.isDependent());
325 public void getAllQueryParamNamingException() throws UnsupportedEncodingException, AAIException {
326 URI uri = UriBuilder.fromPath("network/vces/vce/key1/port-groups/port-group/key2/cvlan-tags").build();
327 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
328 map.putSingle("cvlan-tag", "333");
329 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
331 GremlinPipeline expected = new GremlinPipeline(new IdentityPipe()).V()
332 .has("vnf-id", "key1").has("aai-node-type", "vce")
333 .in("org.onap.relationships.inventory.BelongsTo")
334 .has("interface-id", "key2").in("org.onap.relationships.inventory.BelongsTo")
335 .has("aai-node-type", "cvlan-tag")
336 .has("cvlan-tag", 333);
337 GremlinPipeline expectedParent = new GremlinPipeline(new IdentityPipe()).V()
338 .has("vnf-id", "key1").has("aai-node-type", "vce")
339 .in("org.onap.relationships.inventory.BelongsTo")
340 .has("interface-id", "key2");
342 "gremlin query should be " + expected.toString(),
344 query.getQueryBuilder().getQuery().toString());
346 "parent gremlin query should be equal the query for port group",
347 expectedParent.toString(),
348 query.getQueryBuilder().getParentQuery().toString());
350 "result type should be port-group",
352 query.getParentResultType());
354 "result type should be cvlan-tag",
356 query.getResultType());
358 "container type should be cvlan-tags",
360 query.getContainerType());
361 assertEquals("dependent",true, query.isDependent());
367 public void abstractType() throws UnsupportedEncodingException, AAIException {
368 URI uri = UriBuilder.fromPath("vnf/key1").build();
370 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
372 GremlinPipeline expected = new GremlinPipeline(new IdentityPipe()).V()
373 .has("vnf-id", "key1").or(
374 new GremlinPipeline(new IdentityPipe()).has(AAIProperties.NODE_TYPE, "vce"),
375 new GremlinPipeline(new IdentityPipe()).has(AAIProperties.NODE_TYPE, "generic-vnf"));
377 GremlinPipeline expectedParent = expected;
379 "gremlin query should be " + expected.toString(),
381 query.getQueryBuilder().getQuery().toString());
383 "parent gremlin query should be equal the query for port group",
384 expectedParent.toString(),
385 query.getQueryBuilder().getParentQuery().toString());
387 "result type should be empty",
389 query.getParentResultType());
391 "result type should be vnf",
393 query.getResultType());
395 assertEquals("dependent",false, query.isDependent());
401 public void nonParentAbstractType() throws UnsupportedEncodingException, AAIException {
402 URI uri = UriBuilder.fromPath("cloud-infrastructure/pservers/pserver/key2/vnf/key1").build();
403 thrown.expect(AAIException.class);
404 thrown.expectMessage(startsWith("AAI_3001"));
405 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
412 public void parentAbstractTypeWithNesting() throws UnsupportedEncodingException, AAIException {
413 URI uri = UriBuilder.fromPath("vnf/key1/vf-modules/vf-module/key2").build();
415 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
417 GremlinPipeline expected = new GremlinPipeline(new IdentityPipe()).V()
418 .has("vnf-id", "key1").or(
419 new GremlinPipeline(new IdentityPipe()).has(AAIProperties.NODE_TYPE, "vce"),
420 new GremlinPipeline(new IdentityPipe()).has(AAIProperties.NODE_TYPE, "generic-vnf"))
421 .outE().has("isParent", true).inV().has("vf-module-id", "key2");
422 GremlinPipeline expectedParent = new GremlinPipeline(new IdentityPipe()).V()
423 .has("vnf-id", "key1").or(
424 new GremlinPipeline(new IdentityPipe()).has(AAIProperties.NODE_TYPE, "vce"),
425 new GremlinPipeline(new IdentityPipe()).has(AAIProperties.NODE_TYPE, "generic-vnf"));
427 "gremlin query should be " + expected.toString(),
429 query.getQueryBuilder().getQuery().toString());
431 "parent gremlin query should be equal the query for ",
432 expectedParent.toString(),
433 query.getQueryBuilder().getParentQuery().toString());
435 "result type should be vnf",
437 query.getParentResultType());
439 "result type should be vf-module",
441 query.getResultType());
443 assertEquals("dependent",true, query.isDependent());