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=========================================================
21 package org.onap.aai.serialization.db;
23 import com.google.gson.FieldNamingPolicy;
24 import com.google.gson.Gson;
25 import com.google.gson.GsonBuilder;
26 import org.apache.tinkerpop.gremlin.structure.Graph;
27 import org.apache.tinkerpop.gremlin.structure.Vertex;
28 import org.janusgraph.core.JanusGraphFactory;
29 import org.junit.Before;
30 import org.junit.BeforeClass;
31 import org.junit.Rule;
32 import org.junit.Test;
33 import org.junit.rules.ExpectedException;
34 import org.junit.runner.RunWith;
35 import org.junit.runners.Parameterized;
36 import org.onap.aai.AAISetup;
37 import org.onap.aai.db.props.AAIProperties;
38 import org.onap.aai.edges.EdgeIngestor;
39 import org.onap.aai.exceptions.AAIException;
40 import org.onap.aai.introspection.Introspector;
41 import org.onap.aai.introspection.Loader;
42 import org.onap.aai.introspection.ModelType;
43 import org.onap.aai.parsers.query.QueryParser;
44 import org.onap.aai.serialization.engines.JanusGraphDBEngine;
45 import org.onap.aai.serialization.engines.QueryStyle;
46 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
47 import org.onap.aai.setup.SchemaVersion;
48 import org.onap.aai.util.delta.DeltaAction;
49 import org.springframework.beans.factory.annotation.Autowired;
50 import org.springframework.test.annotation.DirtiesContext;
51 import org.springframework.test.context.TestPropertySource;
53 import java.io.UnsupportedEncodingException;
55 import java.net.URISyntaxException;
58 import static org.hamcrest.CoreMatchers.instanceOf;
59 import static org.junit.Assert.*;
61 @RunWith(value = Parameterized.class)
62 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
63 @TestPropertySource(properties = {
64 "delta.events.enabled=true",
66 public class DbSerializerDeltasTest extends AAISetup {
68 // to use, set thrown.expect to whatever your test needs
69 // this line establishes default of expecting no exception to be thrown
71 public ExpectedException thrown = ExpectedException.none();
73 protected static Graph graph;
76 protected EdgeSerializer edgeSer;
78 protected EdgeIngestor ei;
80 private SchemaVersion version;
81 private final ModelType introspectorFactoryType = ModelType.MOXY;
82 private Loader loader;
83 private TransactionalGraphEngine dbEngine;
84 private TransactionalGraphEngine engine; // for tests that aren't mocking the engine
86 @Parameterized.Parameter(value = 0)
87 public QueryStyle queryStyle;
89 @Parameterized.Parameters(name = "QueryStyle.{0}")
90 public static Collection<Object[]> data() {
91 return Arrays.asList(new Object[][] {{QueryStyle.TRAVERSAL}, {QueryStyle.TRAVERSAL_URI}});
95 public static void init() throws Exception {
96 graph = JanusGraphFactory.build().set("storage.backend", "inmemory").open();
101 public void setup() throws Exception {
103 version = schemaVersions.getDefaultVersion();
104 loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, version);
105 dbEngine = new JanusGraphDBEngine(queryStyle, loader);
106 engine = new JanusGraphDBEngine(queryStyle, loader);
110 public void createTopLevelThenUpdateTest() throws AAIException, UnsupportedEncodingException, URISyntaxException {
111 engine.startTransaction();
113 DBSerializer dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "AAI-TEST", AAIProperties.MINIMUM_DEPTH);
114 Introspector gvnf = loader.introspectorFromName("generic-vnf");
115 Vertex gvnfVert = dbserLocal.createNewVertex(gvnf);
116 QueryParser uriQuery =
117 dbEngine.getQueryBuilder().createQueryFromURI(new URI("/network/generic-vnfs/generic-vnf/myvnf"));
119 gvnf.setValue("vnf-id", "myvnf");
120 gvnf.setValue("vnf-type", "typo");
121 dbserLocal.serializeToDb(gvnf, gvnfVert, uriQuery, "generic-vnf", gvnf.marshal(false));
122 assertTrue("Original created vertex exists", engine.tx().traversal().V()
123 .has("aai-node-type", "generic-vnf")
124 .has("vnf-id", "myvnf")
125 .has("vnf-type", "typo")
129 assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get("/network/generic-vnfs/generic-vnf/myvnf").getAction());
130 assertEquals(4L, dbserLocal.getObjectDeltas().get("/network/generic-vnfs/generic-vnf/myvnf").getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
131 assertEquals(5L, dbserLocal.getObjectDeltas().get("/network/generic-vnfs/generic-vnf/myvnf").getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
132 dbserLocal.getObjectDeltas().values().forEach(od -> {
133 if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID) ) {
134 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
135 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
136 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
137 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
138 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
142 gvnf = dbserLocal.getLatestVersionView(gvnfVert);
143 gvnf.setValue("vnf-type", "new-typo");
144 dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "AAI-TEST", AAIProperties.MINIMUM_DEPTH);
145 dbserLocal.serializeToDb(gvnf, gvnfVert, uriQuery, "generic-vnf", gvnf.marshal(false));
146 assertTrue("Vertex is updated", engine.tx().traversal().V()
147 .has("aai-node-type", "generic-vnf")
148 .has("vnf-id", "myvnf")
149 .has("vnf-type", "new-typo")
153 assertEquals(DeltaAction.UPDATE, dbserLocal.getObjectDeltas().get("/network/generic-vnfs/generic-vnf/myvnf").getAction());
154 assertEquals(4L, dbserLocal.getObjectDeltas().get("/network/generic-vnfs/generic-vnf/myvnf").getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
155 assertEquals(4L, dbserLocal.getObjectDeltas().get("/network/generic-vnfs/generic-vnf/myvnf").getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.UPDATE)).count());
156 dbserLocal.getObjectDeltas().values().forEach(od -> {
157 if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID) ) {
158 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
159 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
160 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
161 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
162 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
168 public void createTopLevelThenCreateChildTest() throws AAIException, UnsupportedEncodingException, URISyntaxException {
169 engine.startTransaction();
171 DBSerializer dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "AAI-TEST", AAIProperties.MINIMUM_DEPTH);
172 Introspector gvnf = loader.introspectorFromName("generic-vnf");
173 Vertex gvnfVert = dbserLocal.createNewVertex(gvnf);
174 final String vnfUri = "/network/generic-vnfs/generic-vnf/myvnf";
175 QueryParser uriQuery =
176 dbEngine.getQueryBuilder().createQueryFromURI(new URI(vnfUri));
178 gvnf.setValue("vnf-id", "myvnf");
179 gvnf.setValue("vnf-type", "typo");
180 dbserLocal.serializeToDb(gvnf, gvnfVert, uriQuery, "generic-vnf", gvnf.marshal(false));
181 assertTrue("Original created vertex exists", engine.tx().traversal().V()
182 .has("aai-node-type", "generic-vnf")
183 .has("vnf-id", "myvnf")
184 .has("vnf-type", "typo")
188 assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(vnfUri).getAction());
189 assertEquals(4L, dbserLocal.getObjectDeltas().get(vnfUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
190 assertEquals(5L, dbserLocal.getObjectDeltas().get(vnfUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
191 dbserLocal.getObjectDeltas().values().forEach(od -> {
192 if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID) ) {
193 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
194 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
195 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
196 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
197 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
201 dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "AAI-TEST", AAIProperties.MINIMUM_DEPTH);
202 Introspector vf = loader.introspectorFromName("vf-module");
203 Vertex vfVertex = dbserLocal.createNewVertex(vf);
204 final String vfUri = "/network/generic-vnfs/generic-vnf/myvnf/vf-modules/vf-module/myvf";
205 uriQuery = engine.getQueryBuilder(gvnfVert).createQueryFromURI(new URI(vfUri));
207 vf.setValue("vf-module-id", "myvf");
208 dbserLocal.serializeToDb(vf, vfVertex, uriQuery, "vf-module", vf.marshal(false));
209 assertTrue("Vertex is creted", engine.tx().traversal().V()
210 .has("aai-node-type", "vf-module")
211 .has("vf-module-id", "myvf")
213 assertTrue("Vf module has edge to gvnf", engine.tx().traversal().V()
214 .has("aai-node-type", "vf-module")
215 .has("vf-module-id", "myvf")
217 .has("aai-node-type", "generic-vnf")
218 .has("vnf-id", "myvnf")
222 assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(vfUri).getAction());
223 assertEquals(4L, dbserLocal.getObjectDeltas().get(vfUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
224 assertEquals(4L, dbserLocal.getObjectDeltas().get(vfUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
225 dbserLocal.getObjectDeltas().values().forEach(od -> {
226 if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID) ) {
227 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
228 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
229 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
230 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
231 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
237 public void createTopWithChildThenDeleteTopTest() throws AAIException, UnsupportedEncodingException, URISyntaxException {
238 engine.startTransaction();
240 DBSerializer dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "AAI-TEST", AAIProperties.MINIMUM_DEPTH);
241 Introspector gvnf = loader.introspectorFromName("generic-vnf");
242 Vertex gvnfVert = dbserLocal.createNewVertex(gvnf);
243 final String vnfUri = "/network/generic-vnfs/generic-vnf/myvnf";
244 QueryParser uriQuery =
245 dbEngine.getQueryBuilder().createQueryFromURI(new URI(vnfUri));
247 gvnf.setValue("vnf-id", "myvnf");
248 gvnf.setValue("vnf-type", "typo");
250 Introspector vf = loader.introspectorFromName("vf-module");
251 vf.setValue("vf-module-id", "myvf");
252 final String vfUri = "/network/generic-vnfs/generic-vnf/myvnf/vf-modules/vf-module/myvf";
254 Introspector vfs = loader.introspectorFromName("vf-modules");
255 vfs.setValue("vf-module", Collections.singletonList(vf.getUnderlyingObject()));
256 gvnf.setValue("vf-modules", vfs.getUnderlyingObject());
258 dbserLocal.serializeToDb(gvnf, gvnfVert, uriQuery, "generic-vnf", gvnf.marshal(false));
260 Gson gson = new GsonBuilder().create();
261 System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
263 assertTrue("Original created vertex exists", engine.tx().traversal().V()
264 .has("aai-node-type", "generic-vnf")
265 .has("vnf-id", "myvnf")
266 .has("vnf-type", "typo")
268 assertTrue("Vertex is creted", engine.tx().traversal().V()
269 .has("aai-node-type", "vf-module")
270 .has("vf-module-id", "myvf")
272 assertTrue("Vf module has edge to gvnf", engine.tx().traversal().V()
273 .has("aai-node-type", "vf-module")
274 .has("vf-module-id", "myvf")
276 .has("aai-node-type", "generic-vnf")
277 .has("vnf-id", "myvnf")
280 assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(vnfUri).getAction());
281 assertEquals(4L, dbserLocal.getObjectDeltas().get(vnfUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
282 assertEquals(5L, dbserLocal.getObjectDeltas().get(vnfUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
283 assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(vfUri).getAction());
284 assertEquals(4L, dbserLocal.getObjectDeltas().get(vfUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
285 assertEquals(4L, dbserLocal.getObjectDeltas().get(vfUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
286 assertEquals(1L, dbserLocal.getObjectDeltas().get(vfUri).getRelationshipDeltas().stream().filter(d -> d.getAction().equals(DeltaAction.CREATE_REL)).count());
287 dbserLocal.getObjectDeltas().values().forEach(od -> {
288 if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID) ) {
289 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
290 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
291 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
292 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
293 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
297 dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "AAI-TEST", AAIProperties.MINIMUM_DEPTH);
298 gvnf = dbserLocal.getLatestVersionView(gvnfVert);
299 String rv = gvnf.getValue(AAIProperties.RESOURCE_VERSION);
300 dbserLocal.delete(engine.tx().traversal().V(gvnfVert).next(), rv, true);
301 System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
303 assertFalse("generic-vnf no longer exists", engine.tx().traversal().V()
304 .has("aai-node-type", "generic-vnf")
306 assertFalse("vf-module no longer exists", engine.tx().traversal().V()
307 .has("aai-node-type", "vf-module")
310 assertEquals(DeltaAction.DELETE, dbserLocal.getObjectDeltas().get(vnfUri).getAction());
311 assertEquals(12L, dbserLocal.getObjectDeltas().get(vnfUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.DELETE)).count());assertEquals(DeltaAction.DELETE, dbserLocal.getObjectDeltas().get(vfUri).getAction());
312 assertEquals(11L, dbserLocal.getObjectDeltas().get(vfUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.DELETE)).count());
318 public void createComplexPserverWithRelDeleteRel() throws AAIException, UnsupportedEncodingException, URISyntaxException {
319 engine.startTransaction();
321 DBSerializer dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "AAI-TEST", AAIProperties.MINIMUM_DEPTH);
322 Introspector complex = loader.introspectorFromName("complex");
323 Vertex complexV = dbserLocal.createNewVertex(complex);
324 final String complexUri = "/cloud-infrastructure/complexes/complex/c-id";
325 QueryParser uriQuery =
326 dbEngine.getQueryBuilder().createQueryFromURI(new URI(complexUri));
328 complex.setValue("physical-location-id", "c-id");
329 complex.setValue("physical-location-type", "type");
330 complex.setValue("street1", "streetA");
331 complex.setValue("city", "cityA");
332 complex.setValue("postal-code", "11111");
333 complex.setValue("country", "abc");
334 complex.setValue("region", "ef");
335 dbserLocal.serializeToDb(complex, complexV, uriQuery, "complex", complex.marshal(false));
336 assertTrue("Complex created", engine.tx().traversal().V()
337 .has("aai-node-type", "complex")
338 .has("physical-location-id", "c-id")
342 assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(complexUri).getAction());
343 assertEquals(4L, dbserLocal.getObjectDeltas().get(complexUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
344 assertEquals(10L, dbserLocal.getObjectDeltas().get(complexUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
345 dbserLocal.getObjectDeltas().values().forEach(od -> {
346 if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID) ) {
347 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
348 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
349 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
350 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
351 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
356 dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "AAI-TEST", AAIProperties.MINIMUM_DEPTH);
357 Introspector pserver = loader.introspectorFromName("pserver");
358 Vertex pserverV = dbserLocal.createNewVertex(pserver);
359 final String pserverUri = "/cloud-infrastructure/pservers/pserver/ps";
361 dbEngine.getQueryBuilder().createQueryFromURI(new URI(pserverUri));
363 Introspector relationship = loader.introspectorFromName("relationship");
364 relationship.setValue("related-to", "complex");
365 relationship.setValue("related-link", complexUri);
366 Introspector relationshipList = loader.introspectorFromName("relationship-list");
367 relationshipList.setValue("relationship", Collections.singletonList(relationship.getUnderlyingObject()));
369 pserver.setValue("relationship-list", relationshipList.getUnderlyingObject());
370 pserver.setValue("hostname", "ps");
372 System.out.println(pserver.marshal(true));
374 dbserLocal.serializeToDb(pserver, pserverV, uriQuery, "pserver", pserver.marshal(false));
375 assertTrue("Pserver created", engine.tx().traversal().V()
376 .has("aai-node-type", "pserver")
377 .has("hostname", "ps")
379 assertTrue("Pserver has edge to complex", engine.tx().traversal().V()
380 .has("aai-node-type", "pserver")
381 .has("hostname", "ps")
384 .has("aai-node-type", "complex")
388 assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(pserverUri).getAction());
389 assertEquals(4L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
390 assertEquals(4L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
391 assertEquals(1L, dbserLocal.getObjectDeltas().get(pserverUri).getRelationshipDeltas().stream().filter(d -> d.getAction().equals(DeltaAction.CREATE_REL)).count());
392 dbserLocal.getObjectDeltas().values().forEach(od -> {
393 if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID) ) {
394 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
395 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
396 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
397 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
398 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
403 dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "AAI-TEST", AAIProperties.MINIMUM_DEPTH);
404 dbserLocal.touchStandardVertexProperties(pserverV, false);
405 dbserLocal.deleteEdge(relationship, pserverV);
406 assertFalse("Pserver no longer has edge to complex", engine.tx().traversal().V()
407 .has("aai-node-type", "pserver")
408 .has("hostname", "ps")
411 .has("aai-node-type", "complex")
415 assertEquals(DeltaAction.UPDATE, dbserLocal.getObjectDeltas().get(pserverUri).getAction());
416 assertEquals(4L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
417 assertEquals(3L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.UPDATE)).count());
418 assertEquals(1L, dbserLocal.getObjectDeltas().get(pserverUri).getRelationshipDeltas().stream().filter(d -> d.getAction().equals(DeltaAction.DELETE_REL)).count());
419 dbserLocal.getObjectDeltas().values().forEach(od -> {
420 if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID) ) {
421 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
422 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
423 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
424 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
425 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
431 public void createComplexPserverWithRelUpdatePserverToDeleteRelAddPinterfaceThenDeleteComplex() throws AAIException, UnsupportedEncodingException, URISyntaxException {
432 engine.startTransaction();
434 Gson gson = new GsonBuilder()
435 .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES)
438 DBSerializer dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "create-complex", AAIProperties.MINIMUM_DEPTH);
439 Introspector complex = loader.introspectorFromName("complex");
440 Vertex complexV = dbserLocal.createNewVertex(complex);
441 final String complexUri = "/cloud-infrastructure/complexes/complex/c-id-b";
442 QueryParser uriQuery =
443 dbEngine.getQueryBuilder().createQueryFromURI(new URI(complexUri));
445 complex.setValue("physical-location-id", "c-id-b");
446 complex.setValue("physical-location-type", "type");
447 complex.setValue("street1", "streetA");
448 complex.setValue("city", "cityA");
449 complex.setValue("postal-code", "11111");
450 complex.setValue("country", "abc");
451 complex.setValue("region", "ef");
452 dbserLocal.serializeToDb(complex, complexV, uriQuery, "complex", complex.marshal(false));
454 System.out.println("Create Complex");
455 System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
457 assertTrue("Complex created", engine.tx().traversal().V()
458 .has("aai-node-type", "complex")
459 .has("physical-location-id", "c-id-b")
461 assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(complexUri).getAction());
462 assertEquals(4L, dbserLocal.getObjectDeltas().get(complexUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
463 assertEquals(10L, dbserLocal.getObjectDeltas().get(complexUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
464 dbserLocal.getObjectDeltas().values().forEach(od -> {
465 if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID) ) {
466 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
467 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
468 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
469 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
470 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
475 dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "create-pserver", AAIProperties.MINIMUM_DEPTH);
476 Introspector pserver = loader.introspectorFromName("pserver");
477 Vertex pserverV = dbserLocal.createNewVertex(pserver);
478 final String pserverUri = "/cloud-infrastructure/pservers/pserver/ps-b";
480 dbEngine.getQueryBuilder().createQueryFromURI(new URI(pserverUri));
482 Introspector relationship = loader.introspectorFromName("relationship");
483 relationship.setValue("related-to", "complex");
484 relationship.setValue("related-link", complexUri);
485 Introspector relationshipList = loader.introspectorFromName("relationship-list");
486 relationshipList.setValue("relationship", Collections.singletonList(relationship.getUnderlyingObject()));
488 pserver.setValue("relationship-list", relationshipList.getUnderlyingObject());
489 pserver.setValue("hostname", "ps-b");
490 pserver.setValue("number-of-cpus", 20);
492 Introspector pint = loader.introspectorFromName("p-interface");
493 pint.setValue("interface-name", "pint-1");
494 final String pintUri = pserverUri + "/p-interfaces/p-interface/pint-1";
496 Introspector pints = loader.introspectorFromName("p-interfaces");
497 pints.setValue("p-interface", Collections.singletonList(pint.getUnderlyingObject()));
498 pserver.setValue("p-interfaces", pints.getUnderlyingObject());
500 dbserLocal.serializeToDb(pserver, pserverV, uriQuery, "pserver", pserver.marshal(false));
502 System.out.println("Create Pserver with pinterface and relationship to complex ");
503 System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
505 assertTrue("Pserver created", engine.tx().traversal().V()
506 .has("aai-node-type", "pserver")
507 .has("hostname", "ps-b")
509 assertTrue("Pserver has edge to complex", engine.tx().traversal().V()
510 .has("aai-node-type", "pserver")
511 .has("hostname", "ps-b")
514 .has("aai-node-type", "complex")
516 assertTrue("Pserver has edge to pinterface", engine.tx().traversal().V()
517 .has("aai-node-type", "pserver")
518 .has("hostname", "ps-b")
521 .has("aai-node-type", "p-interface")
524 assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(pserverUri).getAction());
525 assertEquals(4L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
526 assertEquals(5L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
527 assertEquals(1L, dbserLocal.getObjectDeltas().get(pserverUri).getRelationshipDeltas().stream().filter(d -> d.getAction().equals(DeltaAction.CREATE_REL)).count());
528 assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(pintUri).getAction());
529 assertEquals(4L, dbserLocal.getObjectDeltas().get(pintUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
530 assertEquals(4L, dbserLocal.getObjectDeltas().get(pintUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
531 assertEquals(1L, dbserLocal.getObjectDeltas().get(pintUri).getRelationshipDeltas().stream().filter(d -> d.getAction().equals(DeltaAction.CREATE_REL)).count());
532 dbserLocal.getObjectDeltas().values().forEach(od -> {
533 if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID) ) {
534 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
535 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
536 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
537 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
538 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
542 dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "update-pserver", AAIProperties.MINIMUM_DEPTH);
543 pserver = dbserLocal.getLatestVersionView(pserverV);
544 relationshipList = loader.introspectorFromName("relationship-list");
545 relationshipList.setValue("relationship", Collections.emptyList());
546 pserver.setValue("relationship-list", relationshipList.getUnderlyingObject());
547 pserver.setValue("equip-type", "server-a");
548 pserver.setValue("number-of-cpus", 99);
550 dbserLocal.serializeToDb(pserver, pserverV, uriQuery, "pserver", pserver.marshal(false));
552 System.out.println("Update pserver removing relationship to complex");
553 System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
555 assertFalse("Pserver no longer has edge to complex", engine.tx().traversal().V()
556 .has("aai-node-type", "pserver")
557 .has("hostname", "ps-b")
560 .has("aai-node-type", "complex")
563 assertEquals(DeltaAction.UPDATE, dbserLocal.getObjectDeltas().get(pserverUri).getAction());
564 assertEquals(4L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
565 assertEquals(4L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.UPDATE)).count());
566 assertEquals(1L, dbserLocal.getObjectDeltas().get(pserverUri).getRelationshipDeltas().stream().filter(d -> d.getAction().equals(DeltaAction.DELETE_REL)).count());
567 assertFalse(dbserLocal.getObjectDeltas().containsKey(pintUri));
568 dbserLocal.getObjectDeltas().values().forEach(od -> {
569 if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID) ) {
570 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
571 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
572 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
573 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
574 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
578 dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "delete-pserver", AAIProperties.MINIMUM_DEPTH);
579 pserver = dbserLocal.getLatestVersionView(pserverV);
580 String rv = pserver.getValue(AAIProperties.RESOURCE_VERSION);
581 dbserLocal.delete(engine.tx().traversal().V(pserverV).next(), rv, true);
583 System.out.println("Delete pserver");
584 System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
586 assertFalse("pserver no longer exists", engine.tx().traversal().V()
587 .has("aai-node-type", "pserver")
590 assertEquals(DeltaAction.DELETE, dbserLocal.getObjectDeltas().get(pserverUri).getAction());
591 assertEquals(12L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.DELETE)).count());
592 assertEquals(DeltaAction.DELETE, dbserLocal.getObjectDeltas().get(pintUri).getAction());
593 assertEquals(10L, dbserLocal.getObjectDeltas().get(pintUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.DELETE)).count());
594 dbserLocal.getObjectDeltas().values().forEach(od -> {
595 if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID) ) {
596 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
597 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
598 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
599 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
600 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
606 // /network/ipsec-configurations/ipsec-configuration/{ipsec-configuration-id}/vig-servers/vig-server/{vig-address-type}
609 public void createNodeWithListTest() throws AAIException, UnsupportedEncodingException, URISyntaxException {
610 Gson gson = new GsonBuilder()
611 .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES)
614 engine.startTransaction();
617 * Create the parent ipsec-configuration
619 DBSerializer dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "create-ipsec", AAIProperties.MINIMUM_DEPTH);
620 Introspector ipsec = loader.introspectorFromName("ipsec-configuration");
621 Vertex ipsecVert = dbserLocal.createNewVertex(ipsec);
622 final String ipsecUri = "/network/ipsec-configurations/ipsec-configuration/ipsec";
623 QueryParser uriQuery =
624 dbEngine.getQueryBuilder().createQueryFromURI(new URI(ipsecUri));
626 ipsec.setValue("ipsec-configuration-id", "ipsec");
627 dbserLocal.serializeToDb(ipsec, ipsecVert, uriQuery, "generic-vnf", ipsec.marshal(false));
628 assertTrue("Original created vertex exists", engine.tx().traversal().V()
629 .has("aai-node-type", "ipsec-configuration")
630 .has("ipsec-configuration-id", "ipsec")
633 System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
634 assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(ipsecUri).getAction());
636 dbserLocal.getObjectDeltas().get(ipsecUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
638 dbserLocal.getObjectDeltas().get(ipsecUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
639 dbserLocal.getObjectDeltas().values().forEach(od -> {
640 if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID) ) {
641 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
642 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
643 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
644 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
645 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
650 * Create child vig-server with list property vig-address-type
652 dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "create-child-vig-server", AAIProperties.MINIMUM_DEPTH);
653 Introspector vig = loader.introspectorFromName("vig-server");
654 Vertex vigVertex = dbserLocal.createNewVertex(vig);
655 final String vigUri = "/network/ipsec-configurations/ipsec-configuration/ipsec/vig-servers/vig-server/vig";
656 uriQuery = engine.getQueryBuilder(ipsecVert).createQueryFromURI(new URI(vigUri));
658 vig.setValue("vig-address-type", "vig");
659 List<String> list = new ArrayList<>();
660 list.add("address-1");
661 list.add("address-2");
662 vig.setValue("ipaddress-v4-vig", list);
663 dbserLocal.serializeToDb(vig, vigVertex, uriQuery, "vf-module", vig.marshal(false));
664 assertTrue("Vertex is creted", engine.tx().traversal().V()
665 .has("aai-node-type", "vig-server")
666 .has("vig-address-type", "vig")
668 assertTrue("Vf module has edge to gvnf", engine.tx().traversal().V()
669 .has("aai-node-type", "vig-server")
670 .has("vig-address-type", "vig")
672 .has("aai-node-type", "ipsec-configuration")
673 .has("ipsec-configuration-id", "ipsec")
676 System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
677 assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(vigUri).getAction());
679 dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
681 dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
682 assertThat(dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().get("ipaddress-v4-vig").getValue(), instanceOf(List.class));
683 dbserLocal.getObjectDeltas().values().forEach(od -> {
684 if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID) ) {
685 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
686 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
687 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
688 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
689 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
694 * Update child vig-server with new list for vig-address-type
696 dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "update-child-vig-server", AAIProperties.MINIMUM_DEPTH);
697 vig = dbserLocal.getLatestVersionView(vigVertex);
698 uriQuery = engine.getQueryBuilder(ipsecVert).createQueryFromURI(new URI(vigUri));
701 list.add("address-3");
702 list.add("address-4");
703 vig.setValue("ipaddress-v4-vig", list);
704 dbserLocal.serializeToDb(vig, vigVertex, uriQuery, "vf-module", vig.marshal(false));
705 assertTrue("Vertex is still there", engine.tx().traversal().V()
706 .has("aai-node-type", "vig-server")
707 .has("vig-address-type", "vig")
709 assertTrue("Vf module has edge to gvnf", engine.tx().traversal().V()
710 .has("aai-node-type", "vig-server")
711 .has("vig-address-type", "vig")
713 .has("aai-node-type", "ipsec-configuration")
714 .has("ipsec-configuration-id", "ipsec")
717 System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
718 assertEquals(DeltaAction.UPDATE, dbserLocal.getObjectDeltas().get(vigUri).getAction());
720 dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
722 dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.UPDATE)).count());
723 assertThat(dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().get("ipaddress-v4-vig").getValue(), instanceOf(List.class));
724 assertThat(dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().get("ipaddress-v4-vig").getOldValue(), instanceOf(List.class));
725 dbserLocal.getObjectDeltas().values().forEach(od -> {
726 if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID) ) {
727 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
728 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
729 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
730 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
731 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
737 dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "delete-ipsec", AAIProperties.MINIMUM_DEPTH);
738 ipsec = dbserLocal.getLatestVersionView(ipsecVert);
739 String rv = ipsec.getValue(AAIProperties.RESOURCE_VERSION);
740 dbserLocal.delete(engine.tx().traversal().V(ipsecVert).next(), rv, true);
741 System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
743 assertFalse("ipsec-configuration no longer exists", engine.tx().traversal().V()
744 .has("aai-node-type", "ipsec-configuration")
746 assertFalse("vig-server no longer exists", engine.tx().traversal().V()
747 .has("aai-node-type", "vig-server")
750 assertEquals(DeltaAction.DELETE, dbserLocal.getObjectDeltas().get(ipsecUri).getAction());
751 assertEquals(9L, dbserLocal.getObjectDeltas().get(ipsecUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.DELETE)).count());assertEquals(DeltaAction.DELETE, dbserLocal.getObjectDeltas().get(vigUri).getAction());
752 assertEquals(10L, dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.DELETE)).count());
753 dbserLocal.getObjectDeltas().values().forEach(od -> {
754 if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID) ) {
755 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
756 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
757 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
758 } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
759 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");