2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.aai.serialization.db;
23 import static org.hamcrest.CoreMatchers.instanceOf;
24 import static org.junit.Assert.*;
26 import com.google.gson.FieldNamingPolicy;
27 import com.google.gson.Gson;
28 import com.google.gson.GsonBuilder;
30 import java.io.UnsupportedEncodingException;
32 import java.net.URISyntaxException;
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;
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 {
67 // to use, set thrown.expect to whatever your test needs
68 // this line establishes default of expecting no exception to be thrown
70 public ExpectedException thrown = ExpectedException.none();
72 protected static Graph graph;
75 protected EdgeSerializer edgeSer;
77 protected EdgeIngestor ei;
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
85 @Parameterized.Parameter(value = 0)
86 public QueryStyle queryStyle;
88 @Parameterized.Parameters(name = "QueryStyle.{0}")
89 public static Collection<Object[]> data() {
90 return Arrays.asList(new Object[][] {{QueryStyle.TRAVERSAL}, {QueryStyle.TRAVERSAL_URI}});
94 public static void init() throws Exception {
95 graph = JanusGraphFactory.build().set("storage.backend", "inmemory").open();
100 public void setup() throws Exception {
102 version = schemaVersions.getDefaultVersion();
103 loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, version);
104 dbEngine = new JanusGraphDBEngine(queryStyle, loader);
105 engine = new JanusGraphDBEngine(queryStyle, loader);
109 public void createTopLevelThenUpdateTest() throws AAIException, UnsupportedEncodingException, URISyntaxException {
110 engine.startTransaction();
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"));
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());
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");
141 gvnf = dbserLocal.getLatestVersionView(gvnfVert);
142 gvnf.setValue("vnf-type", "new-typo");
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());
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");
167 public void createTopLevelThenCreateChildTest()
168 throws AAIException, UnsupportedEncodingException, URISyntaxException {
169 engine.startTransaction();
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));
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());
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");
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));
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());
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");
231 public void createTopWithChildThenDeleteTopTest()
232 throws AAIException, UnsupportedEncodingException, URISyntaxException {
233 engine.startTransaction();
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));
242 gvnf.setValue("vnf-id", "myvnf");
243 gvnf.setValue("vnf-type", "typo");
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";
249 Introspector vfs = loader.introspectorFromName("vf-modules");
250 vfs.setValue("vf-module", Collections.singletonList(vf.getUnderlyingObject()));
251 gvnf.setValue("vf-modules", vfs.getUnderlyingObject());
253 dbserLocal.serializeToDb(gvnf, gvnfVert, uriQuery, "generic-vnf", gvnf.marshal(false));
255 Gson gson = new GsonBuilder().create();
256 System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
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());
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");
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()));
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());
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());
309 public void createComplexPserverWithRelDeleteRel()
310 throws AAIException, UnsupportedEncodingException, URISyntaxException {
311 engine.startTransaction();
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));
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());
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");
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));
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()));
359 pserver.setValue("relationship-list", relationshipList.getUnderlyingObject());
360 pserver.setValue("hostname", "ps");
362 System.out.println(pserver.marshal(true));
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());
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");
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());
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");
413 public void createComplexPserverWithRelUpdatePserverToDeleteRelAddPinterfaceThenDeleteComplex()
414 throws AAIException, UnsupportedEncodingException, URISyntaxException {
415 engine.startTransaction();
417 Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES).create();
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));
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));
435 System.out.println("Create Complex");
436 System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
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");
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));
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()));
468 pserver.setValue("relationship-list", relationshipList.getUnderlyingObject());
469 pserver.setValue("hostname", "ps-b");
470 pserver.setValue("number-of-cpus", 20);
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";
476 Introspector pints = loader.introspectorFromName("p-interfaces");
477 pints.setValue("p-interface", Collections.singletonList(pint.getUnderlyingObject()));
478 pserver.setValue("p-interfaces", pints.getUnderlyingObject());
480 dbserLocal.serializeToDb(pserver, pserverV, uriQuery, "pserver", pserver.marshal(false));
482 System.out.println("Create Pserver with pinterface and relationship to complex ");
483 System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
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());
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");
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);
525 dbserLocal.serializeToDb(pserver, pserverV, uriQuery, "pserver", pserver.marshal(false));
527 System.out.println("Update pserver removing relationship to complex");
528 System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
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());
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");
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);
557 System.out.println("Delete pserver");
558 System.out.println(gson.toJsonTree(dbserLocal.getObjectDeltas().values()));
560 assertFalse("pserver no longer exists", engine.tx().traversal().V().has("aai-node-type", "pserver").hasNext());
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");
579 // /network/ipsec-configurations/ipsec-configuration/{ipsec-configuration-id}/vig-servers/vig-server/{vig-address-type}
582 public void createNodeWithListTest() throws AAIException, UnsupportedEncodingException, URISyntaxException {
583 Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES).create();
585 engine.startTransaction();
588 * Create the parent ipsec-configuration
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));
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());
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");
619 * Create child vig-server with list property vig-address-type
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));
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());
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");
659 * Update child vig-server with new list for vig-address-type
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));
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());
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");
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()));
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());
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");