Merge "[AAI] Fix doc config files"
[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 static org.hamcrest.CoreMatchers.instanceOf;
24 import static org.junit.Assert.*;
25
26 import com.google.gson.FieldNamingPolicy;
27 import com.google.gson.Gson;
28 import com.google.gson.GsonBuilder;
29
30 import java.io.UnsupportedEncodingException;
31 import java.net.URI;
32 import java.net.URISyntaxException;
33 import java.util.*;
34
35 import org.apache.tinkerpop.gremlin.structure.Graph;
36 import org.apache.tinkerpop.gremlin.structure.Vertex;
37 import org.janusgraph.core.JanusGraphFactory;
38 import org.junit.Before;
39 import org.junit.BeforeClass;
40 import org.junit.Rule;
41 import org.junit.Test;
42 import org.junit.rules.ExpectedException;
43 import org.junit.runner.RunWith;
44 import org.junit.runners.Parameterized;
45 import org.onap.aai.AAISetup;
46 import org.onap.aai.db.props.AAIProperties;
47 import org.onap.aai.edges.EdgeIngestor;
48 import org.onap.aai.exceptions.AAIException;
49 import org.onap.aai.introspection.Introspector;
50 import org.onap.aai.introspection.Loader;
51 import org.onap.aai.introspection.ModelType;
52 import org.onap.aai.parsers.query.QueryParser;
53 import org.onap.aai.serialization.engines.JanusGraphDBEngine;
54 import org.onap.aai.serialization.engines.QueryStyle;
55 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
56 import org.onap.aai.setup.SchemaVersion;
57 import org.onap.aai.util.delta.DeltaAction;
58 import org.springframework.beans.factory.annotation.Autowired;
59 import org.springframework.test.annotation.DirtiesContext;
60 import org.springframework.test.context.TestPropertySource;
61
62 @RunWith(value = Parameterized.class)
63 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
64 @TestPropertySource(properties = {"delta.events.enabled=true",})
65 public class DbSerializerDeltasTest extends AAISetup {
66
67     // to use, set thrown.expect to whatever your test needs
68     // this line establishes default of expecting no exception to be thrown
69     @Rule
70     public ExpectedException thrown = ExpectedException.none();
71
72     protected static Graph graph;
73
74     @Autowired
75     protected EdgeSerializer edgeSer;
76     @Autowired
77     protected EdgeIngestor ei;
78
79     private SchemaVersion version;
80     private final ModelType introspectorFactoryType = ModelType.MOXY;
81     private Loader loader;
82     private TransactionalGraphEngine dbEngine;
83     private TransactionalGraphEngine engine; // for tests that aren't mocking the engine
84
85     @Parameterized.Parameter(value = 0)
86     public QueryStyle queryStyle;
87
88     @Parameterized.Parameters(name = "QueryStyle.{0}")
89     public static Collection<Object[]> data() {
90         return Arrays.asList(new Object[][] {{QueryStyle.TRAVERSAL}, {QueryStyle.TRAVERSAL_URI}});
91     }
92
93     @BeforeClass
94     public static void init() throws Exception {
95         graph = JanusGraphFactory.build().set("storage.backend", "inmemory").open();
96
97     }
98
99     @Before
100     public void setup() throws Exception {
101         // createGraph();
102         version = schemaVersions.getDefaultVersion();
103         loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, version);
104         dbEngine = new JanusGraphDBEngine(queryStyle, loader);
105         engine = new JanusGraphDBEngine(queryStyle, loader);
106     }
107
108     @Test
109     public void createTopLevelThenUpdateTest() throws AAIException, UnsupportedEncodingException, URISyntaxException {
110         engine.startTransaction();
111
112         DBSerializer dbserLocal =
113                 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().has("aai-node-type", "generic-vnf")
123                 .has("vnf-id", "myvnf").has("vnf-type", "typo").hasNext());
124
125         assertEquals(DeltaAction.CREATE,
126                 dbserLocal.getObjectDeltas().get("/network/generic-vnfs/generic-vnf/myvnf").getAction());
127         assertEquals(4L, dbserLocal.getObjectDeltas().get("/network/generic-vnfs/generic-vnf/myvnf").getPropertyDeltas()
128                 .values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
129         assertEquals(5L, dbserLocal.getObjectDeltas().get("/network/generic-vnfs/generic-vnf/myvnf").getPropertyDeltas()
130                 .values().stream().filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
131         dbserLocal.getObjectDeltas().values().forEach(od -> {
132             if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID)) {
133                 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
134             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
135                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
136             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
137                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
138             }
139         });
140
141         gvnf = dbserLocal.getLatestVersionView(gvnfVert);
142         gvnf.setValue("vnf-type", "new-typo");
143         dbserLocal =
144                 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().has("aai-node-type", "generic-vnf")
147                 .has("vnf-id", "myvnf").has("vnf-type", "new-typo").hasNext());
148
149         assertEquals(DeltaAction.UPDATE,
150                 dbserLocal.getObjectDeltas().get("/network/generic-vnfs/generic-vnf/myvnf").getAction());
151         assertEquals(4L, dbserLocal.getObjectDeltas().get("/network/generic-vnfs/generic-vnf/myvnf").getPropertyDeltas()
152                 .values().stream().filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
153         assertEquals(4L, dbserLocal.getObjectDeltas().get("/network/generic-vnfs/generic-vnf/myvnf").getPropertyDeltas()
154                 .values().stream().filter(d -> d.getAction().equals(DeltaAction.UPDATE)).count());
155         dbserLocal.getObjectDeltas().values().forEach(od -> {
156             if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID)) {
157                 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
158             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
159                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
160             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
161                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
162             }
163         });
164     }
165
166     @Test
167     public void createTopLevelThenCreateChildTest()
168             throws AAIException, UnsupportedEncodingException, URISyntaxException {
169         engine.startTransaction();
170
171         DBSerializer dbserLocal =
172                 new DBSerializer(version, engine, introspectorFactoryType, "AAI-TEST", AAIProperties.MINIMUM_DEPTH);
173         Introspector gvnf = loader.introspectorFromName("generic-vnf");
174         Vertex gvnfVert = dbserLocal.createNewVertex(gvnf);
175         final String vnfUri = "/network/generic-vnfs/generic-vnf/myvnf";
176         QueryParser uriQuery = 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().has("aai-node-type", "generic-vnf")
182                 .has("vnf-id", "myvnf").has("vnf-type", "typo").hasNext());
183
184         assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(vnfUri).getAction());
185         assertEquals(4L, dbserLocal.getObjectDeltas().get(vnfUri).getPropertyDeltas().values().stream()
186                 .filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
187         assertEquals(5L, dbserLocal.getObjectDeltas().get(vnfUri).getPropertyDeltas().values().stream()
188                 .filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
189         dbserLocal.getObjectDeltas().values().forEach(od -> {
190             if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID)) {
191                 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
192             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
193                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
194             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
195                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
196             }
197         });
198
199         dbserLocal =
200                 new DBSerializer(version, engine, introspectorFactoryType, "AAI-TEST", AAIProperties.MINIMUM_DEPTH);
201         Introspector vf = loader.introspectorFromName("vf-module");
202         Vertex vfVertex = dbserLocal.createNewVertex(vf);
203         final String vfUri = "/network/generic-vnfs/generic-vnf/myvnf/vf-modules/vf-module/myvf";
204         uriQuery = engine.getQueryBuilder(gvnfVert).createQueryFromURI(new URI(vfUri));
205
206         vf.setValue("vf-module-id", "myvf");
207         dbserLocal.serializeToDb(vf, vfVertex, uriQuery, "vf-module", vf.marshal(false));
208         assertTrue("Vertex is creted",
209                 engine.tx().traversal().V().has("aai-node-type", "vf-module").has("vf-module-id", "myvf").hasNext());
210         assertTrue("Vf module has edge to gvnf",
211                 engine.tx().traversal().V().has("aai-node-type", "vf-module").has("vf-module-id", "myvf").both()
212                         .has("aai-node-type", "generic-vnf").has("vnf-id", "myvnf").hasNext());
213
214         assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(vfUri).getAction());
215         assertEquals(4L, dbserLocal.getObjectDeltas().get(vfUri).getPropertyDeltas().values().stream()
216                 .filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
217         assertEquals(4L, dbserLocal.getObjectDeltas().get(vfUri).getPropertyDeltas().values().stream()
218                 .filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
219         dbserLocal.getObjectDeltas().values().forEach(od -> {
220             if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID)) {
221                 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
222             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
223                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
224             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
225                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
226             }
227         });
228     }
229
230     @Test
231     public void createTopWithChildThenDeleteTopTest()
232             throws AAIException, UnsupportedEncodingException, URISyntaxException {
233         engine.startTransaction();
234
235         DBSerializer dbserLocal =
236                 new DBSerializer(version, engine, introspectorFactoryType, "AAI-TEST", AAIProperties.MINIMUM_DEPTH);
237         Introspector gvnf = loader.introspectorFromName("generic-vnf");
238         Vertex gvnfVert = dbserLocal.createNewVertex(gvnf);
239         final String vnfUri = "/network/generic-vnfs/generic-vnf/myvnf";
240         QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(new URI(vnfUri));
241
242         gvnf.setValue("vnf-id", "myvnf");
243         gvnf.setValue("vnf-type", "typo");
244
245         Introspector vf = loader.introspectorFromName("vf-module");
246         vf.setValue("vf-module-id", "myvf");
247         final String vfUri = "/network/generic-vnfs/generic-vnf/myvnf/vf-modules/vf-module/myvf";
248
249         Introspector vfs = loader.introspectorFromName("vf-modules");
250         vfs.setValue("vf-module", Collections.singletonList(vf.getUnderlyingObject()));
251         gvnf.setValue("vf-modules", vfs.getUnderlyingObject());
252
253         dbserLocal.serializeToDb(gvnf, gvnfVert, uriQuery, "generic-vnf", gvnf.marshal(false));
254
255         Gson gson = new GsonBuilder().create();
256         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
257
258         assertTrue("Original created vertex exists", engine.tx().traversal().V().has("aai-node-type", "generic-vnf")
259                 .has("vnf-id", "myvnf").has("vnf-type", "typo").hasNext());
260         assertTrue("Vertex is creted",
261                 engine.tx().traversal().V().has("aai-node-type", "vf-module").has("vf-module-id", "myvf").hasNext());
262         assertTrue("Vf module has edge to gvnf",
263                 engine.tx().traversal().V().has("aai-node-type", "vf-module").has("vf-module-id", "myvf").both()
264                         .has("aai-node-type", "generic-vnf").has("vnf-id", "myvnf").hasNext());
265
266         assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(vnfUri).getAction());
267         assertEquals(4L, dbserLocal.getObjectDeltas().get(vnfUri).getPropertyDeltas().values().stream()
268                 .filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
269         assertEquals(5L, dbserLocal.getObjectDeltas().get(vnfUri).getPropertyDeltas().values().stream()
270                 .filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
271         assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(vfUri).getAction());
272         assertEquals(4L, dbserLocal.getObjectDeltas().get(vfUri).getPropertyDeltas().values().stream()
273                 .filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
274         assertEquals(4L, dbserLocal.getObjectDeltas().get(vfUri).getPropertyDeltas().values().stream()
275                 .filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
276         assertEquals(1L, dbserLocal.getObjectDeltas().get(vfUri).getRelationshipDeltas().stream()
277                 .filter(d -> d.getAction().equals(DeltaAction.CREATE_REL)).count());
278         dbserLocal.getObjectDeltas().values().forEach(od -> {
279             if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID)) {
280                 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
281             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
282                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
283             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
284                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
285             }
286         });
287
288         dbserLocal =
289                 new DBSerializer(version, engine, introspectorFactoryType, "AAI-TEST", AAIProperties.MINIMUM_DEPTH);
290         gvnf = dbserLocal.getLatestVersionView(gvnfVert);
291         String rv = gvnf.getValue(AAIProperties.RESOURCE_VERSION);
292         dbserLocal.delete(engine.tx().traversal().V(gvnfVert).next(), rv, true);
293         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
294
295         assertFalse("generic-vnf no longer exists",
296                 engine.tx().traversal().V().has("aai-node-type", "generic-vnf").hasNext());
297         assertFalse("vf-module no longer exists",
298                 engine.tx().traversal().V().has("aai-node-type", "vf-module").hasNext());
299
300         assertEquals(DeltaAction.DELETE, dbserLocal.getObjectDeltas().get(vnfUri).getAction());
301         assertEquals(12L, dbserLocal.getObjectDeltas().get(vnfUri).getPropertyDeltas().values().stream()
302                 .filter(d -> d.getAction().equals(DeltaAction.DELETE)).count());
303         assertEquals(DeltaAction.DELETE, dbserLocal.getObjectDeltas().get(vfUri).getAction());
304         assertEquals(11L, dbserLocal.getObjectDeltas().get(vfUri).getPropertyDeltas().values().stream()
305                 .filter(d -> d.getAction().equals(DeltaAction.DELETE)).count());
306     }
307
308     @Test
309     public void createComplexPserverWithRelDeleteRel()
310             throws AAIException, UnsupportedEncodingException, URISyntaxException {
311         engine.startTransaction();
312
313         DBSerializer dbserLocal =
314                 new DBSerializer(version, engine, introspectorFactoryType, "AAI-TEST", AAIProperties.MINIMUM_DEPTH);
315         Introspector complex = loader.introspectorFromName("complex");
316         Vertex complexV = dbserLocal.createNewVertex(complex);
317         final String complexUri = "/cloud-infrastructure/complexes/complex/c-id";
318         QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(new URI(complexUri));
319
320         complex.setValue("physical-location-id", "c-id");
321         complex.setValue("physical-location-type", "type");
322         complex.setValue("street1", "streetA");
323         complex.setValue("city", "cityA");
324         complex.setValue("postal-code", "11111");
325         complex.setValue("country", "abc");
326         complex.setValue("region", "ef");
327         dbserLocal.serializeToDb(complex, complexV, uriQuery, "complex", complex.marshal(false));
328         assertTrue("Complex created", engine.tx().traversal().V().has("aai-node-type", "complex")
329                 .has("physical-location-id", "c-id").hasNext());
330
331         assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(complexUri).getAction());
332         assertEquals(4L, dbserLocal.getObjectDeltas().get(complexUri).getPropertyDeltas().values().stream()
333                 .filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
334         assertEquals(10L, dbserLocal.getObjectDeltas().get(complexUri).getPropertyDeltas().values().stream()
335                 .filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
336         dbserLocal.getObjectDeltas().values().forEach(od -> {
337             if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID)) {
338                 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
339             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
340                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
341             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
342                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
343             }
344         });
345
346         dbserLocal =
347                 new DBSerializer(version, engine, introspectorFactoryType, "AAI-TEST", AAIProperties.MINIMUM_DEPTH);
348         Introspector pserver = loader.introspectorFromName("pserver");
349         Vertex pserverV = dbserLocal.createNewVertex(pserver);
350         final String pserverUri = "/cloud-infrastructure/pservers/pserver/ps";
351         uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(new URI(pserverUri));
352
353         Introspector relationship = loader.introspectorFromName("relationship");
354         relationship.setValue("related-to", "complex");
355         relationship.setValue("related-link", complexUri);
356         Introspector relationshipList = loader.introspectorFromName("relationship-list");
357         relationshipList.setValue("relationship", Collections.singletonList(relationship.getUnderlyingObject()));
358
359         pserver.setValue("relationship-list", relationshipList.getUnderlyingObject());
360         pserver.setValue("hostname", "ps");
361
362         System.out.println(pserver.marshal(true));
363
364         dbserLocal.serializeToDb(pserver, pserverV, uriQuery, "pserver", pserver.marshal(false));
365         assertTrue("Pserver created",
366                 engine.tx().traversal().V().has("aai-node-type", "pserver").has("hostname", "ps").hasNext());
367         assertTrue("Pserver has edge to complex", engine.tx().traversal().V().has("aai-node-type", "pserver")
368                 .has("hostname", "ps").bothE().otherV().has("aai-node-type", "complex").hasNext());
369
370         assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(pserverUri).getAction());
371         assertEquals(4L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream()
372                 .filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
373         assertEquals(4L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream()
374                 .filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
375         assertEquals(1L, dbserLocal.getObjectDeltas().get(pserverUri).getRelationshipDeltas().stream()
376                 .filter(d -> d.getAction().equals(DeltaAction.CREATE_REL)).count());
377         dbserLocal.getObjectDeltas().values().forEach(od -> {
378             if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID)) {
379                 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
380             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
381                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
382             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
383                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
384             }
385         });
386
387         dbserLocal =
388                 new DBSerializer(version, engine, introspectorFactoryType, "AAI-TEST", AAIProperties.MINIMUM_DEPTH);
389         dbserLocal.touchStandardVertexProperties(pserverV, false);
390         dbserLocal.deleteEdge(relationship, pserverV);
391         assertFalse("Pserver no longer has edge to complex", engine.tx().traversal().V().has("aai-node-type", "pserver")
392                 .has("hostname", "ps").bothE().otherV().has("aai-node-type", "complex").hasNext());
393
394         assertEquals(DeltaAction.UPDATE, dbserLocal.getObjectDeltas().get(pserverUri).getAction());
395         assertEquals(4L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream()
396                 .filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
397         assertEquals(3L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream()
398                 .filter(d -> d.getAction().equals(DeltaAction.UPDATE)).count());
399         assertEquals(1L, dbserLocal.getObjectDeltas().get(pserverUri).getRelationshipDeltas().stream()
400                 .filter(d -> d.getAction().equals(DeltaAction.DELETE_REL)).count());
401         dbserLocal.getObjectDeltas().values().forEach(od -> {
402             if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID)) {
403                 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
404             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
405                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
406             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
407                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
408             }
409         });
410     }
411
412     @Test
413     public void createComplexPserverWithRelUpdatePserverToDeleteRelAddPinterfaceThenDeleteComplex()
414             throws AAIException, UnsupportedEncodingException, URISyntaxException {
415         engine.startTransaction();
416
417         Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES).create();
418
419         DBSerializer dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "create-complex",
420                 AAIProperties.MINIMUM_DEPTH);
421         Introspector complex = loader.introspectorFromName("complex");
422         Vertex complexV = dbserLocal.createNewVertex(complex);
423         final String complexUri = "/cloud-infrastructure/complexes/complex/c-id-b";
424         QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(new URI(complexUri));
425
426         complex.setValue("physical-location-id", "c-id-b");
427         complex.setValue("physical-location-type", "type");
428         complex.setValue("street1", "streetA");
429         complex.setValue("city", "cityA");
430         complex.setValue("postal-code", "11111");
431         complex.setValue("country", "abc");
432         complex.setValue("region", "ef");
433         dbserLocal.serializeToDb(complex, complexV, uriQuery, "complex", complex.marshal(false));
434
435         System.out.println("Create Complex");
436         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
437
438         assertTrue("Complex created", engine.tx().traversal().V().has("aai-node-type", "complex")
439                 .has("physical-location-id", "c-id-b").hasNext());
440         assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(complexUri).getAction());
441         assertEquals(4L, dbserLocal.getObjectDeltas().get(complexUri).getPropertyDeltas().values().stream()
442                 .filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
443         assertEquals(10L, dbserLocal.getObjectDeltas().get(complexUri).getPropertyDeltas().values().stream()
444                 .filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
445         dbserLocal.getObjectDeltas().values().forEach(od -> {
446             if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID)) {
447                 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
448             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
449                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
450             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
451                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
452             }
453         });
454
455         dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "create-pserver",
456                 AAIProperties.MINIMUM_DEPTH);
457         Introspector pserver = loader.introspectorFromName("pserver");
458         Vertex pserverV = dbserLocal.createNewVertex(pserver);
459         final String pserverUri = "/cloud-infrastructure/pservers/pserver/ps-b";
460         uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(new URI(pserverUri));
461
462         Introspector relationship = loader.introspectorFromName("relationship");
463         relationship.setValue("related-to", "complex");
464         relationship.setValue("related-link", complexUri);
465         Introspector relationshipList = loader.introspectorFromName("relationship-list");
466         relationshipList.setValue("relationship", Collections.singletonList(relationship.getUnderlyingObject()));
467
468         pserver.setValue("relationship-list", relationshipList.getUnderlyingObject());
469         pserver.setValue("hostname", "ps-b");
470         pserver.setValue("number-of-cpus", 20);
471
472         Introspector pint = loader.introspectorFromName("p-interface");
473         pint.setValue("interface-name", "pint-1");
474         final String pintUri = pserverUri + "/p-interfaces/p-interface/pint-1";
475
476         Introspector pints = loader.introspectorFromName("p-interfaces");
477         pints.setValue("p-interface", Collections.singletonList(pint.getUnderlyingObject()));
478         pserver.setValue("p-interfaces", pints.getUnderlyingObject());
479
480         dbserLocal.serializeToDb(pserver, pserverV, uriQuery, "pserver", pserver.marshal(false));
481
482         System.out.println("Create Pserver with pinterface and relationship to complex ");
483         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
484
485         assertTrue("Pserver created",
486                 engine.tx().traversal().V().has("aai-node-type", "pserver").has("hostname", "ps-b").hasNext());
487         assertTrue("Pserver has edge to complex", engine.tx().traversal().V().has("aai-node-type", "pserver")
488                 .has("hostname", "ps-b").bothE().otherV().has("aai-node-type", "complex").hasNext());
489         assertTrue("Pserver has edge to pinterface", engine.tx().traversal().V().has("aai-node-type", "pserver")
490                 .has("hostname", "ps-b").bothE().otherV().has("aai-node-type", "p-interface").hasNext());
491
492         assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(pserverUri).getAction());
493         assertEquals(4L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream()
494                 .filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
495         assertEquals(5L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream()
496                 .filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
497         assertEquals(1L, dbserLocal.getObjectDeltas().get(pserverUri).getRelationshipDeltas().stream()
498                 .filter(d -> d.getAction().equals(DeltaAction.CREATE_REL)).count());
499         assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(pintUri).getAction());
500         assertEquals(4L, dbserLocal.getObjectDeltas().get(pintUri).getPropertyDeltas().values().stream()
501                 .filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
502         assertEquals(4L, dbserLocal.getObjectDeltas().get(pintUri).getPropertyDeltas().values().stream()
503                 .filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
504         assertEquals(1L, dbserLocal.getObjectDeltas().get(pintUri).getRelationshipDeltas().stream()
505                 .filter(d -> d.getAction().equals(DeltaAction.CREATE_REL)).count());
506         dbserLocal.getObjectDeltas().values().forEach(od -> {
507             if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID)) {
508                 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
509             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
510                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
511             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
512                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
513             }
514         });
515
516         dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "update-pserver",
517                 AAIProperties.MINIMUM_DEPTH);
518         pserver = dbserLocal.getLatestVersionView(pserverV);
519         relationshipList = loader.introspectorFromName("relationship-list");
520         relationshipList.setValue("relationship", Collections.emptyList());
521         pserver.setValue("relationship-list", relationshipList.getUnderlyingObject());
522         pserver.setValue("equip-type", "server-a");
523         pserver.setValue("number-of-cpus", 99);
524
525         dbserLocal.serializeToDb(pserver, pserverV, uriQuery, "pserver", pserver.marshal(false));
526
527         System.out.println("Update pserver removing relationship to complex");
528         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
529
530         assertFalse("Pserver no longer has edge to complex", engine.tx().traversal().V().has("aai-node-type", "pserver")
531                 .has("hostname", "ps-b").bothE().otherV().has("aai-node-type", "complex").hasNext());
532
533         assertEquals(DeltaAction.UPDATE, dbserLocal.getObjectDeltas().get(pserverUri).getAction());
534         assertEquals(4L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream()
535                 .filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
536         assertEquals(4L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream()
537                 .filter(d -> d.getAction().equals(DeltaAction.UPDATE)).count());
538         assertEquals(1L, dbserLocal.getObjectDeltas().get(pserverUri).getRelationshipDeltas().stream()
539                 .filter(d -> d.getAction().equals(DeltaAction.DELETE_REL)).count());
540         assertFalse(dbserLocal.getObjectDeltas().containsKey(pintUri));
541         dbserLocal.getObjectDeltas().values().forEach(od -> {
542             if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID)) {
543                 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
544             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
545                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
546             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
547                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
548             }
549         });
550
551         dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "delete-pserver",
552                 AAIProperties.MINIMUM_DEPTH);
553         pserver = dbserLocal.getLatestVersionView(pserverV);
554         String rv = pserver.getValue(AAIProperties.RESOURCE_VERSION);
555         dbserLocal.delete(engine.tx().traversal().V(pserverV).next(), rv, true);
556
557         System.out.println("Delete pserver");
558         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
559
560         assertFalse("pserver no longer exists", engine.tx().traversal().V().has("aai-node-type", "pserver").hasNext());
561
562         assertEquals(DeltaAction.DELETE, dbserLocal.getObjectDeltas().get(pserverUri).getAction());
563         assertEquals(12L, dbserLocal.getObjectDeltas().get(pserverUri).getPropertyDeltas().values().stream()
564                 .filter(d -> d.getAction().equals(DeltaAction.DELETE)).count());
565         assertEquals(DeltaAction.DELETE, dbserLocal.getObjectDeltas().get(pintUri).getAction());
566         assertEquals(10L, dbserLocal.getObjectDeltas().get(pintUri).getPropertyDeltas().values().stream()
567                 .filter(d -> d.getAction().equals(DeltaAction.DELETE)).count());
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
579     // /network/ipsec-configurations/ipsec-configuration/{ipsec-configuration-id}/vig-servers/vig-server/{vig-address-type}
580     // ipaddress-v4-vig
581     @Test
582     public void createNodeWithListTest() throws AAIException, UnsupportedEncodingException, URISyntaxException {
583         Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES).create();
584
585         engine.startTransaction();
586
587         /*
588          * Create the parent ipsec-configuration
589          */
590         DBSerializer dbserLocal =
591                 new DBSerializer(version, engine, introspectorFactoryType, "create-ipsec", AAIProperties.MINIMUM_DEPTH);
592         Introspector ipsec = loader.introspectorFromName("ipsec-configuration");
593         Vertex ipsecVert = dbserLocal.createNewVertex(ipsec);
594         final String ipsecUri = "/network/ipsec-configurations/ipsec-configuration/ipsec";
595         QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(new URI(ipsecUri));
596
597         ipsec.setValue("ipsec-configuration-id", "ipsec");
598         dbserLocal.serializeToDb(ipsec, ipsecVert, uriQuery, "generic-vnf", ipsec.marshal(false));
599         assertTrue("Original created vertex exists", engine.tx().traversal().V()
600                 .has("aai-node-type", "ipsec-configuration").has("ipsec-configuration-id", "ipsec").hasNext());
601
602         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
603         assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(ipsecUri).getAction());
604         assertEquals(4L, dbserLocal.getObjectDeltas().get(ipsecUri).getPropertyDeltas().values().stream()
605                 .filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
606         assertEquals(4L, dbserLocal.getObjectDeltas().get(ipsecUri).getPropertyDeltas().values().stream()
607                 .filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
608         dbserLocal.getObjectDeltas().values().forEach(od -> {
609             if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID)) {
610                 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
611             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
612                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
613             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
614                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
615             }
616         });
617
618         /*
619          * Create child vig-server with list property vig-address-type
620          */
621         dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "create-child-vig-server",
622                 AAIProperties.MINIMUM_DEPTH);
623         Introspector vig = loader.introspectorFromName("vig-server");
624         Vertex vigVertex = dbserLocal.createNewVertex(vig);
625         final String vigUri = "/network/ipsec-configurations/ipsec-configuration/ipsec/vig-servers/vig-server/vig";
626         uriQuery = engine.getQueryBuilder(ipsecVert).createQueryFromURI(new URI(vigUri));
627
628         vig.setValue("vig-address-type", "vig");
629         List<String> list = new ArrayList<>();
630         list.add("address-1");
631         list.add("address-2");
632         vig.setValue("ipaddress-v4-vig", list);
633         dbserLocal.serializeToDb(vig, vigVertex, uriQuery, "vf-module", vig.marshal(false));
634         assertTrue("Vertex is creted", engine.tx().traversal().V().has("aai-node-type", "vig-server")
635                 .has("vig-address-type", "vig").hasNext());
636         assertTrue("Vf module has edge to gvnf",
637                 engine.tx().traversal().V().has("aai-node-type", "vig-server").has("vig-address-type", "vig").both()
638                         .has("aai-node-type", "ipsec-configuration").has("ipsec-configuration-id", "ipsec").hasNext());
639
640         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
641         assertEquals(DeltaAction.CREATE, dbserLocal.getObjectDeltas().get(vigUri).getAction());
642         assertEquals(4L, dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().values().stream()
643                 .filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
644         assertEquals(5L, dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().values().stream()
645                 .filter(d -> d.getAction().equals(DeltaAction.CREATE)).count());
646         assertThat(dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().get("ipaddress-v4-vig").getValue(),
647                 instanceOf(List.class));
648         dbserLocal.getObjectDeltas().values().forEach(od -> {
649             if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID)) {
650                 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
651             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
652                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
653             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
654                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
655             }
656         });
657
658         /*
659          * Update child vig-server with new list for vig-address-type
660          */
661         dbserLocal = new DBSerializer(version, engine, introspectorFactoryType, "update-child-vig-server",
662                 AAIProperties.MINIMUM_DEPTH);
663         vig = dbserLocal.getLatestVersionView(vigVertex);
664         uriQuery = engine.getQueryBuilder(ipsecVert).createQueryFromURI(new URI(vigUri));
665
666         new ArrayList<>();
667         list.add("address-3");
668         list.add("address-4");
669         vig.setValue("ipaddress-v4-vig", list);
670         dbserLocal.serializeToDb(vig, vigVertex, uriQuery, "vf-module", vig.marshal(false));
671         assertTrue("Vertex is still there", engine.tx().traversal().V().has("aai-node-type", "vig-server")
672                 .has("vig-address-type", "vig").hasNext());
673         assertTrue("Vf module has edge to gvnf",
674                 engine.tx().traversal().V().has("aai-node-type", "vig-server").has("vig-address-type", "vig").both()
675                         .has("aai-node-type", "ipsec-configuration").has("ipsec-configuration-id", "ipsec").hasNext());
676
677         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
678         assertEquals(DeltaAction.UPDATE, dbserLocal.getObjectDeltas().get(vigUri).getAction());
679         assertEquals(4L, dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().values().stream()
680                 .filter(d -> d.getAction().equals(DeltaAction.STATIC)).count());
681         assertEquals(4L, dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().values().stream()
682                 .filter(d -> d.getAction().equals(DeltaAction.UPDATE)).count());
683         assertThat(dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().get("ipaddress-v4-vig").getValue(),
684                 instanceOf(List.class));
685         assertThat(dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().get("ipaddress-v4-vig").getOldValue(),
686                 instanceOf(List.class));
687         dbserLocal.getObjectDeltas().values().forEach(od -> {
688             if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID)) {
689                 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
690             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
691                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
692             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
693                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
694             }
695         });
696         /*
697          * Delete top level
698          */
699         dbserLocal =
700                 new DBSerializer(version, engine, introspectorFactoryType, "delete-ipsec", AAIProperties.MINIMUM_DEPTH);
701         ipsec = dbserLocal.getLatestVersionView(ipsecVert);
702         String rv = ipsec.getValue(AAIProperties.RESOURCE_VERSION);
703         dbserLocal.delete(engine.tx().traversal().V(ipsecVert).next(), rv, true);
704         System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
705
706         assertFalse("ipsec-configuration no longer exists",
707                 engine.tx().traversal().V().has("aai-node-type", "ipsec-configuration").hasNext());
708         assertFalse("vig-server no longer exists",
709                 engine.tx().traversal().V().has("aai-node-type", "vig-server").hasNext());
710
711         assertEquals(DeltaAction.DELETE, dbserLocal.getObjectDeltas().get(ipsecUri).getAction());
712         assertEquals(9L, dbserLocal.getObjectDeltas().get(ipsecUri).getPropertyDeltas().values().stream()
713                 .filter(d -> d.getAction().equals(DeltaAction.DELETE)).count());
714         assertEquals(DeltaAction.DELETE, dbserLocal.getObjectDeltas().get(vigUri).getAction());
715         assertEquals(10L, dbserLocal.getObjectDeltas().get(vigUri).getPropertyDeltas().values().stream()
716                 .filter(d -> d.getAction().equals(DeltaAction.DELETE)).count());
717         dbserLocal.getObjectDeltas().values().forEach(od -> {
718             if (!od.getPropertyDeltas().containsKey(AAIProperties.AAI_UUID)) {
719                 fail(od.getUri() + " is missing " + AAIProperties.AAI_UUID);
720             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID) == null) {
721                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " is null");
722             } else if (od.getPropertyDeltas().get(AAIProperties.AAI_UUID).getValue() == null) {
723                 fail(od.getUri() + " " + AAIProperties.AAI_UUID + " value is null");
724             }
725         });
726     }
727
728 }