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=========================================================
20 package org.onap.aai.parsers.query;
22 import org.apache.tinkerpop.gremlin.process.traversal.P;
23 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
24 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
25 import org.apache.tinkerpop.gremlin.structure.Vertex;
26 import org.junit.Before;
27 import org.junit.Rule;
28 import org.junit.Test;
29 import org.junit.rules.ExpectedException;
30 import org.onap.aai.AAISetup;
31 import org.onap.aai.db.props.AAIProperties;
32 import org.onap.aai.exceptions.AAIException;
33 import org.onap.aai.introspection.LoaderFactory;
34 import org.onap.aai.introspection.ModelType;
35 import org.onap.aai.introspection.Version;
36 import org.onap.aai.rest.RestTokens;
37 import org.onap.aai.serialization.engines.QueryStyle;
38 import org.onap.aai.serialization.engines.TitanDBEngine;
39 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
41 import javax.ws.rs.core.MultivaluedHashMap;
42 import javax.ws.rs.core.MultivaluedMap;
43 import javax.ws.rs.core.UriBuilder;
44 import java.io.UnsupportedEncodingException;
46 import java.util.ArrayList;
47 import java.util.List;
49 import static org.hamcrest.CoreMatchers.containsString;
50 import static org.hamcrest.Matchers.hasProperty;
51 import static org.hamcrest.Matchers.is;
52 import static org.junit.Assert.assertEquals;
54 public class GraphTraversalTest extends AAISetup {
56 private TransactionalGraphEngine dbEngine;
57 private TransactionalGraphEngine dbEnginev9;
60 public ExpectedException thrown = ExpectedException.none();
65 * @throws SecurityException
66 * @throws NoSuchFieldException
69 public void configure() throws Exception {
71 new TitanDBEngine(QueryStyle.TRAVERSAL,
72 LoaderFactory.createLoaderForVersion(ModelType.MOXY, AAIProperties.LATEST),
76 new TitanDBEngine(QueryStyle.TRAVERSAL,
77 LoaderFactory.createLoaderForVersion(ModelType.MOXY, Version.v9),
84 * @throws UnsupportedEncodingException the unsupported encoding exception
85 * @throws AAIException the AAI exception
88 public void parentQuery() throws UnsupportedEncodingException, AAIException {
89 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1").build();
91 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
93 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start().has("physical-location-id", "key1").has("aai-node-type", "complex");
95 "gremlin query should be " + expected.toString(),
97 query.getQueryBuilder().getQuery().toString());
99 "parent gremlin query should be equal to normal query",
101 query.getQueryBuilder().getParentQuery().getQuery().toString());
103 "result type should be complex",
105 query.getResultType());
107 "result type should be empty",
109 query.getParentResultType());
110 assertEquals("dependent",false, query.isDependent());
118 * @throws UnsupportedEncodingException the unsupported encoding exception
119 * @throws AAIException the AAI exception
122 public void childQuery() throws UnsupportedEncodingException, AAIException {
123 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/ctag-pools/ctag-pool/key2/key3").build();
124 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
125 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
126 .has("physical-location-id", "key1").has("aai-node-type", "complex")
127 .in("org.onap.relationships.inventory.BelongsTo")
128 .has("aai-node-type", "ctag-pool")
129 .has("target-pe", "key2").has("availability-zone-name", "key3");
130 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
131 .has("physical-location-id", "key1").has("aai-node-type", "complex");
133 "gremlin query should be " + expected.toString(),
135 query.getQueryBuilder().getQuery().toString());
137 "parent gremlin query should be equal the query for complex",
138 expectedParent.toString(),
139 query.getQueryBuilder().getParentQuery().getQuery().toString());
141 "result type should be complex",
143 query.getParentResultType());
145 "result type should be ctag-pool",
147 query.getResultType());
148 assertEquals("dependent",true, query.isDependent());
156 * @throws UnsupportedEncodingException the unsupported encoding exception
157 * @throws AAIException the AAI exception
160 public void namingExceptions() throws UnsupportedEncodingException, AAIException {
161 URI uri = UriBuilder.fromPath("network/vces/vce/key1/port-groups/port-group/key2/cvlan-tags/cvlan-tag/655").build();
162 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
163 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
164 .has("vnf-id", "key1").has("aai-node-type", "vce")
165 .in("org.onap.relationships.inventory.BelongsTo")
166 .has("aai-node-type", "port-group")
167 .has("interface-id", "key2").in("org.onap.relationships.inventory.BelongsTo")
168 .has("aai-node-type", "cvlan-tag")
169 .has("cvlan-tag", 655);
170 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
171 .has("vnf-id", "key1").has("aai-node-type", "vce")
172 .in("org.onap.relationships.inventory.BelongsTo")
173 .has("aai-node-type", "port-group")
174 .has("interface-id", "key2");
176 "gremlin query should be " + expected.toString(),
178 query.getQueryBuilder().getQuery().toString());
180 "parent gremlin query should be equal the query for port group",
181 expectedParent.toString(),
182 query.getQueryBuilder().getParentQuery().getQuery().toString());
184 "result type should be cvlan-tag",
186 query.getResultType());
188 "result type should be port-group",
190 query.getParentResultType());
192 "contaner type should be empty",
194 query.getContainerType());
195 assertEquals("dependent",true, query.isDependent());
204 * @throws UnsupportedEncodingException the unsupported encoding exception
205 * @throws AAIException the AAI exception
208 public void getAll() throws UnsupportedEncodingException, AAIException {
209 URI uri = UriBuilder.fromPath("network/vces/vce/key1/port-groups/port-group/key2/cvlan-tags").build();
210 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
211 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
212 .has("vnf-id", "key1").has("aai-node-type", "vce")
213 .in("org.onap.relationships.inventory.BelongsTo")
214 .has("aai-node-type", "port-group")
215 .has("interface-id", "key2").in("org.onap.relationships.inventory.BelongsTo")
216 .has("aai-node-type", "cvlan-tag");
217 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
218 .has("vnf-id", "key1").has("aai-node-type", "vce")
219 .in("org.onap.relationships.inventory.BelongsTo")
220 .has("aai-node-type", "port-group")
221 .has("interface-id", "key2");
223 "gremlin query should be " + expected.toString(),
225 query.getQueryBuilder().getQuery().toString());
227 "parent gremlin query should be equal the query for port group",
228 expectedParent.toString(),
229 query.getQueryBuilder().getParentQuery().getQuery().toString());
231 "result type should be port-group",
233 query.getParentResultType());
235 "result type should be cvlan-tag",
237 query.getResultType());
239 "container type should be cvlan-tags",
241 query.getContainerType());
242 assertEquals("dependent",true, query.isDependent());
248 public void getAllParent() throws UnsupportedEncodingException, AAIException {
249 URI uri = UriBuilder.fromPath("cloud-infrastructure/pservers").build();
250 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
251 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
252 .has("aai-node-type", "pserver");
253 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
254 .has("aai-node-type", "pserver");
256 "gremlin query should be " + expected.toString(),
258 query.getQueryBuilder().getQuery().toString());
260 "parent gremlin query should be equal the query for pserver",
261 expectedParent.toString(),
262 query.getQueryBuilder().getParentQuery().getQuery().toString());
264 "parent result type should be empty",
266 query.getParentResultType());
268 "result type should be pserver",
270 query.getResultType());
272 "container type should be pservers",
274 query.getContainerType());
275 assertEquals("dependent",false, query.isDependent());
282 * Gets the via query param.
284 * @return the via query param
285 * @throws UnsupportedEncodingException the unsupported encoding exception
286 * @throws AAIException the AAI exception
289 public void getViaQueryParam() throws UnsupportedEncodingException, AAIException {
290 URI uri = UriBuilder.fromPath("cloud-infrastructure/cloud-regions/cloud-region/mycloudowner/mycloudregionid/tenants/tenant").build();
291 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
292 map.putSingle("tenant-name", "Tenant1");
293 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
294 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
295 .has("cloud-owner", "mycloudowner").has("cloud-region-id", "mycloudregionid")
296 .has("aai-node-type", "cloud-region")
297 .in("org.onap.relationships.inventory.BelongsTo")
298 .has("aai-node-type", "tenant")
299 .has("tenant-name", "Tenant1");
301 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
302 .has("cloud-owner", "mycloudowner").has("cloud-region-id", "mycloudregionid")
303 .has("aai-node-type", "cloud-region");
306 "gremlin query should be " + expected.toString(),
308 query.getQueryBuilder().getQuery().toString());
310 "parent gremlin query should be equal the query for cloud-region",
311 expectedParent.toString(),
312 query.getQueryBuilder().getParentQuery().getQuery().toString());
314 "result type should be cloud-region",
316 query.getParentResultType());
318 "result type should be tenant",
320 query.getResultType());
322 "container type should be empty",
324 query.getContainerType());
325 assertEquals("dependent",true, query.isDependent());
330 public void getViaDuplicateQueryParam() throws UnsupportedEncodingException, AAIException {
331 URI uri = UriBuilder.fromPath("cloud-infrastructure/cloud-regions/cloud-region/mycloudowner/mycloudregionid/tenants/tenant").build();
332 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
333 List<String> values = new ArrayList<>();
334 values.add("Tenant1");
335 values.add("Tenant2");
336 map.put("tenant-name", values);
337 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
338 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
339 .has("cloud-owner", "mycloudowner").has("cloud-region-id", "mycloudregionid")
340 .has("aai-node-type", "cloud-region")
341 .in("org.onap.relationships.inventory.BelongsTo")
342 .has("aai-node-type", "tenant")
343 .has("tenant-name", P.within(values));
345 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
346 .has("cloud-owner", "mycloudowner").has("cloud-region-id", "mycloudregionid")
347 .has("aai-node-type", "cloud-region");
350 "gremlin query should be " + expected.toString(),
352 query.getQueryBuilder().getQuery().toString());
354 "parent gremlin query should be equal the query for cloud-region",
355 expectedParent.toString(),
356 query.getQueryBuilder().getParentQuery().getQuery().toString());
358 "result type should be cloud-region",
360 query.getParentResultType());
362 "result type should be tenant",
364 query.getResultType());
366 "container type should be empty",
368 query.getContainerType());
369 assertEquals("dependent",true, query.isDependent());
374 * Gets the plural via query param.
376 * @return the plural via query param
377 * @throws UnsupportedEncodingException the unsupported encoding exception
378 * @throws AAIException the AAI exception
381 public void getPluralViaQueryParam() throws UnsupportedEncodingException, AAIException {
382 URI uri = UriBuilder.fromPath("network/vnfcs").build();
383 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
384 map.putSingle("prov-status", "up");
385 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
386 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
387 .has("aai-node-type", "vnfc")
388 .has("prov-status", "up");
390 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
391 .has("aai-node-type", "vnfc");
394 "gremlin query should be " + expected.toString(),
396 query.getQueryBuilder().getQuery().toString());
399 expectedParent.toString(),
400 query.getQueryBuilder().getParentQuery().getQuery().toString());
402 "parent result type should be empty",
404 query.getParentResultType());
406 "result type should be vnfc",
408 query.getResultType());
410 "container type should be empty",
412 query.getContainerType());
413 assertEquals("dependent",true, query.isDependent());
418 * Gets the all query param naming exception.
420 * @return the all query param naming exception
421 * @throws UnsupportedEncodingException the unsupported encoding exception
422 * @throws AAIException the AAI exception
425 public void getAllQueryParamNamingException() throws UnsupportedEncodingException, AAIException {
426 URI uri = UriBuilder.fromPath("network/vces/vce/key1/port-groups/port-group/key2/cvlan-tags").build();
427 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
428 map.putSingle("cvlan-tag", "333");
429 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
431 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
432 .has("vnf-id", "key1").has("aai-node-type", "vce")
433 .in("org.onap.relationships.inventory.BelongsTo")
434 .has("aai-node-type", "port-group")
435 .has("interface-id", "key2").in("org.onap.relationships.inventory.BelongsTo")
436 .has("aai-node-type", "cvlan-tag")
437 .has("cvlan-tag", 333);
438 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
439 .has("vnf-id", "key1").has("aai-node-type", "vce")
440 .in("org.onap.relationships.inventory.BelongsTo")
441 .has("aai-node-type", "port-group")
442 .has("interface-id", "key2");
444 "gremlin query should be " + expected.toString(),
446 query.getQueryBuilder().getQuery().toString());
448 "parent gremlin query should be equal the query for port group",
449 expectedParent.toString(),
450 query.getQueryBuilder().getParentQuery().getQuery().toString());
452 "result type should be port-group",
454 query.getParentResultType());
456 "result type should be cvlan-tag",
458 query.getResultType());
460 "container type should be cvlan-tags",
462 query.getContainerType());
463 assertEquals("dependent",true, query.isDependent());
471 * @throws UnsupportedEncodingException the unsupported encoding exception
472 * @throws AAIException the AAI exception
475 public void abstractType() throws UnsupportedEncodingException, AAIException {
476 URI uri = UriBuilder.fromPath("vnf/key1").build();
478 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
480 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
481 .has("vnf-id", "key1").has(AAIProperties.NODE_TYPE, P.within("vce", "generic-vnf"));
483 GraphTraversal<Vertex, Vertex> expectedParent = expected;
485 "gremlin query should be " + expected.toString(),
487 query.getQueryBuilder().getQuery().toString());
489 "parent gremlin query should be equal the query for port group",
490 expectedParent.toString(),
491 query.getQueryBuilder().getParentQuery().getQuery().toString());
493 "result type should be empty",
495 query.getParentResultType());
497 "result type should be vnf",
499 query.getResultType());
501 assertEquals("dependent",false, query.isDependent());
507 * Non parent abstract type.
509 * @throws UnsupportedEncodingException the unsupported encoding exception
510 * @throws AAIException the AAI exception
513 public void nonParentAbstractType() throws UnsupportedEncodingException, AAIException {
514 URI uri = UriBuilder.fromPath("cloud-infrastructure/pservers/pserver/key2/vnf/key1").build();
515 thrown.expect(AAIException.class);
516 thrown.expectMessage(containsString("not a valid path"));
517 dbEngine.getQueryBuilder().createQueryFromURI(uri);
521 public void parentAbstractTypeWithNesting() throws UnsupportedEncodingException, AAIException {
522 URI uri = UriBuilder.fromPath("vnf/key1/vf-modules/vf-module/key2").build();
524 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
526 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
527 .has("vnf-id", "key1").has(AAIProperties.NODE_TYPE, P.within("vce", "generic-vnf"))
528 .union(__.in("org.onap.relationships.inventory.BelongsTo").has(AAIProperties.NODE_TYPE, "vf-module")).has("vf-module-id", "key2");
530 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
531 .has("vnf-id", "key1").has(AAIProperties.NODE_TYPE, P.within("vce", "generic-vnf"));
533 "gremlin query should be " + expected.toString(),
535 query.getQueryBuilder().getQuery().toString());
537 "parent gremlin query should be equal the query for ",
538 expectedParent.toString(),
539 query.getQueryBuilder().getParentQuery().getQuery().toString());
541 "result type should be vnf",
543 query.getParentResultType());
545 "result type should be vf-module",
547 query.getResultType());
549 assertEquals("dependent",true, query.isDependent());
554 public void getViaBadQueryParam() throws UnsupportedEncodingException, AAIException {
555 URI uri = UriBuilder.fromPath("cloud-infrastructure/cloud-regions/cloud-region/a/b/tenants/tenant").build();
556 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
557 map.putSingle("tenant-n231ame", "Tenant1");
558 thrown.expect(AAIException.class);
559 thrown.expect(hasProperty("code", is("AAI_3000")));
561 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
566 public void getPluralViaBadQueryParam() throws UnsupportedEncodingException, AAIException {
567 URI uri = UriBuilder.fromPath("cloud-infrastructure/cloud-regions/cloud-region/a/b/tenants").build();
568 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
569 map.putSingle("tenant-n231ame", "Tenant1");
570 thrown.expect(AAIException.class);
571 thrown.expect(hasProperty("code", is("AAI_3000")));
573 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
578 public void getPluralViaDuplicateQueryParam() throws UnsupportedEncodingException, AAIException {
579 URI uri = UriBuilder.fromPath("network/vnfcs").build();
580 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
581 List<String> values = new ArrayList<>();
587 map.put("prov-status", values);
588 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
589 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
590 .has("aai-node-type", "vnfc")
591 .has("prov-status", P.within(values));
593 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
594 .has("aai-node-type", "vnfc");
597 "gremlin query should be " + expected.toString(),
599 query.getQueryBuilder().getQuery().toString());
602 expectedParent.toString(),
603 query.getQueryBuilder().getParentQuery().getQuery().toString());
605 "parent result type should be empty",
607 query.getParentResultType());
609 "result type should be vnfc",
611 query.getResultType());
613 "container type should be empty",
615 query.getContainerType());
616 assertEquals("dependent",true, query.isDependent());
621 public void dbAliasedSearch() throws UnsupportedEncodingException, AAIException {
622 URI uri = UriBuilder.fromPath("network/generic-vnfs").build();
623 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
624 map.putSingle("persona-model-customization-id", "key2");
625 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri, map);
626 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
627 .has("aai-node-type", "generic-vnf")
628 .has("model-customization-id", "key2");
629 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
630 .has("aai-node-type", "generic-vnf");
633 "gremlin query should be " + expected.toString(),
635 query.getQueryBuilder().getQuery().toString());
638 expectedParent.toString(),
639 query.getQueryBuilder().getParentQuery().getQuery().toString());
642 "result type should be",
644 query.getResultType());
646 "result type should be empty",
648 query.getParentResultType());
649 assertEquals("dependent",true, query.isDependent());
655 public void dataLinkedSearch() throws UnsupportedEncodingException, AAIException {
656 URI uri = UriBuilder.fromPath("network/vpn-bindings").build();
657 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
658 map.putSingle("global-route-target", "key2");
659 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri, map);
660 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
661 .has("aai-node-type", "vpn-binding")
662 .where(__.in("org.onap.relationships.inventory.BelongsTo").has(AAIProperties.NODE_TYPE, "route-target").has("global-route-target", "key2"));
663 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
664 .has("aai-node-type", "vpn-binding");
667 "gremlin query should be " + expected.toString(),
669 query.getQueryBuilder().getQuery().toString());
672 expectedParent.toString(),
673 query.getQueryBuilder().getParentQuery().getQuery().toString());
676 "result type should be",
678 query.getResultType());
680 "result type should be empty",
682 query.getParentResultType());
683 assertEquals("dependent",true, query.isDependent());
687 public void pluralCousin() throws UnsupportedEncodingException, AAIException {
688 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/related-to/pservers").build();
690 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);
691 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
692 .has("physical-location-id", "key1")
693 .has("aai-node-type", "complex")
694 .in("org.onap.relationships.inventory.LocatedIn").has("aai-node-type", "pserver");
695 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
696 .has("physical-location-id", "key1")
697 .has("aai-node-type", "complex");
700 "gremlin query should be " + expected.toString(),
702 query.getQueryBuilder().getQuery().toString());
705 expectedParent.toString(),
706 query.getQueryBuilder().getParentQuery().getQuery().toString());
709 "result type should be",
711 query.getResultType());
713 "result type should be",
715 query.getParentResultType());
716 //this is controversial but we're not allowing writes on this currently
717 assertEquals("dependent",true, query.isDependent());
721 public void specificCousin() throws UnsupportedEncodingException, AAIException {
722 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/related-to/pservers/pserver/key2").build();
724 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);
725 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
726 .has("physical-location-id", "key1")
727 .has("aai-node-type", "complex")
728 .in("org.onap.relationships.inventory.LocatedIn").has("aai-node-type", "pserver")
729 .has("hostname", "key2");
730 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
731 .has("physical-location-id", "key1")
732 .has("aai-node-type", "complex");
735 "gremlin query should be " + expected.toString(),
737 query.getQueryBuilder().getQuery().toString());
740 expectedParent.toString(),
741 query.getQueryBuilder().getParentQuery().getQuery().toString());
744 "result type should be",
746 query.getResultType());
748 "result type should be",
750 query.getParentResultType());
751 //this is controversial but we're not allowing writes on this currently
752 assertEquals("dependent",true, query.isDependent());
756 public void doubleSpecificCousin() throws UnsupportedEncodingException, AAIException {
757 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/related-to/pservers/pserver/key2/related-to/vservers/vserver/key3").build();
759 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);
760 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
761 .has("physical-location-id", "key1")
762 .has("aai-node-type", "complex")
763 .in("org.onap.relationships.inventory.LocatedIn").has("aai-node-type", "pserver")
764 .has("hostname", "key2")
765 .in("tosca.relationships.HostedOn").has("aai-node-type", "vserver")
766 .has("vserver-id", "key3");
767 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
768 .has("physical-location-id", "key1")
769 .has("aai-node-type", "complex")
770 .in("org.onap.relationships.inventory.LocatedIn").has("aai-node-type", "pserver")
771 .has("hostname", "key2");
774 "gremlin query should be " + expected.toString(),
776 query.getQueryBuilder().getQuery().toString());
779 expectedParent.toString(),
780 query.getQueryBuilder().getParentQuery().getQuery().toString());
783 "result type should be",
785 query.getResultType());
787 "result type should be",
789 query.getParentResultType());
790 //this is controversial but we're not allowing writes on this currently
791 assertEquals("dependent",true, query.isDependent());
795 public void traversalEndsInRelatedTo() throws UnsupportedEncodingException, AAIException {
796 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/related-to").build();
798 thrown.expect(AAIException.class);
799 thrown.expectMessage(containsString(RestTokens.COUSIN.toString()));
800 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);
805 public void pluralCousinToPluralCousin() throws UnsupportedEncodingException, AAIException {
806 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/related-to/pservers").build();
808 thrown.expect(AAIException.class);
809 thrown.expectMessage(containsString("chain plurals"));
810 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);