Enhancements for the aai-common library
[aai/aai-common.git] / aai-core / src / test / java / org / onap / aai / serialization / db / DbSerializerDeltasTest.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
4  * ================================================================================
5  * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *    http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.aai.serialization.db;
22
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;
52
53 import java.io.UnsupportedEncodingException;
54 import java.net.URI;
55 import java.net.URISyntaxException;
56 import java.util.*;
57
58 import static org.hamcrest.CoreMatchers.instanceOf;
59 import static org.junit.Assert.*;
60
61 @RunWith(value = Parameterized.class)
62 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
63 @TestPropertySource(properties = {
64     "delta.events.enabled=true",
65     })
66 public class DbSerializerDeltasTest extends AAISetup {
67
68     // to use, set thrown.expect to whatever your test needs
69     // this line establishes default of expecting no exception to be thrown
70     @Rule
71     public ExpectedException thrown = ExpectedException.none();
72
73     protected static Graph graph;
74
75     @Autowired
76     protected EdgeSerializer edgeSer;
77     @Autowired
78     protected EdgeIngestor ei;
79
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
85
86     @Parameterized.Parameter(value = 0)
87     public QueryStyle queryStyle;
88
89     @Parameterized.Parameters(name = "QueryStyle.{0}")
90     public static Collection<Object[]> data() {
91         return Arrays.asList(new Object[][] {{QueryStyle.TRAVERSAL}, {QueryStyle.TRAVERSAL_URI}});
92     }
93
94     @BeforeClass
95     public static void init() throws Exception {
96         graph = JanusGraphFactory.build().set("storage.backend", "inmemory").open();
97
98     }
99
100     @Before
101     public void setup() throws Exception {
102         // createGraph();
103         version = schemaVersions.getDefaultVersion();
104         loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, version);
105         dbEngine = new JanusGraphDBEngine(queryStyle, loader);
106         engine = new JanusGraphDBEngine(queryStyle, loader);
107     }
108
109     @Test
110     public void createTopLevelThenUpdateTest() throws AAIException, UnsupportedEncodingException, URISyntaxException {
111         engine.startTransaction();
112
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"));
118
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")
126             .hasNext());
127
128
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");
139             }
140         });
141
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")
150             .hasNext());
151
152
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");
163             }
164         });
165     }
166
167     @Test
168     public void createTopLevelThenCreateChildTest() throws AAIException, UnsupportedEncodingException, URISyntaxException {
169         engine.startTransaction();
170
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));
177
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")
185             .hasNext());
186
187
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");
198             }
199         });
200
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));
206
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")
212             .hasNext());
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")
216             .both()
217             .has("aai-node-type", "generic-vnf")
218             .has("vnf-id", "myvnf")
219             .hasNext());
220
221
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");
232             }
233         });
234     }
235
236     @Test
237     public void createTopWithChildThenDeleteTopTest() throws AAIException, UnsupportedEncodingException, URISyntaxException {
238         engine.startTransaction();
239
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));
246
247         gvnf.setValue("vnf-id", "myvnf");
248         gvnf.setValue("vnf-type", "typo");
249
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";
253
254         Introspector vfs = loader.introspectorFromName("vf-modules");
255         vfs.setValue("vf-module", Collections.singletonList(vf.getUnderlyingObject()));
256         gvnf.setValue("vf-modules", vfs.getUnderlyingObject());
257
258         dbserLocal.serializeToDb(gvnf, gvnfVert, uriQuery, "generic-vnf", gvnf.marshal(false));
259
260         Gson gson = new GsonBuilder().create();
261         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
262
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")
267             .hasNext());
268         assertTrue("Vertex is creted", engine.tx().traversal().V()
269             .has("aai-node-type", "vf-module")
270             .has("vf-module-id", "myvf")
271             .hasNext());
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")
275             .both()
276             .has("aai-node-type", "generic-vnf")
277             .has("vnf-id", "myvnf")
278             .hasNext());
279
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");
294             }
295         });
296
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()));
302
303         assertFalse("generic-vnf no longer exists", engine.tx().traversal().V()
304             .has("aai-node-type", "generic-vnf")
305             .hasNext());
306         assertFalse("vf-module no longer exists", engine.tx().traversal().V()
307             .has("aai-node-type", "vf-module")
308             .hasNext());
309
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());
313     }
314
315
316
317     @Test
318     public void createComplexPserverWithRelDeleteRel() throws AAIException, UnsupportedEncodingException, URISyntaxException {
319         engine.startTransaction();
320
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));
327
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")
339             .hasNext());
340
341
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");
352             }
353         });
354
355
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";
360         uriQuery =
361             dbEngine.getQueryBuilder().createQueryFromURI(new URI(pserverUri));
362
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()));
368
369         pserver.setValue("relationship-list", relationshipList.getUnderlyingObject());
370         pserver.setValue("hostname", "ps");
371
372         System.out.println(pserver.marshal(true));
373
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")
378             .hasNext());
379         assertTrue("Pserver has edge to complex", engine.tx().traversal().V()
380             .has("aai-node-type", "pserver")
381             .has("hostname", "ps")
382             .bothE()
383             .otherV()
384             .has("aai-node-type", "complex")
385             .hasNext());
386
387
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");
399             }
400         });
401
402
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")
409             .bothE()
410             .otherV()
411             .has("aai-node-type", "complex")
412             .hasNext());
413
414
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");
426             }
427         });
428     }
429
430     @Test
431     public void createComplexPserverWithRelUpdatePserverToDeleteRelAddPinterfaceThenDeleteComplex() throws AAIException, UnsupportedEncodingException, URISyntaxException {
432         engine.startTransaction();
433
434         Gson gson = new GsonBuilder()
435             .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES)
436             .create();
437
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));
444
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));
453
454         System.out.println("Create Complex");
455         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
456
457         assertTrue("Complex created", engine.tx().traversal().V()
458             .has("aai-node-type", "complex")
459             .has("physical-location-id", "c-id-b")
460             .hasNext());
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");
471             }
472         });
473
474
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";
479         uriQuery =
480             dbEngine.getQueryBuilder().createQueryFromURI(new URI(pserverUri));
481
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()));
487
488         pserver.setValue("relationship-list", relationshipList.getUnderlyingObject());
489         pserver.setValue("hostname", "ps-b");
490         pserver.setValue("number-of-cpus", 20);
491
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";
495
496         Introspector pints = loader.introspectorFromName("p-interfaces");
497         pints.setValue("p-interface", Collections.singletonList(pint.getUnderlyingObject()));
498         pserver.setValue("p-interfaces", pints.getUnderlyingObject());
499
500         dbserLocal.serializeToDb(pserver, pserverV, uriQuery, "pserver", pserver.marshal(false));
501
502         System.out.println("Create Pserver with pinterface and relationship to complex ");
503         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
504
505         assertTrue("Pserver created", engine.tx().traversal().V()
506             .has("aai-node-type", "pserver")
507             .has("hostname", "ps-b")
508             .hasNext());
509         assertTrue("Pserver has edge to complex", engine.tx().traversal().V()
510             .has("aai-node-type", "pserver")
511             .has("hostname", "ps-b")
512             .bothE()
513             .otherV()
514             .has("aai-node-type", "complex")
515             .hasNext());
516         assertTrue("Pserver has edge to pinterface", engine.tx().traversal().V()
517             .has("aai-node-type", "pserver")
518             .has("hostname", "ps-b")
519             .bothE()
520             .otherV()
521             .has("aai-node-type", "p-interface")
522             .hasNext());
523
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");
539             }
540         });
541
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);
549
550         dbserLocal.serializeToDb(pserver, pserverV, uriQuery, "pserver", pserver.marshal(false));
551
552         System.out.println("Update pserver removing relationship to complex");
553         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
554
555         assertFalse("Pserver no longer has edge to complex", engine.tx().traversal().V()
556             .has("aai-node-type", "pserver")
557             .has("hostname", "ps-b")
558             .bothE()
559             .otherV()
560             .has("aai-node-type", "complex")
561             .hasNext());
562
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");
575             }
576         });
577
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);
582
583         System.out.println("Delete pserver");
584         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
585
586         assertFalse("pserver no longer exists", engine.tx().traversal().V()
587             .has("aai-node-type", "pserver")
588             .hasNext());
589
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");
601             }
602         });
603     }
604
605
606     // /network/ipsec-configurations/ipsec-configuration/{ipsec-configuration-id}/vig-servers/vig-server/{vig-address-type}
607     // ipaddress-v4-vig
608     @Test
609     public void createNodeWithListTest() throws AAIException, UnsupportedEncodingException, URISyntaxException {
610         Gson gson = new GsonBuilder()
611             .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES)
612             .create();
613
614         engine.startTransaction();
615
616         /*
617          * Create the parent ipsec-configuration
618          */
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));
625
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")
631             .hasNext());
632
633         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
634         assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(ipsecUri).getAction());
635         assertEquals(4L,
636             dbserLocal.getObjectDeltas().get(ipsecUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
637         assertEquals(4L,
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");
646             }
647         });
648
649         /*
650          * Create child vig-server with list property vig-address-type
651          */
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));
657
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")
667             .hasNext());
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")
671             .both()
672             .has("aai-node-type", "ipsec-configuration")
673             .has("ipsec-configuration-id", "ipsec")
674             .hasNext());
675
676         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
677         assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(vigUri).getAction());
678         assertEquals(4L,
679             dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
680         assertEquals(5L,
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");
690             }
691         });
692
693         /*
694          * Update child vig-server with new list for vig-address-type
695          */
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));
699
700         new ArrayList<>();
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")
708             .hasNext());
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")
712             .both()
713             .has("aai-node-type", "ipsec-configuration")
714             .has("ipsec-configuration-id", "ipsec")
715             .hasNext());
716
717         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
718         assertEquals(DeltaAction.UPDATE, dbserLocal.getObjectDeltas().get(vigUri).getAction());
719         assertEquals(4L,
720             dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
721         assertEquals(4L,
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");
732             }
733         });
734         /*
735         * Delete top level
736          */
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()));
742
743         assertFalse("ipsec-configuration no longer exists", engine.tx().traversal().V()
744             .has("aai-node-type", "ipsec-configuration")
745             .hasNext());
746         assertFalse("vig-server no longer exists", engine.tx().traversal().V()
747             .has("aai-node-type", "vig-server")
748             .hasNext());
749
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");
760             }
761         });
762     }
763
764 }