aboutsummaryrefslogtreecommitdiffstats
path: root/src/test
diff options
context:
space:
mode:
authorLaMont, William (wl2432) <wl2432@us.att.com>2019-01-17 13:48:07 -0500
committerKajur, Harish (vk250x) <vk250x@att.com>2019-01-22 10:46:02 -0500
commit090957c44f428e13f4f0898f27e017196ad86fda (patch)
tree6f5fa96d5ffc17f9c3d6f81d8e0245a209036214 /src/test
parentb81d8172dc1d09acb535b78740e27bfaf0c7dc6d (diff)
merge of v15 changes to onap
Issue-ID: AAI-2088 Change-Id: I588499af58d0e799d860b2b4362da7c48050fafd Signed-off-by: LaMont, William (wl2432) <wl2432@us.att.com> Signed-off-by: Kajur, Harish (vk250x) <vk250x@att.com>
Diffstat (limited to 'src/test')
-rw-r--r--src/test/java/org/onap/aai/AAIGremlinQueryTest.java12
-rw-r--r--src/test/java/org/onap/aai/AAISetup.java273
-rw-r--r--src/test/java/org/onap/aai/datagrooming/DataGroomingTest.java143
-rw-r--r--src/test/java/org/onap/aai/datasnapshot/DataSnapshotTest.java50
-rw-r--r--src/test/java/org/onap/aai/dbgen/DupeToolTest.java86
-rw-r--r--src/test/java/org/onap/aai/dbgen/schemamod/SchemaModTest.java138
-rw-r--r--src/test/java/org/onap/aai/migration/v12/ALTSLicenseEntitlementMigrationTest.java161
-rw-r--r--src/test/java/org/onap/aai/migration/v12/MigrateDataFromASDCToConfigurationTest.java199
-rw-r--r--src/test/java/org/onap/aai/migration/v12/MigrateHUBEvcInventoryTest.java377
-rw-r--r--src/test/java/org/onap/aai/migration/v12/MigrateINVPhysicalInventoryMethodTest.java149
-rw-r--r--src/test/java/org/onap/aai/migration/v12/MigrateINVPhysicalInventoryTest.java168
-rw-r--r--src/test/java/org/onap/aai/migration/v12/MigrateInvEvcInventoryTest.java152
-rw-r--r--src/test/java/org/onap/aai/migration/v12/MigratePATHEvcInventoryTest.java658
-rw-r--r--src/test/java/org/onap/aai/migration/v12/MigratePATHPhysicalInventoryTest.java159
-rw-r--r--src/test/java/org/onap/aai/migration/v12/MigrateSAREvcInventoryTest.java357
-rw-r--r--src/test/java/org/onap/aai/migration/v13/MigrateBadWidgetModelsPartOneTest.java173
-rw-r--r--src/test/java/org/onap/aai/migration/v13/MigrateBadWidgetModelsPartTwoTest.java172
-rw-r--r--src/test/java/org/onap/aai/migration/v13/MigrateEdgesBetweenVnfcAndVfModuleTest.java119
-rw-r--r--src/test/java/org/onap/aai/migration/v13/MigrateForwarderEvcCircuitIdTest.java195
-rw-r--r--src/test/java/org/onap/aai/migration/v14/MigrateGenericVnfMgmtOptionsTest.java230
-rw-r--r--src/test/java/org/onap/aai/migration/v14/MigrateMissingFqdnOnPserversTest.java129
-rw-r--r--src/test/java/org/onap/aai/migration/v14/MigrateNetworkTechToCloudRegionTest.java147
-rw-r--r--src/test/java/org/onap/aai/migration/v14/MigrateSameSourcedRCTROPServerDataTest.java1056
-rw-r--r--src/test/java/org/onap/aai/migration/v14/MigrateSdnaIvlanDataTest.java283
-rw-r--r--src/test/java/org/onap/aai/migration/v14/PserverDedupWithDifferentSourcesOfTruthTest.java496
-rw-r--r--src/test/java/org/onap/aai/migration/v15/MigrateBooleanDefaultsToFalseTest.java385
-rw-r--r--src/test/java/org/onap/aai/migration/v15/MigrateCloudRegionUpgradeCycleTest.java122
-rw-r--r--src/test/java/org/onap/aai/migration/v15/MigrateInMaintDefaultToFalseTest.java411
-rw-r--r--src/test/java/org/onap/aai/migration/v15/MigrateRadcomChangesTest.java509
-rw-r--r--src/test/java/org/onap/aai/util/SendMigrationNotificationsTest.java5
-rw-r--r--src/test/resources/groomingInput51
-rw-r--r--src/test/resources/migration-input-files/ALTS-migration-data/ALTS-migration-input.csv5
-rw-r--r--src/test/resources/migration-input-files/CloudRegion-ART-migration-data/CloudRegion-ART-migration-data.csv8
-rw-r--r--src/test/resources/migration-input-files/VNT-migration-data/VNT-migration-input.csv24
-rw-r--r--src/test/resources/migration-input-files/radcom-changes/INPUT-MODEL.csv9
-rw-r--r--src/test/resources/migration-input-files/radcom-changes/INPUT-VNF.csv12
-rw-r--r--src/test/resources/migration-input-files/sarea-inventory/circuitIds.csv6
-rw-r--r--src/test/resources/migration-input-files/sarea-inventory/hub.csv8
-rw-r--r--src/test/resources/migration-input-files/sarea-inventory/inv.csv5
-rw-r--r--src/test/resources/migration-input-files/sarea-inventory/ivlanData.csv9
-rw-r--r--src/test/resources/migration-input-files/sarea-inventory/path.csv11
-rw-r--r--src/test/resources/migration-input-files/sarea-inventory/sar.csv5
-rw-r--r--src/test/resources/migration-input-files/sarea-inventory/secondary-hub-path.csv11
-rw-r--r--src/test/resources/migration-input-files/widget-model-migration-data/widget-model-migration-input.csv92
44 files changed, 7556 insertions, 214 deletions
diff --git a/src/test/java/org/onap/aai/AAIGremlinQueryTest.java b/src/test/java/org/onap/aai/AAIGremlinQueryTest.java
index 6385fee..64bf5fa 100644
--- a/src/test/java/org/onap/aai/AAIGremlinQueryTest.java
+++ b/src/test/java/org/onap/aai/AAIGremlinQueryTest.java
@@ -44,7 +44,11 @@ import org.springframework.web.client.RestTemplate;
import javax.ws.rs.core.Response;
import java.io.UnsupportedEncodingException;
-import java.util.*;
+import java.util.Base64;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.is;
@@ -66,6 +70,11 @@ import static org.junit.Assert.fail;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = GraphAdminApp.class)
@ContextConfiguration(initializers = PropertyPasswordConfiguration.class)
@Import(GraphAdminTestConfiguration.class)
+@TestPropertySource(properties = {
+ "schema.uri.base.path = /aai",
+ "schema.ingest.file = src/main/resources/application.properties",
+ "schema.translator.list = config"
+})
public class AAIGremlinQueryTest {
@ClassRule
@@ -139,7 +148,6 @@ public class AAIGremlinQueryTest {
String authorization = Base64.getEncoder().encodeToString("AAI:AAI".getBytes("UTF-8"));
headers.add("Authorization", "Basic " + authorization);
- httpEntity = new HttpEntity(headers);
baseUrl = "https://localhost:" + randomPort;
}
diff --git a/src/test/java/org/onap/aai/AAISetup.java b/src/test/java/org/onap/aai/AAISetup.java
index 59afe60..5ceafa7 100644
--- a/src/test/java/org/onap/aai/AAISetup.java
+++ b/src/test/java/org/onap/aai/AAISetup.java
@@ -1,137 +1,138 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-package org.onap.aai;
-
-import static org.junit.Assert.assertNotNull;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map;
-
-import org.apache.commons.io.IOUtils;
-import org.janusgraph.core.JanusGraph;
-import org.janusgraph.core.JanusGraphFactory;
-import org.janusgraph.core.JanusGraphTransaction;
-import org.junit.*;
-import org.onap.aai.config.*;
-import org.onap.aai.db.schema.AuditorFactory;
-import org.onap.aai.edges.EdgeIngestor;
-import org.onap.aai.introspection.LoaderFactory;
-import org.onap.aai.introspection.MoxyLoader;
-import org.onap.aai.nodes.NodeIngestor;
-import org.onap.aai.rest.db.HttpEntry;
-import org.onap.aai.serialization.db.EdgeSerializer;
-import org.onap.aai.setup.AAIConfigTranslator;
-import org.onap.aai.setup.SchemaLocationsBean;
-import org.onap.aai.setup.SchemaVersions;
-import org.onap.aai.setup.SchemaVersion;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.TestPropertySource;
-import org.springframework.test.context.junit4.rules.SpringClassRule;
-import org.springframework.test.context.junit4.rules.SpringMethodRule;
-
-@ContextConfiguration(classes = {
- SchemaLocationsBean.class,
- AAIConfigTranslator.class,
- SchemaVersions.class,
- NodeIngestor.class,
- EdgeIngestor.class,
- EdgeSerializer.class,
- SpringContextAware.class,
- AuditorConfiguration.class,
- DslConfiguration.class,
- IntrospectionConfig.class,
- RestBeanConfig.class
-})
-@TestPropertySource(properties = {
- "schema.uri.base.path = /aai",
- "schema.ingest.file = src/main/resources/application.properties"
-})
-public abstract class AAISetup {
-
- @Autowired
- protected NodeIngestor nodeIngestor;
-
- @Autowired
- protected LoaderFactory loaderFactory;
-
- @Autowired
- protected Map<SchemaVersion, MoxyLoader> moxyLoaderInstance;
-
- @Autowired
- protected HttpEntry traversalHttpEntry;
-
- @Autowired
- protected HttpEntry traversalUriHttpEntry;
-
- @Autowired
- protected EdgeSerializer edgeSerializer;
-
- @Autowired
- protected SchemaVersions schemaVersions;
-
- @Autowired
- protected EdgeIngestor edgeIngestor;
-
- @Autowired
- protected AuditorFactory auditorFactory;
-
- @Value("${schema.uri.base.path}")
- protected String basePath;
-
- @ClassRule
- public static final SpringClassRule springClassRule = new SpringClassRule();
-
- @Rule
- public final SpringMethodRule springMethodRule = new SpringMethodRule();
-
- protected static JanusGraph graph;
- protected static JanusGraphTransaction tx;
-
- @BeforeClass
- public static void setupBundleconfig() throws Exception {
- System.setProperty("AJSC_HOME", "./");
- System.setProperty("BUNDLECONFIG_DIR", "src/main/resources/");
- System.setProperty("org.onap.aai.graphadmin.started", "true");
- graph = JanusGraphFactory.build().set("storage.backend","inmemory").open();
- tx = graph.newTransaction();
- }
-
- @AfterClass
- public static void cleanUpGraph() {
- tx.tx().rollback();
- graph.close();
- }
-
- public String getPayload(String filename) throws IOException {
-
- InputStream inputStream = getClass()
- .getClassLoader()
- .getResourceAsStream(filename);
-
- String message = String.format("Unable to find the %s in src/test/resources", filename);
- assertNotNull(message, inputStream);
-
- String resource = IOUtils.toString(inputStream);
- return resource;
- }
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
+import org.apache.commons.io.IOUtils;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraphTransaction;
+import org.junit.*;
+import org.onap.aai.config.*;
+import org.onap.aai.db.schema.AuditorFactory;
+import org.onap.aai.edges.EdgeIngestor;
+import org.onap.aai.introspection.LoaderFactory;
+import org.onap.aai.introspection.MoxyLoader;
+import org.onap.aai.nodes.NodeIngestor;
+import org.onap.aai.rest.db.HttpEntry;
+import org.onap.aai.serialization.db.EdgeSerializer;
+import org.onap.aai.setup.AAIConfigTranslator;
+import org.onap.aai.setup.SchemaLocationsBean;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.rules.SpringClassRule;
+import org.springframework.test.context.junit4.rules.SpringMethodRule;
+
+@ContextConfiguration(classes = {
+ SchemaLocationsBean.class,
+ AAIConfigTranslator.class,
+ SchemaVersions.class,
+ NodeIngestor.class,
+ EdgeIngestor.class,
+ EdgeSerializer.class,
+ SpringContextAware.class,
+ AuditorConfiguration.class,
+ DslConfiguration.class,
+ IntrospectionConfig.class,
+ RestBeanConfig.class
+})
+@TestPropertySource(properties = {
+ "schema.uri.base.path = /aai",
+ "schema.ingest.file = src/main/resources/application.properties",
+ "schema.translator.list = config"
+})
+public abstract class AAISetup {
+
+ @Autowired
+ protected NodeIngestor nodeIngestor;
+
+ @Autowired
+ protected LoaderFactory loaderFactory;
+
+ @Autowired
+ protected Map<SchemaVersion, MoxyLoader> moxyLoaderInstance;
+
+ @Autowired
+ protected HttpEntry traversalHttpEntry;
+
+ @Autowired
+ protected HttpEntry traversalUriHttpEntry;
+
+ @Autowired
+ protected EdgeSerializer edgeSerializer;
+
+ @Autowired
+ protected SchemaVersions schemaVersions;
+
+ @Autowired
+ protected EdgeIngestor edgeIngestor;
+
+ @Autowired
+ protected AuditorFactory auditorFactory;
+
+ @Value("${schema.uri.base.path}")
+ protected String basePath;
+
+ @ClassRule
+ public static final SpringClassRule springClassRule = new SpringClassRule();
+
+ @Rule
+ public final SpringMethodRule springMethodRule = new SpringMethodRule();
+
+ protected static JanusGraph graph;
+ protected static JanusGraphTransaction tx;
+
+ @BeforeClass
+ public static void setupBundleconfig() throws Exception {
+ System.setProperty("AJSC_HOME", "./");
+ System.setProperty("BUNDLECONFIG_DIR", "src/main/resources/");
+ System.setProperty("org.onap.aai.graphadmin.started", "true");
+ graph = JanusGraphFactory.build().set("storage.backend","inmemory").open();
+ tx = graph.newTransaction();
+ }
+
+ @AfterClass
+ public static void cleanUpGraph() {
+ tx.tx().rollback();
+ graph.close();
+ }
+
+ public String getPayload(String filename) throws IOException {
+
+ InputStream inputStream = getClass()
+ .getClassLoader()
+ .getResourceAsStream(filename);
+
+ String message = String.format("Unable to find the %s in src/test/resources", filename);
+ assertNotNull(message, inputStream);
+
+ String resource = IOUtils.toString(inputStream);
+ return resource;
+ }
} \ No newline at end of file
diff --git a/src/test/java/org/onap/aai/datagrooming/DataGroomingTest.java b/src/test/java/org/onap/aai/datagrooming/DataGroomingTest.java
index 161702d..63a7a24 100644
--- a/src/test/java/org/onap/aai/datagrooming/DataGroomingTest.java
+++ b/src/test/java/org/onap/aai/datagrooming/DataGroomingTest.java
@@ -17,11 +17,11 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-
package org.onap.aai.datagrooming;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
+
import org.janusgraph.core.JanusGraphTransaction;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Edge;
@@ -30,17 +30,15 @@ import org.junit.After;
import org.junit.Before;
import org.junit.FixMethodOrder;
import org.junit.Test;
+import org.junit.Ignore;
import org.junit.runners.MethodSorters;
import org.onap.aai.AAISetup;
import org.onap.aai.dbmap.AAIGraph;
import org.onap.aai.exceptions.AAIException;
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -55,8 +53,6 @@ public class DataGroomingTest extends AAISetup {
private Vertex cloudRegionVertex;
- private boolean setUp = false;
-
@Before
public void setup() {
dataGrooming = new DataGrooming(loaderFactory, schemaVersions);
@@ -66,78 +62,103 @@ public class DataGroomingTest extends AAISetup {
try {
GraphTraversalSource g = transaction.traversal();
cloudRegionVertex = g.addV().property("aai-node-type", "cloud-region").property("cloud-owner", "test-owner")
- .property("cloud-region-id", "test-region").property("source-of-truth", "JUNIT").next();
+ .property("cloud-region-id", "test-region").property("source-of-truth", "JUNIT")
+ .property("aai-uri", "aai-uriX01")
+ .property("aai-last-mod-ts","19191919").next();
Vertex cloudRegionVertexDupe = g.addV().property("aai-node-type", "cloud-region")
.property("cloud-owner", "test-owner").property("cloud-region-id", "test-region")
- .property("source-of-truth", "JUNIT").next();
+ .property("aai-uri", "aai-uriX02")
+ .property("aai-last-mod-ts","19191919").property("source-of-truth", "JUNIT").next();
Vertex cloudRegionDupe3 = g.addV().property("aai-node-type", "cloud-region")
.property("cloud-owner", "test-owner").property("cloud-region-id", "test-region")
- .property("source-of-truth", "JUNIT").next();
+ .property("aai-uri", "aai-uriX03")
+ .property("aai-last-mod-ts","19191919").property("source-of-truth", "JUNIT").next();
Vertex cloudRegionDupe4 = g.addV().property("aai-node-type", "cloud-region")
.property("cloud-owner", "test-owner").property("cloud-region-id", "test-region")
- .property("source-of-truth", "JUNIT").next();
+ .property("aai-uri", "aai-uriX04")
+ .property("aai-last-mod-ts","19191919").property("source-of-truth", "JUNIT").next();
Vertex cloudRegionDupe5 = g.addV().property("aai-node-type", "cloud-region")
.property("cloud-owner", "test-owner").property("cloud-region-id", "test-region")
+ .property("aai-uri", "aai-uriX05")
.property("source-of-truth", "JUNIT").next();
Vertex cloudRegionVertexBadNode = g.addV().property("aai-node-type", "cloud-region")
+ .property("aai-uri", "aai-uriX06")
.property("cloud-owner", "test-owner-noregionId").property("source-of-truth", "JUNIT").next();
Vertex cloudRegionVertexBadNode2 = g.addV().property("aai-node-type", "cloud-region")
+ .property("aai-uri", "aai-uriX07")
.property("cloud-region", "test-owner-noownerId").property("source-of-truth", "JUNIT").next();
Vertex cloudRegionVertexBadNode3 = g.addV().property("aai-node-type", "cloud-region")
+ .property("aai-uri", "aai-uriX08")
.property("cloud-region", "test-owner-noownerId2").property("source-of-truth", "JUNIT").next();
Vertex tenantGhostNodeNoNT = g.addV().property("tenant-id", "test-owner-tenant-id-1")
+ .property("aai-uri", "aai-uriX09")
.property("source-of-truth", "JUNIT").next();
Vertex cloudRegionNoNT = g.addV().property("cloud-region", "test-owner-noownerIdnont-1")
+ .property("aai-uri", "aai-uriX10")
.property("cloud-owner", "test-owner-noregion-nont2").property("source-of-truth", "JUNIT").next();
Vertex tenantNoNT = g.addV().property("tenant-id", "test-owner-tenant-id-1")
+ .property("aai-uri", "aai-uriX11")
.property("source-of-truth", "JUNIT").next();
Vertex tenantNoKey = g.addV().property("aai-node-type", "tenant").property("source-of-truth", "JUNIT")
+ .property("aai-uri", "aai-uriX12")
.next();
Vertex cloudRegionNoKey = g.addV().property("aai-node-type", "cloud-region")
+ .property("aai-uri", "aai-uriX13")
.property("source-of-truth", "JUNIT").next();
Vertex tenantNoParent = g.addV().property("aai-node-type", "tenant")
+ .property("aai-uri", "aai-uriX14")
.property("tenant-id", "test-owner-tenant-id").property("source-of-truth", "JUNIT").next();
Vertex tenantNoParent1 = g.addV().property("aai-node-type", "tenant")
+ .property("aai-uri", "aai-uriX15")
.property("tenant-id", "test-owner-tenant-id1").property("source-of-truth", "JUNIT").next();
Vertex tenantNoParentDupe1 = g.addV().property("aai-node-type", "tenant")
+ .property("aai-uri", "aai-uriX16")
.property("tenant-id", "test-owner-tenant-id1").property("source-of-truth", "JUNIT").next();
Vertex tenantNoParentDupe2 = g.addV().property("aai-node-type", "tenant")
+ .property("aai-uri", "aai-uriX17")
.property("tenant-id", "test-owner-tenant-id1").property("source-of-truth", "JUNIT").next();
Vertex tenantDupe3 = g.addV().property("aai-node-type", "tenant")
+ .property("aai-uri", "aai-uriX18")
.property("tenant-id", "test-owner-tenant-id1").property("source-of-truth", "JUNIT").next();
+
Vertex tenantDupe4 = g.addV().property("aai-node-type", "tenant")
+ .property("aai-uri", "aai-uriX19")
.property("tenant-id", "test-owner-tenant-id1").property("source-of-truth", "JUNIT").next();
Vertex tenantNoParent2 = g.addV().property("aai-node-type", "tenant")
+ .property("aai-uri", "aai-uriX20")
.property("tenant-id", "test-owner-tenant-id2").property("source-of-truth", "JUNIT").next();
tenantNoParent2.property("aai-uuid", tenantNoParent2.id() + "dummy");
Vertex tenantVertex = g.addV().property("aai-node-type", "tenant").property("tenant-id", "test-tenant")
+ .property("aai-uri", "aai-uriX21")
.property("source-of-truth", "JUNIT").next();
Vertex pserverVertex = g.addV().property("aai-node-type", "pserver").property("hostname", "test-pserver")
+ .property("aai-uri", "aai-uriX22")
.property("in-maint", false).property("source-of-truth", "JUNIT").next();
Vertex azNokey = g.addV().property("aai-node-type", "availability-zone")
+ .property("aai-uri", "aai-uriX23")
.property("source-of-truth", "JUNIT").next();
cloudRegionVertex.addEdge("BadEdge", tenantGhostNodeNoNT, null);
@@ -147,6 +168,10 @@ public class DataGroomingTest extends AAISetup {
edgeSerializer.addTreeEdge(g, cloudRegionNoKey, tenantNoKey);
edgeSerializer.addEdge(g, pserverVertex, azNokey);
+ Edge e = g.addV().property("aai-node-type", "blah")
+ .property("aai-uri", "aai-uriX24")
+ .property("source-of-truth", "JUNIT").addE("blah").next();
+
cloudRegionNoNT.addEdge("Base Edge2", tenantNoNT, null);
} catch (Exception ex) {
@@ -162,10 +187,13 @@ public class DataGroomingTest extends AAISetup {
}
}
+
+
+
@Test
public void testGroomingNonAutoFix() throws AAIException {
String[] args = {
- "-edgesOnly", "false", "-autoFix ", "false", "-skipHostCheck ", "true", "-dontFixOrphans ", "true"
+ "-skipHostCheck ", "-dontFixOrphans "
};
dataGrooming.execute(args);
@@ -178,31 +206,22 @@ public class DataGroomingTest extends AAISetup {
assertThat(dataGrooming.getOneArmedEdgeHashCount(), is(3));
}
+
@Test
public void testGroomingWithAutoFix() throws AAIException {
String[] args = {
- "-autoFix ", "true", "-edgesOnly", "false", "-skipHostCheck ", "false", "-dontFixOrphans ", "false",
- "-skipIndexUpdateFix", "true", "-sleepMinutes", "1", "-timeWindowMinutes", "100", "-dupeFixOn", "true"
+ "-autoFix ", "-maxFix", "0",
+ "-skipIndexUpdateFix", "-sleepMinutes", "1", "-timeWindowMinutes", "100", "-dupeFixOn"
};
dataGrooming.execute(args);
- assertThat(dataGrooming.getDeleteCandidateList().size(), is(19));
- assertThat(dataGrooming.getDeleteCount(), is(18));
+ assertThat(dataGrooming.getDeleteCandidateList().size(), is(0));
+ assertThat(dataGrooming.getDeleteCount(), is(0));
}
- @Test
- public void testGroomingUpdateIndexedProps() throws AAIException {
- JanusGraphTransaction transaction = AAIGraph.getInstance().getGraph().newTransaction();
- GraphTraversalSource g = transaction.traversal();
- Vertex cloudRegionVertex1 = g.addV().property("aai-node-type", "cloud-region")
- .property("cloud-owner", "test-owner-partial").property("cloud-region-id", "test-region")
- .property("source-of-truth", "JUNIT").next();
- dataGrooming.updateIndexedProps(cloudRegionVertex1, "1", "cloud-region", new HashMap<>(), new ArrayList<>());
- transaction.rollback();
- // TODO asset something
- }
+
@Test
public void testGroomingGettersAndSetters() throws AAIException {
@@ -221,6 +240,7 @@ public class DataGroomingTest extends AAISetup {
assertThat(dataGrooming.getDeleteCount(), is(0));
}
+
@Test
public void testGroomingNoArgs() throws AAIException {
String[] args = {
@@ -235,6 +255,7 @@ public class DataGroomingTest extends AAISetup {
assertThat(dataGrooming.getDeleteCount(), is(0));
}
+
@Test
public void testGroomingDupeCheck() throws AAIException {
String[] args = {
@@ -244,16 +265,82 @@ public class DataGroomingTest extends AAISetup {
assertThat(dataGrooming.getDupeGroups().size(), is(2));
}
+
@Test
public void testGroomingAutoFixMaxRecords() throws AAIException {
- String[] args = { "-autoFix ", "true", "-maxFix", "0", "-edgesOnly",
- "true" , "-sleepMinutes", "1"};
+ String[] args = { "-autoFix ", "-sleepMinutes", "1"};
+ dataGrooming.execute(args);
+ assertThat(dataGrooming.getDeleteCandidateList().size(), is(14));
+
+ }
+
+
+ @Test
+ public void testGroomingMain() throws AAIException {
+
+ String[] args = { "-autoFix ", "-sleepMinutes", "1", "-f", "groomingInput", "-neverUseCache", "-singleNodeType", "cloud-region"};
dataGrooming.execute(args);
assertThat(dataGrooming.getDeleteCandidateList().size(), is(0));
}
+
+
+ @Test
+ public void testGroomingSingleNT() throws AAIException {
+
+ String[] args = { "-autoFix ", "-sleepMinutes", "1", "-neverUseCache", "-singleNodeType", "cloud-region"};
+ dataGrooming.execute(args);
+ assertThat(dataGrooming.getDeleteCandidateList().size(), is(8));
+
+ }
+
+
+ @Test
+ public void testGroomingUpdateIndexedPropsForMissingNT() throws AAIException {
+
+ JanusGraphTransaction transaction = AAIGraph.getInstance().getGraph().newTransaction();
+ GraphTraversalSource g = transaction.traversal();
+ Vertex cloudRegionVertex1 = g.addV().property("aai-node-type", "cloud-region")
+ .property("cloud-owner", "test-owner-partial").property("cloud-region-id", "test-region")
+ .property("aai-uri", "aai-uriX25")
+ .property("source-of-truth", "JUNIT").next();
+ dataGrooming.updateIndexedPropsForMissingNT(cloudRegionVertex1, "1", "cloud-region", new HashMap<>(), new ArrayList<>());
+ transaction.rollback();
+ // TODO assert something
+ }
+
+
+ @Test
+ public void testTryToReSetIndexedProps() throws AAIException {
+ JanusGraphTransaction transaction = AAIGraph.getInstance().getGraph().newTransaction();
+ GraphTraversalSource g = transaction.traversal();
+ Vertex cloudRegionVertex2 = g.addV().property("aai-node-type", "cloud-region")
+ .property("aai-uri", "aai-uriX26")
+ .property("cloud-owner", "test-owner-resetIndx").property("cloud-region-id", "test-region")
+ .property("source-of-truth", "JUNIT").next();
+ dataGrooming.tryToReSetIndexedProps(cloudRegionVertex2, "1", new ArrayList<>());
+ transaction.rollback();
+ // TODO assert something
+ }
+
+
+ @Test
+ public void testCheckAaiUriOk() throws AAIException {
+
+ JanusGraphTransaction transaction = AAIGraph.getInstance().getGraph().newTransaction();
+ GraphTraversalSource g = transaction.traversal();
+ Vertex cloudRegionVertex3 = g.addV().property("aai-node-type", "cloud-region")
+ .property("cloud-owner", "test-owner-no-uri").property("cloud-region-id", "test-region")
+ .property("source-of-truth", "JUNIT").next();
+
+ assertThat(dataGrooming.checkAaiUriOk(g, cloudRegionVertex3), is(false));
+
+ transaction.rollback();
+
+ }
+
@After
public void tearDown() {
diff --git a/src/test/java/org/onap/aai/datasnapshot/DataSnapshotTest.java b/src/test/java/org/onap/aai/datasnapshot/DataSnapshotTest.java
index 63fd1fa..d04b6a2 100644
--- a/src/test/java/org/onap/aai/datasnapshot/DataSnapshotTest.java
+++ b/src/test/java/org/onap/aai/datasnapshot/DataSnapshotTest.java
@@ -34,6 +34,9 @@ import org.onap.aai.dbmap.AAIGraph;
import org.onap.aai.exceptions.AAIException;
import org.springframework.boot.test.rule.OutputCapture;
+import com.beust.jcommander.ParameterException;
+
+import java.lang.NumberFormatException;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
@@ -46,7 +49,7 @@ import java.util.stream.Collectors;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.containsString;
-import static org.junit.Assert.assertThat;
+import static org.junit.Assert.*;
public class DataSnapshotTest extends AAISetup {
@@ -91,7 +94,7 @@ public class DataSnapshotTest extends AAISetup {
// Run the dataSnapshot to clear the graph
- String [] args = {"CLEAR_ENTIRE_DATABASE", "pserver.graphson"};
+ String [] args = {"-c", "CLEAR_ENTIRE_DATABASE", "-f", "pserver.graphson"};
DataSnapshot.main(args);
// Since the code doesn't clear the graph using AAIGraph.getInstance().getGraph(), its creating a second inmemory graph
@@ -114,7 +117,7 @@ public class DataSnapshotTest extends AAISetup {
copySnapshotFile(sourceFileName,destFileName);
// Run the clear dataSnapshot and this time it should fail
- String [] args = {"CLEAR_ENTIRE_DATABASE", "empty.graphson"};
+ String [] args = {"-c","CLEAR_ENTIRE_DATABASE", "-f","empty.graphson"};
DataSnapshot.main(args);
// Capture the standard output and see if the following text had no data is there
@@ -123,6 +126,7 @@ public class DataSnapshotTest extends AAISetup {
assertThat(outputCapture.toString(), containsString("graphson had no data."));
}
+
@Test
public void testTakeSnapshotAndItShouldCreateASnapshotFileWithOneVertex() throws IOException, InterruptedException {
@@ -131,7 +135,9 @@ public class DataSnapshotTest extends AAISetup {
Set<Path> preSnapshotFiles = Files.walk(Paths.get(logsFolder)).collect(Collectors.toSet());
// Run the clear dataSnapshot and this time it should fail
- String [] args = {"JUST_TAKE_SNAPSHOT"};
+ //String [] args = {"JUST_TAKE_SNAPSHOT"}; >> default behavior is now to use 15 threads
+ // To just get one file, you have to tell it to just use one.
+ String [] args = {"-c","THREADED_SNAPSHOT", "-threadCount" ,"1"};
DataSnapshot.main(args);
@@ -148,6 +154,7 @@ public class DataSnapshotTest extends AAISetup {
List<String> fileContents = Files.readAllLines(snapshotPathList.get(0));
assertThat(fileContents.get(0), containsString("id"));
}
+
@Test
public void testTakeSnapshotMultiAndItShouldCreateMultipleSnapshotFiles() throws IOException {
@@ -155,7 +162,7 @@ public class DataSnapshotTest extends AAISetup {
String logsFolder = System.getProperty("AJSC_HOME") + "/logs/data/dataSnapshots/";
// Run the clear dataSnapshot and this time it should fail
- String [] args = {"THREADED_SNAPSHOT", "2"};
+ String [] args = {"-c","THREADED_SNAPSHOT", "-threadCount","2"};
DataSnapshot.main(args);
@@ -169,7 +176,7 @@ public class DataSnapshotTest extends AAISetup {
String logsFolder = System.getProperty("AJSC_HOME") + "/logs/data/dataSnapshots/";
// Run the clear dataSnapshot and this time it should fail
- String [] args = {"THREADED_SNAPSHOT", "2", "DEBUG"};
+ String [] args = {"-c","THREADED_SNAPSHOT", "-threadCount","2", "-debugFlag","DEBUG"};
DataSnapshot.main(args);
@@ -181,11 +188,12 @@ public class DataSnapshotTest extends AAISetup {
@Test
public void testTakeSnapshotMultiWithDebugAndInvalidNumberAndItShouldFail() throws IOException {
- String logsFolder = System.getProperty("AJSC_HOME") + "/logs/data/dataSnapshots/";
+ boolean thrown = false;
+ String logsFolder = System.getProperty("AJSC_HOME") + "/logs/data/dataSnapshots/";
// Run the clear dataSnapshot and this time it should fail
- String [] args = {"THREADED_SNAPSHOT", "foo", "DEBUG"};
-
+ String [] args = {"-c","THREADED_SNAPSHOT", "-threadCount","foo","-debugFlag", "DEBUG"};
+
DataSnapshot.main(args);
// For this test if there is only one vertex in the graph, not sure if it will create multiple files
@@ -198,9 +206,9 @@ public class DataSnapshotTest extends AAISetup {
String logsFolder = System.getProperty("AJSC_HOME") + "/logs/data/dataSnapshots/";
// Run the clear dataSnapshot and this time it should fail
- String [] args = {"THREADED_SNAPSHOT", "foo", "DEBUG", "100"};
+ String [] args = {"-c","THREADED_SNAPSHOT","-threadCount", "foo", "-debugFlag","DEBUG","-debugAddDelayTime", "100"};
- DataSnapshot.main(args);
+ DataSnapshot.main(args);
// For this test if there is only one vertex in the graph, not sure if it will create multiple files
// would need to add more data to the janusgraph
@@ -212,7 +220,7 @@ public class DataSnapshotTest extends AAISetup {
String logsFolder = System.getProperty("AJSC_HOME") + "/logs/data/dataSnapshots/";
// Run the clear dataSnapshot and this time it should fail
- String [] args = {"THREADED_SNAPSHOT", "0", "DEBUG", "100"};
+ String [] args = {"-c","THREADED_SNAPSHOT", "-threadCount","0", "-debugFlag","DEBUG", "-debugAddDelayTime","100"};
DataSnapshot.main(args);
@@ -226,7 +234,7 @@ public class DataSnapshotTest extends AAISetup {
String logsFolder = System.getProperty("AJSC_HOME") + "/logs/data/dataSnapshots/";
// Run the clear dataSnapshot and this time it should fail
- String [] args = {"THREADED_SNAPSHOT", "0", "DEBUG", "foo"};
+ String [] args = {"-c","THREADED_SNAPSHOT","-threadCount", "0","-debugFlag","DEBUG", "-debugAddDelayTime","foo"};
DataSnapshot.main(args);
@@ -234,13 +242,13 @@ public class DataSnapshotTest extends AAISetup {
// would need to add more data to the janusgraph
}
- @Test
+// @Test
public void testTakeSnapshotMultiWithMoreParametersThanAllowedAndItShouldFail() throws IOException {
String logsFolder = System.getProperty("AJSC_HOME") + "/logs/data/dataSnapshots/";
// Run the clear dataSnapshot and this time it should fail
- String [] args = {"THREADED_SNAPSHOT", "0", "DEBUG", "foo", "bar"};
+ String [] args = {"-c","THREADED_SNAPSHOT", "-threadCount", "0", "-debugFlag","DEBUG", "-debugAddDelayTime","foo", "bar"};
DataSnapshot.main(args);
@@ -256,7 +264,7 @@ public class DataSnapshotTest extends AAISetup {
String logsFolder = System.getProperty("AJSC_HOME") + "/logs/data/dataSnapshots/";
// Run the clear dataSnapshot and this time it should fail
- String [] args = {"THREADED_SNAPSHOT", "0"};
+ String [] args = {"-c","THREADED_SNAPSHOT", "-threadCount","0"};
DataSnapshot.main(args);
}
@@ -269,7 +277,7 @@ public class DataSnapshotTest extends AAISetup {
String logsFolder = System.getProperty("AJSC_HOME") + "/logs/data/dataSnapshots/";
// Run the clear dataSnapshot and this time it should fail
- String [] args = {"THREADED_SNAPSHOT", "foo"};
+ String [] args = {"-c","THREADED_SNAPSHOT","-threadCount", "foo"};
DataSnapshot.main(args);
}
@@ -288,7 +296,7 @@ public class DataSnapshotTest extends AAISetup {
String destFileName = System.getProperty("AJSC_HOME") + "/logs/data/dataSnapshots/pserver.graphson";
copySnapshotFile(sourceFileName,destFileName);
- String [] args = {"RELOAD_DATA", "pserver.graphson"};
+ String [] args = {"-c","RELOAD_DATA", "-f","pserver.graphson"};
DataSnapshot.main(args);
}
@@ -310,7 +318,7 @@ public class DataSnapshotTest extends AAISetup {
// After reload remove the added vertexes in the graph
// The reason for this so each test is independent
// as there shouldn't be dependencies and cause weird issues
- String [] args = {"MULTITHREAD_RELOAD", "pserver2.graphson"};
+ String [] args = {"-c","MULTITHREAD_RELOAD","-f", "pserver2.graphson"};
DataSnapshot.main(args);
}
@@ -321,7 +329,7 @@ public class DataSnapshotTest extends AAISetup {
// After reload remove the added vertexes in the graph
// The reason for this so each test is independent
// as there shouldn't be dependencies and cause weird issues
- String [] args = {"MULTITHREAD_RELOAD", "emptyfoo2.graphson"};
+ String [] args = {"-c","MULTITHREAD_RELOAD", "-f","emptyfoo2.graphson"};
DataSnapshot.main(args);
}
@@ -343,7 +351,7 @@ public class DataSnapshotTest extends AAISetup {
// After reload remove the added vertexes in the graph
// The reason for this so each test is independent
// as there shouldn't be dependencies and cause weird issues
- String [] args = {"RELOAD_DATA_MULTI", "pserver2.graphson"};
+ String [] args = {"-c","RELOAD_DATA_MULTI","-f", "pserver2.graphson"};
DataSnapshot.main(args);
}
diff --git a/src/test/java/org/onap/aai/dbgen/DupeToolTest.java b/src/test/java/org/onap/aai/dbgen/DupeToolTest.java
index 1d3228e..5e7a9a1 100644
--- a/src/test/java/org/onap/aai/dbgen/DupeToolTest.java
+++ b/src/test/java/org/onap/aai/dbgen/DupeToolTest.java
@@ -21,6 +21,7 @@ package org.onap.aai.dbgen;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
+
import org.janusgraph.core.JanusGraphTransaction;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Vertex;
@@ -30,6 +31,8 @@ import org.junit.Test;
import org.onap.aai.AAISetup;
import org.onap.aai.dbmap.AAIGraph;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.*;
public class DupeToolTest extends AAISetup {
@@ -53,38 +56,65 @@ public class DupeToolTest extends AAISetup {
try {
GraphTraversalSource g = transaction.traversal();
-
- Vertex cloudRegionVertex = g.addV()
- .property("aai-node-type", "cloud-region")
- .property("cloud-owner", "test-owner")
- .property("cloud-region-id", "test-region")
+
+ Vertex pserverVertex = g.addV()
+ .property("aai-node-type", "pserver")
+ .property("hostname", "test-pserver")
+ .property("in-maint", false)
.property("source-of-truth", "JUNIT")
.next();
- Vertex tenantVertex = g.addV()
- .property("aai-node-type", "tenant")
- .property("tenant-id", "test-tenant")
+ // Dupe set #1
+ Vertex pInterfaceVertex1 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "p-interface-name1")
+ .property("in-maint", false)
.property("source-of-truth", "JUNIT")
.next();
-
- Vertex pserverVertex = g.addV()
- .property("aai-node-type", "pserver")
- .property("hostname", "test-pserver")
+ edgeSerializer.addTreeEdge(g, pserverVertex, pInterfaceVertex1);
+
+ Vertex pInterfaceVertex2 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "p-interface-name1")
.property("in-maint", false)
.property("source-of-truth", "JUNIT")
.next();
-
- for(int i = 0; i < 100; ++i){
- g.addV()
- .property("aai-node-type", "p-interface")
- .property("interface-name", "p-interface-name")
- .property("in-maint", false)
- .property("source-of-truth", "JUNIT")
- .next();
- }
-
- edgeSerializer.addTreeEdge(g, cloudRegionVertex, tenantVertex);
- edgeSerializer.addEdge(g, cloudRegionVertex, pserverVertex);
+ edgeSerializer.addTreeEdge(g, pserverVertex, pInterfaceVertex2);
+
+ // Dupe Set #2
+ Vertex pInterfaceVertex3 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "p-interface-name2")
+ .property("in-maint", false)
+ .property("source-of-truth", "JUNIT")
+ .next();
+ edgeSerializer.addTreeEdge(g, pserverVertex, pInterfaceVertex3);
+
+ Vertex pInterfaceVertex4 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "p-interface-name2")
+ .property("in-maint", false)
+ .property("source-of-truth", "JUNIT")
+ .next();
+ edgeSerializer.addTreeEdge(g, pserverVertex, pInterfaceVertex4);
+
+ // Dupe Set #3
+ Vertex pInterfaceVertex5 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "p-interface-name3")
+ .property("in-maint", false)
+ .property("source-of-truth", "JUNIT")
+ .next();
+ edgeSerializer.addTreeEdge(g, pserverVertex, pInterfaceVertex5);
+
+ Vertex pInterfaceVertex6 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "p-interface-name3")
+ .property("in-maint", false)
+ .property("source-of-truth", "JUNIT")
+ .next();
+ edgeSerializer.addTreeEdge(g, pserverVertex, pInterfaceVertex6);
+
} catch(Exception ex){
success = false;
@@ -99,19 +129,21 @@ public class DupeToolTest extends AAISetup {
}
}
- @Test
+
+ @Test
public void testDupeToolForPInterface(){
- //TODO: test does not find duplicates
+
String[] args = {
"-userId", "testuser",
"-nodeType", "p-interface",
"-timeWindowMinutes", "30",
- "-autoFix",
"-maxFix", "30",
"-sleepMinutes", "0"
};
dupeTool.execute(args);
+ assertThat(dupeTool.getDupeGroupCount(), is(3));
+
}
@After
diff --git a/src/test/java/org/onap/aai/dbgen/schemamod/SchemaModTest.java b/src/test/java/org/onap/aai/dbgen/schemamod/SchemaModTest.java
new file mode 100644
index 0000000..06a511d
--- /dev/null
+++ b/src/test/java/org/onap/aai/dbgen/schemamod/SchemaModTest.java
@@ -0,0 +1,138 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.dbgen.schemamod;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.janusgraph.core.JanusGraphTransaction;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.AAIGraph;
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.introspection.LoaderFactory;
+import org.onap.aai.setup.SchemaVersions;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import static org.mockito.Mockito.when;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.*;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class SchemaModTest extends AAISetup {
+
+ private static final EELFLogger logger = EELFManager.getInstance().getLogger(SchemaModTest.class);
+
+ private SchemaMod schemaMod;
+
+ private Vertex cloudRegionVertex;
+
+ private boolean setUp = false;
+
+ @Before
+ public void setup() {
+ schemaMod = new SchemaMod(loaderFactory, schemaVersions);
+ // deleteTool.SHOULD_EXIT_VM = false;
+ JanusGraphTransaction transaction = AAIGraph.getInstance().getGraph().newTransaction();
+ boolean success = true;
+ try {
+ GraphTraversalSource g = transaction.traversal();
+ cloudRegionVertex = g.addV().property("aai-node-type", "cloud-region").property("cloud-owner", "test-owner")
+ .property("cloud-region-id", "test-region").property("source-of-truth", "JUNIT")
+ .property("aai-last-mod-ts","19191919").next();
+
+
+
+ Vertex pserverVertex = g.addV().property("aai-node-type", "pserver").property("hostname", "test-pserver")
+ .property("in-maint", false).property("source-of-truth", "JUNIT").next();
+
+
+ edgeSerializer.addEdge(g, cloudRegionVertex, pserverVertex);
+
+
+ } catch (Exception ex) {
+ success = false;
+ logger.error("Unable to create the vertexes", ex);
+ } finally {
+ if (success) {
+ transaction.commit();
+ } else {
+ transaction.rollback();
+ fail("Unable to setup the graph");
+ }
+ }
+ }
+
+
+
+ @Test
+ public void testSchemaModDataType() throws AAIException {
+ String usageString = "Usage: SchemaMod propertyName targetDataType targetIndexInfo preserveDataFlag \n";
+ String[] args = {
+ "sriov-automation", "String", "noIndex", "false"
+ };
+
+ schemaMod.execute(args);
+ /*
+ * 2 GhostNodes - CloudRegions 1 OrphaNode - tenant
+ */
+
+ }
+
+
+
+ @After
+ public void tearDown() {
+
+ JanusGraphTransaction transaction = AAIGraph.getInstance().getGraph().newTransaction();
+ boolean success = true;
+ try {
+ GraphTraversalSource g = transaction.traversal();
+ g.V().has("source-of-truth", "JUNIT").toList().forEach(v -> v.remove());
+
+ } catch (Exception ex) {
+ success = false;
+ logger.error("Unable to remove the vertexes", ex);
+ } finally {
+ if (success) {
+ transaction.commit();
+ } else {
+ transaction.rollback();
+ fail("Unable to teardown the graph");
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/aai/migration/v12/ALTSLicenseEntitlementMigrationTest.java b/src/test/java/org/onap/aai/migration/v12/ALTSLicenseEntitlementMigrationTest.java
new file mode 100644
index 0000000..ad4ae1b
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v12/ALTSLicenseEntitlementMigrationTest.java
@@ -0,0 +1,161 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v12;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.io.UnsupportedEncodingException;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.*;
+import org.onap.aai.AAISetup;
+import org.onap.aai.db.props.AAIProperties;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.LoaderFactory;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphTransaction;
+
+public class ALTSLicenseEntitlementMigrationTest extends AAISetup {
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private JanusGraph graph;
+ private ALTSLicenseEntitlementMigration migration;
+ private GraphTraversalSource g;
+ private JanusGraphTransaction tx;
+
+ @Before
+ public void setUp() throws Exception {
+ graph = JanusGraphFactory.build().set("storage.backend","inmemory").open();
+ tx = graph.newTransaction();
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ System.setProperty("AJSC_HOME", ".");
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources");
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+ Vertex vnf = g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "123456789")
+ .property("vnf-name", "test-vnf-name")
+ .property("equipment-role", "UCPE")
+ .next();
+
+ Vertex entitlement = g.addV().property("aai-node-type", "entitlement")
+ .property("group-uuid", "guuid-entitlement")
+ .property("resource-uuid", "ruuid-entitlement")
+ .property("aai-uri", "/network/generic-vnfs/generic-vnf/123456789/entitlements/entitlement/ruuideuuid/ruuid-entitlement")
+ .next();
+
+ Vertex license = g.addV().property("aai-node-type", "license")
+ .property("group-uuid", "guuid-license")
+ .property("resource-uuid", "ruuid-license")
+ .property("aai-uri", "/network/generic-vnfs/generic-vnf/123456789/licenses/license/ruuideuuid/ruuid-license")
+ .next();
+
+ Vertex vnf2 = g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "23456789")
+ .property("vnf-name", "test-vnf-name")
+ .property("equipment-role", "UCPE")
+ .next();
+ Vertex duplicateEntitlement = g.addV().property("aai-node-type", "entitlement")
+ .property("group-uuid", "guuid")
+ .property("resource-uuid", "ruuid-entitlement")
+ .property("aai-uri", "/network/generic-vnfs/generic-vnf/123456789/entitlements/entitlement/ruuideuuid/ruuid-entitlement")
+ .next();
+
+ Vertex duplicateLicense = g.addV().property("aai-node-type", "license")
+ .property("group-uuid", "guuid")
+ .property("resource-uuid", "ruuid-license")
+ .property("aai-uri", "/network/generic-vnfs/generic-vnf/123456789/licenses/license/ruuideuuid/ruuid-license")
+ .next();
+
+
+
+ edgeSerializer.addTreeEdge(g, vnf, license);
+ edgeSerializer.addTreeEdge(g, vnf, entitlement);
+ edgeSerializer.addTreeEdge(g, vnf2, duplicateEntitlement);
+ edgeSerializer.addTreeEdge(g, vnf2, duplicateLicense);
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+ GraphTraversalSource traversal = g;
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ migration = new ALTSLicenseEntitlementMigration(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+ }
+
+ @After
+ public void cleanUp() {
+ tx.rollback();
+ graph.close();
+ }
+
+ @Test
+ public void testEntitlementsUpdated() throws UnsupportedEncodingException {
+ assertEquals("Found 1 entitlement", (Long)1L,
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "123456789").in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "entitlement").count().next());
+ assertEquals("Entitlement's resource-uuid is updated ", true,
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "123456789").in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "entitlement").has("resource-uuid", "new-ruuid-entitlement").hasNext());
+ assertEquals("Entitlement's resource-uuid is updated by migration ", true,
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "123456789").in("org.onap.relationships.inventory.BelongsTo")
+ .has("aai-node-type", "entitlement").has("resource-uuid", "new-ruuid-entitlement").has("last-mod-source-of-truth", "ALTSLicenseEntitlementMigration").hasNext());
+ }
+ @Test
+ public void testLicensesUpdated() throws UnsupportedEncodingException {
+ assertEquals("Found 1 License", (Long)1L,
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "123456789").in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "license").count().next());
+ assertEquals("License's resource-uuid is updated ", true,
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "123456789").in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "license").has("resource-uuid", "new-ruuid-license").hasNext());
+ }
+
+ @Test
+ public void verifyUri() {
+ assertEquals("Uri should be updated", "/network/generic-vnfs/generic-vnf/123456789/entitlements/entitlement/ruuideuuid/new-ruuid-entitlement",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "123456789").in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "entitlement").has("resource-uuid", "new-ruuid-entitlement").next().property(AAIProperties.AAI_URI).value());
+ assertEquals("Uri should be updated", "/network/generic-vnfs/generic-vnf/123456789/licenses/license/ruuideuuid/new-ruuid-license",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "123456789").in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "license").has("resource-uuid", "new-ruuid-license").next().property(AAIProperties.AAI_URI).value());
+ }
+
+ @Test
+ public void duplicateGroupUuid() {
+ Long count = g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "23456789").in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "license").has("resource-uuid", "new-ruuid-license2").count().next() +
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "23456789").in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "entitlement").has("resource-uuid", "new-ruuid-entitlement2").count().next();
+ assertEquals("Duplicate Entitlement or License Group Uuid should be skipped", (Long)1L, count);
+
+
+ }
+}
diff --git a/src/test/java/org/onap/aai/migration/v12/MigrateDataFromASDCToConfigurationTest.java b/src/test/java/org/onap/aai/migration/v12/MigrateDataFromASDCToConfigurationTest.java
new file mode 100644
index 0000000..7acb40d
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v12/MigrateDataFromASDCToConfigurationTest.java
@@ -0,0 +1,199 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v12;
+
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphTransaction;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+public class MigrateDataFromASDCToConfigurationTest extends AAISetup {
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private JanusGraph graph;
+ private MigrateDataFromASDCToConfiguration migration;
+ private GraphTraversalSource g;
+ private JanusGraphTransaction tx;
+
+ Vertex configuration;
+ Vertex configuration2;
+ Vertex configuration3;
+ Vertex configuration4;
+ Vertex configuration5;
+
+ private boolean success = true;
+ private String entitlementPoolUuid = "";
+ private final String PARENT_NODE_TYPE = "generic-vnf";
+ private String VNT = "";
+
+ @Before
+ public void setUp() throws Exception {
+ graph = JanusGraphFactory.build().set("storage.backend","inmemory").open();
+ tx = graph.newTransaction();
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources");
+ Vertex genericvnf1 = g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "vnfId1")
+ .property("vnf-type","HN")
+ .next();
+
+ Vertex genericvnf2 = g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "vnfId2")
+ .property("vnf-type","HN")
+ .next();
+
+ Vertex genericvnf_wrongtype = g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "vnfIdWrong")
+ .property("vnf-type","vHNF")
+ .next();
+
+ Vertex entitlement1 = g.addV().property("aai-node-type", "entitlement")
+ .property("group-uuid", "599a2d74-cfbd-413d-aedb-ec4875817313")
+ .next();
+
+ Vertex entitlement2 = g.addV().property("aai-node-type", "entitlement")
+ .property("group-uuid", "ea9a547e-137b-48e9-a788-c3fb4e631a2a")
+ .next();
+
+ Vertex serviceInstance1 = g.addV().property("aai-node-type", "service-instance")
+ .property("service-instance-id", "servinstanceTestId1")
+ .next();
+
+ Vertex serviceInstance2 = g.addV().property("aai-node-type", "service-instance")
+ .property("service-instance-id", "servinstanceTestId2")
+ .next();
+
+ configuration = g.addV().property("aai-node-type", "configuration")
+ .property("configuration-id", "configurationIdGraph")
+ .property("vendor-allowed-max-bandwidth", "20")
+ .next();
+ configuration3 = g.addV().property("aai-node-type", "configuration")
+ .property("configuration-id", "configurationIdGraph3")
+ .property("vendor-allowed-max-bandwidth", "15")
+ .next();
+ configuration2 = g.addV().property("aai-node-type", "configuration")
+ .property("configuration-id", "configurationIdGraph2")
+ .property("vendor-allowed-max-bandwidth", "25")
+ .next();
+ configuration4 = g.addV().property("aai-node-type", "configuration")
+ .property("configuration-id", "configurationIdGraph4")
+ .property("vendor-allowed-max-bandwidth", "50")
+ .next();
+ configuration5 = g.addV().property("aai-node-type", "configuration")
+ .property("configuration-id", "configurationIdGraph4")
+ .property("vendor-allowed-max-bandwidth", "75")
+ .next();
+
+ edgeSerializer.addTreeEdge(g, genericvnf1, entitlement1);
+ edgeSerializer.addEdge(g, genericvnf1, serviceInstance1);
+ edgeSerializer.addEdge(g, serviceInstance1, configuration);
+ edgeSerializer.addEdge(g, serviceInstance1, configuration3);
+
+
+ edgeSerializer.addEdge(g, genericvnf2, configuration2, "org.onap.relationships.inventory.Uses");
+
+ edgeSerializer.addTreeEdge(g, genericvnf_wrongtype, entitlement2);
+ edgeSerializer.addEdge(g, genericvnf_wrongtype, serviceInstance2);
+ edgeSerializer.addEdge(g, serviceInstance2, configuration5);
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+ GraphTraversalSource traversal = g;
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ migration = new MigrateDataFromASDCToConfiguration(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+ }
+
+
+ @After
+ public void cleanUp() {
+ tx.rollback();
+ graph.close();
+ }
+
+
+ /***
+ * checks if the VNt value was updated and if theres a second configuration object it is also to be modified
+ */
+
+ @Test
+ public void confirmVNtValueChanged() {
+
+ assertEquals("1000",configuration.property("vendor-allowed-max-bandwidth").value());
+ assertEquals("1000",configuration3.property("vendor-allowed-max-bandwidth").value());
+
+ }
+
+ /***
+ * checks to see if the entitlement object is missing the configuration objects should not be modified at all
+ */
+ @Test
+ public void missingEntitlementObject() {
+ assertEquals("25",configuration2.property("vendor-allowed-max-bandwidth").value());
+ }
+ /***
+ * checks to see if there's a configuration object not connected to anything it should not be modified at all
+ */
+
+ @Test
+ public void confirmConfiguration4notchanged() {
+ assertEquals("50",configuration4.property("vendor-allowed-max-bandwidth").value());
+ }
+ /***
+ * checks that a configuration object not linked to a "HN" vnf-type should not be changed
+ */
+ @Test
+ public void differentVNFType() {
+ assertEquals("75",configuration5.property("vendor-allowed-max-bandwidth").value());
+ }
+
+
+
+
+}
diff --git a/src/test/java/org/onap/aai/migration/v12/MigrateHUBEvcInventoryTest.java b/src/test/java/org/onap/aai/migration/v12/MigrateHUBEvcInventoryTest.java
new file mode 100644
index 0000000..72daf2e
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v12/MigrateHUBEvcInventoryTest.java
@@ -0,0 +1,377 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v12;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.Optional;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.LoaderFactory;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphTransaction;
+
+public class MigrateHUBEvcInventoryTest extends AAISetup {
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private JanusGraph graph;
+ private MigrateHUBEvcInventory migration;
+ private JanusGraphTransaction tx;
+ private GraphTraversalSource g;
+
+ @Before
+ public void setUp() throws Exception {
+ graph = JanusGraphFactory.build().set("storage.backend","inmemory").open();
+ tx = graph.newTransaction();
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources");
+
+ Vertex customer1 = g.addV()
+ .property("aai-node-type", "customer")
+ .property("global-customer-id", "customer-id-1")
+ .property("subscriber-type", "CUST")
+ .next();
+
+ Vertex servSub1 = g.addV()
+ .property("aai-node-type", "service-subscription")
+ .property("service-type", "SAREA")
+ .next();
+
+ Vertex servInstance1 = g.addV()
+ .property("aai-node-type", "service-instance")
+ .property("service-type", "SAREA")
+ .property("service-instance-id", "evc-name-1")
+ .next();
+ Vertex servInstance3 = g.addV()
+ .property("aai-node-type", "service-instance")
+ .property("service-type", "SAREA")
+ .property("service-instance-id", "evc-name-3")
+ .next();
+ Vertex servInstance2 = g.addV()
+ .property("aai-node-type", "service-instance")
+ .property("service-type", "SAREA")
+ .property("service-instance-id", "evc-name-2")
+ .next();
+
+ Vertex evc1 = g.addV().property("aai-node-type", "evc")
+ .property("evc-id", "evc-name-1")
+ .next();
+ Vertex config1 = g.addV().property("aai-node-type", "configuration")
+ .property("configuration-id", "evc-name-1")
+ .next();
+ Vertex fp1 = g.addV()
+ .property("aai-node-type", "forwarding-path")
+ .property("forwarding-path-id", "evc-name-1")
+ .next();
+ Vertex for11 = g.addV()
+ .property("aai-node-type", "forwarder")
+ .property("sequence", "1")
+ .property("forwarder-role","ingress")
+ .next();
+ Vertex for12 = g.addV()
+ .property("aai-node-type", "forwarder")
+ .property("sequence", "2")
+ .property("forwarder-role","egress")
+ .next();
+ Vertex config11 = g.addV()
+ .property("aai-node-type", "configuration")
+ .property("configuration-id", "evc-name-1-1")
+ .next();
+ Vertex config12 = g.addV()
+ .property("aai-node-type", "configuration")
+ .property("configuration-id", "evc-name-1-2")
+ .next();
+ Vertex fevc11 = g.addV()
+ .property("aai-node-type", "forwarder-evc")
+ .property("forwarder-evc-id", "evc-name-1-1")
+ .property("svlan", "6")
+ .next();
+ Vertex fevc12 = g.addV()
+ .property("aai-node-type", "forwarder-evc")
+ .property("forwarder-evc-id", "evc-name-1-2")
+ .property("svlan", "16")
+ .next();
+
+
+
+ Vertex evc2 = g.addV().property("aai-node-type", "evc")
+ .property("evc-id", "evc-name-2")
+ .next();
+ Vertex config2 = g.addV().property("aai-node-type", "configuration")
+ .property("configuration-id", "evc-name-2")
+ .next();
+ Vertex fp2 = g.addV()
+ .property("aai-node-type", "forwarding-path")
+ .property("forwarding-path-id", "evc-name-2")
+ .next();
+ Vertex for21 = g.addV()
+ .property("aai-node-type", "forwarder")
+ .property("sequence", "1")
+ .property("forwarder-role","ingress")
+ .next();
+ Vertex for22 = g.addV()
+ .property("aai-node-type", "forwarder")
+ .property("sequence", "2")
+ .property("forwarder-role","ingress")
+ .next();
+ Vertex for23 = g.addV()
+ .property("aai-node-type", "forwarder")
+ .property("sequence", "3")
+ .property("forwarder-role","egress")
+ .next();
+ Vertex for24 = g.addV()
+ .property("aai-node-type", "forwarder")
+ .property("sequence", "4")
+ .property("forwarder-role","egress")
+ .next();
+ Vertex config21 = g.addV()
+ .property("aai-node-type", "configuration")
+ .property("configuration-id", "evc-name-2-1")
+ .next();
+ Vertex config22 = g.addV()
+ .property("aai-node-type", "configuration")
+ .property("configuration-id", "evc-name-2-2")
+ .next();
+ Vertex config23 = g.addV()
+ .property("aai-node-type", "configuration")
+ .property("configuration-id", "evc-name-2-3")
+ .next();
+ Vertex config24 = g.addV()
+ .property("aai-node-type", "configuration")
+ .property("configuration-id", "evc-name-2-4")
+ .next();
+ Vertex fevc21 = g.addV()
+ .property("aai-node-type", "forwarder-evc")
+ .property("forwarder-evc-id", "evc-name-2-1")
+ .property("svlan", "6")
+ .next();
+ Vertex fevc22 = g.addV()
+ .property("aai-node-type", "forwarder-evc")
+ .property("forwarder-evc-id", "evc-name-2-2")
+ .property("svlan", "16")
+ .next();
+ Vertex fevc23 = g.addV()
+ .property("aai-node-type", "forwarder-evc")
+ .property("forwarder-evc-id", "evc-name-2-3")
+ .property("svlan", "12")
+ .property("ivlan", "600")
+ .next();
+ Vertex fevc24 = g.addV()
+ .property("aai-node-type", "forwarder-evc")
+ .property("forwarder-evc-id", "evc-name-2-4")
+ .property("svlan", "16")
+ .property("ivlan", "600")
+ .next();
+
+ Vertex evc3 = g.addV().property("aai-node-type", "evc")
+ .property("evc-id", "evc-name-3")
+ .next();
+ Vertex config3 = g.addV().property("aai-node-type", "configuration")
+ .property("configuration-id", "evc-name-3")
+ .next();
+ Vertex fp3 = g.addV()
+ .property("aai-node-type", "forwarding-path")
+ .property("forwarding-path-id", "evc-name-3")
+ .next();
+ Vertex for31 = g.addV()
+ .property("aai-node-type", "forwarder")
+ .property("sequence", "1")
+ .property("forwarder-role","ingress")
+ .next();
+ Vertex for32 = g.addV()
+ .property("aai-node-type", "forwarder")
+ .property("sequence", "2")
+ .property("forwarder-role","egress")
+ .next();
+ Vertex config31 = g.addV()
+ .property("aai-node-type", "configuration")
+ .property("configuration-id", "evc-name-3-1")
+ .next();
+ Vertex config32 = g.addV()
+ .property("aai-node-type", "configuration")
+ .property("configuration-id", "evc-name-3-2")
+ .next();
+ Vertex fevc31 = g.addV()
+ .property("aai-node-type", "forwarder-evc")
+ .property("forwarder-evc-id", "evc-name-3-1")
+ .property("svlan", "6")
+ .next();
+ Vertex fevc32 = g.addV()
+ .property("aai-node-type", "forwarder-evc")
+ .property("forwarder-evc-id", "evc-name-3-2")
+// .property("svlan", "16")
+ .next();
+
+ // graph 1
+ edgeSerializer.addTreeEdge(g, customer1, servSub1);
+ edgeSerializer.addTreeEdge(g, servSub1, servInstance1);
+ edgeSerializer.addTreeEdge(g, servSub1, servInstance2);
+ edgeSerializer.addTreeEdge(g, servSub1, servInstance3);
+
+ edgeSerializer.addEdge(g, servInstance1, fp1);
+ edgeSerializer.addEdge(g, servInstance2, fp2);
+
+ edgeSerializer.addEdge(g, fp1, config1);
+ edgeSerializer.addEdge(g, fp2, config2);
+ edgeSerializer.addEdge(g, fp3, config3);
+
+ edgeSerializer.addTreeEdge(g, evc1, config1);
+ edgeSerializer.addTreeEdge(g, evc2, config2);
+ edgeSerializer.addTreeEdge(g, evc3, config3);
+
+ edgeSerializer.addTreeEdge(g, fp1, for11);
+ edgeSerializer.addTreeEdge(g, fp1, for12);
+ edgeSerializer.addTreeEdge(g, fp2, for21);
+ edgeSerializer.addTreeEdge(g, fp2, for22);
+ edgeSerializer.addTreeEdge(g, fp2, for23);
+ edgeSerializer.addTreeEdge(g, fp2, for24);
+ edgeSerializer.addTreeEdge(g, fp3, for31);
+ edgeSerializer.addTreeEdge(g, fp3, for32);
+
+ edgeSerializer.addEdge(g, for11, config11);
+ edgeSerializer.addEdge(g, for12, config12);
+ edgeSerializer.addEdge(g, for21, config21);
+ edgeSerializer.addEdge(g, for22, config22);
+ edgeSerializer.addEdge(g, for23, config23);
+ edgeSerializer.addEdge(g, for24, config24);
+ edgeSerializer.addEdge(g, for31, config31);
+ edgeSerializer.addEdge(g, for32, config32);
+
+ edgeSerializer.addTreeEdge(g, config11, fevc11);
+ edgeSerializer.addTreeEdge(g, config12, fevc12);
+ edgeSerializer.addTreeEdge(g, config21, fevc21);
+ edgeSerializer.addTreeEdge(g, config22, fevc22);
+ edgeSerializer.addTreeEdge(g, config23, fevc23);
+ edgeSerializer.addTreeEdge(g, config24, fevc24);
+ edgeSerializer.addTreeEdge(g, config31, fevc31);
+ edgeSerializer.addTreeEdge(g, config32, fevc32);
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+
+ GraphTraversalSource traversal = g;
+ GraphTraversalSource readOnly = tx.traversal(GraphTraversalSource.build().with(ReadOnlyStrategy.instance()));
+ when (spy.tx()).thenReturn(tx);
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ when(adminSpy.getReadOnlyTraversalSource()).thenReturn(readOnly);
+
+ migration = new MigrateHUBEvcInventory(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+ }
+
+ @After
+ public void cleanUp() {
+ tx.tx().rollback();
+ graph.close();
+ }
+
+ @Test
+ public void testRun_checkFevc1AndFevc2AreUpdated() throws Exception {
+
+ // check if forwarder-evc nodes get updated
+ assertEquals("forwarder-evc evc-name-1-1 updated with ivlan", true,
+ g.V().has("aai-node-type", "forwarder-evc")
+ .has("forwarder-evc-id", "evc-name-1-1")
+ .has("ivlan","4054")
+ .hasNext());
+
+ assertEquals("forwarder-evc evc-name-2-2 updated with ivlan", true,
+ g.V().has("aai-node-type", "forwarder-evc")
+ .has("forwarder-evc-id", "evc-name-2-2")
+ .has("ivlan","4084")
+ .hasNext());
+ assertEquals("forwarder-evc evc-name-2-3 updated with ivlan", true,
+ g.V().has("aai-node-type", "forwarder-evc")
+ .has("forwarder-evc-id", "evc-name-2-3")
+ .has("ivlan","4054")
+ .hasNext());
+
+ assertEquals("4 forwarder-evcs exist for evc evc-name-2", new Long(4L),
+ g.V().has("forwarding-path-id", "evc-name-2")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .out("org.onap.relationships.inventory.Uses").has("aai-node-type", "configuration")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder-evc")
+ .count().next());
+
+ assertEquals("3 forwarder-evcs updated for evc evc-name-2", new Long(3L),
+ g.V().has("forwarding-path-id", "evc-name-2")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .out("org.onap.relationships.inventory.Uses").has("aai-node-type", "configuration")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder-evc")
+ .has("forwarder-evc-id").has("ivlan")
+ .count().next());
+
+ assertEquals("forwarder-evc evc-name-3-1 updated with ivlan", false,
+ g.V().has("aai-node-type", "forwarder-evc")
+ .has("forwarder-evc-id", "evc-name-3-1")
+ .has("ivlan")
+ .hasNext());
+ }
+
+
+ @Test
+ public void testGetAffectedNodeTypes() {
+ Optional<String[]> types = migration.getAffectedNodeTypes();
+ Optional<String[]> expected = Optional.of(new String[]{"forwarder-evc"});
+
+ assertNotNull(types);
+ assertArrayEquals(expected.get(), types.get());
+ }
+
+ @Test
+ public void testGetMigrationName() {
+ String migrationName = migration.getMigrationName();
+
+ assertNotNull(migrationName);
+ assertEquals("MigrateHUBEvcInventory", migrationName);
+ }
+}
diff --git a/src/test/java/org/onap/aai/migration/v12/MigrateINVPhysicalInventoryMethodTest.java b/src/test/java/org/onap/aai/migration/v12/MigrateINVPhysicalInventoryMethodTest.java
new file mode 100644
index 0000000..59ae5e7
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v12/MigrateINVPhysicalInventoryMethodTest.java
@@ -0,0 +1,149 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v12;
+
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphTransaction;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
+import org.javatuples.Pair;
+import org.junit.*;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+import java.util.*;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+public class MigrateINVPhysicalInventoryMethodTest extends AAISetup {
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private JanusGraph graph;
+ private JanusGraphTransaction tx;
+ private GraphTraversalSource g;
+ private TransactionalGraphEngine spy;
+
+ @Before
+ public void setUp() throws Exception {
+ graph = JanusGraphFactory.build().set("storage.backend","inmemory").open();
+ tx = graph.newTransaction();
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources");
+
+ spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+
+ GraphTraversalSource traversal = g;
+ GraphTraversalSource readOnly = tx.traversal(GraphTraversalSource.build().with(ReadOnlyStrategy.instance()));
+ when (spy.tx()).thenReturn(tx);
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ when(adminSpy.getReadOnlyTraversalSource()).thenReturn(readOnly);
+ }
+
+ @After
+ public void cleanUp() {
+ tx.tx().rollback();
+ graph.close();
+ }
+
+
+ @Test
+ public void headerTest() throws Exception {
+ MigrateINVPhysicalInventory m = new MigrateINVPhysicalInventory(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ String header = "ptnii-name,fic,equipment-model,equipment-role,equipment-role-additional,ip-addr,subnet-mask,slot-name,card-type,card-port-lock,card-vlan-lock,port-aid,port-type,port-role,port-lock,vlan-lock,reservation-name,collector-interconnect-type,tag-mode,media-type,media-speed-value+media-speed-units,uni-cir-value+uni-cir-units,evc-name";
+ List<String> lines = new ArrayList<>();
+ lines.add(header);
+ assertEquals(header, m.processAndRemoveHeader(lines));
+ assertEquals(0, lines.size());
+ assertEquals(23, m.headerLength);
+
+ }
+
+ @Test
+ public void verifyLineTest() throws Exception {
+ MigrateINVPhysicalInventory m = new MigrateINVPhysicalInventory(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ m.headerLength = 23;
+ assertFalse(m.verifyLine(Collections.nCopies(5, "foo")));
+ assertTrue(m.verifyLine(Collections.nCopies(23, "foo")));
+ assertEquals(1, m.skippedRowsCount.intValue());
+
+ }
+
+ @Test
+ public void readLineTest() throws Exception {
+ MigrateINVPhysicalInventory m = new MigrateINVPhysicalInventory(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ String line = "pnf-name-collector-1,06000D.121,5150,AED,,2001:1890:fcfe:7000:7021:0:1:2,64,,,,,\"1.7 \",SFP_1GE/Ethernet_10/100/1000M,ACCESS,N,N,M0651881_ST,SHARED,DOUBLE,SFP-1GE-LX,1000Mbps,,evc-name-1\n";
+ Pair<String, String> pair = m.processLine(Arrays.asList(line.split("\\s*,\\s*", -1))).get();
+ assertEquals("Test 1","pnf-name-collector-1", pair.getValue0());
+ assertEquals("Test 1","1.7", pair.getValue1());
+
+ line = "pnf-name-1,06000D.121,5150,AED,,2001:1890:fcfe:7000:7021:0:1:2,64,,,,,1.2,SFP_1GE/Ethernet_10/100/1000M,ACCESS,N,N,M0651882_ST,SHARED,DOUBLE,SFP-1GE-LX,1000Mbps,,evc-name-3";
+ pair = m.processLine(Arrays.asList(line.split("\\s*,\\s*", -1))).get();
+ assertEquals("Test 1","pnf-name-1", pair.getValue0());
+ assertEquals("Test 1","1.2", pair.getValue1());
+
+ }
+
+ @Test
+ public void getFileContentsTest() throws Exception {
+ MigrateINVPhysicalInventory m = new MigrateINVPhysicalInventory(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+
+ Map<String,Set<String>> expected = new HashMap<>();
+ List<String> lines = new ArrayList<>();
+
+ String header = "ptnii-name,fic,equipment-model,equipment-role,equipment-role-additional,ip-addr,subnet-mask,slot-name,card-type,card-port-lock,card-vlan-lock,port-aid,port-type,port-role,port-lock,vlan-lock,reservation-name,collector-interconnect-type,tag-mode,media-type,media-speed-value+media-speed-units,uni-cir-value+uni-cir-units,evc-name";
+ lines.add(header);
+
+ lines.add("pnf-name-collector-1,06000D.121,5150,AED,,2001:1890:fcfe:7000:7021:0:1:2,64,,,,,\"1.7 \",SFP_1GE/Ethernet_10/100/1000M,ACCESS,N,N,M0651881_ST,SHARED,DOUBLE,SFP-1GE-LX,1000Mbps,,evc-name-1");
+ expected.put("pnf-name-collector-1", new HashSet<>(Arrays.asList("1.7")));
+
+ lines.add("pnf-name-1,06000D.121,5150,AED,,2001:1890:fcfe:7000:7021:0:1:2,64,,,,,1.2,SFP_1GE/Ethernet_10/100/1000M,ACCESS,N,N,M0651882_ST,SHARED,DOUBLE,SFP-1GE-LX,1000Mbps,,evc-name-3");
+ lines.add("pnf-name-1,06000D.121,5150,AED,,2001:1890:fcfe:7000:7021:0:1:2,64,,,,,1.2,SFP_1GE/Ethernet_10/100/1000M,ACCESS,N,N,M0651882_ST,SHARED,DOUBLE,SFP-1GE-LX,1000Mbps,,evc-name-3");
+ lines.add("pnf-name-1,06000D.121,5150,AED,,2001:1890:fcfe:7000:7021:0:1:2,64,,,,,1.3,SFP_1GE/Ethernet_10/100/1000M,ACCESS,N,N,M0651882_ST,SHARED,DOUBLE,SFP-1GE-LX,1000Mbps,,evc-name-3");
+ expected.put("pnf-name-1", new HashSet<>(Arrays.asList("1.2", "1.3")));
+
+ lines.add("foo");
+
+ assertEquals(expected, m.getFileContents(lines));
+
+ }
+}
diff --git a/src/test/java/org/onap/aai/migration/v12/MigrateINVPhysicalInventoryTest.java b/src/test/java/org/onap/aai/migration/v12/MigrateINVPhysicalInventoryTest.java
new file mode 100644
index 0000000..82ea770
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v12/MigrateINVPhysicalInventoryTest.java
@@ -0,0 +1,168 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v12;
+
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphTransaction;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.*;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+import java.util.Optional;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+public class MigrateINVPhysicalInventoryTest extends AAISetup {
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private JanusGraph graph;
+ private MigrateINVPhysicalInventory migration;
+ private JanusGraphTransaction tx;
+ private GraphTraversalSource g;
+
+ @Before
+ public void setUp() throws Exception {
+ graph = JanusGraphFactory.build().set("storage.backend","inmemory").open();
+ tx = graph.newTransaction();
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources");
+
+
+ Vertex pnf1 = g.addV()
+ .property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf-name-1")
+ .property("aai-uri", "/network/pnfs/pnf/pnf-name-1")
+ .next();
+ Vertex port11 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "1.1")
+ .property("aai-uri", "/network/pnfs/pnf/pnf-name-1/p-interfaces/pinterface/1.1")
+ .next();
+ // graph 1
+
+ edgeSerializer.addTreeEdge(g, pnf1, port11);
+
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+
+ GraphTraversalSource traversal = g;
+ GraphTraversalSource readOnly = tx.traversal(GraphTraversalSource.build().with(ReadOnlyStrategy.instance()));
+ when (spy.tx()).thenReturn(tx);
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ when(adminSpy.getReadOnlyTraversalSource()).thenReturn(readOnly);
+
+ migration = new MigrateINVPhysicalInventory(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+ }
+
+ @After
+ public void cleanUp() {
+ tx.tx().rollback();
+ graph.close();
+ }
+
+
+ @Test
+ public void pnfsExistTest() throws Exception {
+ // check if pnf node gets created
+ assertEquals("2 PNFs exist", new Long(2L),
+ g.V().has("aai-node-type", "pnf")
+ .count().next());
+ }
+
+ @Test
+ public void pInterfacesExistTest() throws Exception {
+
+ assertEquals("4 Pinterfaces exist", new Long(4L),
+ g.V().has("aai-node-type", "p-interface")
+ .count().next());
+ }
+
+ @Test
+ public void testRun_checkPnfsAndPInterfacesExist() throws Exception {
+ // check if graph nodes exist
+
+ // check if pnf node gets created
+ assertEquals("2 PNFs exist", new Long(2L),
+ g.V().has("aai-node-type", "pnf")
+ .count().next());
+
+ System.out.println("cOUNT:" +g.V().has("aai-node-type", "pnf")
+ .has("pnf-name", "pnf-name-collector-1").in("tosca.relationships.network.BindsTo").count().next());
+
+ assertEquals("p-interfaces created for pnfs", new Long(1L),
+ g.V().has("aai-node-type", "pnf")
+ .has("pnf-name", "pnf-name-collector-1").count().next());
+
+ assertEquals("p-interface 1.7 created for pnf-name-collector-1", true,
+ g.V().has("aai-node-type", "pnf")
+ .has("pnf-name", "pnf-name-collector-1")
+ .in("tosca.relationships.network.BindsTo")
+ .has("interface-name","1.7")
+ .hasNext());
+ assertEquals("p-interfaces created for pnfs", new Long(2L),
+ g.V().has("aai-node-type", "pnf")
+ .has("pnf-name", "pnf-name-1")
+ .in("tosca.relationships.network.BindsTo").count().next());
+ }
+
+ @Test
+ public void testGetAffectedNodeTypes() {
+ Optional<String[]> types = migration.getAffectedNodeTypes();
+ Optional<String[]> expected = Optional.of(new String[]{"pnf"});
+
+ assertNotNull(types);
+ assertArrayEquals(expected.get(), types.get());
+ }
+
+ @Test
+ public void testGetMigrationName() {
+ String migrationName = migration.getMigrationName();
+
+ assertNotNull(migrationName);
+ assertEquals("MigrateINVPhysicalInventory", migrationName);
+ }
+}
diff --git a/src/test/java/org/onap/aai/migration/v12/MigrateInvEvcInventoryTest.java b/src/test/java/org/onap/aai/migration/v12/MigrateInvEvcInventoryTest.java
new file mode 100644
index 0000000..ebe5136
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v12/MigrateInvEvcInventoryTest.java
@@ -0,0 +1,152 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v12;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.Optional;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.*;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphTransaction;
+
+public class MigrateInvEvcInventoryTest extends AAISetup {
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+
+ private static Loader loader;
+ private static TransactionalGraphEngine dbEngine;
+ private static JanusGraph graph;
+ private static MigrateINVEvcInventory migration;
+ private static JanusGraphTransaction tx;
+ private static GraphTraversalSource g;
+
+ @Before
+ public void setUp() throws Exception {
+ graph = JanusGraphFactory.build().set("storage.backend","inmemory").open();
+ tx = graph.newTransaction();
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources");
+
+ Vertex evc = g.addV()
+ .property("aai-node-type", "evc")
+ .property("evc-id", "evc-name-1")
+ .next();
+
+ Vertex evc2 = g.addV()
+ .property("aai-node-type", "evc")
+ .property("evc-id", "evc-name-2")
+ .next();
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+
+ GraphTraversalSource traversal = g;
+ GraphTraversalSource readOnly = tx.traversal(GraphTraversalSource.build().with(ReadOnlyStrategy.instance()));
+ when (spy.tx()).thenReturn(tx);
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ when(adminSpy.getReadOnlyTraversalSource()).thenReturn(readOnly);
+
+ migration = new MigrateINVEvcInventory(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+ }
+
+ @After
+ public void cleanUp() {
+ tx.tx().rollback();
+ graph.close();
+ }
+
+ @Test
+ public void testRun_updateEvcNode() throws Exception {
+ // check if graph nodes exist
+ assertEquals("evc node exists", true,
+ g.V().has("aai-node-type", "evc")
+ .has("evc-id", "evc-name-1")
+ .hasNext());
+
+ // check if evc object is updated to set the value for inter-connect-type-ingress
+ assertEquals("evc is updated", true,
+ g.V().has("aai-node-type", "evc").has("evc-id", "evc-name-1")
+ .has("inter-connect-type-ingress", "SHARED")
+ .hasNext());
+ }
+
+ @Test
+ public void testRun_evcNotCreated() throws Exception {
+
+ assertEquals("evc node does not exist", false,
+ g.V().has("aai-node-type", "evc").has("evc-id", "evc-name-3")
+ .hasNext());
+
+ //inter-connect-type-ingress is not present on the evc
+ assertEquals("evc node exists", true,
+ g.V().has("aai-node-type", "evc").has("evc-id", "evc-name-2")
+ .hasNext());
+ assertEquals("evc node not updated with inter-connect-type-ingress", false,
+ g.V().has("aai-node-type", "evc").has("evc-id", "evc-name-2").has("inter-connect-type-ingress")
+ .hasNext());
+
+ }
+
+ @Test
+ public void testGetAffectedNodeTypes() {
+ Optional<String[]> types = migration.getAffectedNodeTypes();
+ Optional<String[]> expected = Optional.of(new String[]{"evc"});
+
+ assertNotNull(types);
+ assertArrayEquals(expected.get(), types.get());
+ }
+
+ @Test
+ public void testGetMigrationName() {
+ String migrationName = migration.getMigrationName();
+
+ assertNotNull(migrationName);
+ assertEquals("MigrateINVEvcInventory", migrationName);
+ }
+}
diff --git a/src/test/java/org/onap/aai/migration/v12/MigratePATHEvcInventoryTest.java b/src/test/java/org/onap/aai/migration/v12/MigratePATHEvcInventoryTest.java
new file mode 100644
index 0000000..334f32b
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v12/MigratePATHEvcInventoryTest.java
@@ -0,0 +1,658 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v12;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.Optional;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.*;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+public class MigratePATHEvcInventoryTest extends AAISetup {
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private MigratePATHEvcInventory migration;
+ private GraphTraversalSource g;
+
+ @Before
+ public void setUp() throws Exception {
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources");
+
+ Vertex customer1 = g.addV()
+ .property("aai-node-type", "customer")
+ .property("global-customer-id", "customer-id-1")
+ .property("subscriber-type", "CUST")
+ .next();
+
+ Vertex servSub1 = g.addV()
+ .property("aai-node-type", "service-subscription")
+ .property("service-type", "SAREA")
+ .next();
+
+ Vertex servInstance1 = g.addV()
+ .property("aai-node-type", "service-instance")
+ .property("service-type", "SAREA")
+ .property("service-instance-id", "evc-name-1")
+ .next();
+ Vertex servInstance3 = g.addV()
+ .property("aai-node-type", "service-instance")
+ .property("service-type", "SAREA")
+ .property("service-instance-id", "evc-name-3")
+ .next();
+ Vertex servInstance2 = g.addV()
+ .property("aai-node-type", "service-instance")
+ .property("service-type", "SAREA")
+ .property("service-instance-id", "evc-name-2")
+ .next();
+
+ Vertex pnf1 = g.addV()
+ .property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf-name-1")
+ .next();
+ Vertex port11 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "1.1")
+ .next();
+ Vertex port12 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "1.41")
+ .next();
+
+ Vertex pnf2 = g.addV()
+ .property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf-name-2")
+ .next();
+ Vertex port21 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "1.25")
+ .next();
+ Vertex port22 = g.addV()
+ .property("aai-node-type", "lag-interface")
+ .property("interface-name", "ae1")
+ .next();
+
+ Vertex pnf3 = g.addV()
+ .property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf-name-3")
+ .next();
+ Vertex port31 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "1.32")
+ .next();
+ Vertex port32 = g.addV()
+ .property("aai-node-type", "lag-interface")
+ .property("interface-name", "ae1")
+ .next();
+
+ Vertex pnf4 = g.addV()
+ .property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf-name-4")
+ .next();
+ Vertex port41 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "1.7")
+ .next();
+ Vertex port42 = g.addV()
+ .property("aai-node-type", "lag-interface")
+ .property("interface-name", "ae101")
+ .next();
+
+ Vertex pnf5 = g.addV()
+ .property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf-name-5")
+ .next();
+ Vertex port51 = g.addV()
+ .property("aai-node-type", "lag-interface")
+ .property("interface-name", "104")
+ .next();
+ Vertex port52 = g.addV()
+ .property("aai-node-type", "lag-interface")
+ .property("interface-name", "101")
+ .next();
+
+ Vertex pnf6 = g.addV()
+ .property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf-name-6")
+ .next();
+ Vertex port61 = g.addV()
+ .property("aai-node-type", "lag-interface")
+ .property("interface-name", "ae104")
+ .next();
+ Vertex port62 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "1.39")
+ .next();
+
+ Vertex evc1 = g.addV().property("aai-node-type", "evc")
+ .property("evc-id", "evc-name-1")
+ .next();
+ Vertex fp1 = g.addV()
+ .property("aai-node-type", "forwarding-path")
+ .property("forwarding-path-id", "evc-name-1")
+ .next();
+
+ Vertex evc2 = g.addV().property("aai-node-type", "evc")
+ .property("evc-id", "evc-name-2")
+ .next();
+ Vertex fp2 = g.addV()
+ .property("aai-node-type", "forwarding-path")
+ .property("forwarding-path-id", "evc-name-2")
+ .next();
+
+ Vertex evc3 = g.addV().property("aai-node-type", "evc")
+ .property("evc-id", "evc-name-3")
+ .next();
+ Vertex fp3 = g.addV()
+ .property("aai-node-type", "forwarding-path")
+ .property("forwarding-path-id", "evc-name-3")
+ .next();
+
+ // graph 1
+ edgeSerializer.addTreeEdge(g, customer1, servSub1);
+ edgeSerializer.addTreeEdge(g, servSub1, servInstance1);
+ edgeSerializer.addTreeEdge(g, servSub1, servInstance2);
+ edgeSerializer.addTreeEdge(g, servSub1, servInstance3);
+
+ edgeSerializer.addEdge(g, servInstance1, fp1);
+ edgeSerializer.addEdge(g, servInstance2, fp2);
+ edgeSerializer.addEdge(g, servInstance3, fp3);
+
+ edgeSerializer.addTreeEdge(g, pnf1, port11);
+ edgeSerializer.addTreeEdge(g, pnf1, port12);
+
+ edgeSerializer.addTreeEdge(g, pnf2, port21);
+ edgeSerializer.addTreeEdge(g, pnf2, port22);
+
+ edgeSerializer.addTreeEdge(g, pnf3, port31);
+ edgeSerializer.addTreeEdge(g, pnf3, port32);
+
+ edgeSerializer.addTreeEdge(g, pnf4, port41);
+ edgeSerializer.addTreeEdge(g, pnf4, port42);
+
+ edgeSerializer.addTreeEdge(g, pnf5, port51);
+ edgeSerializer.addTreeEdge(g, pnf5, port52);
+
+ edgeSerializer.addTreeEdge(g, pnf6, port61);
+ edgeSerializer.addTreeEdge(g, pnf6, port62);
+
+
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+
+ GraphTraversalSource traversal = g;
+ GraphTraversalSource readOnly = tx.traversal(GraphTraversalSource.build().with(ReadOnlyStrategy.instance()));
+ when (spy.tx()).thenReturn(tx);
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ when(adminSpy.getReadOnlyTraversalSource()).thenReturn(readOnly);
+
+ migration = new MigratePATHEvcInventory(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+ }
+
+ @Test
+ public void testRun_checkServInstanceAndForwardingPathsExist() throws Exception {
+ // check if graph nodes exist
+
+ // check if service-instance node gets created
+ assertEquals("service subscription node, service-type=SAREA", true,
+ g.V().has("service-instance-id", "evc-name-1")
+ .out("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .hasNext());
+
+ assertEquals("fowarding-path node exists", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-1")
+ .in("org.onap.relationships.inventory.AppliesTo")
+ .has("aai-node-type", "forwarding-path")
+ .has("forwarding-path-id", "evc-name-1")
+ .hasNext());
+ assertEquals("fowarding-path node exists", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-2")
+ .in("org.onap.relationships.inventory.AppliesTo")
+ .has("aai-node-type", "forwarding-path")
+ .has("forwarding-path-id", "evc-name-2")
+ .hasNext());
+ assertEquals("fowarding-path node exists", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo")
+ .has("aai-node-type", "forwarding-path")
+ .has("forwarding-path-id", "evc-name-3")
+ .hasNext());
+
+ }
+
+ @Test
+ public void testRun_checkForwardersForEvc1AreCreated() throws Exception {
+ // check if graph nodes exist
+ // check if forwarder node gets created
+
+ assertEquals("forwarder node is created for evc-name-1 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-1")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 1)
+ .has("forwarder-role", "ingress")
+ .hasNext());
+
+ assertEquals("forwarder node is created for evc-name-1 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-1")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 2)
+ .has("forwarder-role", "egress")
+ .hasNext());
+ }
+
+ @Test
+ public void testRun_checkForwardersForEvc2AreCreated() throws Exception {
+
+ // check if forwarder node gets created
+
+ assertEquals("forwarder node is created for evc-name-2 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-2")
+ .hasNext());
+
+ assertEquals("forwarder node is created for evc-name-2 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-2")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .hasNext());
+
+ assertEquals("4 forwarders are created for evc-name-2 ", (Long)4l,
+ g.V().
+ has("aai-node-type", "forwarding-path").has("forwarding-path-id","evc-name-2")
+ .in("org.onap.relationships.inventory.BelongsTo")
+ .has("aai-node-type", "forwarder").count().next()); //org.onap.relationships.inventory.BelongsTo
+
+ assertEquals("forwarder node is created for evc-name-2 ", true,
+ g.V().has("aai-node-type", "forwarding-path").has("forwarding-path-id","evc-name-2")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 1)
+ .has("forwarder-role", "ingress")
+ .hasNext());
+
+ assertEquals("forwarder node is created for evc-name-2 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-2")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 1)
+ .has("forwarder-role", "ingress")
+ .hasNext());
+
+ assertEquals("forwarder node is created for evc-name-2 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-2")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 2)
+ .has("forwarder-role", "intermediate")
+ .hasNext());
+
+ assertEquals("forwarder node is created for evc-name-2 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-2")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 3)
+ .has("forwarder-role", "intermediate")
+ .hasNext());
+
+ assertEquals("forwarder node is created for evc-name-2 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-2")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 4)
+ .has("forwarder-role", "egress")
+ .hasNext());
+ }
+
+ @Test
+ public void testRun_checkForwardersForEvc3AreCreated() throws Exception {
+
+ // check if forwarder node gets created
+
+ assertEquals("forwarder node is created for evc-name-3 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 1)
+ .has("forwarder-role", "ingress")
+ .hasNext());
+
+ assertEquals("forwarder node is created for evc-name-3 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 1)
+ .has("forwarder-role", "ingress")
+ .out("org.onap.relationships.inventory.ForwardsTo")
+ .has("aai-node-type", "p-interface")
+ .has("interface-name","1.7")
+ .hasNext());
+
+ assertEquals("forwarder-evc node is created for forwarder with sequence 1 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 1)
+ .has("forwarder-role", "ingress")
+ .out("org.onap.relationships.inventory.Uses").has("aai-node-type", "configuration")
+ .has("configuration-id","evc-name-3-1").has("configuration-type","forwarder").has("configuration-sub-type", "forwarder")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder-evc")
+ .has("forwarder-evc-id","evc-name-3-1")
+ .has("circuit-id","M0651881")
+ .has("cvlan","34")
+ .has("svlan","8")
+ .hasNext());
+
+ assertEquals("forwarder node is created for evc-name-3 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 2)
+ .has("forwarder-role", "intermediate")
+ .hasNext());
+
+ //forwarder to interface check
+ assertEquals("forwarder node is created for evc-name-3 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 2)
+ .has("forwarder-role", "intermediate")
+ .out("org.onap.relationships.inventory.ForwardsTo")
+ .has("aai-node-type", "lag-interface")
+ .has("interface-name","ae101")
+ .hasNext());
+
+ assertEquals("forwarder-evc node is created for forwarder with sequence 2 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 2)
+ .has("forwarder-role", "intermediate")
+ .out("org.onap.relationships.inventory.Uses").has("aai-node-type", "configuration")
+ .has("configuration-id","evc-name-3-2").has("configuration-type","forwarder").has("configuration-sub-type", "forwarder")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder-evc")
+ .has("forwarder-evc-id","evc-name-3-2")
+ .has("cvlan","34")
+ .has("svlan","740")
+ .hasNext());
+
+ assertEquals("forwarder node is created for evc-name-3 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 3)
+ .has("forwarder-role", "intermediate")
+ .hasNext());
+
+ assertEquals("forwarder node is created for evc-name-3 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 3)
+ .has("forwarder-role", "intermediate")
+ .out("org.onap.relationships.inventory.ForwardsTo")
+ .has("aai-node-type", "lag-interface")
+ .has("interface-name","101")
+ .hasNext());
+
+ assertEquals("forwarder-evc node is created for forwarder with sequence 3 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 3)
+ .has("forwarder-role", "intermediate")
+ .out("org.onap.relationships.inventory.Uses").has("aai-node-type", "configuration")
+ .has("configuration-id","evc-name-3-3").has("configuration-type","forwarder").has("configuration-sub-type", "forwarder")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder-evc")
+ .has("forwarder-evc-id","evc-name-3-3")
+ .has("cvlan","35")
+ .has("svlan","740")
+ .hasNext());
+
+ assertEquals("forwarder node is created for evc-name-3 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 4)
+ .has("forwarder-role", "intermediate")
+ .hasNext());
+
+ assertEquals("forwarder node is created for evc-name-3 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 4)
+ .has("forwarder-role", "intermediate")
+ .out("org.onap.relationships.inventory.ForwardsTo")
+ .has("aai-node-type", "lag-interface")
+ .has("interface-name","104")
+ .hasNext());
+
+ assertEquals("forwarder-evc node is created for forwarder with sequence 4 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 4)
+ .has("forwarder-role", "intermediate")
+ .out("org.onap.relationships.inventory.Uses").has("aai-node-type", "configuration")
+ .has("configuration-id","evc-name-3-4").has("configuration-type","forwarder").has("configuration-sub-type", "forwarder")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder-evc")
+ .has("forwarder-evc-id","evc-name-3-4")
+ .has("cvlan","37")
+ .has("svlan","740")
+ .hasNext());
+
+ assertEquals("forwarder node is created for evc-name-3 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 5)
+ .has("forwarder-role", "intermediate")
+ .hasNext());
+
+ assertEquals("forwarder node is created for evc-name-3 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 5)
+ .has("forwarder-role", "intermediate")
+ .out("org.onap.relationships.inventory.ForwardsTo")
+ .has("aai-node-type", "lag-interface")
+ .has("interface-name","ae104")
+ .hasNext());
+
+
+
+ assertEquals("configuration node is created for forwarder with sequence 5 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 5)
+ .has("forwarder-role", "intermediate")
+ .out("org.onap.relationships.inventory.Uses").has("aai-node-type", "configuration")
+ .has("configuration-id","evc-name-3-5").has("configuration-type","forwarder").has("configuration-sub-type", "forwarder")
+ .hasNext());
+
+ assertEquals("forwarder-evc node is created for forwarder with sequence 5 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 5)
+ .has("forwarder-role", "intermediate")
+ .out("org.onap.relationships.inventory.Uses").has("aai-node-type", "configuration")
+ .has("configuration-id","evc-name-3-5").has("configuration-type","forwarder").has("configuration-sub-type", "forwarder")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder-evc")
+ .has("forwarder-evc-id","evc-name-3-5")
+ .has("cvlan","36")
+ .has("svlan","740")
+ .hasNext());
+
+ assertEquals("forwarder node is created for evc-name-3 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 6)
+ .has("forwarder-role", "egress")
+ .hasNext());
+
+ assertEquals("forwarder node is created for evc-name-3 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 6)
+ .has("forwarder-role", "egress")
+ .out("org.onap.relationships.inventory.ForwardsTo")
+ .has("aai-node-type", "p-interface")
+ .has("interface-name","1.39")
+ .hasNext());
+
+ assertEquals("configuration node is created for forwarder with sequence 6 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 6)
+ .has("forwarder-role", "egress")
+ .out("org.onap.relationships.inventory.Uses").has("aai-node-type", "configuration")
+ .has("configuration-id","evc-name-3-6").has("configuration-type","forwarder").has("configuration-sub-type", "forwarder")
+ .hasNext());
+
+ assertEquals("configuration node is created for forwarder with sequence 6 ", true,
+ g.V().has("global-customer-id", "customer-id-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder")
+ .has("sequence", 6)
+ .has("forwarder-role", "egress")
+ .out("org.onap.relationships.inventory.Uses").has("aai-node-type", "configuration")
+ .has("configuration-id","evc-name-3-6").has("configuration-type","forwarder").has("configuration-sub-type", "forwarder")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "forwarder-evc")
+ .has("forwarder-evc-id","evc-name-3-6").has("circuit-id","IZEZ.597112..ATI").has("cvlan","36").has("svlan","3")
+ .hasNext());
+
+ }
+
+
+ @Test
+ public void testGetAffectedNodeTypes() {
+ Optional<String[]> types = migration.getAffectedNodeTypes();
+ Optional<String[]> expected = Optional.of(new String[]{"forwarding-path"});
+
+ assertNotNull(types);
+ assertArrayEquals(expected.get(), types.get());
+ }
+
+ @Test
+ public void testGetMigrationName() {
+ String migrationName = migration.getMigrationName();
+
+ assertNotNull(migrationName);
+ assertEquals("MigratePATHEvcInventory", migrationName);
+ }
+}
diff --git a/src/test/java/org/onap/aai/migration/v12/MigratePATHPhysicalInventoryTest.java b/src/test/java/org/onap/aai/migration/v12/MigratePATHPhysicalInventoryTest.java
new file mode 100644
index 0000000..11aa0a6
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v12/MigratePATHPhysicalInventoryTest.java
@@ -0,0 +1,159 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v12;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Matchers.shortThat;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.Optional;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.*;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphTransaction;
+
+public class MigratePATHPhysicalInventoryTest extends AAISetup {
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private MigratePATHPhysicalInventory migration;
+ private GraphTraversalSource g;
+
+ @Before
+ public void setUp() throws Exception {
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources");
+
+ Vertex pnf2 = g.addV()
+ .property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf-name-2")
+ .next();
+ Vertex port21 = g.addV()
+ .property("aai-node-type", "lag-interface")
+ .property("interface-name", "ae1")
+ .next();
+
+ Vertex pnf3 = g.addV()
+ .property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf-name-3")
+ .next();
+ Vertex pnf4 = g.addV()
+ .property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf-name-4")
+ .next();
+ Vertex pnf5 = g.addV()
+ .property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf-name-5")
+ .next();
+ // graph 1
+
+ edgeSerializer.addTreeEdge(g, pnf2, port21);
+
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+
+ GraphTraversalSource traversal = g;
+ GraphTraversalSource readOnly = tx.traversal(GraphTraversalSource.build().with(ReadOnlyStrategy.instance()));
+ when (spy.tx()).thenReturn(tx);
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ when(adminSpy.getReadOnlyTraversalSource()).thenReturn(readOnly);
+
+ migration = new MigratePATHPhysicalInventory(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+ }
+
+ @Test
+ public void testRun_checkPnfsAndPInterfacesExist() throws Exception {
+ // check if graph nodes exist
+
+ testGetMigrationName();
+ testGetAffectedNodeTypes();
+
+ // check if pnf node gets created
+ assertEquals("4 PNFs exist", new Long(4L),
+ g.V().has("aai-node-type", "pnf")
+ .count().next());
+
+ assertEquals("5 lag-interfaces were created", new Long (5L), g.V().has("aai-node-type", "lag-interface")
+ .out("tosca.relationships.network.BindsTo").count().next());
+
+ assertEquals("lag-interfaces created for pnfs", new Long(1L),
+ g.V().has("aai-node-type", "pnf")
+ .has("pnf-name", "pnf-name-3").count().next());
+
+ assertEquals("lag-interface ae1 created for pnf-name-3", true,
+ g.V().has("aai-node-type", "pnf")
+ .has("pnf-name", "pnf-name-3")
+ .in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type", "lag-interface")
+ .has("interface-name","ae1")
+ .hasNext());
+
+ assertEquals("lag-interfaces created for pnfs", new Long(2L),
+ g.V().has("aai-node-type", "pnf")
+ .has("pnf-name", "pnf-name-5")
+ .in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type", "lag-interface").count().next());
+ }
+
+ public void testGetAffectedNodeTypes() {
+ Optional<String[]> types = migration.getAffectedNodeTypes();
+ Optional<String[]> expected = Optional.of(new String[]{"lag-interface"});
+
+ assertNotNull(types);
+ assertArrayEquals(expected.get(), types.get());
+ }
+
+ public void testGetMigrationName() {
+ String migrationName = migration.getMigrationName();
+
+ assertNotNull(migrationName);
+ assertEquals("MigratePATHPhysicalInventory", migrationName);
+ }
+}
diff --git a/src/test/java/org/onap/aai/migration/v12/MigrateSAREvcInventoryTest.java b/src/test/java/org/onap/aai/migration/v12/MigrateSAREvcInventoryTest.java
new file mode 100644
index 0000000..79a5877
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v12/MigrateSAREvcInventoryTest.java
@@ -0,0 +1,357 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v12;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.Optional;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphTransaction;
+
+public class MigrateSAREvcInventoryTest extends AAISetup {
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private JanusGraph graph;
+ private MigrateSAREvcInventory migration;
+ private JanusGraphTransaction tx;
+ private GraphTraversalSource g;
+
+ @Before
+ public void setUp() throws Exception {
+ graph = JanusGraphFactory.build().set("storage.backend","inmemory").open();
+ tx = graph.newTransaction();
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources");
+
+ Vertex customer1 = g.addV()
+ .property("aai-node-type", "customer")
+ .property("global-customer-id", "8a00890a-e6ae-446b-9dbe-b828dbeb38bd")
+ .property("subscriber-type", "CUST")
+ .next();
+
+ Vertex servSub1 = g.addV()
+ .property("aai-node-type", "service-subscription")
+ .property("service-type", "SAREA")
+ .next();
+
+ Vertex servInst1 = g.addV()
+ .property("aai-node-type", "service-instance")
+ .property("service-instance-id", "evc-name-1")
+ .next();
+
+ Vertex customer2 = g.addV()
+ .property("aai-node-type", "customer")
+ .property("global-customer-id", "cust-1")
+ .property("subscriber-type", "CUST")
+ .next();
+
+ Vertex servSub2 = g.addV()
+ .property("aai-node-type", "service-subscription")
+ .property("service-type", "SAREA")
+ .next();
+
+ Vertex servInst2 = g.addV()
+ .property("aai-node-type", "service-instance")
+ .property("service-instance-id", "evc-name-1")
+ .next();
+
+ Vertex collectorPnf = g.addV()
+ .property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf-name-collector-1")
+ .next();
+
+ Vertex bearerPnf = g.addV()
+ .property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf-name-bearer-1")
+ .next();
+
+ Vertex collectorPort = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "p-int-collector-1")
+ .next();
+
+ Vertex bearerPort = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "p-int-bearer-1")
+ .next();
+
+ Vertex servInst4 = g.addV()
+ .property("aai-node-type", "service-instance")
+ .property("service-instance-id", "evc-name-4")
+ .next();
+
+ // graph 1
+ edgeSerializer.addTreeEdge(g, customer1, servSub1);
+// edgeSerializer.addTreeEdge(g, servSub1, servInst1);
+ edgeSerializer.addTreeEdge(g, customer2, servSub2);
+ edgeSerializer.addTreeEdge(g, servSub2, servInst2);
+ edgeSerializer.addTreeEdge(g, servSub1, servInst4); //evc-name-4 exists in graph as a child of SAREA serv-sub
+ edgeSerializer.addTreeEdge(g, collectorPnf, collectorPort);
+ edgeSerializer.addTreeEdge(g, bearerPnf, bearerPort);
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+
+ GraphTraversalSource traversal = g;
+ GraphTraversalSource readOnly = tx.traversal(GraphTraversalSource.build().with(ReadOnlyStrategy.instance()));
+ when (spy.tx()).thenReturn(tx);
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ when(adminSpy.getReadOnlyTraversalSource()).thenReturn(readOnly);
+
+ migration = new MigrateSAREvcInventory(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+ }
+
+ @After
+ public void cleanUp() {
+ tx.tx().rollback();
+ graph.close();
+ }
+
+ @Test
+ public void testRun_createServiceInstanceNode() throws Exception {
+ // check if graph nodes exist
+ assertEquals("service instance node exists", true,
+ g.V().has("service-instance-id", "evc-name-1")
+ .hasNext());
+
+ // check if service-instance node gets created
+ assertEquals("service subscription node, service-type=SAREA", true,
+ g.V().has("service-instance-id", "evc-name-1")
+ .out("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .hasNext());
+
+
+
+ // check if fowarding-path node gets created
+ assertEquals("fowarding-path is created", true, g.V().has("forwarding-path-id", "evc-name-1")
+ .has("forwarding-path-name", "evc-name-1").hasNext());
+
+ assertEquals("fowarding-path node exists", true,
+ g.V().has("global-customer-id", "8a00890a-e6ae-446b-9dbe-b828dbeb38bd")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-1")
+ .in("org.onap.relationships.inventory.AppliesTo")
+ .has("aai-node-type", "forwarding-path")
+ .has("forwarding-path-id", "evc-name-1")
+ .has("forwarding-path-name", "evc-name-1")
+ .hasNext());
+
+ // check if configuration node gets created
+ assertEquals("configuration node, configuration-type= forwarding-path", true,
+ g.V().has("global-customer-id", "8a00890a-e6ae-446b-9dbe-b828dbeb38bd")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-1")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .out("org.onap.relationships.inventory.Uses").has("aai-node-type", "configuration")
+ .has("configuration-type", "forwarding-path")
+ .has("configuration-sub-type", "evc")
+ .hasNext());
+
+ //check if evc node gets created
+ assertEquals("evc is created", true,
+ g.V().has("global-customer-id", "8a00890a-e6ae-446b-9dbe-b828dbeb38bd")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-1")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .out("org.onap.relationships.inventory.Uses").has("aai-node-type", "configuration")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "evc")
+ .hasNext());
+
+ // check if evc node gets created
+ assertEquals("configuration node, configuration-type= evc", true,
+ g.V().has("global-customer-id", "8a00890a-e6ae-446b-9dbe-b828dbeb38bd")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-1")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .out("org.onap.relationships.inventory.Uses").has("aai-node-type", "configuration")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "evc")
+ .has("evc-id", "evc-name-1")
+ .has("forwarding-path-topology", "PointToPoint")
+ .has("cir-value", "40")
+ .has("cir-units", "Mbps")
+ .has("tagmode-access-ingress", "DOUBLE")
+ .has("tagmode-access-egress", "DOUBLE")
+ .hasNext());
+ }
+
+ @Test
+ public void testRun_evcNotCreated() throws Exception {
+ // check if graph nodes exist
+ assertEquals("customer node exists", true,
+ g.V().has("global-customer-id", "8a00890a-e6ae-446b-9dbe-b828dbeb38bd")
+ .hasNext());
+
+ assertEquals("service subscription node, service-type=SAREA", true,
+ g.V().has("global-customer-id", "8a00890a-e6ae-446b-9dbe-b828dbeb38bd")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .hasNext());
+
+ //service-instance should not be created
+ assertEquals("service instance node created", false,
+ g.V().has("global-customer-id", "8a00890a-e6ae-446b-9dbe-b828dbeb38bd")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-2")
+ .hasNext());
+
+ assertEquals("service instance node already exists", true,
+ g.V().has("global-customer-id", "cust-1")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-1")
+ .hasNext());
+
+ // fowarding-path node should not be created
+ assertEquals("fowarding-path created", false, g.V().has("aai-node-type", "forwarding-path")
+ .has("forwarding-path-name", "evc-name-2").hasNext());
+
+ // configuration node should not be created
+ assertEquals("configuration node created", false, g.V().has("aai-node-type", "configuration")
+ .has("configuration-id", "evc-name-2").hasNext());
+
+ // evc node should not be created
+ assertEquals("evc node created", false, g.V().has("aai-node-type", "evc")
+ .has("evc-id", "evc-name-2").hasNext());
+
+ // service-instance is not created because pnf exists, but p-interface does not
+ assertEquals("service instance node created", false,
+ g.V().has("global-customer-id", "8a00890a-e6ae-446b-9dbe-b828dbeb38bd")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-3")
+ .hasNext());
+ }
+
+ @Test
+ public void testRun_createFPConfigurationEvcNode4() throws Exception {
+ // check if graph nodes exist
+ assertEquals("service instance node exists", true,
+ g.V().has("service-instance-id", "evc-name-4")
+ .hasNext());
+
+ // check if service-instance node gets created
+ assertEquals("service subscription node, service-type=SAREA", true,
+ g.V().has("service-instance-id", "evc-name-4")
+ .out("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .hasNext());
+
+
+
+ // check if fowarding-path node gets created
+ assertEquals("fowarding-path is created", true, g.V().has("forwarding-path-id", "evc-name-4")
+ .has("forwarding-path-name", "evc-name-4").hasNext());
+
+ assertEquals("fowarding-path node exists", true,
+ g.V().has("global-customer-id", "8a00890a-e6ae-446b-9dbe-b828dbeb38bd")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-4")
+ .in("org.onap.relationships.inventory.AppliesTo")
+ .has("aai-node-type", "forwarding-path")
+ .has("forwarding-path-id", "evc-name-4")
+ .has("forwarding-path-name", "evc-name-4")
+ .hasNext());
+
+ // check if configuration node gets created
+ assertEquals("configuration node, configuration-type= forwarding-path", true,
+ g.V().has("global-customer-id", "8a00890a-e6ae-446b-9dbe-b828dbeb38bd")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-4")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .out("org.onap.relationships.inventory.Uses").has("aai-node-type", "configuration")
+ .has("configuration-type", "forwarding-path")
+ .has("configuration-sub-type", "evc")
+ .hasNext());
+
+ //check if evc node gets created
+ assertEquals("evc is created", true,
+ g.V().has("global-customer-id", "8a00890a-e6ae-446b-9dbe-b828dbeb38bd")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-4")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .out("org.onap.relationships.inventory.Uses").has("aai-node-type", "configuration")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "evc")
+ .hasNext());
+
+ // check if evc node gets created
+ assertEquals("configuration node, configuration-type= evc", true,
+ g.V().has("global-customer-id", "8a00890a-e6ae-446b-9dbe-b828dbeb38bd")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-type", "SAREA")
+ .in("org.onap.relationships.inventory.BelongsTo").has("service-instance-id", "evc-name-1")
+ .in("org.onap.relationships.inventory.AppliesTo").has("aai-node-type", "forwarding-path")
+ .out("org.onap.relationships.inventory.Uses").has("aai-node-type", "configuration")
+ .in("org.onap.relationships.inventory.BelongsTo").has("aai-node-type", "evc")
+ .has("evc-id", "evc-name-1")
+ .has("forwarding-path-topology", "PointToPoint")
+ .has("cir-value", "40")
+ .has("cir-units", "Mbps")
+ .has("tagmode-access-ingress", "DOUBLE")
+ .has("tagmode-access-egress", "DOUBLE")
+ .hasNext());
+ }
+
+ @Test
+ public void testGetAffectedNodeTypes() {
+ Optional<String[]> types = migration.getAffectedNodeTypes();
+ Optional<String[]> expected = Optional.of(new String[]{"service-instance"});
+
+ assertNotNull(types);
+ assertArrayEquals(expected.get(), types.get());
+ }
+
+ @Test
+ public void testGetMigrationName() {
+ String migrationName = migration.getMigrationName();
+
+ assertNotNull(migrationName);
+ assertEquals("MigrateSAREvcInventory", migrationName);
+ }
+}
diff --git a/src/test/java/org/onap/aai/migration/v13/MigrateBadWidgetModelsPartOneTest.java b/src/test/java/org/onap/aai/migration/v13/MigrateBadWidgetModelsPartOneTest.java
new file mode 100644
index 0000000..d3607d3
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v13/MigrateBadWidgetModelsPartOneTest.java
@@ -0,0 +1,173 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v13;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.Optional;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.edges.EdgeIngestor;
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.LoaderFactory;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.serialization.db.EdgeSerializer;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphTransaction;
+import org.janusgraph.core.schema.JanusGraphManagement;
+
+public class MigrateBadWidgetModelsPartOneTest extends AAISetup {
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private GraphTraversalSource g;
+ private MockMigrateBadWidgetModelsPartOne migration;
+ private Vertex modelVer1 = null;
+ private Vertex modelVer3 = null;
+
+ @Before
+ public void setUp() throws Exception {
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources");
+ JanusGraphManagement janusgraphManagement = graph.openManagement();
+ g = graph.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(queryStyle, type, loader);
+ createFirstVertexAndRelatedVertexes();
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+ GraphTraversalSource traversal = g;
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ Mockito.doReturn(janusgraphManagement).when(adminSpy).getManagementSystem();
+
+ migration = new MockMigrateBadWidgetModelsPartOne(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+ }
+
+ private void createFirstVertexAndRelatedVertexes() throws AAIException {
+
+ // Add model1/model-ver1 -- invalid model/model-ver
+ Vertex model1 = g.addV().property("aai-node-type", "model")
+ .property("model-invariant-id", "model-invariant-id-1").property("model-type", "widget").next();
+ modelVer1 = g.addV().property("aai-node-type", "model-ver").property("model-version-id", "model-version-id-1")
+ .property("model-name", "connector").property("model-version", "v1.0").next();
+ edgeSerializer.addTreeEdge(g, model1, modelVer1);
+
+ // Add named-query and named-query-element nodes. Point the named-query-element at model1
+ Vertex namedQ1 = g.addV().property("aai-node-type", "named-query")
+ .property("named-query-uuid", "named-query-uuid-1").property("named-query-name", "test-NQ-1").next();
+ Vertex namedQElement1 = g.addV().property("aai-node-type", "named-query-element")
+ .property("named-query-element-uuid", "named-query-element-uuid-1").next();
+ edgeSerializer.addTreeEdge(g, namedQElement1, namedQ1);
+ edgeSerializer.addEdge(g, model1, namedQElement1);
+
+
+ // For model3/model-ver3 - we use valid invId/versionIds
+ Vertex model3 = g.addV().property("aai-node-type", "model")
+ .property("model-invariant-id", "4c01c948-7607-4d66-8a6c-99c2c2717936").property("model-type", "widget")
+ .next();
+ modelVer3 = g.addV().property("aai-node-type", "model-ver")
+ .property("model-version-id", "22104c9f-29fd-462f-be07-96cd6b46dd33")
+ .property("model-name", "connector").property("model-version", "v1.0").next();
+ edgeSerializer.addTreeEdge(g, model3, modelVer3);
+ }
+
+ class MockMigrateBadWidgetModelsPartOne extends MigrateBadWidgetModelsPartOne {
+
+ public MockMigrateBadWidgetModelsPartOne(TransactionalGraphEngine engine, LoaderFactory loaderFactory, EdgeIngestor edgeIngestor, EdgeSerializer edgeSerializer, SchemaVersions schemaVersions) {
+ super(engine, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ }
+
+ @Override
+ public Optional<String[]> getAffectedNodeTypes() {
+ return Optional.of(new String[] { "model", "model-element", "model-ver" });
+ }
+
+ @Override
+ public String getMigrationName() {
+ return "MockMigrateBadWidgetModelsPartOne";
+ }
+ }
+
+ @Test
+ public void testBelongsToEdgeStillThereForNqElement() {
+ assertEquals(true,
+ g.V().has("aai-node-type", "named-query-element").has("named-query-element-uuid", "named-query-element-uuid-1")
+ .out("org.onap.relationships.inventory.BelongsTo")
+ .has("named-query-uuid", "named-query-uuid-1").hasNext());
+ }
+
+ @Test
+ public void testBadNodesAreNotGone() {
+ assertEquals(true,
+ g.V().has("aai-node-type", "model-ver").has("model-version-id", "model-version-id-1").hasNext());
+ assertEquals(true,
+ g.V().has("aai-node-type", "model").has("model-invariant-id", "model-invariant-id-1").hasNext());
+ }
+
+ @Test
+ public void testNQNodesaAreStillThere() {
+ assertEquals(true,
+ g.V().has("aai-node-type", "named-query").has("named-query-uuid", "named-query-uuid-1").hasNext());
+ assertEquals(true,
+ g.V().has("aai-node-type", "named-query-element").has("named-query-element-uuid", "named-query-element-uuid-1").hasNext());
+
+ }
+
+
+ @Test
+ public void testThatNewEdgeAdded() {
+ assertEquals(true,
+ g.V().has("aai-node-type", "model").has("model-invariant-id", "4c01c948-7607-4d66-8a6c-99c2c2717936")
+ .in("org.onap.relationships.inventory.IsA").has("named-query-element-uuid", "named-query-element-uuid-1")
+ .hasNext());
+ }
+
+ @Test
+ public void testThatOldEdgeDeleted() {
+ assertEquals(false,
+ g.V().has("aai-node-type", "model").has("model-invariant-id", "model-invariant-id-1")
+ .in("org.onap.relationships.inventory.IsA").has("named-query-element-uuid", "named-query-element-uuid-1")
+ .hasNext());
+ }
+
+
+
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/aai/migration/v13/MigrateBadWidgetModelsPartTwoTest.java b/src/test/java/org/onap/aai/migration/v13/MigrateBadWidgetModelsPartTwoTest.java
new file mode 100644
index 0000000..f3c4bb1
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v13/MigrateBadWidgetModelsPartTwoTest.java
@@ -0,0 +1,172 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v13;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.Optional;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.edges.EdgeIngestor;
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.LoaderFactory;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.serialization.db.EdgeSerializer;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphTransaction;
+import org.janusgraph.core.schema.JanusGraphManagement;
+
+public class MigrateBadWidgetModelsPartTwoTest extends AAISetup {
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private GraphTraversalSource g;
+ private MockMigrateBadWidgetModelsPartTwo migration;
+ private Vertex modelVer1 = null;
+ private Vertex modelVer3 = null;
+
+ @Before
+ public void setUp() throws Exception {
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources");
+ JanusGraphManagement janusgraphManagement = graph.openManagement();
+ g = graph.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(queryStyle, type, loader);
+ createFirstVertexAndRelatedVertexes();
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+ GraphTraversalSource traversal = g;
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ Mockito.doReturn(janusgraphManagement).when(adminSpy).getManagementSystem();
+
+ migration = new MockMigrateBadWidgetModelsPartTwo(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+ }
+
+ private void createFirstVertexAndRelatedVertexes() throws AAIException {
+ Vertex model1 = g.addV().property("aai-node-type", "model")
+ .property("model-invariant-id", "model-invariant-id-1").property("model-type", "widget").next();
+ modelVer1 = g.addV().property("aai-node-type", "model-ver").property("model-version-id", "model-version-id-1")
+ .property("model-name", "connector").property("model-version", "v1.0").next();
+ edgeSerializer.addTreeEdge(g, model1, modelVer1);
+
+ // Create the cousin vertex - modelElement2 for modelVer1
+ Vertex model2 = g.addV().property("aai-node-type", "model")
+ .property("model-invariant-id", "model-invariant-id-2").property("model-type", "resource").next();
+ Vertex modelVer2 = g.addV().property("aai-node-type", "model-ver")
+ .property("model-version-id", "model-version-id-2").property("model-name", "resourceMod4Test")
+ .property("model-version", "v1.0").next();
+ edgeSerializer.addTreeEdge(g, model2, modelVer2);
+ Vertex modelElement2 = g.addV().property("aai-node-type", "model-element")
+ .property("model-element-uuid", "model-element-uuid-2").property("new-data-del-flag", "T")
+ .property("cardinality", "unbounded").next();
+ edgeSerializer.addTreeEdge(g, modelVer2, modelElement2);
+ edgeSerializer.addEdge(g, modelVer1, modelElement2);
+
+ // For model3/model-ver3 - we use valid invid/versionIds
+ Vertex model3 = g.addV().property("aai-node-type", "model")
+ .property("model-invariant-id", "4c01c948-7607-4d66-8a6c-99c2c2717936").property("model-type", "widget")
+ .next();
+ modelVer3 = g.addV().property("aai-node-type", "model-ver")
+ .property("model-version-id", "22104c9f-29fd-462f-be07-96cd6b46dd33")
+ .property("model-name", "connector").property("model-version", "v1.0").next();
+ edgeSerializer.addTreeEdge(g, model3, modelVer3);
+ }
+
+ class MockMigrateBadWidgetModelsPartTwo extends MigrateBadWidgetModelsPartTwo {
+
+ public MockMigrateBadWidgetModelsPartTwo(TransactionalGraphEngine engine, LoaderFactory loaderFactory, EdgeIngestor edgeIngestor, EdgeSerializer edgeSerializer, SchemaVersions schemaVersions) {
+ super(engine, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ }
+
+ @Override
+ public Optional<String[]> getAffectedNodeTypes() {
+ return Optional.of(new String[] { "model", "model-element", "model-ver" });
+ }
+
+ @Override
+ public String getMigrationName() {
+ return "MockMigrateNodesThatUseBadWidgetModelsPartTwo";
+ }
+ }
+
+
+ @Test
+ public void testBelongsToEdgesStillThereX() {
+ assertEquals(true,
+ g.V().has("aai-node-type", "model-ver").has("model-version-id", "22104c9f-29fd-462f-be07-96cd6b46dd33")
+ .out("org.onap.relationships.inventory.BelongsTo")
+ .has("model-invariant-id", "4c01c948-7607-4d66-8a6c-99c2c2717936").hasNext());
+ assertEquals(true,
+ g.V().has("aai-node-type", "model-element").has("model-element-uuid", "model-element-uuid-2")
+ .out("org.onap.relationships.inventory.BelongsTo").has("model-version-id", "model-version-id-2")
+ .hasNext());
+ }
+
+ @Test
+ public void testBadVerNodeIsGoneX() {
+ assertEquals(false,
+ g.V().has("aai-node-type", "model-ver").has("model-version-id", "model-version-id-1").hasNext());
+ }
+
+ @Test
+ public void testBadModelNodeIsGoneX() {
+ assertEquals(false,
+ g.V().has("aai-node-type", "model").has("model-invariant-id", "model-invariant-id-1").hasNext());
+ }
+
+ @Test
+ public void testThatNewEdgeAddedX() {
+ assertEquals(true,
+ g.V().has("aai-node-type", "model-ver").has("model-version-id", "22104c9f-29fd-462f-be07-96cd6b46dd33")
+ .in("org.onap.relationships.inventory.IsA").has("model-element-uuid", "model-element-uuid-2")
+ .hasNext());
+ }
+
+ @Test
+ public void testThatOldEdgeGone() {
+ assertEquals(false,
+ g.V().has("aai-node-type", "model-ver").has("model-version-id", "model-version-id-1")
+ .in("org.onap.relationships.inventory.IsA").has("model-element-uuid", "model-element-uuid-2")
+ .hasNext());
+ }
+
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/aai/migration/v13/MigrateEdgesBetweenVnfcAndVfModuleTest.java b/src/test/java/org/onap/aai/migration/v13/MigrateEdgesBetweenVnfcAndVfModuleTest.java
new file mode 100644
index 0000000..90d30fc
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v13/MigrateEdgesBetweenVnfcAndVfModuleTest.java
@@ -0,0 +1,119 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v13;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraphTransaction;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.edges.enums.EdgeProperty;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+public class MigrateEdgesBetweenVnfcAndVfModuleTest extends AAISetup{
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+
+ private static Loader loader;
+ private static TransactionalGraphEngine dbEngine;
+ private static JanusGraph graph;
+ private static MigrateEdgesBetweenVnfcAndVfModule migration;
+ private static JanusGraphTransaction tx;
+ private static GraphTraversalSource g;
+
+ @Before
+ public void setUp() throws Exception {
+ graph = JanusGraphFactory.build().set("storage.backend","inmemory").open();
+ tx = graph.newTransaction();
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources");
+
+ Vertex vnfc = g.addV().property("aai-node-type", "vnfc")
+ .property("vnfc-name", "vnfc-name-1").next();
+
+ Vertex vfmodule = g.addV().property("aai-node-type", "vf-module")
+ .property("vf-module-id", "vf-module-id-1").next();
+
+
+ //edgeSerializer.addEdge(g, vfmodule, vnfc,"org.onap.relationships.inventory.Uses");
+
+ vfmodule.addEdge("org.onap.relationships.inventory.Uses", vnfc, EdgeProperty.CONTAINS.toString(), "NONE",
+ EdgeProperty.DELETE_OTHER_V.toString(), "NONE", EdgeProperty.PREVENT_DELETE.toString(), "OUT");
+
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+
+ GraphTraversalSource traversal = g;
+ GraphTraversalSource readOnly = tx.traversal(GraphTraversalSource.build().with(ReadOnlyStrategy.instance()));
+ when (spy.tx()).thenReturn(tx);
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ when(adminSpy.getReadOnlyTraversalSource()).thenReturn(readOnly);
+
+ migration = new MigrateEdgesBetweenVnfcAndVfModule(spy,loaderFactory,edgeIngestor,edgeSerializer,schemaVersions);
+ migration.run();
+ }
+
+ @After
+ public void cleanUp() {
+ tx.tx().rollback();
+ graph.close();
+ }
+
+ @Ignore
+ @Test
+ public void testIdsUpdated() throws Exception {
+
+ //System.out.println("After Migration: " +migration.asString(g.V().has("aai-node-type","vnfc").inE().next()));
+
+ assertEquals("vf-module to vnfc migration done", true,
+ g.V().has("aai-node-type", "vf-module").outE().hasLabel("org.onap.relationships.inventory.Uses")
+ .has(EdgeProperty.DELETE_OTHER_V.toString(), "OUT").hasNext());
+
+ assertEquals("vf-module to vnfc migration done", true,
+ g.V().has("aai-node-type", "vnfc").inE().hasLabel("org.onap.relationships.inventory.Uses")
+ .has(EdgeProperty.PREVENT_DELETE.toString(), "NONE").hasNext());
+ }
+}
diff --git a/src/test/java/org/onap/aai/migration/v13/MigrateForwarderEvcCircuitIdTest.java b/src/test/java/org/onap/aai/migration/v13/MigrateForwarderEvcCircuitIdTest.java
new file mode 100644
index 0000000..1006a29
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v13/MigrateForwarderEvcCircuitIdTest.java
@@ -0,0 +1,195 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v13;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.Optional;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.*;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphTransaction;
+
+public class MigrateForwarderEvcCircuitIdTest extends AAISetup {
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private MigrateForwarderEvcCircuitId migration;
+ private GraphTraversalSource g;
+
+ @Before
+ public void setUp() throws Exception {
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources");
+
+ Vertex pnf1 = g.addV().property("aai-node-type", "pnf").property("pnf-name", "pnf-1").next();
+ Vertex pnf2 = g.addV().property("aai-node-type", "pnf").property("pnf-name", "pnf-2").next();
+ Vertex pnf3 = g.addV().property("aai-node-type", "pnf").property("pnf-name", "pnf-3").next();
+ Vertex pnf4 = g.addV().property("aai-node-type", "pnf").property("pnf-name", "pnf-4").next();
+ Vertex pnf5 = g.addV().property("aai-node-type", "pnf").property("pnf-name", "pnf-5").next();
+
+ Vertex pInterface1 = g.addV().property("aai-node-type", "p-interface").property("interface-name", "p-interface-1").next();
+ Vertex pInterface2 = g.addV().property("aai-node-type", "p-interface").property("interface-name", "p-interface-2").next();
+ Vertex pInterface3 = g.addV().property("aai-node-type", "p-interface").property("interface-name", "p-interface-3").next();
+ Vertex pInterface4 = g.addV().property("aai-node-type", "p-interface").property("interface-name", "p-interface-4").next();
+ Vertex pInterface5 = g.addV().property("aai-node-type", "p-interface").property("interface-name", "p-interface-5").next();
+
+ Vertex forwarder1 = g.addV().property("aai-node-type", "forwarder").property("sequence", 1)
+ .property("forwarder-role", "ingress").next();
+ Vertex forwarder2 = g.addV().property("aai-node-type", "forwarder").property("sequence", 1)
+ .property("forwarder-role", "ingress").next();
+ Vertex forwarder3 = g.addV().property("aai-node-type", "forwarder").property("sequence", 1)
+ .property("forwarder-role", "ingress").next();
+ Vertex forwarder4 = g.addV().property("aai-node-type", "forwarder").property("sequence", 1)
+ .property("forwarder-role", "ingress").next();
+ Vertex forwarder5 = g.addV().property("aai-node-type", "forwarder").property("sequence", 1)
+ .property("forwarder-role", "ingress").next();
+
+
+ Vertex configuration1 = g.addV().property("aai-node-type", "configuration").property("configuration-id", "config-1")
+ .property("configuration-type", "test").property("configuration-subt-type", "test").next();
+ Vertex configuration2 = g.addV().property("aai-node-type", "configuration").property("configuration-id", "config-2")
+ .property("configuration-type", "test").property("configuration-subt-type", "test").next();
+ Vertex configuration3 = g.addV().property("aai-node-type", "configuration").property("configuration-id", "config-3")
+ .property("configuration-type", "test").property("configuration-subt-type", "test").next();
+ Vertex configuration4 = g.addV().property("aai-node-type", "configuration").property("configuration-id", "config-4")
+ .property("configuration-type", "test").property("configuration-subt-type", "test").next();
+ Vertex configuration5 = g.addV().property("aai-node-type", "configuration").property("configuration-id", "config-5")
+ .property("configuration-type", "test").property("configuration-subt-type", "test").next();
+
+
+ Vertex forwarderEvc1 = g.addV().property("aai-node-type", "forwarder-evc").property("forwarder-evc-id", "evc-1")
+ .property("circuit-id", "1").property("resource-version", "v13").next();
+ Vertex forwarderEvc2 = g.addV().property("aai-node-type", "forwarder-evc").property("forwarder-evc-id", "evc-2")
+ .property("circuit-id", "2").property("resource-version", "v13").next();
+ Vertex forwarderEvc3 = g.addV().property("aai-node-type", "forwarder-evc").property("forwarder-evc-id", "evc-3")
+ .property("resource-version", "v13").next();
+ Vertex forwarderEvc4 = g.addV().property("aai-node-type", "forwarder-evc").property("forwarder-evc-id", "evc-4")
+ .property("circuit-id", "3").property("resource-version", "v13").next();
+ Vertex forwarderEvc5 = g.addV().property("aai-node-type", "forwarder-evc").property("forwarder-evc-id", "evc-5")
+ .property("resource-version", "v13").next();
+
+
+
+ edgeSerializer.addTreeEdge(g, pnf1, pInterface1);
+ edgeSerializer.addEdge(g, pInterface1, forwarder1);
+ edgeSerializer.addEdge(g, forwarder1, configuration1);
+ edgeSerializer.addTreeEdge(g, configuration1, forwarderEvc1);
+
+ edgeSerializer.addTreeEdge(g, pnf2, pInterface2);
+ edgeSerializer.addEdge(g, pInterface2, forwarder2);
+ edgeSerializer.addEdge(g, forwarder2, configuration2);
+ edgeSerializer.addTreeEdge(g, configuration2, forwarderEvc2);
+
+ edgeSerializer.addTreeEdge(g, pnf3, pInterface3);
+ edgeSerializer.addEdge(g, pInterface3, forwarder3);
+ edgeSerializer.addEdge(g, forwarder3, configuration3);
+ edgeSerializer.addTreeEdge(g, configuration3, forwarderEvc3);
+
+ edgeSerializer.addTreeEdge(g, pnf4, pInterface4);
+ edgeSerializer.addEdge(g, pInterface4, forwarder4);
+ edgeSerializer.addEdge(g, forwarder4, configuration4);
+ edgeSerializer.addTreeEdge(g, configuration4, forwarderEvc4);
+
+ edgeSerializer.addTreeEdge(g, pnf5, pInterface5);
+ edgeSerializer.addEdge(g, pInterface5, forwarder5);
+ edgeSerializer.addEdge(g, forwarder5, configuration5);
+ edgeSerializer.addTreeEdge(g, configuration5, forwarderEvc5);
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+
+ GraphTraversalSource traversal = g;
+ GraphTraversalSource readOnly = tx.traversal(GraphTraversalSource.build().with(ReadOnlyStrategy.instance()));
+ when (spy.tx()).thenReturn(tx);
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ when(adminSpy.getReadOnlyTraversalSource()).thenReturn(readOnly);
+
+ migration = new MigrateForwarderEvcCircuitId(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+ }
+
+ @Test
+ public void testCircuitIdsUpdated() throws Exception {
+ // check if graph nodes are updated
+
+ assertEquals("First circuit-id updated", "10",
+ g.V().has("aai-node-type", "forwarder-evc").has("circuit-id", "10").next().value("circuit-id").toString());
+
+ assertEquals("Second circuit-id updated", "20",
+ g.V().has("aai-node-type", "forwarder-evc").has("circuit-id", "20").next().value("circuit-id").toString());
+
+ assertFalse("Third circuit-id remains empty", g.V().has("aai-node-type", "forwarder-evc").has("forwarder-evc-id", "evc-3")
+ .next().property("circuit-id").isPresent());
+
+ assertEquals("Fourth circuit-id not updated", "3",
+ g.V().has("aai-node-type", "forwarder-evc").has("circuit-id", "3").next().value("circuit-id").toString());
+
+ assertFalse("Fifth circuit-id remains empty", g.V().has("aai-node-type", "forwarder-evc").has("forwarder-evc-id", "evc-5")
+ .next().property("circuit-id").isPresent());
+ }
+
+ @Test
+ public void testGetAffectedNodeTypes() {
+ Optional<String[]> types = migration.getAffectedNodeTypes();
+ Optional<String[]> expected = Optional.of(new String[]{"forwarder-evc"});
+
+ assertNotNull(types);
+ assertArrayEquals(expected.get(), types.get());
+ }
+
+ @Test
+ public void testGetMigrationName() {
+ String migrationName = migration.getMigrationName();
+
+ assertNotNull(migrationName);
+ assertEquals("MigrateForwarderEvcCircuitId", migrationName);
+ }
+}
diff --git a/src/test/java/org/onap/aai/migration/v14/MigrateGenericVnfMgmtOptionsTest.java b/src/test/java/org/onap/aai/migration/v14/MigrateGenericVnfMgmtOptionsTest.java
new file mode 100644
index 0000000..a35c300
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v14/MigrateGenericVnfMgmtOptionsTest.java
@@ -0,0 +1,230 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v14;
+
+import org.onap.aai.AAISetup;
+import org.onap.aai.edges.EdgeIngestor;
+import org.onap.aai.introspection.LoaderFactory;
+import org.onap.aai.serialization.db.EdgeSerializer;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraphTransaction;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.migration.Status;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.Optional;
+
+import javax.validation.constraints.AssertFalse;
+
+import static org.junit.Assert.assertTrue;
+
+public class MigrateGenericVnfMgmtOptionsTest extends AAISetup {
+
+ protected static final String VNF_NODE_TYPE = "generic-vnf";
+
+ public static class MigrateVnfType extends MigrateGenericVnfMgmtOptions {
+ public MigrateVnfType(TransactionalGraphEngine engine, LoaderFactory loaderFactory, EdgeIngestor edgeIngestor, EdgeSerializer edgeSerializer, SchemaVersions schemaVersions){
+ super(engine, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ }
+ @Override
+ public Status getStatus() {
+ return Status.SUCCESS;
+ }
+ @Override
+ public Optional<String[]> getAffectedNodeTypes() {
+ return Optional.of(new String[]{VNF_NODE_TYPE});
+ }
+ @Override
+ public String getMigrationName() {
+ return "MockMigrateVnfType";
+ }
+ }
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private MigrateVnfType migration;
+ private GraphTraversalSource g;
+
+ @Before
+ public void setup() throws Exception{
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+ //generic-vnf
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf0")
+ .property("vnf-type", "HN")
+ .next();
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf1")
+ .property("vnf-type", "HN")
+ .property("management-option", "")
+ .next();
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf2")
+ .property("vnf-type", "HN")
+ .property("management-option", "existingOption")
+ .next();
+
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf10")
+ .property("vnf-type", "HP")
+ .next();
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf11")
+ .property("vnf-type", "HP")
+ .property("management-option", "")
+ .next();
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf12")
+ .property("vnf-type", "HP")
+ .property("management-option", "existingOption")
+ .next();
+
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf20")
+ .property("vnf-type", "HG")
+ .next();
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf21")
+ .property("vnf-type", "HG")
+ .property("management-option", "")
+ .next();
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf22")
+ .property("vnf-type", "HG")
+ .property("management-option", "existingOption")
+ .next();
+
+ // Non-eligible migration conditions - vnf-type = XX
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf30")
+ .property("vnf-type", "XX")
+ .next();
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf31")
+ .property("vnf-type", "XX")
+ .property("management-option", "")
+ .next();
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf32")
+ .property("vnf-type", "XX")
+ .property("management-option", "existingOption")
+ .next();
+ // Non-eligible migration conditions - vnf-type = missing
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf40")
+ .next();
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf41")
+ .property("management-option", "")
+ .next();
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf42")
+ .property("management-option", "existingOption")
+ .next();
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+ GraphTraversalSource traversal = g;
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ migration = new MigrateVnfType(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+
+ }
+
+ @Test
+ public void testMissingProperty(){
+ //management-option
+ assertTrue("Value of generic-vnf should be updated since the property management-option doesn't exist",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf0").has("management-option", "AT&T Managed-Basic").hasNext());
+ assertTrue("Value of generic-vnf should be updated since the property management-option doesn't exist",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf10").has("management-option", "AT&T Managed-Basic").hasNext());
+ assertTrue("Value of generic-vnf should be updated since the property management-option doesn't exist",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf20").has("management-option", "AT&T Managed-Basic").hasNext());
+ }
+
+ @Test
+ public void testEmptyValue() {
+ //management-option
+ assertTrue("Value of generic-vnf should be updated since the value for management-option is an empty string",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf1").has("management-option", "AT&T Managed-Basic").hasNext());
+ assertTrue("Value of generic-vnf should be updated since the value for management-option is an empty string",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf11").has("management-option", "AT&T Managed-Basic").hasNext());
+ assertTrue("Value of generic-vnf should be updated since the value for management-option is an empty string",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf21").has("management-option", "AT&T Managed-Basic").hasNext());
+
+ }
+
+ @Test
+ public void testExistingValues() {
+ //management-option
+ assertTrue("Value of generic-vnf shouldn't be updated since management-option already exists",
+ !g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf2").has("management-option", "AT&T Managed-Basic").hasNext());
+ assertTrue("Value of generic-vnf shouldn't be updated since management-option already exists",
+ !g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf12").has("management-option", "AT&T Managed-Basic").hasNext());
+ assertTrue("Value of generic-vnf shouldn't be updated since management-option already exists",
+ !g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf22").has("management-option", "AT&T Managed-Basic").hasNext());
+
+
+ }
+
+ @Test
+ public void testExistingVnfsNotMigrated() {
+ //management-option
+ assertTrue("Value of generic-vnf shouldn't be updated since vnf-type is not affected",
+ !g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf30").has("management-option", "AT&T Managed-Basic").hasNext());
+ assertTrue("Value of generic-vnf shouldn't be updated since vnf-type is not affected",
+ !g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf31").has("management-option", "AT&T Managed-Basic").hasNext());
+ assertTrue("Value of generic-vnf shouldn't be updated since vnf-type is not affected and management-option already exists",
+ !g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf32").has("management-option", "AT&T Managed-Basic").hasNext());
+
+ assertTrue("Value of generic-vnf shouldn't be updated since vnf-type is not present",
+ !g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf40").has("management-option", "AT&T Managed-Basic").hasNext());
+ assertTrue("Value of generic-vnf shouldn't be updated since vnf-type is not present",
+ !g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf41").has("management-option", "AT&T Managed-Basic").hasNext());
+ assertTrue("Value of generic-vnf shouldn't be updated since vnf-type is not present and management-option already exists",
+ !g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf42").has("management-option", "AT&T Managed-Basic").hasNext());
+
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/aai/migration/v14/MigrateMissingFqdnOnPserversTest.java b/src/test/java/org/onap/aai/migration/v14/MigrateMissingFqdnOnPserversTest.java
new file mode 100644
index 0000000..f4ec345
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v14/MigrateMissingFqdnOnPserversTest.java
@@ -0,0 +1,129 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v14;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraphTransaction;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+
+public class MigrateMissingFqdnOnPserversTest extends AAISetup{
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private JanusGraph graph;
+ private MigrateMissingFqdnOnPservers migration;
+ private GraphTraversalSource g;
+ private JanusGraphTransaction tx;
+ Vertex pserver1;
+ Vertex pserver2;
+ Vertex pserver3;
+ Vertex pserver4;
+ Vertex pserver5;
+
+
+ @Before
+ public void setUp() throws Exception {
+
+ graph = JanusGraphFactory.build().set("storage.backend", "inmemory").open();
+ tx = graph.newTransaction();
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+
+ pserver1 = g.addV().property("aai-node-type", MigrateMissingFqdnOnPservers.PSERVER_NODE_TYPE)
+ .property(MigrateMissingFqdnOnPservers.PSERVER_HOSTNAME, "hostname1.com")
+ .property(MigrateMissingFqdnOnPservers.PSERVER_SOURCEOFTRUTH, "RO")
+ .next();
+
+ pserver2 = g.addV().property("aai-node-type", MigrateMissingFqdnOnPservers.PSERVER_NODE_TYPE)
+ .property(MigrateMissingFqdnOnPservers.PSERVER_HOSTNAME, "hostname2.com")
+ .property(MigrateMissingFqdnOnPservers.PSERVER_FQDN, "")
+ .next();
+
+ pserver3 = g.addV().property("aai-node-type", MigrateMissingFqdnOnPservers.PSERVER_NODE_TYPE)
+ .property(MigrateMissingFqdnOnPservers.PSERVER_HOSTNAME, "akr1")
+ .property(MigrateMissingFqdnOnPservers.PSERVER_SOURCEOFTRUTH, "RO")
+ .property(MigrateMissingFqdnOnPservers.PSERVER_FQDN, "akr1")
+ .next();
+
+ pserver4 = g.addV().property("aai-node-type", MigrateMissingFqdnOnPservers.PSERVER_NODE_TYPE)
+ .property(MigrateMissingFqdnOnPservers.PSERVER_HOSTNAME, "hostname1")
+ .property(MigrateMissingFqdnOnPservers.PSERVER_SOURCEOFTRUTH, "RO")
+ .property(MigrateMissingFqdnOnPservers.PSERVER_FQDN, "")
+ .next();
+
+ pserver5 = g.addV().property("aai-node-type", MigrateMissingFqdnOnPservers.PSERVER_NODE_TYPE)
+ .property(MigrateMissingFqdnOnPservers.PSERVER_HOSTNAME, "hostname2")
+ .property(MigrateMissingFqdnOnPservers.PSERVER_SOURCEOFTRUTH, "RO")
+ .next();
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+ GraphTraversalSource traversal = g;
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ migration = new MigrateMissingFqdnOnPservers(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+ }
+
+ @After
+ public void cleanUp() {
+ tx.rollback();
+ graph.close();
+ }
+
+
+ /***
+ * checks if the fqdn value was changed
+ */
+
+ @Test
+ public void confirmFQDNValueChanged() {
+
+ assertEquals("hostname1.com",pserver1.property(MigrateMissingFqdnOnPservers.PSERVER_FQDN).value());//created fqdn property
+ assertEquals("hostname2.com",pserver2.property(MigrateMissingFqdnOnPservers.PSERVER_FQDN).value());//updated empty fqdn
+ assertEquals("akr1",pserver3.property(MigrateMissingFqdnOnPservers.PSERVER_FQDN).value());//Not changed
+ assertEquals("",pserver4.property(MigrateMissingFqdnOnPservers.PSERVER_FQDN).value());//Not changed
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/aai/migration/v14/MigrateNetworkTechToCloudRegionTest.java b/src/test/java/org/onap/aai/migration/v14/MigrateNetworkTechToCloudRegionTest.java
new file mode 100644
index 0000000..6438034
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v14/MigrateNetworkTechToCloudRegionTest.java
@@ -0,0 +1,147 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v14;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+public class MigrateNetworkTechToCloudRegionTest extends AAISetup{
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private GraphTraversalSource g;
+ private MigrateNetworkTechToCloudRegion migration;
+
+ @Before
+ public void setUp() throws Exception {
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+ Vertex cloudRegion1 = g.addV().property("aai-node-type", "cloud-region").property("cloud-region-id", "cloud-region-id-1").property("cloud-owner", "att-aic").property("resource-version", "1").next();
+ Vertex cloudRegion2 = g.addV().property("aai-node-type", "cloud-region").property("cloud-region-id", "cloud-region-id-2").property("cloud-owner", "att-nc").property("resource-version", "2").next();
+ Vertex cloudRegion3 = g.addV().property("aai-node-type", "cloud-region").property("cloud-region-id", "cloud-region-id-3").property("cloud-owner", "att-aic").property("resource-version", "7").next();
+
+ Vertex networkTech1 = g.addV().property("aai-node-type","network-technology").property("network-technology-id", "network-technology-1").property("network-technology-name", "CONTRAIL").property("resource-version", "3").next();
+ Vertex networkTech2 = g.addV().property("aai-node-type", "network-technology").property("network-technology-id", "network-technology-2").property("network-technology-name", "AIC_SR_IOV").property("resource-version", "4").next();
+ Vertex networkTech3 = g.addV().property("aai-node-type", "network-technology").property("network-technology-id", "network-technology-3").property("network-technology-name", "TEST").property("resource-version", "5").next();
+ Vertex networkTech4 = g.addV().property("aai-node-type", "network-technology").property("network-technology-id", "network-technology-4").property("network-technology-name", "OVS").property("resource-version", "8").next();
+
+
+ edgeSerializer.addEdge(g, cloudRegion1, networkTech1);
+
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+ GraphTraversalSource traversal = g;
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+
+
+ migration = new MigrateNetworkTechToCloudRegion(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+
+ /*try {
+ System.out.println("containsVertexLabel :: "+graph.containsVertexLabel("cloud-region"));
+ graph.io(IoCore.graphson()).writeGraph("tinkerpop-modern.json");
+
+ try (final InputStream stream = new FileInputStream("tinkerpop-modern.json")) {
+ graph.io(IoCore.graphson()).reader().create().readGraph(stream, graph);
+ }
+
+ OutputStream out = new FileOutputStream("tinkerpop-modern.json");
+ GraphSONWriter objGraphSONWriter = new GraphSONWriter(GraphSONWriter.build());
+ objGraphSONWriter.writeGraph(out, graph);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }*/
+ }
+
+ public void cleanUp() {
+ tx.rollback();
+ graph.close();
+ }
+
+ @Test
+ public void checkEdgeCreatedForNetworkTechnology() {
+
+ assertEquals(true,
+ g.V().has("aai-node-type", "cloud-region").has("cloud-region-id", "cloud-region-id-1")
+ .out()
+ .has("aai-node-type", "network-technology").has("network-technology-id","network-technology-2").hasNext());
+
+ assertEquals(true,
+ g.V().has("aai-node-type", "cloud-region").has("cloud-region-id", "cloud-region-id-3")
+ .out()
+ .has("aai-node-type", "network-technology").has("network-technology-id","network-technology-1").hasNext());
+
+
+ assertEquals(true,
+ g.V().has("aai-node-type", "cloud-region").has("cloud-region-id", "cloud-region-id-2")
+ .out()
+ .has("aai-node-type", "network-technology").has("network-technology-id","network-technology-4").hasNext());
+
+
+ assertEquals("Edge not created", false,
+ g.V().has("aai-node-type", "cloud-region").has("cloud-region-id", "cloud-region-id-1")
+ .out()
+ .has("aai-node-type", "network-technology").has("network-technology-id","network-technology-3").hasNext());
+
+ assertEquals("Edge not created", false,
+ g.V().has("aai-node-type", "cloud-region").has("cloud-region-id", "cloud-region-id-2")
+ .out()
+ .has("aai-node-type", "network-technology").has("network-technology-id","network-technology-1").hasNext());
+
+
+ assertEquals("Edge exists to 2 cloud regions", new Long(2L),
+ g.V().has("aai-node-type", "network-technology").has("network-technology-id", "network-technology-1")
+ .in().count().next());
+
+ /*
+ try {
+ graph.io(IoCore.graphson()).writeGraph("tinkerpop-modern.json");
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }*/
+
+ }
+
+}
diff --git a/src/test/java/org/onap/aai/migration/v14/MigrateSameSourcedRCTROPServerDataTest.java b/src/test/java/org/onap/aai/migration/v14/MigrateSameSourcedRCTROPServerDataTest.java
new file mode 100644
index 0000000..3795dac
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v14/MigrateSameSourcedRCTROPServerDataTest.java
@@ -0,0 +1,1056 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v14;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.*;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.migration.v14.MigrateSameSourcedRCTROPserverData;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphTransaction;
+
+public class MigrateSameSourcedRCTROPServerDataTest extends AAISetup{
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+
+ Loader loader;
+ TransactionalGraphEngine dbEngine;
+ JanusGraph graph;
+ MigrateSameSourcedRCTROPserverData migration;
+ JanusGraphTransaction tx;
+ GraphTraversalSource g;
+ Vertex pintOld;
+ Vertex lInterfaceold;
+ Vertex pintOldRo;
+ Vertex lInterfaceoldRo;
+ Vertex pintOldRo1;
+ Vertex pintNewRo1;
+ Vertex plinkROonOldRo1;
+
+ Vertex pintOldScn3;
+ Vertex pintNewScn3;
+ Vertex pLinkOldScn3;
+ Vertex pLinkNewScn3;
+
+ Vertex pintOldScn2;
+ Vertex pintNewScn2;
+ Vertex pLinkOldScn2;
+ Vertex pintOld2Scn2;
+ Vertex sriovPfOld;
+ Vertex sriovVfOld;
+
+ Vertex lInterfaceold2;
+ Vertex pintOld2;
+
+ Vertex pLinkMoveScn2;
+ Vertex pLinkMoveScn1;
+
+ Vertex pint1ROOld;
+ Vertex pint2ROOld;
+ Vertex pint2RONew;
+ Vertex pint3ROOld;
+ Vertex pint3RONew;
+ Vertex pint1ROOldPlink;
+
+ //ManyToOne edge scenario
+ Vertex pserverRCTScn6;
+ Vertex pserverRCT1Scn6;
+ Vertex zoneScn61;
+ Vertex zoneScn62;
+
+ @Before
+ public void setUp() throws Exception {
+ graph = JanusGraphFactory.build().set("storage.backend","inmemory").open();
+ tx = graph.newTransaction();
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType,schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+//rct
+ Vertex pserverOld = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserverOld")
+ .property("source-of-truth","RCT")
+ .property("fqdn","tttt.bbbb.cccc.dddd")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverOld")
+ .property("resource-version","1")
+ .next();
+ Vertex pserverNew = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserverNew")
+ .property("source-of-truth","RCT")
+ .property("fqdn","tttt.cccc.cccc.dddd")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverNew")
+ .property("resource-version","2")
+ .next();
+ pintOld = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pintOld")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverOld/p-interfaces/p-interface/pintOld")
+ .next();
+
+ lInterfaceold = g.addV().property("aai-node-type", "l-interface")
+ .property("interface-name", "linterfaceold")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverOld/p-interfaces/p-interface/pintOld/l-interfaces/l-interface/linterfaceold")
+ .next();
+
+ pintOld2 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pintOld2")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverOld/p-interfaces/p-interface/pintOld2")
+ .next();
+ lInterfaceold2 = g.addV().property("aai-node-type", "l-interface")
+ .property("interface-name", "linterfaceold2")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverOld/p-interfaces/p-interface/pintOld2/l-interfaces/l-interface/linterfaceold2")
+ .next();
+
+ sriovPfOld = g.addV().property("aai-node-type", "sriov-pf")
+ .property("pf-pci-id","sriovPfOld")
+ .property("source-of-truth","RCT")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverOld/p-interfaces/p-interface/pintOld2/sriov-pfs/sriov-pf/sriovPfOld")
+ .next();
+
+ sriovVfOld = g.addV().property("aai-node-type", "sriov-vf")
+ .property("pci-id","sriovVfOld")
+ .property("source-of-truth","RCT")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverOld/p-interfaces/p-interface/pintOld2/l-interfaces/l-interface/linterfaceold2/sriov-vfs/sriov-vf/sriovVfOld")
+ .next();
+
+
+
+ Vertex vserver3 = g.addV().property("aai-node-type", "vserver")
+ .property("vserver-id", "vserver1")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/vserver3")
+ .next();
+ Vertex lInterface3 = g.addV().property("aai-node-type", "l-interface")
+ .property("interface-name", "linterfaceold3")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/vserver3")
+ .next();
+ Vertex sriovVfOld3 = g.addV().property("aai-node-type", "sriov-vf")
+ .property("pci-id","sriovVfOld3")
+ .property("source-of-truth","RCT")
+// .property("aai-uri","/cloud-infrastructure/pservers/pserver/vserver3")
+ .next();
+ Vertex complexOld = g.addV().property("aai-node-type", "complex")
+ .property("physical-location-id", "complexOld")
+ .property("aai-uri","/cloud-infrastructure/complex/complexOld")
+ .next();
+
+
+//ro
+ Vertex pserverRoOld = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserverRo.OldOne.aaaa.bbbbb")
+ .property("source-of-truth","RO")
+ .property("fqdn","aaaa.bbbb.cccc.dddd")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRo.OldOne.aaaa.bbbbb")
+ .property("resource-version","1")
+ .next();
+ Vertex pserverRoNew = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserverRo.NewOne.aaaa.ccccccccccc")
+ .property("source-of-truth","RO")
+ .property("fqdn","aaaa.cccc.cccc.dddd")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRo.NewOne.aaaa.ccccccccccc")
+ .property("resource-version","2")
+ .next();
+
+ Vertex pserverRo3 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserverRo3")
+ .property("source-of-truth","RO")
+ .property("fqdn","aaaa.cccc.cccc.dddd")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRo3")
+ .property("resource-version","2")
+ .next();
+
+ Vertex pserverRo4 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserverRoComplexTest.aaa")
+ .property("source-of-truth","RO")
+ .property("fqdn","aaaa.cccc.cccc.dddd")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRoComplexTest.aaa")
+ .property("resource-version","2")
+ .next();
+
+ Vertex pserverRo5 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserverRoComplexTest.aaaaa")
+ .property("source-of-truth","RO")
+ .property("fqdn","aaaa.cccc.cccc.eeee")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRoComplexTest.aaaaa")
+ .property("resource-version","2")
+ .next();
+
+ pintOldRo = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pintOldRo")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRo.OldOne.aaaa.bbbbb/p-interfaces/p-interface/pintOldRo")
+ .next();
+ lInterfaceoldRo = g.addV().property("aai-node-type", "l-interface")
+ .property("interface-name", "linterfaceoldRo")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRo.OldOne.aaaa.bbbbb/p-interfaces/p-interface/pintOld/l-interfaces/l-interface/linterfaceold")
+ .next();
+ Vertex complexOldRO = g.addV().property("aai-node-type", "complex")
+ .property("physical-location-id", "complexOldRO")
+ .property("aai-uri","/cloud-infrastructure/complexes/complex/vserver3")
+ .next();
+
+ pintOldRo1 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pintRo1")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRo.OldOne.aaaa.bbbbb/p-interfaces/p-interface/pintRo1")
+ .next();
+
+ pintNewRo1 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pintRo1")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRo.NewOne.aaaa.ccccccccccc/p-interfaces/p-interface/pintRo1")
+ .next();
+
+ plinkROonOldRo1 = g.addV()
+ .property("aai-node-type", "physical-link")
+ .property("link-name", "plinkROonOldRo1")
+ .next();
+
+ Vertex pintNew31 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pintRo1")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRo3/p-interfaces/p-interface/pintRo1")
+ .next();
+
+ Vertex pintOld41 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pintOld41")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRoComplexTest.aaa/p-interfaces/p-interface/pintOld41")
+ .next();
+
+ Vertex sriovpfOldRo1= g.addV()
+ .property("aai-node-type", "sriov-pf")
+ .property("pf-pci-id", "sriovpfOldRo1")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRo.OldOne.aaaa.bbbbb/p-interfaces/p-interface/pintRo1/sriov-pfs/sriov-pf/sriovpfOldRo1")
+ .next();
+
+ //Scenario 3 same p interface name, new interface has a seprate plink
+
+ Vertex pserverOldScn3 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserverOldScn3")
+ .property("source-of-truth","RCT")
+ .property("fqdn","eeee.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverOldScn3")
+ .property("resource-version","1")
+ .next();
+ Vertex pserverNewScn3= g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserverNewScn3")
+ .property("source-of-truth","RCT")
+ .property("fqdn","eeee.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverNewScn3")
+ .property("resource-version","2")
+ .next();
+
+ pintOldScn3= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pintOldScn3")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverOldScn3/p-interfaces/p-interface/pintOldScn3")
+ .next();
+ pintNewScn3= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pintNewScn3")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverNewScn3/p-interfaces/p-interface/pintNewScn3")
+ .next();
+
+ pLinkOldScn3 = g.addV().property("aai-node-type", "physical-link")
+ .property("link-name", "pLinkOldScn3")
+ .property("service-provider-bandwidth-up-value", 0)
+ .property("service-provider-bandwidth-up-units", "empty")
+ .property("service-provider-bandwidth-down-value", 0)
+ .property("service-provider-bandwidth-down-units", "empty")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/vserver3")
+ .next();
+ pLinkNewScn3 = g.addV().property("aai-node-type", "physical-link")
+ .property("link-name", "pLinkNewScn3")
+ .property("service-provider-bandwidth-up-value", 0)
+ .property("service-provider-bandwidth-up-units", "empty")
+ .property("service-provider-bandwidth-down-value", 0)
+ .property("service-provider-bandwidth-down-units", "empty")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/vserver3")
+ .next();
+
+
+
+
+
+// Scenario 2 missing plink in new pserver same pinterface name
+
+ Vertex pserverOldScn2 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserverOldScn2")
+ .property("source-of-truth","RCT")
+ .property("fqdn","vvvv.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverOldScn2")
+ .property("resource-version","1")
+ .next();
+ Vertex pserverNewScn2= g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserverNewScn2")
+ .property("source-of-truth","RCT")
+ .property("fqdn","vvvv.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverNewScn2")
+ .property("resource-version","2")
+ .next();
+
+ pintOldScn2= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pintScn2")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverOldScn2/p-interfaces/p-interface/pintScn2")
+ .next();
+ pintOld2Scn2= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pintOld2Scn2")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverOldScn2/p-interfaces/p-interface/pintOld2Scn2")
+ .next();
+
+ pintNewScn2= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pintScn2")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverNewScn2/p-interfaces/p-interface/pintScn2")
+ .next();
+
+ pLinkOldScn2 = g.addV().property("aai-node-type", "physical-link")
+ .property("link-name", "pLinkOldScn2")
+ .property("service-provider-bandwidth-up-value", 0)
+ .property("service-provider-bandwidth-up-units", "empty")
+ .property("service-provider-bandwidth-down-value", 0)
+ .property("service-provider-bandwidth-down-units", "empty")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/vserver3")
+ .next();
+
+// Scnario 2 RCT Pinter face match moving plink and updating the name
+ Vertex pserver1Scn2 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserver1Scn2")
+ .property("source-of-truth","RCT")
+ .property("fqdn","same.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserver1Scn2")
+ .property("resource-version","1")
+ .next();
+ Vertex pserver2Scn2= g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserver2Scn2")
+ .property("source-of-truth","RCT")
+ .property("fqdn","same.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserver2Scn2")
+ .property("resource-version","2")
+ .next();
+ Vertex pserver3Scn2= g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserver3Scn2")
+ .property("source-of-truth","RCT")
+ .property("fqdn","jkkdahfkjashf.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserver3Scn2")
+ .property("resource-version","2")
+ .next();
+
+
+ Vertex pint1Scn2= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint1Scn2")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserver1Scn2/p-interfaces/p-interface/pint1Scn2")
+ .next();
+ Vertex pint2NewScn2= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint1Scn2")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserver2Scn2/p-interfaces/p-interface/pint1Scn2")
+ .next();
+ Vertex pint3Scn2= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint3Scn2")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserver3Scn2/p-interfaces/p-interface/pint3Scn2")
+ .next();
+
+ pLinkMoveScn2= g.addV().property("aai-node-type", "physical-link")
+ .property("link-name", "pserver1Scn2:pint1Scn2|pserver3Scn2:pint3Scn2")
+ .property("aai-uri","/cloud-infrastructure/plink/pLinkMoveScn2")
+ .next();
+
+
+// Scenario 1 RCT plink name change move everything from old pserver to new pserver, new pserver has no plink
+ Vertex pserver1Scn1 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserver1Scn1")
+ .property("source-of-truth","RCT")
+ .property("fqdn","sameScn1.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserver1Scn1")
+ .property("resource-version","1")
+ .next();
+ Vertex pserver2Scn1= g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserver2Scn1")
+ .property("source-of-truth","RCT")
+ .property("fqdn","sameScn1.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserver2Scn1")
+ .property("resource-version","2")
+ .next();
+ Vertex pserver3Scn1= g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserver3Scn1")
+ .property("source-of-truth","RCT")
+ .property("fqdn","jkkdahfkjashf.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserver3Scn1")
+ .property("resource-version","2")
+ .next();
+
+
+ Vertex pint1Scn1= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint1Scn1")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserver1Scn1/p-interfaces/p-interface/pint1Scn1")
+ .next();
+
+ Vertex pint3Scn1= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint3Scn1")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserver3Scn1/p-interfaces/p-interface/pint3Scn1")
+ .next();
+
+
+ pLinkMoveScn1= g.addV().property("aai-node-type", "physical-link")
+ .property("link-name", "pserver1Scn1:pint1Scn1|pserver3Scn1:pint3Scn1")
+ .property("aai-uri","/cloud-infrastructure/plink/pLinkMoveScn1")
+ .next();
+
+
+ //Scnario 2 RCT Pinter face match moving plink and updating the name
+ edgeSerializer.addTreeEdge(g,pserver1Scn2,pint1Scn2);
+
+ edgeSerializer.addTreeEdge(g,pserver2Scn2,pint2NewScn2);
+
+ edgeSerializer.addTreeEdge(g,pserver3Scn2,pint3Scn2);
+
+ edgeSerializer.addEdge(g,pint1Scn2,pLinkMoveScn2);
+ edgeSerializer.addEdge(g,pint3Scn2,pLinkMoveScn2);
+
+
+ // Scenario 1 RCT plink name change move everything from old pserver to new pserver, new pserver has no plink
+ edgeSerializer.addTreeEdge(g, pserver1Scn1,pint1Scn1);
+ edgeSerializer.addTreeEdge(g, pserver3Scn1,pint3Scn1);
+
+ edgeSerializer.addEdge(g,pint1Scn1,pLinkMoveScn1);
+ edgeSerializer.addEdge(g,pint3Scn1,pLinkMoveScn1);
+
+
+//RCT
+ edgeSerializer.addTreeEdge(g, pserverOld,pintOld);
+ edgeSerializer.addTreeEdge(g, pintOld,lInterfaceold);
+// rules.addTreeEdge(g, pintOld,sriovPfOld);
+// rules.addTreeEdge(g, lInterfaceold,sriovVfOld);
+
+ edgeSerializer.addTreeEdge(g, pserverOld,pintOld2);
+ edgeSerializer.addTreeEdge(g, pintOld2,lInterfaceold2);
+ edgeSerializer.addTreeEdge(g, pintOld2,sriovPfOld);
+ edgeSerializer.addTreeEdge(g, sriovVfOld,lInterfaceold2);
+
+ edgeSerializer.addTreeEdge(g,vserver3,lInterface3);
+ edgeSerializer.addTreeEdge(g,lInterface3,sriovVfOld3);
+
+ edgeSerializer.addEdge(g,sriovPfOld,sriovVfOld3);
+ edgeSerializer.addEdge(g,pserverOld,complexOld);
+
+
+
+//ro
+ edgeSerializer.addTreeEdge(g,pserverRoOld,pintOldRo);
+ edgeSerializer.addTreeEdge(g,pintOldRo,lInterfaceoldRo);
+ edgeSerializer.addEdge(g,pserverRoOld,complexOldRO);
+ edgeSerializer.addTreeEdge(g,pserverRoOld, pintOldRo1);
+ edgeSerializer.addTreeEdge(g,pserverRoNew, pintNewRo1);
+ edgeSerializer.addEdge(g, pintOldRo1, plinkROonOldRo1);
+
+ edgeSerializer.addTreeEdge(g, pserverRo3, pintNew31);
+ edgeSerializer.addEdge(g, pintNew31, plinkROonOldRo1);
+
+ edgeSerializer.addTreeEdge(g, pserverRo4, pintOld41);
+
+ edgeSerializer.addTreeEdge(g, pintOldRo1, sriovpfOldRo1);
+
+
+ // physical-link tests
+ //1. p-int does not exist on longer hostname RO, p-int and p-link moves from shorter to longer
+ pint1ROOld= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint1ROOld")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRo.OldOne.aaaa.bbbbb/p-interfaces/p-interface/pint1ROOld")
+ .next();
+
+ Vertex pLink1ROOld = g.addV().property("aai-node-type", "physical-link")
+ .property("link-name", "pLink1ROOld")
+ .property("service-provider-bandwidth-up-value", 0)
+ .property("service-provider-bandwidth-up-units", "empty")
+ .property("service-provider-bandwidth-down-value", 0)
+ .property("service-provider-bandwidth-down-units", "empty")
+ .next();
+ edgeSerializer.addTreeEdge(g,pserverRoOld,pint1ROOld);
+ edgeSerializer.addEdge(g,pint1ROOld,pLink1ROOld);
+
+ //2. p-int matches on shorter and longer hostname ROP pservers, p-link does not exist on longer RO. p-link moves from shorter to longer hostname
+ pint2ROOld= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint2RO")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRo.OldOne.aaaa.bbbbb/p-interfaces/p-interface/pint2RO")
+ .next();
+
+ Vertex pLink2ROOld = g.addV().property("aai-node-type", "physical-link")
+ .property("link-name", "pLink2ROOld")
+ .property("service-provider-bandwidth-up-value", 0)
+ .property("service-provider-bandwidth-up-units", "empty")
+ .property("service-provider-bandwidth-down-value", 0)
+ .property("service-provider-bandwidth-down-units", "empty")
+ .next();
+
+ pint2RONew= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint2RO")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRo.NewOne.aaaa.ccccccccccc/p-interfaces/p-interface/pint2RO")
+ .next();
+
+ edgeSerializer.addTreeEdge(g,pserverRoOld,pint2ROOld);
+ edgeSerializer.addEdge(g,pint2ROOld,pLink2ROOld);
+ edgeSerializer.addTreeEdge(g,pserverRoNew,pint2RONew);
+
+ //3. p-int matches on shorter and longer hostname ROP pservers, p-link exists on both, no change in plink or p-int on longer
+ pint3ROOld= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint3RO")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRo.OldOne.aaaa.bbbbb/p-interfaces/p-interface/pint3RO")
+ .next();
+
+ Vertex pLink3ROOld = g.addV().property("aai-node-type", "physical-link")
+ .property("link-name", "pLink3ROOld")
+ .property("service-provider-bandwidth-up-value", 0)
+ .property("service-provider-bandwidth-up-units", "empty")
+ .property("service-provider-bandwidth-down-value", 0)
+ .property("service-provider-bandwidth-down-units", "empty")
+ .next();
+
+ pint3RONew= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint3RO")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRo.NewOne.aaaa.ccccccccccc/p-interfaces/p-interface/pint3RO")
+ .next();
+
+ Vertex pLink3RONew = g.addV().property("aai-node-type", "physical-link")
+ .property("link-name", "pLink3RONew")
+ .property("service-provider-bandwidth-up-value", 0)
+ .property("service-provider-bandwidth-up-units", "empty")
+ .property("service-provider-bandwidth-down-value", 0)
+ .property("service-provider-bandwidth-down-units", "empty")
+ .next();
+
+ edgeSerializer.addTreeEdge(g,pserverRoOld,pint3ROOld);
+ edgeSerializer.addEdge(g,pint3ROOld,pLink3ROOld);
+ edgeSerializer.addTreeEdge(g,pserverRoNew,pint3RONew);
+ edgeSerializer.addEdge(g,pint3RONew,pLink3RONew);
+ //End physical-links tests
+
+
+//sc3
+ edgeSerializer.addTreeEdge(g,pserverOldScn3,pintOldScn3);
+ edgeSerializer.addTreeEdge(g,pserverNewScn3,pintNewScn3);
+ edgeSerializer.addEdge(g,pintNewScn3,pLinkNewScn3);
+ edgeSerializer.addEdge(g,pintOldScn3,pLinkOldScn3);
+
+//sc2
+ edgeSerializer.addTreeEdge(g,pserverOldScn2,pintOldScn2);
+ edgeSerializer.addTreeEdge(g,pserverOldScn2,pintOld2Scn2);
+ edgeSerializer.addTreeEdge(g,pserverNewScn2,pintNewScn2);
+ edgeSerializer.addEdge(g,pintOldScn2,pLinkOldScn2);
+
+//RCT fqdn not set new tests
+
+ Vertex rctP1 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","rctP1")
+ .property("source-of-truth","RCT")
+ .property("fqdn","sameFqdnScn1.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP1")
+ .property("resource-version","1")
+ .next();
+
+ // Don't throw null pointer with fqdn not set
+ Vertex rctP2 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","rctP2")
+ .property("source-of-truth","RCT")
+// .property("fqdn","sameScn1.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP2")
+ .property("resource-version","2")
+ .next();
+
+ Vertex rctP3 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","rctP3")
+ .property("source-of-truth","RCT")
+ .property("fqdn","sameFqdnScn1.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP3")
+ .property("resource-version","3")
+ .next();
+
+ Vertex rctP4 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","rctP4")
+ .property("source-of-truth","RCT")
+ .property("fqdn","")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP4")
+ .property("resource-version","4")
+ .next();
+
+ Vertex rctP5 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","rctP5")
+ .property("source-of-truth","RCT")
+ .property("fqdn","")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP5")
+ .property("resource-version","5")
+ .next();
+
+ //pint11 does not have a match on rctP3. So, expect this to move to rctP3. Add test
+ Vertex pint11= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint11")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP1/p-interfaces/p-interface/pint11")
+ .next();
+
+ // matching interface-name on pint12 and pint31. Delete pint12. Don't move it to rctP3. Add test
+ //interface-name matches b/w vertices pint12 and pint31
+ Vertex pint12= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint12")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP1/p-interfaces/p-interface/pint12")
+ .next();
+
+ //int-name on pint31 is same as pint12
+ Vertex pint31= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint12")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP3/p-interfaces/p-interface/pint12")
+ .next();
+ //End matching interface-name on pint12 and pint31. Delete pint12. Don't move it to rctP3.
+
+
+ // Plink exists on both matching pints. Delete old pint, old plink, and edge b/w them - add test
+ // Vertex pint23 has physical link connected to pint14
+ Vertex pint14= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint14")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP1/p-interfaces/p-interface/pint14")
+ .next();
+ Vertex pint23= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint3RCTFqdn2")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP2/p-interfaces/p-interface/pint23")
+ .next();
+ Vertex plink1423 = g.addV()
+ .property("aai-node-type", "physical-link")
+ .property("link-name", "rctP1:pint14|rctP2:pint23")
+ .property("aai-uri","/network/physical-links/physical-link/plink1423")
+ .next();
+
+ // Vertex pint24 has physical link connected to pint33 (Plink exists on both old and new p-int, no change)
+ // Vertex pint33 has same interface-name as pint14
+ Vertex pint33= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint14")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pint33/p-interfaces/p-interface/pint14")
+ .next();
+ Vertex pint24= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint24")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP2/p-interfaces/p-interface/pint24")
+ .next();
+ Vertex plink2433 = g.addV()
+ .property("aai-node-type", "physical-link")
+ .property("link-name", "rctP2:pint24|rctP3:pint14")
+ .property("aai-uri","/network/physical-links/physical-link/plinkFqdn2443")
+ .next();
+ // End Plink exists on both matching pints. Delete old pint, old plink, and edge b/w them - add test
+
+ Vertex pint41= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pserver1RCTFqdn4")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserver1RCTFqdn4/p-interfaces/p-interface/pserver1RCTFqdn4")
+ .next();
+
+ Vertex pint51= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pserver1RCTFqdn5")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserver1RCTFqdn4/p-interfaces/p-interface/pserver1RCTFqdn5")
+ .next();
+
+ //Case physical link moves from pint13 on rctP1 to pint32 on rctP3 since latest pserver does not have plink - Add test
+ //Vertex pint13 has plink connected to pint21
+ Vertex pint21= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint21")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP2/p-interfaces/p-interface/pint21")
+ .next();
+ Vertex pint13= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint13")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP1/p-interfaces/p-interface/pint13")
+ .next();
+ Vertex plink1321 = g.addV()
+ .property("aai-node-type", "physical-link")
+ .property("link-name", "rctP1:pint13|rctP2:pint21")
+ .property("aai-uri","/network/physical-links/physical-link/plink1321")
+ .next();
+
+ //int-name on pint32 is same pint13
+ Vertex pint32= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pint13")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP3/p-interfaces/p-interface/pint13")
+ .next();
+
+ edgeSerializer.addTreeEdge(g,rctP1,pint13);
+ edgeSerializer.addTreeEdge(g,rctP2,pint21);
+ edgeSerializer.addTreeEdge(g, rctP3, pint32);
+ edgeSerializer.addEdge(g, plink1321, pint13);
+ edgeSerializer.addEdge(g, plink1321, pint21);
+
+ // End Case physical link moves from pint13 on rctP1 to pint32 on rctP3 since latest pserver does not have plink
+
+
+ edgeSerializer.addTreeEdge(g,rctP1,pint11);
+ edgeSerializer.addTreeEdge(g,rctP1,pint12);
+ edgeSerializer.addTreeEdge(g,rctP3,pint31);
+ edgeSerializer.addTreeEdge(g,rctP3,pint33);
+ edgeSerializer.addTreeEdge(g,rctP4,pint41);
+ edgeSerializer.addTreeEdge(g,rctP5,pint51);
+
+ edgeSerializer.addTreeEdge(g, rctP2, pint23);
+ edgeSerializer.addTreeEdge(g, rctP1, pint14);
+ edgeSerializer.addTreeEdge(g, rctP2, pint24);
+
+
+ edgeSerializer.addEdge(g, plink1423, pint14);
+ edgeSerializer.addEdge(g, plink1423, pint23);
+
+ edgeSerializer.addEdge(g, plink2433, pint24);
+ edgeSerializer.addEdge(g, plink2433, pint33);
+
+ //lag-interfaces
+ //lagint11 does not have a match on rctP3. So, expect this to move to rctP3. Add test
+ Vertex lagint11= g.addV()
+ .property("aai-node-type", "lag-interface")
+ .property("interface-name", "lagint11")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP1/lag-interfaces/lag-interface/lagint11")
+ .next();
+ edgeSerializer.addTreeEdge(g, rctP1, lagint11);
+
+ //lagint12 matches with lagint31 on rctP3
+ Vertex lagint12= g.addV()
+ .property("aai-node-type", "lag-interface")
+ .property("interface-name", "lagint12")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP1/lag-interfaces/lag-interface/lagint12")
+ .next();
+ Vertex lagint31= g.addV()
+ .property("aai-node-type", "lag-interface")
+ .property("interface-name", "lagint12")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP3/lag-interfaces/lag-interface/lagint12")
+ .next();
+ edgeSerializer.addTreeEdge(g, rctP1, lagint12);
+ edgeSerializer.addTreeEdge(g, rctP3, lagint31);
+
+ //Verify manytoOne edge scenario
+ pserverRCTScn6 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserverRCTScn6")
+ .property("source-of-truth","RCT")
+ .property("fqdn","Scn6.pserverRCTScn6")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRCTScn6")
+ .property("resource-version","1")
+ .next();
+
+ zoneScn61 = g.addV().property("aai-node-type", "zone")
+ .property("zone-id", "zone-61")
+ .next();
+
+ pserverRCT1Scn6 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","Scn6.pserverRCT1Scn6")
+ .property("source-of-truth","RCT")
+ .property("fqdn","Scn6.pserverRCT1Scn6")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRCT1Scn6")
+ .property("resource-version","4")
+ .next();
+
+ zoneScn62 = g.addV().property("aai-node-type", "zone")
+ .property("zone-id", "zone-62")
+ .next();
+
+ edgeSerializer.addEdge(g, pserverRCTScn6, zoneScn61);
+ edgeSerializer.addEdge(g, pserverRCT1Scn6, zoneScn62);
+
+ //Verify manyToMany edge scenario
+ Vertex gvnf1 = g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "vnf-1")
+ .next();
+
+ Vertex gvnf2 = g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "vnf-2")
+ .next();
+
+ edgeSerializer.addEdge(g, pserverRCTScn6, gvnf1);
+ edgeSerializer.addEdge(g, pserverRCT1Scn6, gvnf2);
+
+
+ // Empty string first token test
+ Vertex pserver1EmptyFirstToken = g.addV().property("aai-node-type", "pserver")
+ .property("hostname",".pserver1EmptyFirstToken")
+ .property("source-of-truth","RO")
+ .property("fqdn","sameScn1.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/.pserver1EmptyFirstToken")
+ .property("resource-version","1")
+ .next();
+ Vertex pserver2EmptyFirstToken= g.addV().property("aai-node-type", "pserver")
+ .property("hostname",".pserver2EmptyFirstToken.1")
+ .property("source-of-truth","RO")
+ .property("fqdn","sameScn1.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/.pserver2EmptyFirstToken")
+ .property("resource-version","2")
+ .next();
+
+ Vertex pserver1EmptyFirstTokenFqdn = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserver1EmptyFirstTokenFqdn")
+ .property("source-of-truth","RCT")
+ .property("fqdn",".rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserver1EmptyFirstTokenFqdn")
+ .property("resource-version","1")
+ .next();
+ Vertex pserver2EmptyFirstTokenFqdn= g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserver2EmptyFirstTokenFqdn")
+ .property("source-of-truth","RCT")
+ .property("fqdn",".rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserver2EmptyFirstTokenFqdn")
+ .property("resource-version","2")
+ .next();
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+
+ GraphTraversalSource traversal = g;
+ GraphTraversalSource readOnly = tx.traversal(GraphTraversalSource.build().with(ReadOnlyStrategy.instance()));
+ when (spy.tx()).thenReturn(tx);
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ when(adminSpy.getReadOnlyTraversalSource()).thenReturn(readOnly);
+
+ migration = new MigrateSameSourcedRCTROPserverData(spy,loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+ }
+
+ @After
+ public void cleanUp() {
+ tx.tx().rollback();
+ graph.close();
+ }
+
+ @Test
+ public void RCT() throws Exception {
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverNew").in("tosca.relationships.network.BindsTo").has("aai-node-type","p-interface").hasNext());
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverNew/p-interfaces/p-interface/pintOld", pintOld.property("aai-uri").value().toString());
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverNew/p-interfaces/p-interface/pintOld/l-interfaces/l-interface/linterfaceold", lInterfaceold.property("aai-uri").value().toString());
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverNew/p-interfaces/p-interface/pintOld2/l-interfaces/l-interface/linterfaceold2", lInterfaceold2.property("aai-uri").value().toString());
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverNew/p-interfaces/p-interface/pintOld2/sriov-pfs/sriov-pf/sriovPfOld",sriovPfOld.property("aai-uri").value().toString());
+ assertEquals(true, g.V().has("aai-node-type", "sriov-pf").has("pf-pci-id","sriovPfOld").in("org.onap.relationships.inventory.Uses").has("aai-node-type","sriov-vf").hasNext());
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverNew/p-interfaces/p-interface/pintOld2/l-interfaces/l-interface/linterfaceold2/sriov-vfs/sriov-vf/sriovVfOld",sriovVfOld.property("aai-uri").value().toString());
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverNew").out("org.onap.relationships.inventory.LocatedIn").has("aai-node-type","complex").hasNext());
+
+ }
+ @Test
+ public void RO() throws Exception {
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverRo.NewOne.aaaa.ccccccccccc").in("tosca.relationships.network.BindsTo").has("aai-node-type","p-interface").has("interface-name","pintOldRo").hasNext());
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverRo.NewOne.aaaa.ccccccccccc/p-interfaces/p-interface/pintOldRo", pintOldRo.property("aai-uri").value().toString());
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverRo.NewOne.aaaa.ccccccccccc/p-interfaces/p-interface/pintOldRo/l-interfaces/l-interface/linterfaceoldRo", lInterfaceoldRo.property("aai-uri").value().toString());
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverRo.NewOne.aaaa.ccccccccccc").out("org.onap.relationships.inventory.LocatedIn").has("aai-node-type","complex").hasNext());
+// System.out.println("************** SRIOV-PF *************"+g.V().has("aai-node-type","pserver").has("hostname","pserverRo.NewOne.aaaa.ccccccccccc").in("tosca.relationships.network.BindsTo")
+// .has("aai-node-type","p-interface").has("interface-name","pintRo1").in().has("aai-node-type", "sriov-pf").toList().get(0).property("pf-pci-id").value().toString());
+ assertEquals(true, g.V().has("aai-node-type","pserver").has("hostname","pserverRo.NewOne.aaaa.ccccccccccc").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").has("interface-name","pintRo1").in().has("aai-node-type", "sriov-pf").hasNext());
+ //.has("pf-pci-id","sriovpfOldRo1")
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverRo.NewOne.aaaa.ccccccccccc/p-interfaces/p-interface/pintRo1/sriov-pfs/sriov-pf/sriovpfOldRo1",
+ g.V().has("aai-node-type","sriov-pf").has("pf-pci-id","sriovpfOldRo1").toList().get(0).property("aai-uri").value().toString());
+ assertNotEquals("/cloud-infrastructure/pservers/pserver/pserverRo.OldOne.aaaa.bbbbb/p-interfaces/p-interface/pintRo1/sriov-pfs/sriov-pf/sriovpfOldRo1",
+ g.V().has("aai-node-type","sriov-pf").has("pf-pci-id","sriovpfOldRo1").toList().get(0).property("aai-uri").value().toString());
+ }
+
+ @Test
+ public void RCTplinkScenario3() throws Exception {
+ assertEquals(false, g.V().has("aai-node-type", "pserver").has("hostname","pserverNewplink").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").out("tosca.relationships.network.LinksTo").has("aai-node-type","physical-link").has("link-name","pLinkOld").hasNext());
+
+ }
+
+ @Test
+ public void RCTpLinkMoveScn2NameChange() throws Exception {
+ assertEquals("pserver2Scn2:pint1Scn2|pserver3Scn2:pint3Scn2", pLinkMoveScn2.property("link-name").value().toString());
+
+ }
+
+ @Test
+ public void RCTpLinkMoveScn1NameChange() throws Exception {
+ assertEquals("pserver2Scn1:pint1Scn1|pserver3Scn1:pint3Scn1", pLinkMoveScn1.property("link-name").value().toString());
+
+ }
+
+ @Test
+ public void RCTplinkScenario2() throws Exception {
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverNewScn2").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").out("tosca.relationships.network.LinksTo").has("aai-node-type","physical-link").has("link-name","pLinkOldScn2").hasNext());
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverNewScn2/p-interfaces/p-interface/pintOld2Scn2", pintOld2Scn2.property("aai-uri").value().toString());
+
+ }
+
+ @Test
+ public void roSuccessfulMovePlinkScn1() throws Exception {
+ assertEquals("aaaa.cccc.cccc.dddd",g.V().has("aai-node-type","pserver").has("hostname","pserverRo.NewOne.aaaa.ccccccccccc").next().value("fqdn").toString());
+ assertEquals(false, g.V().has("aai-node-type", "pserver").has("pserverRo.OldOne.aaaa.bbbbb").hasNext());
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverRo.NewOne.aaaa.ccccccccccc").in("tosca.relationships.network.BindsTo").has("aai-node-type","p-interface").has("interface-name","pint1ROOld").hasNext());
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverRo.NewOne.aaaa.ccccccccccc/p-interfaces/p-interface/pint1ROOld", pint1ROOld.property("aai-uri").value().toString());
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverRo.NewOne.aaaa.ccccccccccc").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").has("interface-name","pint1ROOld").out("tosca.relationships.network.LinksTo").has("link-name","pLink1ROOld").hasNext());
+ }
+
+ @Test
+ public void roSuccessfulSamePIntScn() throws Exception {
+ assertEquals("aaaa.cccc.cccc.dddd",g.V().has("aai-node-type","pserver").has("hostname","pserverRo.NewOne.aaaa.ccccccccccc").next().value("fqdn").toString());
+ assertEquals(false, g.V().has("aai-node-type", "pserver").has("pserverRo.OldOne.aaaa.bbbbb").hasNext());
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverRo.NewOne.aaaa.ccccccccccc").in("tosca.relationships.network.BindsTo").has("aai-node-type","p-interface").has("interface-name","pint2RO").hasNext());
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverRo.NewOne.aaaa.ccccccccccc/p-interfaces/p-interface/pint2RO", pint2RONew.property("aai-uri").value().toString());
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverRo.NewOne.aaaa.ccccccccccc").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").has("interface-name","pint2RO").out("tosca.relationships.network.LinksTo").has("link-name","pLink2ROOld").hasNext());
+ }
+
+ @Test
+ public void roSuccessfulSamePIntScnPlinkExistsOnBoth() throws Exception {
+ assertEquals("aaaa.cccc.cccc.dddd",g.V().has("aai-node-type","pserver").has("hostname","pserverRo.NewOne.aaaa.ccccccccccc").next().value("fqdn").toString());
+ assertEquals(false, g.V().has("aai-node-type", "pserver").has("pserverRo.OldOne.aaaa.bbbbb").hasNext());
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverRo.NewOne.aaaa.ccccccccccc").in("tosca.relationships.network.BindsTo").has("aai-node-type","p-interface").has("interface-name","pint3RO").hasNext());
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverRo.NewOne.aaaa.ccccccccccc/p-interfaces/p-interface/pint3RO", pint3RONew.property("aai-uri").value().toString());
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverRo.NewOne.aaaa.ccccccccccc").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").has("interface-name","pint3RO").out("tosca.relationships.network.LinksTo").has("link-name","pLink3RONew").hasNext());
+ }
+
+ @Test
+ public void RCThandleNullFqdnSamePints() throws Exception {
+ //1. pint11 from rctP1 moves to rctP3
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","rctP3").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").has("interface-name","pint11").hasNext());
+ assertEquals(false, g.V().has("aai-node-type", "p-interface").has("aai-uri","/cloud-infrastructure/pservers/pserver/rctP1/p-interfaces/p-interface/pint11").hasNext());
+ assertEquals(true, g.V().has("aai-node-type", "p-interface").has("aai-uri","/cloud-infrastructure/pservers/pserver/rctP3/p-interfaces/p-interface/pint11").hasNext());
+
+ //2. pint12 int-name matches with pint31. So, verify that p-int does not move from rctP1 to rctP3
+ assertEquals("rctP3 has only 1 pint with name pint12", new Long(1L), g.V().has("aai-node-type", "pserver").has("hostname","rctP3").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").has("interface-name","pint12").count().next());
+
+ //3. Verify that the p-interface from pserver is not moved to another pserver that has null fqdn
+ assertEquals(false, g.V().has("aai-node-type", "pserver").has("hostname","rctP2").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").has("interface-name","pint11").hasNext());
+
+ //4. If the fqdn is "" within 2 RCT pservers, ignore that case. Don't move the p-int from old resource-version to new resource-version pserver
+ assertEquals(false, g.V().has("aai-node-type", "pserver").has("hostname","rctP5").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").has("interface-name","pint41").hasNext());
+ assertEquals("rctP5 has only 1 p-interface", new Long(1L), g.V().has("aai-node-type", "pserver").has("hostname","rctP5").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").count().next());
+
+ //5. plink is moved from pint3 on pserver fqdn1 to pint2 on pserver fqdn3. Both p-ints have the same interface-name
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","rctP3").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").has("interface-name","pint13").out().has("aai-node-type", "physical-link").hasNext());
+ System.out.println("plink on pint13 is "+ g.V().has("aai-node-type", "pserver").has("hostname","rctP3").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").has("interface-name","pint13").out().has("aai-node-type", "physical-link").next().property("link-name").value().toString());
+
+ assertEquals(true, g.V().has("aai-node-type","physical-link").has("link-name","rctP2:pint21|rctP3:pint13").hasNext());
+
+ //6. plink is not moved from pint4 on pserver fqdn1 to pint3 on pserver fqdn3. Both p-ints have the same interface-name
+ assertEquals(true, g.V().has("aai-node-type","physical-link").has("link-name","rctP2:pint24|rctP3:pint14").hasNext());
+ assertEquals(false, g.V().has("aai-node-type","physical-link").has("link-name","rctP1:pint14|rctP2:pint23").hasNext());
+
+ }
+
+ @Test
+ public void testRCTLagInterfaces() throws Exception {
+ //1. lagint11 from rctP1 moves to rctP3
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","rctP3").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","lag-interface").has("interface-name","lagint11").hasNext());
+ assertEquals(false, g.V().has("aai-node-type", "lag-interface").has("aai-uri","/cloud-infrastructure/pservers/pserver/rctP1/lag-interfaces/lag-interface/lagint11").hasNext());
+ assertEquals(true, g.V().has("aai-node-type", "lag-interface").has("aai-uri","/cloud-infrastructure/pservers/pserver/rctP3/lag-interfaces/lag-interface/lagint11").hasNext());
+
+
+ //2. lagint12 int-name matches with lagint31. So, verify that lag-int does not move from rctP1 to rctP3
+ assertEquals("rctP3 has only 1 lag-interface with name lagint12", new Long(1L), g.V().has("aai-node-type", "pserver").has("hostname","rctP3").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","lag-interface").has("interface-name","lagint12").count().next());
+
+ }
+
+ @Test
+ public void checkRCTPserverHasRelnToOnly1Zone() throws Exception {
+
+ assertEquals("Edge to only 1 Zone exists", new Long(1L), g.V().has("aai-node-type", "pserver").has("hostname","Scn6.pserverRCT1Scn6").out("org.onap.relationships.inventory.LocatedIn")
+ .has("aai-node-type","zone").count().next());
+ assertEquals(true, g.V().has("aai-node-type", "zone").has("zone-id","zone-62").hasNext());
+ //Verify no edge exists from zone61 to lower resource-version RCT pserver
+ assertEquals(false, g.V().has("aai-node-type", "zone").has("zone-id","zone-61").in().has("aai-node-type", "pserver").hasNext());
+ }
+
+ @Test
+ public void checkRCTPserverHasRelnTo2GenericVnfs() throws Exception {
+
+ assertEquals("Edge to 2 generic-vnfs exists", new Long(2L), g.V().has("aai-node-type", "pserver").has("hostname","Scn6.pserverRCT1Scn6").in("tosca.relationships.HostedOn")
+ .has("aai-node-type","generic-vnf").count().next());
+ assertEquals(true, g.V().has("aai-node-type", "generic-vnf").has("vnf-id","vnf-1").out().has("aai-node-type", "pserver").has("hostname", "Scn6.pserverRCT1Scn6").hasNext());
+ //Verify no edge exists from vnf-1 to lower resource-version pserver
+ assertEquals(false, g.V().has("aai-node-type", "generic-vnf").has("vnf-id","vnf-1").out().has("aai-node-type", "pserver").has("hostname", "Scn6.pserverRCTScn6").hasNext());
+ }
+
+ @Test
+ public void roPlinkNewMovesToLongerHostNameROPserver() throws Exception {
+
+ assertEquals(false, g.V().has("aai-node-type", "pserver").has("hostname","pserverRo.NewOne.aaaa.ccccccccccc").in("tosca.relationships.network.BindsTo").has("aai-node-type","p-interface").has("interface-name","pintOldRo1").hasNext());
+ assertEquals(false, g.V().has("aai-node-type", "pserver").has("hostname","pserverRo.OldOne.aaaa.bbbbb").hasNext());
+ assertEquals(false, g.V().has("id", "pintOldRo1").hasNext());
+ //Verify that the physical link moves to the new pserver
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverRo.NewOne.aaaa.ccccccccccc").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").has("interface-name","pintRo1").out().has("link-name","plinkROonOldRo1").hasNext());
+ //Verify complex does not get attached to pserverRO5
+ assertEquals("Complex is related to only 1 pserver", new Long(1L), g.V().has("physical-location-id", "complexOldRO").in("org.onap.relationships.inventory.LocatedIn").count().next());
+ }
+
+ @Test
+ public void ignoreEmptyStringFirstTokenFqdn() throws Exception {
+ List<Vertex> pserverList = g.V().has("aai-node-type", "pserver").has("hostname").toList();
+ pserverList.forEach(v ->System.out.println(v.property("hostname").value().toString()));
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserver1EmptyFirstTokenFqdn").hasNext());
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname",".pserver1EmptyFirstToken").hasNext());
+
+
+ System.out.println(UUID.randomUUID().toString());
+ System.out.println(UUID.randomUUID().toString());
+
+ }
+
+}
diff --git a/src/test/java/org/onap/aai/migration/v14/MigrateSdnaIvlanDataTest.java b/src/test/java/org/onap/aai/migration/v14/MigrateSdnaIvlanDataTest.java
new file mode 100644
index 0000000..c7b11b9
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v14/MigrateSdnaIvlanDataTest.java
@@ -0,0 +1,283 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v14;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraphTransaction;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.aai.AAISetup;
+import org.onap.aai.db.props.AAIProperties;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+public class MigrateSdnaIvlanDataTest extends AAISetup {
+
+ private final String CONFIGURATION_NODE_TYPE = "configuration";
+ private final String EVC_NODE_TYPE = "evc";
+ private final String FORWARDER_NODE_TYPE = "forwarder";
+ private final String FORWRDER_EVC_NODE_TYPE = "forwarder-evc";
+ private final String FORWARDING_PATH_NODE_TYPE = "forwarding-path";
+ private final String LAG_INTERFACE_NODE_TYPE = "lag-interface";
+ private final String P_INTERFACE_NODE_TYPE = "p-interface";
+ private final String PNF_NODE_TYPE = "pnf";
+ private final String SERVICE_INSTANCE_NODE_TYPE = "service-instance";
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private MigrateSdnaIvlanData migration;
+ private GraphTraversalSource g;
+
+ @Before
+ public void setUp() throws Exception {
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources");
+
+ //PNF - pnf1
+ Vertex pnf1 = g.addV()
+ .property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf1")
+ .next();
+
+ //P-INTERFACE - "11111.1"
+ Vertex pInterface1 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "11111.1")
+ .next();
+
+ //LAG-INTERFACE - lag-interface1
+ Vertex lagInterface1 = g.addV()
+ .property("aai-node-type", "lag-interface")
+ .property("interface-name", "lag-interface1")
+ .next();
+
+ //CONFIGURATION - "test/evc/one"
+ Vertex configuration1 = g.addV()
+ .property("aai-node-type", "configuration")
+ .property("configuration-id", "test/evc/one")
+ .next();
+
+ //CONFIGURATION - "test/evc/one-1"
+ Vertex configuration1_1 = g.addV()
+ .property("aai-node-type", "configuration")
+ .property("configuration-id", "test/evc/one-1")
+ .next();
+ //CONFIGURATION - "test/evc/one-2"
+ Vertex configuration1_2 = g.addV()
+ .property("aai-node-type", "configuration")
+ .property("configuration-id", "test/evc/one-2")
+ .next();
+
+ //FORWARDER - "test/evc/one" sequence 1
+ Vertex forwarder1_1 = g.addV()
+ .property("aai-node-type", "forwarder")
+ .property("sequence", 1)
+ .property("forwarder-role", "ingress")
+ .next();
+
+ //FORWARDER - "test/evc/one" sequence 2
+ Vertex forwarder1_2 = g.addV()
+ .property("aai-node-type", "forwarder")
+ .property("sequence", 2)
+ .property("forwarder-role", "ingress")
+ .next();
+
+ //FORWARDING-PATH - "test/evc/one"
+ Vertex forwardingPath1 = g.addV()
+ .property("aai-node-type", "forwarding-path")
+ .property("forwarding-path-id", "test/evc/one")
+ .property("forwarding-path-name", "test/evc/one")
+ .next();
+
+ //EVC - "test/evc/one"
+ Vertex evc = g.addV()
+ .property("aai-node-type", "evc")
+ .property("evc-id", "test/evc/one")
+ .next();
+
+ //FORWARDER-EVC - "test/evc/one-1"
+ Vertex fwdEvc1_1 = g.addV()
+ .property("aai-node-type", "forwarder-evc")
+ .property("forwarder-evc-id", "test/evc/one-1")
+ .next();
+
+ //FORWARDER-EVC - "test/evc/one-2"
+ Vertex fwdEvc1_2 = g.addV()
+ .property("aai-node-type", "forwarder-evc")
+ .property("forwarder-evc-id", "test/evc/one-2")
+ .next();
+
+ //pnf -> p-interface -> forwarder -> configuration -> forwarder-evc
+ //pnf1 -> pInterface1 -> forwarder1_1 -> configuration1_1 -> fwdEvc1_1
+ edgeSerializer.addTreeEdge(g, pnf1, pInterface1);
+ edgeSerializer.addEdge(g, pInterface1,forwarder1_1);
+ edgeSerializer.addEdge(g, forwarder1_1, configuration1_1);
+
+ edgeSerializer.addEdge(g, forwardingPath1, configuration1);
+ edgeSerializer.addTreeEdge(g, forwarder1_1, forwardingPath1);
+ edgeSerializer.addTreeEdge(g, forwarder1_2, forwardingPath1);
+
+ edgeSerializer.addTreeEdge(g, configuration1_1, fwdEvc1_1);
+
+ //pnf -> lag-interface -> forwarder -> configuration -> forwarder-evc
+ //pnf1 -> lagInterface1 -> forwarder1_2 -> configuration1_2 -> fwdEvc1_2
+ edgeSerializer.addTreeEdge(g, pnf1, lagInterface1);
+ edgeSerializer.addEdge(g, forwarder1_2, configuration1_2);
+ edgeSerializer.addEdge(g, lagInterface1, forwarder1_2);
+ edgeSerializer.addTreeEdge(g, configuration1_2, fwdEvc1_2);
+
+
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+
+ GraphTraversalSource traversal = g;
+ GraphTraversalSource readOnly = tx.traversal(GraphTraversalSource.build().with(ReadOnlyStrategy.instance()));
+ when (spy.tx()).thenReturn(tx);
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ when(adminSpy.getReadOnlyTraversalSource()).thenReturn(readOnly);
+
+ migration = new MigrateSdnaIvlanData(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+
+ }
+
+ @Test
+ public void testSdnaIvlanMigration() {
+
+ assertTrue("Value of node-type forwarder-evc, forwarder-evc-id of test/evc/one-1 has ben updated with the ivlan property value of 111 ",
+ g.V()
+ .has(AAIProperties.NODE_TYPE, PNF_NODE_TYPE).has("pnf-name", "pnf1")
+ .in("tosca.relationships.network.BindsTo")
+ .has(AAIProperties.NODE_TYPE, P_INTERFACE_NODE_TYPE).has("interface-name", "11111.1")
+ .in("org.onap.relationships.inventory.ForwardsTo")
+ .where(__.out("org.onap.relationships.inventory.BelongsTo").has("forwarding-path-id", "test/evc/one"))
+ .out("org.onap.relationships.inventory.Uses")
+ .in("org.onap.relationships.inventory.BelongsTo")
+ .has("ivlan", "111").hasNext());
+
+ assertTrue("Value of node-type forwarder-evc, forwarder-evc-id of test/evc/one-2 has ben updated with the ivlan property value of 222 ",
+ g.V()
+ .has(AAIProperties.NODE_TYPE, PNF_NODE_TYPE).has("pnf-name", "pnf1")
+ .in("tosca.relationships.network.BindsTo")
+ .has(AAIProperties.NODE_TYPE, LAG_INTERFACE_NODE_TYPE).has("interface-name", "lag-interface1")
+ .in("org.onap.relationships.inventory.ForwardsTo")
+ .where(__.out("org.onap.relationships.inventory.BelongsTo").has("forwarding-path-id", "test/evc/one"))
+ .out("org.onap.relationships.inventory.Uses")
+ .in("org.onap.relationships.inventory.BelongsTo")
+ .has("ivlan", "222").hasNext());
+
+ assertTrue("Value of node-type P-INTERFACE with an interface-name of l11111.2 does not exist in Graph. Ivlan not Updated ",
+ !g.V()
+ .has(AAIProperties.NODE_TYPE, PNF_NODE_TYPE).has("pnf-name", "pnf1")
+ .in("tosca.relationships.network.BindsTo")
+ .has(AAIProperties.NODE_TYPE, P_INTERFACE_NODE_TYPE).has("interface-name", "11111.2")
+ .in("org.onap.relationships.inventory.ForwardsTo")
+ .where(__.out("org.onap.relationships.inventory.BelongsTo").has("forwarding-path-id", "test/evc/one"))
+ .out("org.onap.relationships.inventory.Uses")
+ .in("org.onap.relationships.inventory.BelongsTo")
+ .has("ivlan", "333").hasNext());
+
+ assertTrue("Value of node-type LAG-INTERFACE with an interface-name of lag-interface2 does not exist in Graph. Ivlan not Updated ",
+ !g.V()
+ .has(AAIProperties.NODE_TYPE, PNF_NODE_TYPE).has("pnf-name", "pnf1")
+ .in("tosca.relationships.network.BindsTo")
+ .has(AAIProperties.NODE_TYPE, LAG_INTERFACE_NODE_TYPE).has("interface-name", "lag-interface2")
+ .in("org.onap.relationships.inventory.ForwardsTo")
+ .where(__.out("org.onap.relationships.inventory.BelongsTo").has("forwarding-path-id", "test/evc/one"))
+ .out("org.onap.relationships.inventory.Uses")
+ .in("org.onap.relationships.inventory.BelongsTo")
+ .has("ivlan", "444").hasNext());
+
+
+ assertTrue("Value of node-type P-INTERFACE with an interface-name of 11111.3 and evc of test/evc/one_2 does not exist in Graph. Ivlan not Updated ",
+ !g.V()
+ .has(AAIProperties.NODE_TYPE, PNF_NODE_TYPE).has("pnf-name", "pnf1")
+ .in("tosca.relationships.network.BindsTo")
+ .has(AAIProperties.NODE_TYPE, P_INTERFACE_NODE_TYPE).has("interface-name", "11111.3")
+ .in("org.onap.relationships.inventory.ForwardsTo")
+ .where(__.out("org.onap.relationships.inventory.BelongsTo").has("forwarding-path-id", "test/evc/one_2"))
+ .out("org.onap.relationships.inventory.Uses")
+ .in("org.onap.relationships.inventory.BelongsTo")
+ .has("ivlan", "555").hasNext());
+
+ assertTrue("Value of node-type LAG-INTERFACE with an interface-name of lag-interface3 and evc of test/evc/one_2 does not exist in Graph. Ivlan not Updated ",
+ !g.V()
+ .has(AAIProperties.NODE_TYPE, PNF_NODE_TYPE).has("pnf-name", "pnf1")
+ .in("tosca.relationships.network.BindsTo")
+ .has(AAIProperties.NODE_TYPE, LAG_INTERFACE_NODE_TYPE).has("interface-name", "lag-interface3")
+ .in("org.onap.relationships.inventory.ForwardsTo")
+ .where(__.out("org.onap.relationships.inventory.BelongsTo").has("forwarding-path-id", "test/evc/one_2"))
+ .out("org.onap.relationships.inventory.Uses")
+ .in("org.onap.relationships.inventory.BelongsTo")
+ .has("ivlan", "666").hasNext());
+
+ assertTrue("Value of node-type PNF with an pnf-name of pnf2 does not exist in Graph. Ivlan not Updated ",
+ !g.V()
+ .has(AAIProperties.NODE_TYPE, PNF_NODE_TYPE).has("pnf-name", "pnf2")
+ .in("tosca.relationships.network.BindsTo")
+ .has(AAIProperties.NODE_TYPE, P_INTERFACE_NODE_TYPE).has("interface-name", "22222.2")
+ .in("org.onap.relationships.inventory.ForwardsTo")
+ .where(__.out("org.onap.relationships.inventory.BelongsTo").has("forwarding-path-id", "test/evc/two"))
+ .out("org.onap.relationships.inventory.Uses")
+ .in("org.onap.relationships.inventory.BelongsTo")
+ .has("ivlan", "777").hasNext());
+
+ assertTrue("Value of node-type PNF with an pnf-name of pnf2 does not exist in Graph. Ivlan not Updated ",
+ !g.V()
+ .has(AAIProperties.NODE_TYPE, PNF_NODE_TYPE).has("pnf-name", "pnf2")
+ .in("tosca.relationships.network.BindsTo")
+ .has(AAIProperties.NODE_TYPE, LAG_INTERFACE_NODE_TYPE).has("interface-name", "lag-interface2")
+ .in("org.onap.relationships.inventory.ForwardsTo")
+ .where(__.out("org.onap.relationships.inventory.BelongsTo").has("forwarding-path-id", "test/evc/two"))
+ .out("org.onap.relationships.inventory.Uses")
+ .in("org.onap.relationships.inventory.BelongsTo")
+ .has("ivlan", "888").hasNext());
+
+ }
+
+}
diff --git a/src/test/java/org/onap/aai/migration/v14/PserverDedupWithDifferentSourcesOfTruthTest.java b/src/test/java/org/onap/aai/migration/v14/PserverDedupWithDifferentSourcesOfTruthTest.java
new file mode 100644
index 0000000..a541eca
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v14/PserverDedupWithDifferentSourcesOfTruthTest.java
@@ -0,0 +1,496 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v14;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.List;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.*;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphTransaction;
+
+public class PserverDedupWithDifferentSourcesOfTruthTest extends AAISetup{
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+
+ Loader loader;
+ TransactionalGraphEngine dbEngine;
+ JanusGraph graph;
+ PserverDedupWithDifferentSourcesOfTruth migration;
+ JanusGraphTransaction tx;
+ GraphTraversalSource g;
+
+//scn1
+ Vertex pIntRo;
+ Vertex lInterfaceRo;
+ Vertex pserverRCT;
+ Vertex complexRO;
+//scn2
+
+ Vertex pserverRCTScn2;
+ Vertex pIntRoScn2;
+ Vertex lInterfaceRoScn2;
+ Vertex complexROScn2;
+ Vertex lInterfaceRctScn2;
+ Vertex pIntRctScn2;
+ Vertex complexRctScn2;
+
+ //physical link
+ Vertex pintPlinkScn1;
+ Vertex samePintScn4RO;
+ Vertex samePintScn4RCT;
+ Vertex pserverRCTPlinkScn4;
+
+ //Scn3
+ Vertex pserverRCTScn3;
+ Vertex complexScn3;
+ Vertex pserverROScn3;
+
+ //ManyToOne edge scenario
+ Vertex pserverRCTScn6;
+ Vertex pserverROScn6;
+ Vertex zoneScn61;
+ Vertex zoneScn62;
+
+ @Before
+ public void setUp() throws Exception {
+ graph = JanusGraphFactory.build().set("storage.backend","inmemory").open();
+ tx = graph.newTransaction();
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType,schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+//Scn1 empty RCT move everything over
+ pserverRCT = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserverRCT")
+ .property("source-of-truth","RCT")
+ .property("fqdn","tttt.bbbb.cccc.dddd")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRCT")
+ .property("resource-version","1")
+ .next();
+
+ Vertex pserverRO = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","tttt.RoHostname")
+ .property("source-of-truth","RO")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/tttt.RoHostname")
+ .property("resource-version","2")
+ .next();
+ pIntRo = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pIntRo")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/tttt.RoHostname/p-interfaces/p-interface/pIntRo")
+ .next();
+ lInterfaceRo = g.addV().property("aai-node-type", "l-interface")
+ .property("interface-name", "lInterfaceRo")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/tttt.RoHostname/p-interfaces/p-interface/pIntRo/l-interfaces/l-interface/lInterfaceRo")
+ .next();
+ complexRO = g.addV().property("aai-node-type", "complex")
+ .property("physical-location-id","complexRO")
+ .property("aai-uri","/cloud-infrastructure/complexes/complex/complexRO")
+ .next();
+
+ // physical-link tests
+ //1. p-int does not exist on RCT, p-int and p-link moves from RO to RCT
+ pintPlinkScn1= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pintPlinkScn1")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/tttt.RoHostname/p-interfaces/p-interface/pintPlinkScn1")
+ .next();
+
+ Vertex pLinkScn1 = g.addV().property("aai-node-type", "physical-link")
+ .property("link-name", "pLinkScn1")
+ .property("service-provider-bandwidth-up-value", 0)
+ .property("service-provider-bandwidth-up-units", "empty")
+ .property("service-provider-bandwidth-down-value", 0)
+ .property("service-provider-bandwidth-down-units", "empty")
+ .property("aai-uri","/network/physical-links/physical-link/pLinkScn1")
+ .next();
+ edgeSerializer.addTreeEdge(g,pserverRO,pintPlinkScn1);
+ edgeSerializer.addEdge(g,pintPlinkScn1,pLinkScn1);
+
+ //2. p-int matches on RCT, p-int and p-link don't move from RO to RCT
+
+ Vertex pserverROSPlinkScn4 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","Scn4.pserverROSPlinkScn4")
+ .property("source-of-truth","RO")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/Scn4.pserverROSPlinkScn4")
+ .property("resource-version","4")
+ .next();
+
+ pserverRCTPlinkScn4 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserverRCTPlinkScn4")
+ .property("source-of-truth","RCT")
+ .property("fqdn","Scn4.pserverRCTPlinkScn4")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRCTPlinkScn4")
+ .property("resource-version","3")
+ .next();
+
+ samePintScn4RO= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pintPlinkScn4")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/Scn4.pserverROSPlinkScn4/p-interfaces/p-interface/pintPlinkScn4")
+ .next();
+
+ Vertex plinkScn2 = g.addV().property("aai-node-type", "physical-link")
+ .property("link-name", "plinkScn2")
+ .property("service-provider-bandwidth-up-value", 0)
+ .property("service-provider-bandwidth-up-units", "empty")
+ .property("service-provider-bandwidth-down-value", 0)
+ .property("service-provider-bandwidth-down-units", "empty")
+ .property("aai-uri","/network/physical-links/physical-link/pLinkScn2")
+ .next();
+
+ samePintScn4RCT= g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pintPlinkScn4")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRCTPlinkScn4/p-interfaces/p-interface/pintPlinkScn4")
+ .next();
+
+ edgeSerializer.addTreeEdge(g,pserverROSPlinkScn4,samePintScn4RO);
+ edgeSerializer.addEdge(g,samePintScn4RO,plinkScn2);
+ edgeSerializer.addTreeEdge(g,pserverRCTPlinkScn4,samePintScn4RCT);
+ //End physical-links tests
+
+//Scn2 RCT has children already
+
+ pserverRCTScn2 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserverRCTScn2")
+ .property("source-of-truth","RCT")
+ .property("fqdn","Scn2.pserverRCTScn2")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRCTScn2")
+ .property("resource-version","3")
+ .next();
+ pIntRctScn2 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pIntRctScn2")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRCTScn2/p-interfaces/p-interface/pIntRctScn2")
+ .next();
+ lInterfaceRctScn2 = g.addV().property("aai-node-type", "l-interface")
+ .property("interface-name", "lInterfaceRctScn2")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRCTScn2/p-interfaces/p-interface/pIntRctScn2/l-interfaces/l-interface/lInterfaceRctScn2")
+ .next();
+ complexRctScn2 = g.addV().property("aai-node-type", "complex")
+ .property("physical-location-id","complexRctScn2")
+ .property("aai-uri","/cloud-infrastructure/complexes/complex/complexRctScn2")
+ .next();
+ Vertex pserverROScn2 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","Scn2.pserverROScn2")
+ .property("source-of-truth","RO")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/Scn2.pserverROScn2")
+ .property("resource-version","4")
+ .next();
+ pIntRoScn2 = g.addV()
+ .property("aai-node-type", "p-interface")
+ .property("interface-name", "pIntRoScn2")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/Scn2.pserverROScn2/p-interfaces/p-interface/pIntRoScn2")
+ .next();
+ lInterfaceRoScn2 = g.addV().property("aai-node-type", "l-interface")
+ .property("interface-name", "lInterfaceRoScn2")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/Scn2.pserverROScn2/p-interfaces/p-interface/pIntRoScn2/l-interfaces/l-interface/lInterfaceRoScn2")
+ .next();
+ complexROScn2 = g.addV().property("aai-node-type", "complex")
+ .property("physical-location-id","complexROScn2")
+ .property("aai-uri","/cloud-infrastructure/complexes/complex/complexROScn2")
+ .next();
+
+
+ //Scn1
+ edgeSerializer.addTreeEdge(g,pserverRO,pIntRo);
+ edgeSerializer.addTreeEdge(g,pIntRo,lInterfaceRo);
+ edgeSerializer.addEdge(g,pserverRO,complexRO);
+
+
+
+ //Scn2
+ edgeSerializer.addTreeEdge(g,pserverRCTScn2,pIntRctScn2);
+ edgeSerializer.addTreeEdge(g,pIntRctScn2,lInterfaceRctScn2);
+ edgeSerializer.addEdge(g,pserverRCTScn2,complexRctScn2);
+ edgeSerializer.addTreeEdge(g,pserverROScn2,pIntRoScn2);
+ edgeSerializer.addTreeEdge(g,pIntRoScn2,lInterfaceRoScn2);
+ edgeSerializer.addEdge(g,pserverROScn2,complexROScn2);
+
+ //Scn3
+ pserverRCTScn3 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserverRCTScn3")
+ .property("source-of-truth","RCT")
+ .property("fqdn","Scn3.pserverRCTScn3")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRCTScn3")
+ .property("resource-version","3")
+ .next();
+
+ complexScn3 = g.addV().property("aai-node-type", "complex")
+ .property("physical-location-id","complexScn3")
+ .property("aai-uri","/cloud-infrastructure/complexes/complex/complexScn3")
+ .next();
+
+ pserverROScn3 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","Scn3.pserverROScn3")
+ .property("source-of-truth","RO")
+ .property("fqdn","Scn2.pserverRCTScn2")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/Scn3.pserverROScn3")
+ .property("resource-version","4")
+ .next();
+
+ edgeSerializer.addEdge(g, pserverRCTScn3, complexScn3);
+ edgeSerializer.addEdge(g, pserverROScn3, complexScn3);
+
+ //Verify manytoOne edge scenario
+ pserverRCTScn6 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserverRCTScn6")
+ .property("source-of-truth","RCT")
+ .property("fqdn","Scn6.pserverRCTScn6")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserverRCTScn6")
+ .property("resource-version","1")
+ .next();
+
+ zoneScn61 = g.addV().property("aai-node-type", "zone")
+ .property("zone-id", "zone-61")
+ .property("aai-uri","/network/zones/zone/zone-61")
+ .next();
+
+ pserverROScn6 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","Scn6.pserverROScn6")
+ .property("source-of-truth","RO")
+ .property("fqdn","Scn6.pserverRCTScn6")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/Scn6.pserverROScn6")
+ .property("resource-version","4")
+ .next();
+
+ zoneScn62 = g.addV().property("aai-node-type", "zone")
+ .property("zone-id", "zone-62")
+ .property("aai-uri","/network/zones/zone/zone-62")
+ .next();
+
+ edgeSerializer.addEdge(g, pserverRCTScn6, zoneScn61);
+ edgeSerializer.addEdge(g, pserverROScn6, zoneScn62);
+
+ //Verify manyToMany edge scenario
+ Vertex gvnf1 = g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "vnf-1")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/Scn6.pserverROScn6")
+ .next();
+
+ Vertex gvnf2 = g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "vnf-2")
+ .property("aai-uri","/network/generic-vnfs/generic-vnf/vnf-2")
+ .next();
+
+ edgeSerializer.addEdge(g, pserverRCTScn6, gvnf1);
+ edgeSerializer.addEdge(g, pserverROScn6, gvnf2);
+
+ // Verify empty string scenario
+ Vertex pserver1EmptyFirstToken = g.addV().property("aai-node-type", "pserver")
+ .property("hostname",".pserver1EmptyFirstToken")
+ .property("source-of-truth","RO")
+ .property("fqdn","sameScn1.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/.pserver1EmptyFirstToken")
+ .property("resource-version","1")
+ .next();
+
+ Vertex pserver1EmptyFirstTokenFqdn = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserver1EmptyFirstTokenFqdn")
+ .property("source-of-truth","RCT")
+ .property("fqdn",".rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserver1EmptyFirstTokenFqdn")
+ .property("resource-version","1")
+ .next();
+
+ //lag-interfaces
+
+ Vertex roP1 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","pserver.ro")
+ .property("source-of-truth","RO")
+ .property("fqdn","pserver.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/pserver.ro")
+ .property("resource-version","1")
+ .next();
+
+ Vertex rctP1 = g.addV().property("aai-node-type", "pserver")
+ .property("hostname","rctP1")
+ .property("source-of-truth","RCT")
+ .property("fqdn","pserver.rrrr.tttt.yyyy")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP1")
+ .property("resource-version","3")
+ .next();
+
+ //lagint11 does not have a match on rctP1. So, expect this to move to rctP1. Add test
+ Vertex lagint11= g.addV()
+ .property("aai-node-type", "lag-interface")
+ .property("interface-name", "lagint11")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/roP1/lag-interfaces/lag-interface/lagint11")
+ .next();
+ edgeSerializer.addTreeEdge(g, roP1, lagint11);
+
+ //lagint12 matches with lagint31 on rctP3
+ Vertex lagint12= g.addV()
+ .property("aai-node-type", "lag-interface")
+ .property("interface-name", "lagint12")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/roP1/lag-interfaces/lag-interface/lagint12")
+ .next();
+ Vertex lagint31= g.addV()
+ .property("aai-node-type", "lag-interface")
+ .property("interface-name", "lagint12")
+ .property("aai-uri","/cloud-infrastructure/pservers/pserver/rctP3/lag-interfaces/lag-interface/lagint12")
+ .next();
+ edgeSerializer.addTreeEdge(g, roP1, lagint12);
+ edgeSerializer.addTreeEdge(g, rctP1, lagint31);
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+
+ GraphTraversalSource traversal = g;
+ GraphTraversalSource readOnly = tx.traversal(GraphTraversalSource.build().with(ReadOnlyStrategy.instance()));
+ when (spy.tx()).thenReturn(tx);
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ when(adminSpy.getReadOnlyTraversalSource()).thenReturn(readOnly);
+
+ migration = new PserverDedupWithDifferentSourcesOfTruth(spy,loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+ }
+
+ @After
+ public void cleanUp() {
+ tx.tx().rollback();
+ graph.close();
+ }
+
+ @Test
+ public void rctSuccessfulMoveScn1() throws Exception {
+
+ assertEquals("tttt.RoHostname",pserverRCT.property("fqdn").value().toString());
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverRCT").in("tosca.relationships.network.BindsTo").has("aai-node-type","p-interface").hasNext());
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverRCT/p-interfaces/p-interface/pIntRo", pIntRo.property("aai-uri").value().toString());
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverRCT/p-interfaces/p-interface/pIntRo/l-interfaces/l-interface/lInterfaceRo", lInterfaceRo.property("aai-uri").value().toString());
+ assertEquals(true,pserverRCT.property("pserver-id").isPresent());
+ }
+
+ @Test
+ public void rctSuccessfulMovePlink() throws Exception {
+
+ assertEquals("tttt.RoHostname",pserverRCT.property("fqdn").value().toString());
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverRCT").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").has("interface-name","pintPlinkScn1").hasNext());
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverRCT/p-interfaces/p-interface/pintPlinkScn1", pintPlinkScn1.property("aai-uri").value().toString());
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverRCT").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").has("interface-name","pintPlinkScn1").out("tosca.relationships.network.LinksTo").has("link-name","pLinkScn1").hasNext());
+ }
+
+ @Test
+ public void rctNoChangeSamePIntScenario() throws Exception {
+
+ assertEquals("Scn4.pserverROSPlinkScn4",pserverRCTPlinkScn4.property("fqdn").value().toString());
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverRCTPlinkScn4").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").has("interface-name","pintPlinkScn4").hasNext());
+ assertEquals("only 1 p-int is present on RCT pserver", new Long(1L), g.V().has("aai-node-type", "pserver").has("hostname","pserverRCTPlinkScn4").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").has("interface-name","pintPlinkScn4").count().next());
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverRCTPlinkScn4/p-interfaces/p-interface/pintPlinkScn4", samePintScn4RCT.property("aai-uri").value().toString());
+ //plink is not moved from RO to RCT when p-int matches
+ assertEquals(false, g.V().has("aai-node-type", "pserver").has("hostname","pserverRCT").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","p-interface").has("interface-name","pintPlinkScn4").out("tosca.relationships.network.LinksTo").hasNext());
+ assertEquals(false, g.V().has("aai-node-type", "pserver").has("hostname","pserverROPlinkScn4").hasNext());
+ //Verify that no orphan nodes are present in the graph
+ assertEquals(false, g.V().has("aai-node-type","p-interface").has("interface-name","pintPlinkScn4").out("tosca.relationships.network.LinksTo").has("link-name","pLinkScn2").hasNext());
+ assertEquals(false, g.V().has("aai-node-type","physical-link").has("link-name","pLinkScn2").hasNext());
+ }
+
+ @Test
+ public void rctSuccessfulMoveScn2() throws Exception {
+
+ assertEquals("Scn2.pserverROScn2",pserverRCTScn2.property("fqdn").value().toString());
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverRCTScn2").in("tosca.relationships.network.BindsTo").has("aai-node-type","p-interface").hasNext());
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverRCTScn2/p-interfaces/p-interface/pIntRoScn2", pIntRoScn2.property("aai-uri").value().toString());
+ assertEquals("/cloud-infrastructure/pservers/pserver/pserverRCTScn2/p-interfaces/p-interface/pIntRoScn2/l-interfaces/l-interface/lInterfaceRoScn2", lInterfaceRoScn2.property("aai-uri").value().toString());
+ assertEquals(true,pserverRCTScn2.property("pserver-id").isPresent());
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserverRCTScn2").out("org.onap.relationships.inventory.LocatedIn")
+ .has("aai-node-type","complex").has("physical-location-id","complexRctScn2").hasNext());
+ }
+
+ @Test
+ public void checkRCTPserverHasRelnToOnly1Complex() throws Exception {
+
+ assertEquals("Edge to only 1 complex exists", new Long(1L), g.V().has("aai-node-type", "pserver").has("hostname","pserverRCTScn3").out("org.onap.relationships.inventory.LocatedIn")
+ .has("aai-node-type","complex").count().next());
+ }
+
+ @Test
+ public void checkRCTPserverHasRelnToOnly1Zone() throws Exception {
+
+ assertEquals("Edge to only 1 Zone exists", new Long(1L), g.V().has("aai-node-type", "pserver").has("hostname","pserverRCTScn6").out("org.onap.relationships.inventory.LocatedIn")
+ .has("aai-node-type","zone").count().next());
+ assertEquals(true, g.V().has("aai-node-type", "zone").has("zone-id","zone-62").hasNext());
+ //Verify no edge exists from zone62 to RO pserver
+ assertEquals(false, g.V().has("aai-node-type", "zone").has("zone-id","zone-62").in().has("aai-node-type", "pserver").hasNext());
+
+ }
+
+ @Test
+ public void checkRCTPserverHasRelnTo2GenericVnfs() throws Exception {
+
+ assertEquals("Edge to 2 generic-vnfs exists", new Long(2L), g.V().has("aai-node-type", "pserver").has("hostname","pserverRCTScn6").in("tosca.relationships.HostedOn")
+ .has("aai-node-type","generic-vnf").count().next());
+ assertEquals(true, g.V().has("aai-node-type", "generic-vnf").has("vnf-id","vnf-2").out().has("aai-node-type", "pserver").has("hostname", "pserverRCTScn6").hasNext());
+ //Verify no edge exists from zone62 to RO pserver
+ assertEquals(false, g.V().has("aai-node-type", "generic-vnf").has("vnf-id","vnf-2").out().has("aai-node-type", "pserver").has("hostname", "pserverROScn6").hasNext());
+ }
+
+ @Test
+ public void ignoreEmptyStringFirstTokenFqdn() throws Exception {
+// List<Vertex> pserverList = g.V().has("aai-node-type", "pserver").has("hostname").toList();
+// pserverList.forEach(v ->System.out.println(v.property("hostname").value().toString()));
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","pserver1EmptyFirstTokenFqdn").hasNext());
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname",".pserver1EmptyFirstToken").hasNext());
+
+ }
+
+ @Test
+ public void testLagInterfaces() throws Exception {
+ //1. lagint11 from roP1 moves to rctP1
+ assertEquals(true, g.V().has("aai-node-type", "pserver").has("hostname","rctP1").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","lag-interface").has("interface-name","lagint11").hasNext());
+ assertEquals(false, g.V().has("aai-node-type", "lag-interface").has("aai-uri","/cloud-infrastructure/pservers/pserver/pserver.ro/lag-interfaces/lag-interface/lagint11").hasNext());
+ assertEquals(true, g.V().has("aai-node-type", "lag-interface").has("aai-uri","/cloud-infrastructure/pservers/pserver/rctP1/lag-interfaces/lag-interface/lagint11").hasNext());
+
+
+ //2. lagint12 int-name matches with lagint31. So, verify that lag-int does not move from rctP1 to rctP3
+ assertEquals("rctP1 has only 1 lag-interface with name lagint12", new Long(1L), g.V().has("aai-node-type", "pserver").has("hostname","rctP1").in("tosca.relationships.network.BindsTo")
+ .has("aai-node-type","lag-interface").has("interface-name","lagint12").count().next());
+
+ }
+
+}
diff --git a/src/test/java/org/onap/aai/migration/v15/MigrateBooleanDefaultsToFalseTest.java b/src/test/java/org/onap/aai/migration/v15/MigrateBooleanDefaultsToFalseTest.java
new file mode 100644
index 0000000..1474ca1
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v15/MigrateBooleanDefaultsToFalseTest.java
@@ -0,0 +1,385 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v15;
+
+import org.onap.aai.AAISetup;
+import org.onap.aai.edges.EdgeIngestor;
+import org.onap.aai.introspection.LoaderFactory;
+import org.onap.aai.serialization.db.EdgeSerializer;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraphTransaction;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.migration.Status;
+import org.onap.aai.migration.v15.MigrateBooleanDefaultsToFalse;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.Optional;
+
+import static org.junit.Assert.assertTrue;
+
+public class MigrateBooleanDefaultsToFalseTest extends AAISetup {
+
+ public static class BooleanDefaultMigrator extends MigrateBooleanDefaultsToFalse {
+ public BooleanDefaultMigrator(TransactionalGraphEngine engine, LoaderFactory loaderFactory, EdgeIngestor edgeIngestor, EdgeSerializer edgeSerializer, SchemaVersions schemaVersions){
+ super(engine, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ }
+ @Override
+ public Status getStatus() {
+ return Status.SUCCESS;
+ }
+ @Override
+ public Optional<String[]> getAffectedNodeTypes() {
+ return Optional.of(new String[]{VNF_NODE_TYPE,VSERVER_NODE_TYPE,VNFC_NODE_TYPE,L3NETWORK_NODE_TYPE,SUBNET_NODE_TYPE,LINTERFACE_NODE_TYPE,VFMODULE_NODE_TYPE});
+ }
+ @Override
+ public String getMigrationName() {
+ return "MockBooleanDefaultMigrator";
+ }
+ }
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private BooleanDefaultMigrator migration;
+ private GraphTraversalSource g;
+
+ @Before
+ public void setup() throws Exception{
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+ //generic-vnf
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf0")
+ .next();
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf1")
+ .property("is-closed-loop-disabled", "")
+ .next();
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf2")
+ .property("is-closed-loop-disabled", true)
+ .next();
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf3")
+ .property("is-closed-loop-disabled", false)
+ .next();
+ //vnfc
+ g.addV().property("aai-node-type", "vnfc")
+ .property("vnfc-name", "vnfc0")
+ .next();
+ g.addV().property("aai-node-type", "vnfc")
+ .property("vnfc-name", "vnfc1")
+ .property("is-closed-loop-disabled", "")
+ .next();
+ g.addV().property("aai-node-type", "vnfc")
+ .property("vnfc-name", "vnfc2")
+ .property("is-closed-loop-disabled", true)
+ .next();
+ g.addV().property("aai-node-type", "vnfc")
+ .property("vnfc-name", "vnfc3")
+ .property("is-closed-loop-disabled", false)
+ .next();
+ //vserver
+ g.addV().property("aai-node-type", "vserver")
+ .property("vserver-id", "vserver0")
+ .next();
+ g.addV().property("aai-node-type", "vserver")
+ .property("vserver-id", "vserver1")
+ .property("is-closed-loop-disabled", "")
+ .next();
+ g.addV().property("aai-node-type", "vserver")
+ .property("vserver-id", "vserver2")
+ .property("is-closed-loop-disabled", true)
+ .next();
+ g.addV().property("aai-node-type", "vserver")
+ .property("vserver-id", "vserver3")
+ .property("is-closed-loop-disabled", false)
+ .next();
+ //l3-network
+ g.addV().property("aai-node-type", "l3-network")
+ .property("network-id", "l3-network0")
+ .property("network-name", "l3-network-name0")
+ .next();
+ g.addV().property("aai-node-type", "l3-network")
+ .property("network-id", "l3-network1")
+ .property("network-name", "l3-network-name1")
+ .property("is-bound-to-vpn", "")
+ .property("is-provider-network", "")
+ .property("is-shared-network", "")
+ .property("is-external-network", "")
+ .next();
+ g.addV().property("aai-node-type", "l3-network")
+ .property("network-id", "l3-network2")
+ .property("network-name", "l3-network-name2")
+ .property("is-bound-to-vpn", true)
+ .property("is-provider-network", true)
+ .property("is-shared-network", true)
+ .property("is-external-network", true)
+ .next();
+ g.addV().property("aai-node-type", "l3-network")
+ .property("network-id", "l3-network3")
+ .property("network-name", "l3-network-name3")
+ .property("is-bound-to-vpn", false)
+ .property("is-provider-network", false)
+ .property("is-shared-network", false)
+ .property("is-external-network", false)
+ .next();
+ //subnet
+ g.addV().property("aai-node-type", "subnet")
+ .property("subnet-id", "subnet0")
+ .next();
+ g.addV().property("aai-node-type", "subnet")
+ .property("subnet-id", "subnet1")
+ .property("dhcp-enabled", "")
+ .next();
+ g.addV().property("aai-node-type", "subnet")
+ .property("subnet-id", "subnet2")
+ .property("dhcp-enabled", true)
+ .next();
+ g.addV().property("aai-node-type", "subnet")
+ .property("subnet-id", "subnet3")
+ .property("dhcp-enabled", false)
+ .next();
+ //l-interface
+ g.addV().property("aai-node-type", "l-interface")
+ .property("interface-name", "l-interface0")
+ .property("in-maint", false)
+ .next();
+ g.addV().property("aai-node-type", "l-interface")
+ .property("interface-name", "l-interface1")
+ .property("in-maint", false)
+ .property("is-port-mirrored", "")
+ .property("is-ip-unnumbered", "")
+ .next();
+ g.addV().property("aai-node-type", "l-interface")
+ .property("interface-name", "l-interface2")
+ .property("in-maint", false)
+ .property("is-port-mirrored", true)
+ .property("is-ip-unnumbered", true)
+ .next();
+ g.addV().property("aai-node-type", "l-interface")
+ .property("interface-name", "l-interface3")
+ .property("in-maint", false)
+ .property("is-port-mirrored", false)
+ .property("is-ip-unnumbered", false)
+ .next();
+ //vf-module
+ g.addV().property("aai-node-type", "vf-module")
+ .property("vf-module-id", "vf-module0")
+ .next();
+ g.addV().property("aai-node-type", "vf-module")
+ .property("vf-module-id", "vf-module1")
+ .property("is-base-vf-module", "")
+ .next();
+ g.addV().property("aai-node-type", "vf-module")
+ .property("vf-module-id", "vf-module2")
+ .property("is-base-vf-module", true)
+ .next();
+ g.addV().property("aai-node-type", "vf-module")
+ .property("vf-module-id", "vf-module3")
+ .property("is-base-vf-module", false)
+ .next();
+
+ //vlan
+ g.addV().property("aai-node-type", "vlan")
+ .property("vlan-interface", "vlan0")
+ .next();
+ g.addV().property("aai-node-type", "vlan")
+ .property("vlan-interface", "vlan1")
+ .property("is-ip-unnumbered", "")
+ .next();
+ g.addV().property("aai-node-type", "vlan")
+ .property("vlan-interface", "vlan2")
+ .property("is-ip-unnumbered", true)
+ .next();
+ g.addV().property("aai-node-type", "vlan")
+ .property("vlan-interface", "vlan3")
+ .property("is-ip-unnumbered", false)
+ .next();
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+ GraphTraversalSource traversal = g;
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ migration = new BooleanDefaultMigrator(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+
+ }
+
+ @Test
+ public void testMissingProperty(){
+ //is-closed-loop-disabled
+ assertTrue("Value of generic-vnf should be updated since the property is-closed-loop-disabled doesn't exist",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf0").has("is-closed-loop-disabled", false).hasNext());
+ assertTrue("Value of vnfc should be updated since the property is-closed-loop-disabled doesn't exist",
+ g.V().has("aai-node-type", "vnfc").has("vnfc-name", "vnfc0").has("is-closed-loop-disabled", false).hasNext());
+ assertTrue("Value of vserver should be updated since the property is-closed-loop-disabled doesn't exist",
+ g.V().has("aai-node-type", "vserver").has("vserver-id", "vserver0").has("is-closed-loop-disabled", false).hasNext());
+ //dhcp-enabled
+ assertTrue("Value of subnet should be updated since the property dhcp-enabled doesn't exist",
+ g.V().has("aai-node-type", "subnet").has("subnet-id", "subnet0").has("dhcp-enabled", false).hasNext());
+ //l3-network: is-bound-to-vpn, is-shared-network, is-external-network
+ assertTrue("Value of l3-network should be updated since the property is-bound-to-vpn doesn't exist",
+ g.V().has("aai-node-type", "l3-network").has("network-id", "l3-network0").has("network-name", "l3-network-name0").has("is-bound-to-vpn", false).hasNext());
+ assertTrue("Value of l3-network should be updated since the property is-provider-network doesn't exist",
+ g.V().has("aai-node-type", "l3-network").has("network-id", "l3-network0").has("network-name", "l3-network-name0").has("is-provider-network", false).hasNext());
+ assertTrue("Value of l3-network should be updated since the property is-shared-network doesn't exist",
+ g.V().has("aai-node-type", "l3-network").has("network-id", "l3-network0").has("network-name", "l3-network-name0").has("is-shared-network", false).hasNext());
+ assertTrue("Value of l3-network should be updated since the property is-external-network doesn't exist",
+ g.V().has("aai-node-type", "l3-network").has("network-id", "l3-network0").has("network-name", "l3-network-name0").has("is-external-network", false).hasNext());
+ //l-interface: is-port-mirrored, is-ip-unnumbered
+ assertTrue("Value of l-interface should be updated since the property is-port-mirrored doesn't exist",
+ g.V().has("aai-node-type", "l-interface").has("interface-name", "l-interface0").has("is-port-mirrored", false).hasNext());
+ assertTrue("Value of l-interface should be updated since the property is-ip-unnumbered doesn't exist",
+ g.V().has("aai-node-type", "l-interface").has("interface-name", "l-interface0").has("is-ip-unnumbered", false).hasNext());
+ //vf-module: is-base-vf-module
+ assertTrue("Value of vf-module should be updated since the property is-base-vf-module doesn't exist",
+ g.V().has("aai-node-type", "vf-module").has("vf-module-id", "vf-module0").has("is-base-vf-module", false).hasNext());
+ //vlan: is-ip-unnumbered
+ assertTrue("Value of vlan should be updated since the property is-ip-unnumbered doesn't exist",
+ g.V().has("aai-node-type", "vlan").has("vlan-interface", "vlan0").has("is-ip-unnumbered", false).hasNext());
+ }
+
+ @Test
+ public void testEmptyValue() {
+ //is-closed-loop-disabled
+ assertTrue("Value of generic-vnf should be updated since the value for is-closed-loop-disabled is an empty string",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf1").has("is-closed-loop-disabled", false).hasNext());
+ assertTrue("Value of vnfc should be updated since the value for is-closed-loop-disabled is an empty string",
+ g.V().has("aai-node-type", "vnfc").has("vnfc-name", "vnfc1").has("is-closed-loop-disabled", false).hasNext());
+ assertTrue("Value of vserver should be updated since the value for is-closed-loop-disabled is an empty string",
+ g.V().has("aai-node-type", "vserver").has("vserver-id", "vserver1").has("is-closed-loop-disabled", false).hasNext());
+ //dhcp-enabled
+ assertTrue("Value of subnet should be updated since the value for dhcp-enabled is an empty string",
+ g.V().has("aai-node-type", "subnet").has("subnet-id", "subnet1").has("dhcp-enabled", false).hasNext());
+ //l3-network: is-bound-to-vpn, is-shared-network, is-external-network
+ assertTrue("Value of l3-network should be updated since the value for is-bound-to-vpn is an empty string",
+ g.V().has("aai-node-type", "l3-network").has("network-id", "l3-network1").has("network-name", "l3-network-name1").has("is-bound-to-vpn", false).hasNext());
+ assertTrue("Value of l3-network should be updated since the value for is-provider-network is an empty string",
+ g.V().has("aai-node-type", "l3-network").has("network-id", "l3-network1").has("network-name", "l3-network-name1").has("is-provider-network", false).hasNext());
+ assertTrue("Value of l3-network should be updated since the value for is-shared-network is an empty string",
+ g.V().has("aai-node-type", "l3-network").has("network-id", "l3-network1").has("network-name", "l3-network-name1").has("is-shared-network", false).hasNext());
+ assertTrue("Value of l3-network should be updated since the value for is-external-network is an empty string",
+ g.V().has("aai-node-type", "l3-network").has("network-id", "l3-network1").has("network-name", "l3-network-name1").has("is-external-network", false).hasNext());
+ //l-interface: is-port-mirrored, is-ip-unnumbered
+ assertTrue("Value of l-interface should be updated since the property is-port-mirrored is an empty string",
+ g.V().has("aai-node-type", "l-interface").has("interface-name", "l-interface1").has("is-port-mirrored", false).hasNext());
+ assertTrue("Value of l-interface should be updated since the property is-ip-unnumbered is an empty string",
+ g.V().has("aai-node-type", "l-interface").has("interface-name", "l-interface1").has("is-ip-unnumbered", false).hasNext());
+ //vf-module: is-base-vf-module, is-ip-unnumbered
+ assertTrue("Value of vf-module should be updated since the property is-base-vf-module is an empty string",
+ g.V().has("aai-node-type", "vf-module").has("vf-module-id", "vf-module1").has("is-base-vf-module", false).hasNext());
+ //vlan: is-ip-unnumbered
+ assertTrue("Value of vlan should be updated since the property is-ip-unnumbered is an empty string",
+ g.V().has("aai-node-type", "vlan").has("vlan-interface", "vlan1").has("is-ip-unnumbered", false).hasNext());
+ }
+
+ @Test
+ public void testExistingTrueValues() {
+ //is-closed-loop-disabled
+ assertTrue("Value of generic-vnf shouldn't be update since is-closed-loop-disabled already exists",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf2").has("is-closed-loop-disabled", true).hasNext());
+ assertTrue("Value of vnfc shouldn't be update since is-closed-loop-disabled already exists",
+ g.V().has("aai-node-type", "vnfc").has("vnfc-name", "vnfc2").has("is-closed-loop-disabled", true).hasNext());
+ assertTrue("Value of vserver shouldn't be update since is-closed-loop-disabled already exists",
+ g.V().has("aai-node-type", "vserver").has("vserver-id", "vserver2").has("is-closed-loop-disabled", true).hasNext());
+ //dhcp-enabled
+ assertTrue("Value of subnet shouldn't be update since dhcp-enabled already exists",
+ g.V().has("aai-node-type", "subnet").has("subnet-id", "subnet2").has("dhcp-enabled", true).hasNext());
+ //l3-network: is-bound-to-vpn, is-shared-network, is-external-network
+ assertTrue("Value of l3-network shouldn't be updated since is-bound-to-vpn already exists",
+ g.V().has("aai-node-type", "l3-network").has("network-id", "l3-network2").has("network-name", "l3-network-name2").has("is-bound-to-vpn", true).hasNext());
+ assertTrue("Value of l3-network shouldn't be updated since is-provider-network already exists",
+ g.V().has("aai-node-type", "l3-network").has("network-id", "l3-network2").has("network-name", "l3-network-name2").has("is-provider-network", true).hasNext());
+ assertTrue("Value of l3-network shouldn't be updated since is-shared-network already exists",
+ g.V().has("aai-node-type", "l3-network").has("network-id", "l3-network2").has("network-name", "l3-network-name2").has("is-shared-network", true).hasNext());
+ assertTrue("Value of l3-network shouldn't be updated since is-external-network already exists",
+ g.V().has("aai-node-type", "l3-network").has("network-id", "l3-network2").has("network-name", "l3-network-name2").has("is-external-network", true).hasNext());
+ //l-interface: is-port-mirrored, is-ip-unnumbered
+ assertTrue("Value of l-interface shouldn't be updated since is-port-mirrored already exists",
+ g.V().has("aai-node-type", "l-interface").has("interface-name", "l-interface2").has("is-port-mirrored", true).hasNext());
+ assertTrue("Value of ll-interface shouldn't be updated since is-ip-unnumbered already exists",
+ g.V().has("aai-node-type", "l-interface").has("interface-name", "l-interface2").has("is-ip-unnumbered", true).hasNext());
+ //vf-module: is-base-vf-module
+ assertTrue("Value of vf-module shouldn't be updated since is-base-vf-module already exists",
+ g.V().has("aai-node-type", "vf-module").has("vf-module-id", "vf-module2").has("is-base-vf-module", true).hasNext());
+ //vlan: is-ip-unnumbered
+ assertTrue("Value of vlan shouldn't be updated since is-ip-unnumbered already exists",
+ g.V().has("aai-node-type", "vlan").has("vlan-interface", "vlan2").has("is-ip-unnumbered", true).hasNext());
+
+ }
+
+ @Test
+ public void testExistingFalseValues() {
+ //is-closed-loop-disabled
+ assertTrue("Value of generic-vnf shouldn't be update since is-closed-loop-disabled already exists",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf3").has("is-closed-loop-disabled", false).hasNext());
+ assertTrue("Value of vnfc shouldn't be update since is-closed-loop-disabled already exists",
+ g.V().has("aai-node-type", "vnfc").has("vnfc-name", "vnfc3").has("is-closed-loop-disabled", false).hasNext());
+ assertTrue("Value of vserver shouldn't be update since is-closed-loop-disabled already exists",
+ g.V().has("aai-node-type", "vserver").has("vserver-id", "vserver3").has("is-closed-loop-disabled", false).hasNext());
+ //dhcp-enabled
+ assertTrue("Value of subnet shouldn't be update since dhcp-enabled already exists",
+ g.V().has("aai-node-type", "subnet").has("subnet-id", "subnet3").has("dhcp-enabled", false).hasNext());
+ //l3-network: is-bound-to-vpn, is-shared-network, is-external-network
+ assertTrue("Value of l3-network shouldn't be updated since is-bound-to-vpn already exists",
+ g.V().has("aai-node-type", "l3-network").has("network-id", "l3-network3").has("network-name", "l3-network-name3").has("is-bound-to-vpn", false).hasNext());
+ assertTrue("Value of l3-network shouldn't be updated since is-provider-network already exists",
+ g.V().has("aai-node-type", "l3-network").has("network-id", "l3-network3").has("network-name", "l3-network-name3").has("is-provider-network", false).hasNext());
+ assertTrue("Value of l3-network shouldn't be updated since is-shared-network already exists",
+ g.V().has("aai-node-type", "l3-network").has("network-id", "l3-network3").has("network-name", "l3-network-name3").has("is-shared-network", false).hasNext());
+ assertTrue("Value of l3-network shouldn't be updated since is-external-network already exists",
+ g.V().has("aai-node-type", "l3-network").has("network-id", "l3-network3").has("network-name", "l3-network-name3").has("is-external-network", false).hasNext());
+ //l-interface: is-port-mirrored, is-ip-unnumbered
+ assertTrue("Value of l-interface shouldn't be updated since is-port-mirrored already exists",
+ g.V().has("aai-node-type", "l-interface").has("interface-name", "l-interface3").has("is-port-mirrored", false).hasNext());
+ assertTrue("Value of ll-interface shouldn't be updated since is-ip-unnumbered already exists",
+ g.V().has("aai-node-type", "l-interface").has("interface-name", "l-interface3").has("is-ip-unnumbered", false).hasNext());
+ //vf-module: is-base-vf-module
+ assertTrue("Value of vf-module shouldn't be updated since is-base-vf-module already exists",
+ g.V().has("aai-node-type", "vf-module").has("vf-module-id", "vf-module3").has("is-base-vf-module", false).hasNext());
+ //vlan: is-ip-unnumbered
+ assertTrue("Value of vlan shouldn't be updated since is-ip-unnumbered already exists",
+ g.V().has("aai-node-type", "vlan").has("vlan-interface", "vlan3").has("is-ip-unnumbered", false).hasNext());
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/aai/migration/v15/MigrateCloudRegionUpgradeCycleTest.java b/src/test/java/org/onap/aai/migration/v15/MigrateCloudRegionUpgradeCycleTest.java
new file mode 100644
index 0000000..1b84d86
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v15/MigrateCloudRegionUpgradeCycleTest.java
@@ -0,0 +1,122 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v15;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.LoaderFactory;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphTransaction;
+
+
+public class MigrateCloudRegionUpgradeCycleTest extends AAISetup{
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private JanusGraph graph;
+ private MigrateCloudRegionUpgradeCycle migration;
+ private GraphTraversalSource g;
+ private JanusGraphTransaction tx;
+ Vertex cloudRegion1;
+ Vertex cloudRegion2;
+ Vertex cloudRegion3;
+
+
+ @Before
+ public void setUp() throws Exception {
+
+ graph = JanusGraphFactory.build().set("storage.backend", "inmemory").open();
+ tx = graph.newTransaction();
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources");
+
+ cloudRegion1 = g.addV().property("aai-node-type", MigrateCloudRegionUpgradeCycle.CLOUD_REGION_NODE_TYPE)
+ .property(MigrateCloudRegionUpgradeCycle.CLOUD_REGION_ID, "akr1")
+ .property(MigrateCloudRegionUpgradeCycle.CLOUD_OWNER, "att-aic")
+ .property( MigrateCloudRegionUpgradeCycle.UPGRADE_CYCLE, "Test")
+ .next();
+
+ cloudRegion2 = g.addV().property("aai-node-type", MigrateCloudRegionUpgradeCycle.CLOUD_REGION_NODE_TYPE)
+ .property(MigrateCloudRegionUpgradeCycle.CLOUD_REGION_ID, "amsnl1b")
+ .property(MigrateCloudRegionUpgradeCycle.CLOUD_OWNER, "att-aic")
+ //.property( MigrateCloudRegionUpgradeCycle.UPGRADE_CYCLE, "server")
+ .next();
+
+ cloudRegion3 = g.addV().property("aai-node-type", MigrateCloudRegionUpgradeCycle.CLOUD_REGION_NODE_TYPE)
+ .property(MigrateCloudRegionUpgradeCycle.CLOUD_REGION_ID, "alp1")
+ .property(MigrateCloudRegionUpgradeCycle.CLOUD_OWNER, "Test")
+ .property( MigrateCloudRegionUpgradeCycle.UPGRADE_CYCLE, "server1")
+ .next();
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+ GraphTraversalSource traversal = g;
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ migration = new MigrateCloudRegionUpgradeCycle(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+ }
+
+ @After
+ public void cleanUp() {
+ tx.rollback();
+ graph.close();
+ }
+
+
+ /***
+ * checks if the upgrade cycle value was changed
+ */
+
+ @Test
+ public void confirmUpgradeCycleChanged() {
+
+ assertEquals("E",cloudRegion1.property(MigrateCloudRegionUpgradeCycle.UPGRADE_CYCLE).value());
+ assertEquals("B",cloudRegion2.property(MigrateCloudRegionUpgradeCycle.UPGRADE_CYCLE).value());
+ assertEquals("server1",cloudRegion3.property(MigrateCloudRegionUpgradeCycle.UPGRADE_CYCLE).value());//Not changed
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/aai/migration/v15/MigrateInMaintDefaultToFalseTest.java b/src/test/java/org/onap/aai/migration/v15/MigrateInMaintDefaultToFalseTest.java
new file mode 100644
index 0000000..1bf1344
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v15/MigrateInMaintDefaultToFalseTest.java
@@ -0,0 +1,411 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v15;
+
+import org.onap.aai.edges.EdgeIngestor;
+import org.onap.aai.serialization.db.EdgeSerializer;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraphTransaction;
+import org.janusgraph.core.schema.JanusGraphManagement;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.LoaderFactory;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.migration.Status;
+import org.onap.aai.migration.v15.MigrateInMaintDefaultToFalse;
+import org.onap.aai.migration.v15.MigrateInMaintDefaultToFalseTest.InMaintDefaultMigrator;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+
+public class MigrateInMaintDefaultToFalseTest extends
+ AAISetup {
+ protected static final String VNF_NODE_TYPE = "generic-vnf";
+ protected static final String LINTERFACE_NODE_TYPE = "l-interface";
+ protected static final String LAG_INTERFACE_NODE_TYPE = "lag-interface";
+ protected static final String LOGICAL_LINK_NODE_TYPE = "logical-link";
+ protected static final String PINTERFACE_NODE_TYPE = "p-interface";
+ protected static final String VLAN_NODE_TYPE = "vlan";
+ protected static final String VNFC_NODE_TYPE = "vnfc";
+ protected static final String VSERVER_NODE_TYPE = "vserver";
+ protected static final String PSERVER_NODE_TYPE = "pserver";
+ protected static final String PNF_NODE_TYPE = "pnf";
+ protected static final String NOS_SERVER_NODE_TYPE = "nos-server";
+
+ public static class InMaintDefaultMigrator extends MigrateInMaintDefaultToFalse {
+ public InMaintDefaultMigrator(TransactionalGraphEngine engine, LoaderFactory loaderFactory, EdgeIngestor edgeIngestor, EdgeSerializer edgeSerializer, SchemaVersions schemaVersions){
+ super(engine, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ }
+ @Override
+ public Status getStatus() {
+ return Status.SUCCESS;
+ }
+ @Override
+ public Optional<String[]> getAffectedNodeTypes() {
+ return Optional.of(new String[]{VNF_NODE_TYPE,LINTERFACE_NODE_TYPE,LAG_INTERFACE_NODE_TYPE,LOGICAL_LINK_NODE_TYPE,PINTERFACE_NODE_TYPE,VLAN_NODE_TYPE,VNFC_NODE_TYPE,VSERVER_NODE_TYPE,PSERVER_NODE_TYPE,PNF_NODE_TYPE,NOS_SERVER_NODE_TYPE});
+ }
+ @Override
+ public String getMigrationName() {
+ return "MockInMaintDefaultMigrator";
+ }
+ }
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private InMaintDefaultMigrator migration;
+ private GraphTraversalSource g;
+
+ @Before
+ public void setup() throws Exception{
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+ //generic-vnf
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf0")
+ .next();
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf1")
+ .property("in-maint", "")
+ .next();
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf2")
+ .property("in-maint", true)
+ .next();
+ g.addV().property("aai-node-type", "generic-vnf")
+ .property("vnf-id", "generic-vnf3")
+ .property("in-maint", false)
+ .next();
+ //l-interface
+ g.addV().property("aai-node-type", "l-interface")
+ .property("interface-name", "l-interface0")
+ .next();
+ g.addV().property("aai-node-type", "l-interface")
+ .property("interface-name", "l-interface1")
+ .property("in-maint", "")
+ .next();
+ g.addV().property("aai-node-type", "l-interface")
+ .property("interface-name", "l-interface2")
+ .property("in-maint", true)
+ .next();
+ g.addV().property("aai-node-type", "l-interface")
+ .property("interface-name", "l-interface3")
+ .property("in-maint", false)
+ .next();
+ //lag-interface
+ g.addV().property("aai-node-type", "lag-interface")
+ .property("interface-name", "lag-interface0")
+ .next();
+ g.addV().property("aai-node-type", "lag-interface")
+ .property("interface-name", "lag-interface1")
+ .property("in-maint", "")
+ .next();
+ g.addV().property("aai-node-type", "lag-interface")
+ .property("interface-name", "lag-interface2")
+ .property("in-maint", true)
+ .next();
+ g.addV().property("aai-node-type", "lag-interface")
+ .property("interface-name", "lag-interface3")
+ .property("in-maint", false)
+ .next();
+ //logical-link
+ g.addV().property("aai-node-type", "logical-link")
+ .property("link-name", "logical-link0")
+ .next();
+ g.addV().property("aai-node-type", "logical-link")
+ .property("link-name", "logical-link1")
+ .property("in-maint", "")
+ .next();
+ g.addV().property("aai-node-type", "logical-link")
+ .property("link-name", "logical-link2")
+ .property("in-maint", true)
+ .next();
+ g.addV().property("aai-node-type", "logical-link")
+ .property("link-name", "logical-link3")
+ .property("in-maint", false)
+ .next();
+ //p-interface
+ g.addV().property("aai-node-type", "p-interface")
+ .property("interface-name", "p-interface0")
+ .next();
+ g.addV().property("aai-node-type", "p-interface")
+ .property("interface-name", "p-interface1")
+ .property("in-maint", "")
+ .next();
+ g.addV().property("aai-node-type", "p-interface")
+ .property("interface-name", "p-interface2")
+ .property("in-maint", true)
+ .next();
+ g.addV().property("aai-node-type", "p-interface")
+ .property("interface-name", "p-interface3")
+ .property("in-maint", false)
+ .next();
+ //pnf
+ g.addV().property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf0")
+ .next();
+ g.addV().property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf1")
+ .property("in-maint", "")
+ .next();
+ g.addV().property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf2")
+ .property("in-maint", true)
+ .next();
+ g.addV().property("aai-node-type", "pnf")
+ .property("pnf-name", "pnf3")
+ .property("in-maint", false)
+ .next();
+ //pserver
+ g.addV().property("aai-node-type", "pserver")
+ .property("pserver-id", "pserver0")
+ .next();
+ g.addV().property("aai-node-type", "pserver")
+ .property("pserver-id", "pserver1")
+ .property("in-maint", "")
+ .next();
+ g.addV().property("aai-node-type", "pserver")
+ .property("pserver-id", "pserver2")
+ .property("in-maint", true)
+ .next();
+ g.addV().property("aai-node-type", "pserver")
+ .property("pserver-id", "pserver3")
+ .property("in-maint", false)
+ .next();
+ //vlan
+ g.addV().property("aai-node-type", "vlan")
+ .property("vlan-interface", "vlan0")
+ .next();
+ g.addV().property("aai-node-type", "vlan")
+ .property("vlan-interface", "vlan1")
+ .property("in-maint", "")
+ .next();
+ g.addV().property("aai-node-type", "vlan")
+ .property("vlan-interface", "vlan2")
+ .property("in-maint", true)
+ .next();
+ g.addV().property("aai-node-type", "vlan")
+ .property("vlan-interface", "vlan3")
+ .property("in-maint", false)
+ .next();
+ //vnfc
+ g.addV().property("aai-node-type", "vnfc")
+ .property("vnfc-name", "vnfc0")
+ .next();
+ g.addV().property("aai-node-type", "vnfc")
+ .property("vnfc-name", "vnfc1")
+ .property("in-maint", "")
+ .next();
+ g.addV().property("aai-node-type", "vnfc")
+ .property("vnfc-name", "vnfc2")
+ .property("in-maint", true)
+ .next();
+ g.addV().property("aai-node-type", "vnfc")
+ .property("vnfc-name", "vnfc3")
+ .property("in-maint", false)
+ .next();
+ //vserver
+ g.addV().property("aai-node-type", "vserver")
+ .property("vserver-id", "vserver0")
+ .next();
+ g.addV().property("aai-node-type", "vserver")
+ .property("vserver-id", "vserver1")
+ .property("in-maint", "")
+ .next();
+ g.addV().property("aai-node-type", "vserver")
+ .property("vserver-id", "vserver2")
+ .property("in-maint", true)
+ .property("is-closed-loop-disabled", true)
+ .next();
+ g.addV().property("aai-node-type", "vserver")
+ .property("vserver-id", "vserver3")
+ .property("in-maint", false)
+ .next();
+ //nos-server
+ g.addV().property("aai-node-type", "nos-server")
+ .property("nos-server-id", "nos-server0")
+ .property("nos-server-name", "nos-server-name0")
+ .property("vendor", "vendor0")
+ .property("nos-server-selflink", "nos-server-selflink0")
+ .next();
+ g.addV().property("aai-node-type", "nos-server")
+ .property("nos-server-id", "nos-server1")
+ .property("nos-server-name", "nos-server-name1")
+ .property("vendor", "vendor1")
+ .property("nos-server-selflink", "nos-server-selflink1")
+ .property("in-maint", "")
+ .next();
+ g.addV().property("aai-node-type", "nos-server")
+ .property("nos-server-id", "nos-server2")
+ .property("nos-server-name", "nos-server-name2")
+ .property("vendor", "vendor2")
+ .property("nos-server-selflink", "nos-server-selflink2")
+ .property("in-maint", true)
+ .next();
+ g.addV().property("aai-node-type", "nos-server")
+ .property("nos-server-id", "nos-server3")
+ .property("nos-server-name", "nos-server-name3")
+ .property("vendor", "vendor3")
+ .property("nos-server-selflink", "nos-server-selflink3")
+ .property("in-maint", false)
+ .next();
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+ GraphTraversalSource traversal = g;
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ migration = new InMaintDefaultMigrator(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+ }
+
+ @Test
+ public void testMissingProperty(){
+ assertTrue("Value of generic-vnf should be updated since the property in-maint doesn't exist",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf0").has("in-maint", false).hasNext());
+ assertTrue("Value of l-interface should be updated since the property in-maint doesn't exist",
+ g.V().has("aai-node-type", "l-interface").has("interface-name", "l-interface0").has("in-maint", false).hasNext());
+ assertTrue("Value of lag-interface should be updated since the property in-maint doesn't exist",
+ g.V().has("aai-node-type", "lag-interface").has("interface-name", "lag-interface0").has("in-maint", false).hasNext());
+ assertTrue("Value of logical-link should be updated since the property in-maint doesn't exist",
+ g.V().has("aai-node-type", "logical-link").has("link-name", "logical-link0").has("in-maint", false).hasNext());
+ assertTrue("Value of p-interface should be updated since the property in-maint doesn't exist",
+ g.V().has("aai-node-type", "p-interface").has("interface-name", "p-interface0").has("in-maint", false).hasNext());
+ assertTrue("Value of pnf should be updated since the property in-maint doesn't exist",
+ g.V().has("aai-node-type", "pnf").has("pnf-name", "pnf0").has("in-maint", false).hasNext());
+ assertTrue("Value of pserver should be updated since the property in-maint doesn't exist",
+ g.V().has("aai-node-type", "pserver").has("pserver-id", "pserver0").has("in-maint", false).hasNext());
+ assertTrue("Value of vlan should be updated since the property in-maint doesn't exist",
+ g.V().has("aai-node-type", "vlan").has("vlan-interface", "vlan0").has("in-maint", false).hasNext());
+ assertTrue("Value of vnfc should be updated since the property in-maint doesn't exist",
+ g.V().has("aai-node-type", "vnfc").has("vnfc-name", "vnfc0").has("in-maint", false).hasNext());
+ assertTrue("Value of vserver should be updated since the property in-maint doesn't exist",
+ g.V().has("aai-node-type", "vserver").has("vserver-id", "vserver0").has("in-maint", false).hasNext());
+ assertTrue("Value of nos-server should be updated since the property in-maint doesn't exist",
+ g.V().has("aai-node-type", "nos-server").has("nos-server-id", "nos-server0").has("in-maint", false).hasNext());
+ }
+
+ @Test
+ public void testEmptyValue() {
+ assertTrue("Value of generic-vnf should be updated since the value for in-maint is an empty string",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf1").has("in-maint", false).hasNext());
+ assertTrue("Value of l-interface should be updated since the value for in-maint is an empty string",
+ g.V().has("aai-node-type", "l-interface").has("interface-name", "l-interface1").has("in-maint", false).hasNext());
+ assertTrue("Value of lag-interface should be updated since the value for in-maint is an empty string",
+ g.V().has("aai-node-type", "lag-interface").has("interface-name", "lag-interface1").has("in-maint", false).hasNext());
+ assertTrue("Value of logical-link should be updated since the value for in-maint is an empty string",
+ g.V().has("aai-node-type", "logical-link").has("link-name", "logical-link1").has("in-maint", false).hasNext());
+ assertTrue("Value of p-interface should be updated since the value for in-maint is an empty string",
+ g.V().has("aai-node-type", "p-interface").has("interface-name", "p-interface1").has("in-maint", false).hasNext());
+ assertTrue("Value of pnf should be updated since the value for in-maint is an empty string",
+ g.V().has("aai-node-type", "pnf").has("pnf-name", "pnf1").has("in-maint", false).hasNext());
+ assertTrue("Value of pserver should be updated since the value for in-maint is an empty string",
+ g.V().has("aai-node-type", "pserver").has("pserver-id", "pserver1").has("in-maint", false).hasNext());
+ assertTrue("Value of vlan should be updated since the value for in-maint is an empty string",
+ g.V().has("aai-node-type", "vlan").has("vlan-interface", "vlan1").has("in-maint", false).hasNext());
+ assertTrue("Value of vnfc should be updated since the value for in-maint is an empty string",
+ g.V().has("aai-node-type", "vnfc").has("vnfc-name", "vnfc1").has("in-maint", false).hasNext());
+ assertTrue("Value of vserver should be updated since the value for in-maint is an empty string",
+ g.V().has("aai-node-type", "vserver").has("vserver-id", "vserver1").has("in-maint", false).hasNext());
+ assertTrue("Value of nos-server should be updated since the value for in-maint is an empty string",
+ g.V().has("aai-node-type", "nos-server").has("nos-server-id", "nos-server1").has("in-maint", false).hasNext());
+ }
+
+ @Test
+ public void testExistingTrueValues() {
+ assertTrue("Value of generic-vnf shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf2").has("in-maint", true).hasNext());
+ assertTrue("Value of l-interface shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "l-interface").has("interface-name", "l-interface2").has("in-maint", true).hasNext());
+ assertTrue("Value of lag-interface shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "lag-interface").has("interface-name", "lag-interface2").has("in-maint", true).hasNext());
+ assertTrue("Value of logical-link shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "logical-link").has("link-name", "logical-link2").has("in-maint", true).hasNext());
+ assertTrue("Value of p-interface shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "p-interface").has("interface-name", "p-interface2").has("in-maint", true).hasNext());
+ assertTrue("Value of pnf shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "pnf").has("pnf-name", "pnf2").has("in-maint", true).hasNext());
+ assertTrue("Value of pserver shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "pserver").has("pserver-id", "pserver2").has("in-maint", true).hasNext());
+ assertTrue("Value of vlan shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "vlan").has("vlan-interface", "vlan2").has("in-maint", true).hasNext());
+ assertTrue("Value of vnfc shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "vnfc").has("vnfc-name", "vnfc2").has("in-maint", true).hasNext());
+ assertTrue("Value of vserver shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "vserver").has("vserver-id", "vserver2").has("in-maint", true).hasNext());
+ assertTrue("Value of nos-server shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "nos-server").has("nos-server-id", "nos-server2").has("in-maint", true).hasNext());
+ }
+
+ @Test
+ public void testExistingFalseValues() {
+ assertTrue("Value of generic-vnf shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "generic-vnf3").has("in-maint", false).hasNext());
+ assertTrue("Value of l-interface shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "l-interface").has("interface-name", "l-interface3").has("in-maint", false).hasNext());
+ assertTrue("Value of lag-interface shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "lag-interface").has("interface-name", "lag-interface3").has("in-maint", false).hasNext());
+ assertTrue("Value of logical-link shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "logical-link").has("link-name", "logical-link3").has("in-maint", false).hasNext());
+ assertTrue("Value of p-interface shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "p-interface").has("interface-name", "p-interface3").has("in-maint", false).hasNext());
+ assertTrue("Value of pnf shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "pnf").has("pnf-name", "pnf3").has("in-maint", false).hasNext());
+ assertTrue("Value of pserver shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "pserver").has("pserver-id", "pserver3").has("in-maint", false).hasNext());
+ assertTrue("Value of vlan shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "vlan").has("vlan-interface", "vlan3").has("in-maint", false).hasNext());
+ assertTrue("Value of vnfc shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "vnfc").has("vnfc-name", "vnfc3").has("in-maint", false).hasNext());
+ assertTrue("Value of vserver shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "vserver").has("vserver-id", "vserver3").has("in-maint", false).hasNext());
+ assertTrue("Value of nos-server shouldn't be updated since in-maint already exists",
+ g.V().has("aai-node-type", "nos-server").has("nos-server-id", "nos-server3").has("in-maint", false).hasNext());
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/aai/migration/v15/MigrateRadcomChangesTest.java b/src/test/java/org/onap/aai/migration/v15/MigrateRadcomChangesTest.java
new file mode 100644
index 0000000..ad101ed
--- /dev/null
+++ b/src/test/java/org/onap/aai/migration/v15/MigrateRadcomChangesTest.java
@@ -0,0 +1,509 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.migration.v15;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.Optional;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.*;
+import org.onap.aai.AAISetup;
+import org.onap.aai.dbmap.DBConnectionType;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.ModelType;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.serialization.engines.QueryStyle;
+import org.onap.aai.serialization.engines.JanusGraphDBEngine;
+import org.onap.aai.serialization.engines.TransactionalGraphEngine;
+import org.janusgraph.core.JanusGraphFactory;
+import org.janusgraph.core.JanusGraph;
+import org.janusgraph.core.JanusGraphTransaction;
+
+public class MigrateRadcomChangesTest extends AAISetup {
+
+ private final static ModelType introspectorFactoryType = ModelType.MOXY;
+ private final static QueryStyle queryStyle = QueryStyle.TRAVERSAL;
+ private final static DBConnectionType type = DBConnectionType.REALTIME;
+
+ private Loader loader;
+ private TransactionalGraphEngine dbEngine;
+ private MigrateRadcomChanges migration;
+ private GraphTraversalSource g;
+
+ @Before
+ public void setUp() throws Exception {
+ g = tx.traversal();
+ loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, schemaVersions.getDefaultVersion());
+ dbEngine = new JanusGraphDBEngine(
+ queryStyle,
+ type,
+ loader);
+
+ System.setProperty("BUNDLECONFIG_DIR", "src/test/resources");
+
+ Vertex genericVnf1 = g.addV().property("aai-node-type", "generic-vnf").property("vnf-id", "test-1")
+ .property("vnf-name", "name-1").property("vnf-type", "test")
+ .property("model-invariant-id-local", "test").property("model-version-id-local", "test").property("model-customization-id", "test").next();
+ Vertex genericVnf2 = g.addV().property("aai-node-type", "generic-vnf").property("vnf-id", "test-2")
+ .property("vnf-name", "name-2").property("vnf-type", "test")
+ .property("model-invariant-id-local", "change").property("model-version-id-local", "change").property("model-customization-id", "change").next();
+ Vertex genericVnf3 = g.addV().property("aai-node-type", "generic-vnf").property("vnf-id", "test-3")
+ .property("vnf-name", "no-service").property("vnf-type", "test")
+ .property("model-invariant-id-local", "test").property("model-version-id-local", "test").property("model-customization-id", "test").next();
+ Vertex genericVnf4 = g.addV().property("aai-node-type", "generic-vnf").property("vnf-id", "test-4")
+ .property("vnf-name", "no-invariant").property("vnf-type", "test")
+ .property("model-version-id-local", "test").property("model-customization-id", "test").next();
+ Vertex genericVnf5 = g.addV().property("aai-node-type", "generic-vnf").property("vnf-id", "test-5")
+ .property("vnf-name", "no-version").property("vnf-type", "test")
+ .property("model-invariant-id-local", "test").property("model-customization-id", "test").next();
+ Vertex genericVnf6 = g.addV().property("aai-node-type", "generic-vnf").property("vnf-id", "test-6")
+ .property("vnf-name", "no-customization").property("vnf-type", "test")
+ .property("model-invariant-id-local", "test").property("model-version-id-local", "test").next();
+ Vertex genericVnf7 = g.addV().property("aai-node-type", "generic-vnf").property("vnf-id", "test-7")
+ .property("vnf-name", "no ids").property("vnf-type", "test").next();
+ Vertex genericVnf8 = g.addV().property("aai-node-type", "generic-vnf").property("vnf-id", "test-8")
+ .property("vnf-name", "many-service-1").property("vnf-type", "test")
+ .property("model-invariant-id-local", "test").property("model-version-id-local", "test").property("model-customization-id", "test").next();
+ Vertex genericVnf9 = g.addV().property("aai-node-type", "generic-vnf").property("vnf-id", "test-9")
+ .property("vnf-name", "many-service-2").property("vnf-type", "test")
+ .property("model-invariant-id-local", "test").property("model-version-id-local", "test").property("model-customization-id", "test").next();
+ Vertex genericVnf10 = g.addV().property("aai-node-type", "generic-vnf").property("vnf-id", "test-10")
+ .property("vnf-name", "multi-name").property("vnf-type", "test").next();
+ Vertex genericVnf11 = g.addV().property("aai-node-type", "generic-vnf").property("vnf-id", "test-11")
+ .property("vnf-name", "multi-name").property("vnf-type", "test")
+ .property("model-invariant-id-local", "test").property("model-version-id-local", "test").property("model-customization-id", "test").next();
+ Vertex genericVnf12 = g.addV().property("aai-node-type", "generic-vnf").property("vnf-id", "test-12")
+ .property("vnf-name", "wrong-type").property("vnf-type", "none").next();
+ Vertex genericVnf13 = g.addV().property("aai-node-type", "generic-vnf").property("vnf-id", "test-13")
+ .property("vnf-name", "wrong-name").property("vnf-type", "test")
+ .property("model-invariant-id-local", "test").property("model-version-id-local", "test").property("model-customization-id", "test").next();
+
+ Vertex serviceInstance1 = g.addV().property("aai-node-type", "service-instance")
+ .property("service-instance-id", "service-1")
+ .property("model-invariant-id-local", "test").property("model-version-id-local", "test").next();
+ Vertex serviceInstance2 = g.addV().property("aai-node-type", "service-instance")
+ .property("service-instance-id", "service-2")
+ .property("model-invariant-id-local", "diff").property("model-version-id-local", "diff").next();
+ Vertex serviceInstance3 = g.addV().property("aai-node-type", "service-instance")
+ .property("service-instance-id", "no-invariant")
+ .property("model-version-id-local", "test").next();
+ Vertex serviceInstance4 = g.addV().property("aai-node-type", "service-instance")
+ .property("service-instance-id", "no-version")
+ .property("model-invariant-id-local", "test").next();
+ Vertex serviceInstance5 = g.addV().property("aai-node-type", "service-instance")
+ .property("service-instance-id", "no ids").next();
+ Vertex serviceInstance6 = g.addV().property("aai-node-type", "service-instance")
+ .property("service-instance-id", "service-many")
+ .property("model-invariant-id-local", "test").property("model-version-id-local", "test").next();
+ Vertex serviceInstance7 = g.addV().property("aai-node-type", "service-instance")
+ .property("service-instance-id", "wrong").next();
+ Vertex serviceInstance8 = g.addV().property("aai-node-type", "service-instance")
+ .property("service-instance-id", "connected-wrong")
+ .property("model-invariant-id-local", "test").property("model-version-id-local", "test").next();
+
+ Vertex serviceModel = g.addV().property("aai-node-type", "model")
+ .property("model-invariant-id", "new-service-inv").property("model-type", "Service").next();
+ Vertex serviceModelVer = g.addV().property("aai-node-type", "model-ver")
+ .property("model-version-id", "new-service-ver").property("model-name", "test-service")
+ .property("version", "test").next();
+ Vertex resourceModel = g.addV().property("aai-node-type", "model")
+ .property("model-invariant-id", "new-resource-inv").property("model-type", "VNF-resource").next();
+ Vertex resourceModelVer = g.addV().property("aai-node-type", "model-ver")
+ .property("model-version-id", "new-resource-ver").property("model-name", "test-resource")
+ .property("version", "test").next();
+ Vertex resourceModelElement1 = g.addV().property("aai-node-type", "model-element")
+ .property("model-element-uuid", "resource-element-start").property("new-data-del-flag", "T")
+ .property("cardinality", "unbounded").next();
+ Vertex newVfModuleModelVer2 = g.addV().property("aai-node-type", "model-ver")
+ .property("model-version-id", "new-vf-module-ver-2").property("model-name", "model-2")
+ .property("version", "test").next();
+ Vertex newVfModuleModel2 = g.addV().property("aai-node-type", "model")
+ .property("model-invariant-id", "new-vf-module-inv-2").property("model-type", "2").next();
+ Vertex resourceModelElement2 = g.addV().property("aai-node-type", "model-element")
+ .property("model-element-uuid", "resource-element-depth-1").property("new-data-del-flag", "T")
+ .property("cardinality", "unbounded").next();
+ Vertex newVfModuleModelVer3 = g.addV().property("aai-node-type", "model-ver")
+ .property("model-version-id", "new-vf-module-ver-3").property("model-name", "model-3")
+ .property("version", "test").next();
+ Vertex newVfModuleModel3 = g.addV().property("aai-node-type", "model")
+ .property("model-invariant-id", "new-vf-module-inv-3").property("model-type", "3").next();
+ Vertex resourceModelElement3 = g.addV().property("aai-node-type", "model-element")
+ .property("model-element-uuid", "resource-element-depth-2-1").property("new-data-del-flag", "T")
+ .property("cardinality", "unbounded").next();
+ Vertex newVfModuleModelVer4 = g.addV().property("aai-node-type", "model-ver")
+ .property("model-version-id", "new-vf-module-ver-4").property("model-name", "model-4")
+ .property("version", "test").next();
+ Vertex newVfModuleModel4 = g.addV().property("aai-node-type", "model")
+ .property("model-invariant-id", "new-vf-module-inv-4").property("model-type", "4").next();
+ Vertex resourceModelElement4 = g.addV().property("aai-node-type", "model-element")
+ .property("model-element-uuid", "resource-element-depth-2-2").property("new-data-del-flag", "T")
+ .property("cardinality", "unbounded").next();
+ Vertex newVfModuleModelVer5 = g.addV().property("aai-node-type", "model-ver")
+ .property("model-version-id", "new-vf-module-ver-5").property("model-name", "model-5")
+ .property("version", "test").next();
+ Vertex newVfModuleModel5 = g.addV().property("aai-node-type", "model")
+ .property("model-invariant-id", "new-vf-module-inv-5").property("model-type", "5").next();
+ Vertex resourceModelElement5 = g.addV().property("aai-node-type", "model-element")
+ .property("model-element-uuid", "resource-element-depth-2-3").property("new-data-del-flag", "T")
+ .property("cardinality", "unbounded").next();
+ Vertex newVfModuleModelVer1 = g.addV().property("aai-node-type", "model-ver")
+ .property("model-version-id", "new-vf-module-ver-1").property("model-name", "model-1")
+ .property("version", "test").next();
+ Vertex newVfModuleModel1 = g.addV().property("aai-node-type", "model")
+ .property("model-invariant-id", "new-vf-module-inv-1").property("model-type", "1").next();
+
+ Vertex vfModule1 = g.addV().property("aai-node-type", "vf-module")
+ .property("vf-module-id", "vf-module-1")
+ .property("model-invariant-id-local", "test").property("model-version-id-local", "test").next();
+ Vertex vfModule2 = g.addV().property("aai-node-type", "vf-module")
+ .property("vf-module-id", "vf-module-2")
+ .property("model-invariant-id-local", "test").property("model-version-id-local", "test").next();
+ Vertex vfModule3 = g.addV().property("aai-node-type", "vf-module")
+ .property("vf-module-id", "no-invariant")
+ .property("model-version-id-local", "test").next();
+ Vertex vfModule4 = g.addV().property("aai-node-type", "vf-module")
+ .property("vf-module-id", "no-ver")
+ .property("model-invariant-id-local", "test").next();
+ Vertex vfModule5 = g.addV().property("aai-node-type", "vf-module")
+ .property("vf-module-id", "no-ids").next();
+ Vertex badVfModule = g.addV().property("aai-node-type", "vf-module")
+ .property("vf-module-id", "bad").next();
+
+ Vertex vserver1 = g.addV().property("aai-node-type", "vserver")
+ .property("vserver-id", "vserver-1").property("vserver-name", "vname-1").next();
+ Vertex vserver2 = g.addV().property("aai-node-type", "vserver")
+ .property("vserver-id", "vserver-2").property("vserver-name", "vname-2").next();
+ Vertex unchangedVserver = g.addV().property("aai-node-type", "vserver")
+ .property("vserver-id", "unchanged").property("vserver-name", "unchanged").next();
+
+ Vertex image1 = g.addV().property("aai-node-type", "image")
+ .property("image-id", "image-id-1").property("image-name", "image-1").next();
+ Vertex image2 = g.addV().property("aai-node-type", "image")
+ .property("image-id", "image-id-2").property("image-name", "image-2").next();
+ Vertex oldImage = g.addV().property("aai-node-type", "image")
+ .property("image-id", "image-old").property("image-name", "image-old-name").next();
+ Vertex badImage = g.addV().property("aai-node-type", "image")
+ .property("image-id", "image-bad").property("image-name", "image-bad").next();
+
+ Vertex tenant1 = g.addV().property("aai-node-type", "tenant")
+ .property("tenant-id", "tenant-id-1").property("tenant-name", "tenant-1").next();
+ Vertex tenant2 = g.addV().property("aai-node-type", "tenant")
+ .property("tenant-id", "tenant-id-2").property("tenant-name", "tenant-2").next();
+ Vertex cloudRegion1 = g.addV().property("aai-node-type", "cloud-region")
+ .property("cloud-region-id", "region-1").property("cloud-owner", "owner-1").next();
+ Vertex cloudRegion2 = g.addV().property("aai-node-type", "cloud-region")
+ .property("cloud-region-id", "region-2").property("cloud-owner", "owner-2").next();
+
+
+ edgeSerializer.addEdge(g, genericVnf1, serviceInstance1);
+ edgeSerializer.addEdge(g, genericVnf2, serviceInstance2);
+ edgeSerializer.addEdge(g, genericVnf4, serviceInstance3);
+ edgeSerializer.addEdge(g, genericVnf5, serviceInstance4);
+ edgeSerializer.addEdge(g, genericVnf6, serviceInstance5);
+ edgeSerializer.addEdge(g, genericVnf8, serviceInstance6);
+ edgeSerializer.addEdge(g, genericVnf9, serviceInstance6);
+ edgeSerializer.addEdge(g, genericVnf12, serviceInstance8);
+
+ edgeSerializer.addTreeEdge(g, genericVnf2, vfModule1);
+ edgeSerializer.addTreeEdge(g, genericVnf4, vfModule2);
+ edgeSerializer.addTreeEdge(g, genericVnf5, vfModule3);
+ edgeSerializer.addTreeEdge(g, genericVnf6, vfModule4);
+ edgeSerializer.addTreeEdge(g, genericVnf7, vfModule5);
+ edgeSerializer.addTreeEdge(g, genericVnf12, badVfModule);
+
+ edgeSerializer.addTreeEdge(g, serviceModel, serviceModelVer);
+ edgeSerializer.addTreeEdge(g, resourceModel, resourceModelVer);
+ edgeSerializer.addTreeEdge(g, resourceModelVer, resourceModelElement1);
+ edgeSerializer.addEdge(g, resourceModelElement1, newVfModuleModelVer2);
+ edgeSerializer.addTreeEdge(g, newVfModuleModelVer2, newVfModuleModel2);
+ edgeSerializer.addTreeEdge(g, resourceModelElement1, resourceModelElement2);
+ edgeSerializer.addEdge(g, resourceModelElement2, newVfModuleModelVer3);
+ edgeSerializer.addTreeEdge(g, newVfModuleModelVer3, newVfModuleModel3);
+ edgeSerializer.addTreeEdge(g, resourceModelElement2, resourceModelElement3);
+ edgeSerializer.addTreeEdge(g, resourceModelElement2, resourceModelElement4);
+ edgeSerializer.addTreeEdge(g, resourceModelElement2, resourceModelElement5);
+ edgeSerializer.addEdge(g, resourceModelElement3, newVfModuleModelVer4);
+ edgeSerializer.addTreeEdge(g, newVfModuleModelVer4, newVfModuleModel4);
+ edgeSerializer.addEdge(g, resourceModelElement4, newVfModuleModelVer5);
+ edgeSerializer.addTreeEdge(g, newVfModuleModelVer5, newVfModuleModel5);
+ edgeSerializer.addEdge(g, resourceModelElement5, newVfModuleModelVer1);
+ edgeSerializer.addTreeEdge(g, newVfModuleModelVer1, newVfModuleModel1);
+
+ edgeSerializer.addEdge(g, vfModule1, vserver1);
+ edgeSerializer.addEdge(g, vfModule2, vserver2);
+ edgeSerializer.addEdge(g, vfModule4, unchangedVserver);
+ edgeSerializer.addEdge(g, vserver2, oldImage);
+ edgeSerializer.addEdge(g, unchangedVserver, badImage);
+ edgeSerializer.addTreeEdge(g, image1, cloudRegion1);
+ edgeSerializer.addTreeEdge(g, tenant1, cloudRegion1);
+ edgeSerializer.addTreeEdge(g, tenant1, vserver1);
+ edgeSerializer.addTreeEdge(g, image2, cloudRegion2);
+ edgeSerializer.addTreeEdge(g, tenant2, cloudRegion2);
+ edgeSerializer.addTreeEdge(g, tenant2, vserver2);
+
+ TransactionalGraphEngine spy = spy(dbEngine);
+ TransactionalGraphEngine.Admin adminSpy = spy(dbEngine.asAdmin());
+
+ GraphTraversalSource traversal = g;
+ GraphTraversalSource readOnly = tx.traversal(GraphTraversalSource.build().with(ReadOnlyStrategy.instance()));
+ when (spy.tx()).thenReturn(tx);
+ when(spy.asAdmin()).thenReturn(adminSpy);
+ when(adminSpy.getTraversalSource()).thenReturn(traversal);
+ when(adminSpy.getReadOnlyTraversalSource()).thenReturn(readOnly);
+
+ migration = new MigrateRadcomChanges(spy, loaderFactory, edgeIngestor, edgeSerializer, schemaVersions);
+ migration.run();
+ }
+
+ @Test
+ public void testGenericVnfsUpdated() throws Exception {
+ // check if generic-vnf nodes are updated
+
+ assertEquals("First generic-vnf updated invariant", "new-resource-inv",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "name-1").next().value("model-invariant-id-local"));
+ assertEquals("First generic-vnf updated version", "new-resource-ver",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "name-1").next().value("model-version-id-local"));
+ assertEquals("First generic-vnf updated customization", "new-resource-cust",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "name-1").next().value("model-customization-id"));
+
+ assertEquals("Second generic-vnf updated invariant", "new-resource-inv",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "name-2").next().value("model-invariant-id-local"));
+ assertEquals("Second generic-vnf updated version", "new-resource-ver",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "name-2").next().value("model-version-id-local"));
+ assertEquals("Second generic-vnf updated customization", "new-resource-cust",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "name-2").next().value("model-customization-id"));
+
+ assertEquals("Generic-vnf with no service updated invariant", "new-resource-inv",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "no-service").next().value("model-invariant-id-local"));
+ assertEquals("Generic-vnf with no service updated version", "new-resource-ver",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "no-service").next().value("model-version-id-local"));
+ assertEquals("Generic-vnf with no service updated customization", "new-resource-cust",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "no-service").next().value("model-customization-id"));
+
+ assertEquals("Generic-vnf with no invariant updated invariant", "new-resource-inv",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "no-invariant").next().value("model-invariant-id-local"));
+ assertEquals("Generic-vnf with no invariant updated version", "new-resource-ver",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "no-invariant").next().value("model-version-id-local"));
+ assertEquals("Generic-vnf with no invariant updated customization", "new-resource-cust",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "no-invariant").next().value("model-customization-id"));
+
+ assertEquals("Generic-vnf with no version updated invariant", "new-resource-inv",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "no-version").next().value("model-invariant-id-local"));
+ assertEquals("Generic-vnf with no version updated version", "new-resource-ver",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "no-version").next().value("model-version-id-local"));
+ assertEquals("Generic-vnf with no version updated customization", "new-resource-cust",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "no-version").next().value("model-customization-id"));
+
+ assertEquals("Generic-vnf with no customization updated invariant", "new-resource-inv",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "no-customization").next().value("model-invariant-id-local"));
+ assertEquals("Generic-vnf with no customization updated version", "new-resource-ver",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "no-customization").next().value("model-version-id-local"));
+ assertEquals("Generic-vnf with no customization updated customization", "new-resource-cust",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "no-customization").next().value("model-customization-id"));
+
+ assertEquals("Generic-vnf with no ids updated invariant", "new-resource-inv",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "no ids").next().value("model-invariant-id-local"));
+ assertEquals("Generic-vnf with no ids updated version", "new-resource-ver",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "no ids").next().value("model-version-id-local"));
+ assertEquals("Generic-vnf with no version updated customization", "new-resource-cust",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "no-version").next().value("model-customization-id"));
+
+ assertEquals("First generic-vnf for many-to-service test updated invariant", "new-resource-inv",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "many-service-1").next().value("model-invariant-id-local"));
+ assertEquals("First generic-vnf for many-to-service test updated version", "new-resource-ver",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "many-service-1").next().value("model-version-id-local"));
+ assertEquals("First generic-vnf for many-to-service test updated customization", "new-resource-cust",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "many-service-1").next().value("model-customization-id"));
+
+ assertEquals("Second generic-vnf for many-to-service test updated invariant", "new-resource-inv",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "many-service-2").next().value("model-invariant-id-local"));
+ assertEquals("Second generic-vnf for many-to-service test updated version", "new-resource-ver",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "many-service-2").next().value("model-version-id-local"));
+ assertEquals("Second generic-vnf for many-to-service test updated customization", "new-resource-cust",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "many-service-2").next().value("model-customization-id"));
+
+
+ assertEquals("First generic-vnf for multi-name test updated invariant", "new-resource-inv",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "test-10").next().value("model-invariant-id-local"));
+ assertEquals("First generic-vnf for multi-name test updated version", "new-resource-ver",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "test-10").next().value("model-version-id-local"));
+ assertEquals("First generic-vnf for multi-name test updated customization", "new-resource-cust",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "test-10").next().value("model-customization-id"));
+
+ assertEquals("Second generic-vnf for multi-name test updated invariant", "new-resource-inv",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "test-11").next().value("model-invariant-id-local"));
+ assertEquals("Second generic-vnf for multi-name test updated version", "new-resource-ver",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "test-11").next().value("model-version-id-local"));
+ assertEquals("Second generic-vnf for multi-name test customization", "new-resource-cust",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-id", "test-11").next().value("model-customization-id"));
+ }
+
+
+ @Test
+ public void testServiceInstancesUpdated() throws Exception {
+ // check if service-instance nodes are updated
+
+ assertEquals("First service-instance updated invariant", "new-service-inv",
+ g.V().has("aai-node-type", "service-instance").has("service-instance-id", "service-1").next().value("model-invariant-id-local"));
+ assertEquals("First service-instance-updated version", "new-service-ver",
+ g.V().has("aai-node-type", "service-instance").has("service-instance-id", "service-1").next().value("model-version-id-local"));
+
+ assertEquals("Second service-instance updated invariant", "new-service-inv",
+ g.V().has("aai-node-type", "service-instance").has("service-instance-id", "service-2").next().value("model-invariant-id-local"));
+ assertEquals("Second service-instance-updated version", "new-service-ver",
+ g.V().has("aai-node-type", "service-instance").has("service-instance-id", "service-2").next().value("model-version-id-local"));
+
+ assertEquals("Service-instance with no invariant updated invariant", "new-service-inv",
+ g.V().has("aai-node-type", "service-instance").has("service-instance-id", "no-invariant").next().value("model-invariant-id-local"));
+ assertEquals("Service-instance with no invariant updated version", "new-service-ver",
+ g.V().has("aai-node-type", "service-instance").has("service-instance-id", "no-invariant").next().value("model-version-id-local"));
+
+ assertEquals("Service-instance with no version updated invariant", "new-service-inv",
+ g.V().has("aai-node-type", "service-instance").has("service-instance-id", "no-version").next().value("model-invariant-id-local"));
+ assertEquals("Service-instance with no version updated version", "new-service-ver",
+ g.V().has("aai-node-type", "service-instance").has("service-instance-id", "no-version").next().value("model-version-id-local"));
+
+ assertEquals("Service-instance with no ids updated invariant", "new-service-inv",
+ g.V().has("aai-node-type", "service-instance").has("service-instance-id", "no ids").next().value("model-invariant-id-local"));
+ assertEquals("Service-instance with no ids updated version", "new-service-ver",
+ g.V().has("aai-node-type", "service-instance").has("service-instance-id", "no ids").next().value("model-version-id-local"));
+
+ assertEquals("Service-instance for many-to-service test updated invariant", "new-service-inv",
+ g.V().has("aai-node-type", "service-instance").has("service-instance-id", "service-many").next().value("model-invariant-id-local"));
+ assertEquals("Service-instance for many-to-service test updated version", "new-service-ver",
+ g.V().has("aai-node-type", "service-instance").has("service-instance-id", "service-many").next().value("model-version-id-local"));
+ }
+
+ @Test
+ public void testVfModulesUpdated() throws Exception {
+ //test if vf-module nodes are updated
+
+ assertEquals("First vf-module updated invariant", "new-vf-module-inv-1",
+ g.V().has("aai-node-type", "vf-module").has("vf-module-id", "vf-module-1").next().value("model-invariant-id-local"));
+ assertEquals("First vf-module updated version", "new-vf-module-ver-1",
+ g.V().has("aai-node-type", "vf-module").has("vf-module-id", "vf-module-1").next().value("model-version-id-local"));
+
+ assertEquals("Second vf-module updated invariant", "new-vf-module-inv-2",
+ g.V().has("aai-node-type", "vf-module").has("vf-module-id", "vf-module-2").next().value("model-invariant-id-local"));
+ assertEquals("Second vf-module updated version", "new-vf-module-ver-2",
+ g.V().has("aai-node-type", "vf-module").has("vf-module-id", "vf-module-2").next().value("model-version-id-local"));
+
+ assertEquals("Vf-module with no invariant updated invariant", "new-vf-module-inv-3",
+ g.V().has("aai-node-type", "vf-module").has("vf-module-id", "no-invariant").next().value("model-invariant-id-local"));
+ assertEquals("Vf-module with no invariant updated version", "new-vf-module-ver-3",
+ g.V().has("aai-node-type", "vf-module").has("vf-module-id", "no-invariant").next().value("model-version-id-local"));
+
+ assertEquals("Vf-module with no version updated invariant", "new-vf-module-inv-4",
+ g.V().has("aai-node-type", "vf-module").has("vf-module-id", "no-ver").next().value("model-invariant-id-local"));
+ assertEquals("Vf-module with no version updated version", "new-vf-module-ver-4",
+ g.V().has("aai-node-type", "vf-module").has("vf-module-id", "no-ver").next().value("model-version-id-local"));
+
+ assertEquals("Vf-module with no ids updated invariant", "new-vf-module-inv-5",
+ g.V().has("aai-node-type", "vf-module").has("vf-module-id", "no-ids").next().value("model-invariant-id-local"));
+ assertEquals("Vf-module with no ids updated version", "new-vf-module-ver-5",
+ g.V().has("aai-node-type", "vf-module").has("vf-module-id", "no-ids").next().value("model-version-id-local"));
+ }
+
+ @Test
+ public void testVserverAndImageUpdated() throws Exception {
+ //test if vserver-image relationships are updated
+ assertTrue("Vserver not connected to image is connected to new image",
+ g.V().has("aai-node-type", "vserver").has("vserver-id", "vserver-1").out("org.onap.relationships.inventory.Uses")
+ .has("aai-node-type", "image").has("image-id", "image-id-1").hasNext());
+ assertTrue("Vserver connected to existing image is connected to new image",
+ g.V().has("aai-node-type", "vserver").has("vserver-id", "vserver-2").out("org.onap.relationships.inventory.Uses")
+ .has("aai-node-type", "image").has("image-id", "image-id-2").hasNext());
+ assertFalse("Vserver connected to existing image is not connected to that image",
+ g.V().has("aai-node-type", "vserver").has("vserver-id", "vserver-2").out("org.onap.relationships.inventory.Uses")
+ .has("aai-node-type", "image").has("image-id", "image-old").hasNext());
+ assertTrue("Existing image still exists",
+ g.V().has("aai-node-type", "image").has("image-id", "image-old").hasNext());
+ }
+
+ @Test
+ public void testNodesNotUpdated() throws Exception {
+ // negative tests
+
+ assertFalse("Generic-vnf with wrong type has unchanged invariant",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "wrong-type").next()
+ .property("model-invariant-id-local").isPresent());
+ assertFalse("Generic-vnf with wrong type has unchanged version",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "wrong-type").next()
+ .property("model-version-id-local").isPresent());
+ assertFalse("Generic-vnf with wrong type has unchanged customization",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "wrong-type").next()
+ .property("model-customizaiton-id").isPresent());
+
+ assertEquals("Generic-vnf with wrong name has unchanged invariant", "test",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "wrong-name").next().value("model-invariant-id-local"));
+ assertEquals("Generic-vnf with wrong name has unchanged version", "test",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "wrong-name").next().value("model-version-id-local"));
+ assertEquals("Generic-vnf with wrong name has unchanged customization", "test",
+ g.V().has("aai-node-type", "generic-vnf").has("vnf-name", "wrong-name").next().value("model-customization-id"));
+
+ assertFalse("Unconnected service-instance has unchanged invariant",
+ g.V().has("aai-node-type", "service-instance").has("service-instance-id", "wrong").next()
+ .property("model-invariant-id-local").isPresent());
+ assertFalse("Unconnected service-instance has unchanged version",
+ g.V().has("aai-node-type", "service-instance").has("service-instance-id", "wrong").next()
+ .property("model-version-id-local").isPresent());
+
+ assertEquals("Service-instance connected to unctouched generic-vnf has unchanged invariant", "test",
+ g.V().has("aai-node-type", "service-instance").has("service-instance-id", "connected-wrong")
+ .next().value("model-invariant-id-local"));
+ assertEquals("Service-instance connected to untouched generic-vnf has unchanged version", "test",
+ g.V().has("aai-node-type", "service-instance").has("service-instance-id", "connected-wrong")
+ .next().value("model-version-id-local"));
+
+ assertFalse("Vf-module connected to untouched generic-vnf has unchanged invariant",
+ g.V().has("aai-node-type", "vf-module").has("vf-module-id", "bad")
+ .next().property("model-invariant-id-local").isPresent());
+ assertFalse("Vf-module connected to untouched generic-vnf has unchanged version",
+ g.V().has("aai-node-type", "vf-module").has("vf-module-id", "bad")
+ .next().property("model-version-id-local").isPresent());
+
+ assertTrue("Untouched vserver still connected to image",
+ g.V().has("aai-node-type", "vserver").has("vserver-id", "unchanged").out("org.onap.relationships.inventory.Uses")
+ .has("aai-node-type", "image").has("image-id", "image-bad").hasNext());
+ }
+
+ @Test
+ public void testGetAffectedNodeTypes() {
+ Optional<String[]> types = migration.getAffectedNodeTypes();
+ Optional<String[]> expected = Optional.of(new String[]{"generic-vnf", "service-instance", "vf-module", "vserver", "image"});
+
+ assertNotNull(types);
+ assertArrayEquals(expected.get(), types.get());
+ }
+
+ @Test
+ public void testGetMigrationName() {
+ String migrationName = migration.getMigrationName();
+
+ assertNotNull(migrationName);
+ assertEquals("MigrateRadcomChanges", migrationName);
+ }
+}
diff --git a/src/test/java/org/onap/aai/util/SendMigrationNotificationsTest.java b/src/test/java/org/onap/aai/util/SendMigrationNotificationsTest.java
index 6719d0f..c7ca3d3 100644
--- a/src/test/java/org/onap/aai/util/SendMigrationNotificationsTest.java
+++ b/src/test/java/org/onap/aai/util/SendMigrationNotificationsTest.java
@@ -71,30 +71,35 @@ public class SendMigrationNotificationsTest extends AAISetup {
Vertex pnf1 = g.addV()
.property("aai-node-type", "pnf")
.property("pnf-name", SendMigrationNotifications.class.getSimpleName()+"-pnf-1")
+ .property("aai-uri", "/network/pnfs/pnf/" + SendMigrationNotifications.class.getSimpleName()+"-pnf-1")
.property(AAIProperties.RESOURCE_VERSION, "123")
.next();
Vertex pnf2 = g.addV()
.property("aai-node-type", "pnf")
.property("pnf-name", SendMigrationNotifications.class.getSimpleName()+"-pnf-2")
+ .property("aai-uri", "/network/pnfs/pnf/" + SendMigrationNotifications.class.getSimpleName()+"-pnf-2")
.property(AAIProperties.RESOURCE_VERSION, "456")
.next();
Vertex pnf3 = g.addV()
.property("aai-node-type", "pnf")
.property("pnf-name", SendMigrationNotifications.class.getSimpleName()+"-pnf-3")
+ .property("aai-uri", "/network/pnfs/pnf/" + SendMigrationNotifications.class.getSimpleName()+"-pnf-3")
.property(AAIProperties.RESOURCE_VERSION, "111")
.next();
Vertex pinterface1 = g.addV()
.property("aai-node-type", "p-interface")
.property("interface-name", SendMigrationNotifications.class.getSimpleName()+"-pinterface-1")
+ .property("aai-uri", "/network/pnfs/pnf/" + SendMigrationNotifications.class.getSimpleName()+"-pnf-1" + "/p-interfaces/p-interface/" + SendMigrationNotifications.class.getSimpleName()+"-pinterface-1")
.property(AAIProperties.RESOURCE_VERSION, "789")
.next();
Vertex pserver1 = g.addV()
.property("aai-node-type", "pserver")
.property("hostname", SendMigrationNotifications.class.getSimpleName()+"-pserver-1")
+ .property("aai-uri", "/cloud-infrastructure/pservers/pserver/" + SendMigrationNotifications.class.getSimpleName()+"-pserver-1")
.property(AAIProperties.RESOURCE_VERSION, "333")
.next();
diff --git a/src/test/resources/groomingInput b/src/test/resources/groomingInput
new file mode 100644
index 0000000..4189b0f
--- /dev/null
+++ b/src/test/resources/groomingInput
@@ -0,0 +1,51 @@
+ ============ Summary ==============
+Ran PARTIAL data grooming just looking at data added/updated in the last 100 minutes.
+
+Ran these nodeTypes:
+
+There were this many delete candidates from previous run = 0
+Deleted this many delete candidates = 0
+Dummy-index-update to delete candidates = 0
+Total number of nodes looked at = 0
+Ghost Nodes identified = 0
+Orphan Nodes identified = 0
+Missing aai-node-type Nodes identified = 0
+Bad Edges identified = 3
+Duplicate Groups count = 0
+MisMatching Label/aai-node-type count = 0
+
+ ------------- Delete Candidates ---------
+DeleteCandidate: Bad EDGE Edge-id = [c9c-j28-74l-izc]
+DeleteCandidate: Bad EDGE Edge-id = [8oz-cns-36d-cso]
+DeleteCandidate: Bad EDGE Edge-id = [9w5-9m0-f8d1-9i0]
+
+-- NOTE - To see DeleteCandidates for Duplicates, you need to look in the Duplicates Detail section below.
+
+ ------------- GHOST NODES - detail
+ ------------- Missing aai-node-type NODES - detail:
+ ------------- Missing Dependent Edge ORPHAN NODES - detail:
+ ------------- EDGES pointing to empty/bad vertices:
+> Edge pointing to bad vertex (Vid = 24600) EdgeId = c9c-j28-74l-izc
+Label: [org.onap.relationships.inventory.MemberOf]
+Prop: [p[private->false]], val = [false]
+Prop: [p[aai-uuid->9eb4b690-0572-4504-9]], val = [9eb4b690-0572-4504-97d1-c4870108c7ea]
+Prop: [p[delete-other-v->NONE]], val = [NONE]
+Prop: [p[contains-other-v->NONE]], val = [NONE]
+Prop: [p[prevent-delete->IN]], val = [IN]
+
+> Edge pointing to bad vertex (Vid = 16408) EdgeId = 8oz-cns-36d-cso
+Label: [org.onap.relationships.inventory.BelongsTo]
+Prop: [p[private->false]], val = [false]
+Prop: [p[prevent-delete->IN]], val = [IN]
+Prop: [p[contains-other-v->IN]], val = [IN]
+Prop: [p[aai-uuid->c7a0abfd-85eb-4893-8]], val = [c7a0abfd-85eb-4893-8440-a50d21eb8460]
+Prop: [p[delete-other-v->NONE]], val = [NONE]
+
+> Edge pointing to bad vertex (Vid = 12312) EdgeId = 9w5-9m0-f8d1-9i0
+Label: [BadEdge]
+
+ ------------- Duplicates:
+ ------------- Mis-matched Label/aai-node-type Nodes:
+
+ ------------- Got these errors while processing:
+
diff --git a/src/test/resources/migration-input-files/ALTS-migration-data/ALTS-migration-input.csv b/src/test/resources/migration-input-files/ALTS-migration-data/ALTS-migration-input.csv
new file mode 100644
index 0000000..1353a6e
--- /dev/null
+++ b/src/test/resources/migration-input-files/ALTS-migration-data/ALTS-migration-input.csv
@@ -0,0 +1,5 @@
+SOFTWARE_ASSET_TAG,SOFTWARE_PACKAGE_NAME,SOFTWARE_PACKAGE_VERSION,HOST_NAME,OS_AND_VERSION,TRACKING_LICENSE,LICENSE_KEY,NUM_CPUS,NUM_CORES,VPMO_NUMBER,SWM_USER_ID,USED,UPDATE_DATE,REP_UPDATE,PHONE_HOME_DATE,RESOURCE_UUID,PURCHASING_SYSTEM_SOURCE,ASSIGNMENT_STATUS,ASSIGNMENT_DATE,VNF_ID,LICENSE_NUMBER,INVARIANT_UUID
+new-ruuid-entitlement,guuid-entitlement,Unallocated,NEWHOST-123456,Unallocated,N,,,,,,Y,1-Jul-16,1-Jul-16,,GPS-45908182,GPS,in use,1-Jul-16,123456789,,
+new-ruuid-license,guuid-license,Unallocated,NEWHOST-123456,Unallocated,N,,,,,,Y,1-Jul-16,1-Jul-16,,GPS-45908182,GPS,in use,1-Jul-16,123456789,,
+new-ruuid-entitlement2,guuid,Unallocated,NEWHOST-123456,Unallocated,N,,,,,,Y,1-Jul-16,1-Jul-16,,GPS-45908182,GPS,in use,1-Jul-16,23456789,,
+new-ruuid-license2,guuid,Unallocated,NEWHOST-123456,Unallocated,N,,,,,,Y,1-Jul-16,1-Jul-16,,GPS-45908182,GPS,in use,1-Jul-16,23456789,,
diff --git a/src/test/resources/migration-input-files/CloudRegion-ART-migration-data/CloudRegion-ART-migration-data.csv b/src/test/resources/migration-input-files/CloudRegion-ART-migration-data/CloudRegion-ART-migration-data.csv
new file mode 100644
index 0000000..e087cff
--- /dev/null
+++ b/src/test/resources/migration-input-files/CloudRegion-ART-migration-data/CloudRegion-ART-migration-data.csv
@@ -0,0 +1,8 @@
+Region,Alias,Production,Upgrade Cycle
+akr1,,ORT,E
+akr1b,,ST,C
+all1,,TEST,D
+all1b,,ORT,G
+alp1,,E2E,G
+alp1b,,TEST,E
+ams1b,amsnl1b,ST,B
diff --git a/src/test/resources/migration-input-files/VNT-migration-data/VNT-migration-input.csv b/src/test/resources/migration-input-files/VNT-migration-data/VNT-migration-input.csv
new file mode 100644
index 0000000..bade411
--- /dev/null
+++ b/src/test/resources/migration-input-files/VNT-migration-data/VNT-migration-input.csv
@@ -0,0 +1,24 @@
+"entitlement-pool-uuid vendor-allowed-max-bandwidth (VNT)"
+"599a2d74-cfbd-413d-aedb-ec4875817313 1000"
+"ea9a547e-137b-48e9-a788-c3fb4e631a2a 3000"
+"8ce33a8c-b83f-4103-9967-caf95dc47009 10000"
+"d3d93cc4-8961-43ef-a916-161107fe2721 400"
+"63a5bd41-4e43-4c14-8f68-1d518970cc2e 100"
+"4b3cc5a8-39bb-46a3-b112-f7041f33c8b5 10000"
+"1b33b22f-559e-441f-ab5d-01be6d0e6fd9 100"
+"e40a3806-ea7f-43cd-99d0-7694d7daff24 400"
+"f8a20afe-078b-47eb-b039-8ad747799274 200"
+"c00d30be-8db2-4c2c-99af-7e6fc89fba74 3000"
+"360d847c-76e9-403c-9c3c-364dc07eed16 3000"
+"d4248a5a-95d1-42a6-8bec-59dd76dc757f 200"
+"e60183ad-5664-4911-a53b-3cd8639569b3 400"
+"867cc331-59b6-4432-a7e4-2734798a9d1d 1000"
+"6813c65c-7c1c-4bcf-8330-70828fa776c3 100"
+"82530f84-05d6-4548-a3de-8e968d099522 200"
+"8b176fde-7e7d-4d82-a02a-1bf2dc9a1cbf 1000"
+"ed88c374-aa3e-4027-b05e-f58cb95e99c7 3000"
+"987750b0-e3ac-42d0-b491-76de11cac222 1000"
+"3f9000aa-4fca-405e-ac5a-a67080ed91e5 100"
+"275829e8-6132-44d7-b001-d10043f5ad2e 400"
+"09b46095-9424-4f06-bbcd-1283f70d3d3d 10000"
+"16a0d09c-4d56-4cfd-a3e3-fa637aa20b28 200"
diff --git a/src/test/resources/migration-input-files/radcom-changes/INPUT-MODEL.csv b/src/test/resources/migration-input-files/radcom-changes/INPUT-MODEL.csv
new file mode 100644
index 0000000..17c9a11
--- /dev/null
+++ b/src/test/resources/migration-input-files/radcom-changes/INPUT-MODEL.csv
@@ -0,0 +1,9 @@
+Model-type,vnf-type,model-invariant-id,model-version-id,model-customization-id,model-name,image-name
+Service,test,new-service-inv,new-service-ver,,,
+VNF-resource,test,new-resource-inv,new-resource-ver,new-resource-cust,,
+vf-module-1,,,,,model-1,image-1
+vf-module-2,,,,,model-2,image-2
+no-invariant,,,,,model-3,
+no-ver,,,,,model-4,keep-image
+no-ids,,,,,model-5,
+
diff --git a/src/test/resources/migration-input-files/radcom-changes/INPUT-VNF.csv b/src/test/resources/migration-input-files/radcom-changes/INPUT-VNF.csv
new file mode 100644
index 0000000..2cbe329
--- /dev/null
+++ b/src/test/resources/migration-input-files/radcom-changes/INPUT-VNF.csv
@@ -0,0 +1,12 @@
+vnf-name,vnf-type
+name-1,test
+name-2,test
+no-service,test
+no-invariant,test
+no-version,test
+no-customization,test
+no ids,test
+many-service-1,test
+many-service-2,test
+multi-name,test
+wrong-type,test
diff --git a/src/test/resources/migration-input-files/sarea-inventory/circuitIds.csv b/src/test/resources/migration-input-files/sarea-inventory/circuitIds.csv
new file mode 100644
index 0000000..f1a8caf
--- /dev/null
+++ b/src/test/resources/migration-input-files/sarea-inventory/circuitIds.csv
@@ -0,0 +1,6 @@
+pnf,port-aid,existing-reservation-circuit-id,existing-alias-collector-circuit-id ,new-reservation-circuit-id,new-alias-collector-circuit-id
+pnf-1,p-interface-1,1,,10,
+pnf-2,p-interface-2,2,,20,
+pnf-3,p-interface-3,,,30,
+pnf-4,p-interface-4,3,,,
+pnf-5,p-interface-5,,,,
diff --git a/src/test/resources/migration-input-files/sarea-inventory/hub.csv b/src/test/resources/migration-input-files/sarea-inventory/hub.csv
new file mode 100644
index 0000000..45d1e1c
--- /dev/null
+++ b/src/test/resources/migration-input-files/sarea-inventory/hub.csv
@@ -0,0 +1,8 @@
+ptnii-name,internal-vlan,uni-svlan,nni-svlan,evc-name
+SGSNGP2002MG2,4054,740,6,evc-name-1
+PHMKTI1002MG2,4084,486,16,evc-name-2
+N/A,,,,
+SGSNGP2002MG2,4054,740,12,evc-name-2
+SGSNGP2002MG2,4054,740,12,evc-name-2
+SGSNGP2002MG2,4054,740,12,evc-name-3
+SGSNGP2002MG2,4054,740,12,evc-name-4
diff --git a/src/test/resources/migration-input-files/sarea-inventory/inv.csv b/src/test/resources/migration-input-files/sarea-inventory/inv.csv
new file mode 100644
index 0000000..33463ec
--- /dev/null
+++ b/src/test/resources/migration-input-files/sarea-inventory/inv.csv
@@ -0,0 +1,5 @@
+ptnii-name,fic,equipment-model,equipment-role,equipment-role-additional,ip-addr,subnet-mask,slot-name,card-type,card-port-lock,card-vlan-lock,port-aid,port-type,port-role,port-lock,vlan-lock,reservation-name,collector-interconnect-type,tag-mode,media-type,media-speed-value+media-speed-units,uni-cir-value+uni-cir-units,evc-name
+pnf-name-collector-1,06000D.121,5150,AED,,2001:1890:fcfe:7000:7021:0:1:2,64,,,,,"1.7 ",SFP_1GE/Ethernet_10/100/1000M,ACCESS,N,N,M0651881_ST,SHARED,DOUBLE,SFP-1GE-LX,1000Mbps,,evc-name-1
+pnf-name-collector-1,06000D.121,5150,AED,,2001:1890:fcfe:7000:7021:0:1:2,64,,,,,"1.8 ",SFP_1GE/Ethernet_10/100/1000M,ACCESS,N,N,M0651882_ST,SHARED,DOUBLE,SFP-1GE-LX,1000Mbps,,evc-name-3
+pnf-name-1,06000D.121,5150,AED,,2001:1890:fcfe:7000:7021:0:1:2,64,,,,,1.1,SFP_1GE/Ethernet_10/100/1000M,ACCESS,N,N,M0651882_ST,SHARED,DOUBLE,SFP-1GE-LX,1000Mbps,,evc-name-3
+pnf-name-1,06000D.121,5150,AED,,2001:1890:fcfe:7000:7021:0:1:2,64,,,,,1.2,SFP_1GE/Ethernet_10/100/1000M,ACCESS,N,N,M0651882_ST,SHARED,DOUBLE,SFP-1GE-LX,1000Mbps,,evc-name-3
diff --git a/src/test/resources/migration-input-files/sarea-inventory/ivlanData.csv b/src/test/resources/migration-input-files/sarea-inventory/ivlanData.csv
new file mode 100644
index 0000000..2085a5b
--- /dev/null
+++ b/src/test/resources/migration-input-files/sarea-inventory/ivlanData.csv
@@ -0,0 +1,9 @@
+EVC Name, PNF (PTNII), Interface AID, ivlan,UNI_NNI
+test/evc/one, pnf1,11111.1,111,UNI
+test/evc/one, pnf1, lag-interface1,222,UNI
+test/evc/one, pnf1,11111.2,333,UNI
+test/evc/one, pnf1, lag-interface2,444,UNI
+test/evc/one_2, pnf1,11111.3,555,UNI
+test/evc/one_2, pnf1, lag-interface3,666,UNI
+test/evc/two, pnf2,22222.2,777,UNI
+test/evc/two, pnf2, lag-interface2,888,UNI
diff --git a/src/test/resources/migration-input-files/sarea-inventory/path.csv b/src/test/resources/migration-input-files/sarea-inventory/path.csv
new file mode 100644
index 0000000..e39b5cf
--- /dev/null
+++ b/src/test/resources/migration-input-files/sarea-inventory/path.csv
@@ -0,0 +1,11 @@
+pe/vpe-name,evc-name,subscriber-name,esp-name,network-side-circuit-id,network-side-tag-mode,cvlan,svlan,ptnii-name,ipv4 MGMT Address/Loopback 0,ipv6 MGMT Address,slot-name,port-aid,port-type,esp-side-circuit-id,esp-side-tag-mode,cvlan,svlan,ptnii-name,ipv4 MGMT Address/Loopback 0,ipv6 MGMT Address,slot-name,port-aid,port-type
+SGSNGP3001ME2,evc-name-4,AT&T Global Access Management_000000000,ST,IZEZ.508988..ATI,DOUBLE,33,15,pnf-name-1,32.120.75.3,2001:1890:fcfe:7000:7021:0:1:1,,1.1,SFP_1GE/Ethernet_10/100/1000M,M0630051,DOUBLE,,15,pnf-name-1,32.120.75.3,2001:1890:fcfe:7000:7021:0:1:1,,1.41,SFP_1GE/Ethernet_10/100/1000M
+SGSNGP3001ME2,evc-name-4,AT&T Global Access Management_000000000,ST,IZEZ.508988..ATI,DOUBLE,33,15,pnf-name-1,32.120.75.3,2001:1890:fcfe:7000:7021:0:1:1,,1.1,SFP_1GE/Ethernet_10/100/1000M,M0630051,DOUBLE,,15,pnf-name-1,32.120.75.3,2001:1890:fcfe:7000:7021:0:1:1,,1.41,SFP_1GE/Ethernet_10/100/1000M
+SGSNGP3001ME2,evc-name-1,AT&T Global Access Management_000000000,ST,IZEZ.508988..ATI,DOUBLE,33,15,pnf-name-1,32.120.75.3,2001:1890:fcfe:7000:7021:0:1:1,,1.1,SFP_1GE/Ethernet_10/100/1000M,M0630051,DOUBLE,,15,pnf-name-1,32.120.75.3,2001:1890:fcfe:7000:7021:0:1:1,,1.41,SFP_1GE/Ethernet_10/100/1000M
+PLWRSW1002ME2,evc-name-2,AT&T Global Access Management_000000000,BPT,BFEZ.552785..ATI,DOUBLE,,14,pnf-name-2,32.109.138.34,2001:1890:fcfe:4000:6161:0:1:1,"MODULE2 ",ae1_2.1,XFP_10GE,66595,DOUBLE,,401,pnf-name-2,32.109.138.34,2001:1890:fcfe:4000:6161:0:1:1,,1.25,SFP_1GE/Ethernet_10/100/1000M
+,evc-name-2,,,IZEZ.517090..ATI,DOUBLE,,4,pnf-name-3,32.109.138.50,2001:1890:fcfe:4000:6161:0:1:2,,1.32,SFP_1GE/Ethernet_10/100/1000M,BFEZ.552785..ATI,DOUBLE,,14,pnf-name-3,32.109.138.50,2001:1890:fcfe:4000:6161:0:1:2,MODULE2,ae1_2.1,XFP_10GE
+SGSNGP2003ME2,evc-name-3,AT&T Global Access Management_000000000,ST,BFEZ.536900..ATI,DOUBLE,34,740,pnf-name-4,32.120.75.18,2001:1890:fcfe:7000:7021:0:1:2,"MODULE3 ",ae101_3.1,XFP_10GE,M0651881,DOUBLE,34,8,pnf-name-4,32.120.75.18,2001:1890:fcfe:7000:7021:0:1:2,,1.7,SFP_1GE/Ethernet_10/100/1000M
+,evc-name-3,,,BFEZ.542287..ATI,DOUBLE,37,740,pnf-name-5,32.109.201.14,,,104_4,SFP_1GE/SFP+_10GE,BFEZ.536900..ATI,DOUBLE,35,740,pnf-name-5,32.109.201.14,,,101_1,SFP_1GE/SFP+_10GE
+,evc-name-3,,,IZEZ.597112..ATI,DOUBLE,36,3,pnf-name-6,32.120.75.66,2001:1890:fcfe:7000:7021:0:1:5,,1.39,SFP_1GE/Ethernet_10/100/1000M,BFEZ.542287..ATI,DOUBLE,36,740,pnf-name-6,32.120.75.66,2001:1890:fcfe:7000:7021:0:1:5,MODULE3,ae104_3.1,XFP_10GE
+SGSNGP2003ME2,evc-name-3,AT&T Global Access Management_000000000,ST,BFEZ.536900..ATI,DOUBLE,34,740,pnf-name-1,32.120.75.18,2001:1890:fcfe:7000:7021:0:1:2,"MODULE3 ",1.41,XFP_10GE,M0651881,DOUBLE,34,8,pnf-name-1,32.120.75.18,2001:1890:fcfe:7000:7021:0:1:2,,1.1,SFP_1GE/Ethernet_10/100/1000M
+SGSNGP2003ME2,evc-name-3,AT&T Global Access Management_000000000,ST,BFEZ.536900..ATI,DOUBLE,34,740,pnf-name-1,32.120.75.18,2001:1890:fcfe:7000:7021:0:1:2,"MODULE3 ",1.A1,XFP_10GE,M0651881,DOUBLE,34,8,pnf-name-1,32.120.75.18,2001:1890:fcfe:7000:7021:0:1:2,,1.1,SFP_1GE/Ethernet_10/100/1000M
diff --git a/src/test/resources/migration-input-files/sarea-inventory/sar.csv b/src/test/resources/migration-input-files/sarea-inventory/sar.csv
new file mode 100644
index 0000000..e565bbd
--- /dev/null
+++ b/src/test/resources/migration-input-files/sarea-inventory/sar.csv
@@ -0,0 +1,5 @@
+evc-name,subscriber-name,esp-name,bearer-circuit-id,bearer-tag-mode,cvlan,svlan,ptnii-name,slot-name,port-aid,port-type,collector-circuit-id,collector-tag-mode,cvlan,svlan,ptnii-name,slot-name,port-aid,port-type,espEVCCircuit ID,EVC Access CIR
+evc-name-1,AT&T Global Access Management_000000000,PLDT,IZEZ.573163..ATI,DOUBLE,,2,pnf-name-bearer-1,,p-int-bearer-1,SFP_1GE/Ethernet_10/100/1000M,A&TAP01-052013-14812_PLDT,DOUBLE,,41,pnf-name-collector-1,,p-int-collector-1,SFP_1GE/Ethernet_10/100/1000M,,40Mbps
+evc-name-2,AT&T Global Access Management_000000000,PLDT,IZEZ.573163..ATI,DOUBLE,,2,pnf-name-bearer-2,,p-int-bearer-2,SFP_1GE/Ethernet_10/100/1000M,A&TAP01-052013-14812_PLDT,DOUBLE,,41,pnf-name-collector-1,,p-int-collector-2,SFP_1GE/Ethernet_10/100/1000M,,4Mbps
+evc-name-3,AT&T Global Access Management_000000000,PLDT,IZEZ.573163..ATI,DOUBLE,,2,pnf-name-bearer-1,,p-int-bearer-2,SFP_1GE/Ethernet_10/100/1000M,A&TAP01-052013-14812_PLDT,DOUBLE,,41,pnf-name-collector-1,,p-int-collector-2,SFP_1GE/Ethernet_10/100/1000M,,4Mbps
+evc-name-4,AT&T Global Access Management_000000000,PLDT,IZEZ.573163..ATI,DOUBLE,,2,pnf-name-bearer-1,,p-int-bearer-1,SFP_1GE/Ethernet_10/100/1000M,A&TAP01-052013-14812_PLDT,DOUBLE,,41,pnf-name-collector-1,,p-int-collector-1,SFP_1GE/Ethernet_10/100/1000M,,40Mbps
diff --git a/src/test/resources/migration-input-files/sarea-inventory/secondary-hub-path.csv b/src/test/resources/migration-input-files/sarea-inventory/secondary-hub-path.csv
new file mode 100644
index 0000000..fc833c4
--- /dev/null
+++ b/src/test/resources/migration-input-files/sarea-inventory/secondary-hub-path.csv
@@ -0,0 +1,11 @@
+pe/vpe-name,evc-name,subscriber-name,esp-name,network-side-circuit-id,network-side-tag-mode,cvlan,svlan,ptnii-name,ipv4 MGMT Address/Loopback 0,ipv6 MGMT Address,slot-name,port-aid,port-type,esp-side-circuit-id,esp-side-tag-mode,cvlan,svlan,ptnii-name,ipv4 MGMT Address/Loopback 0,ipv6 MGMT Address,slot-name,port-aid,port-type
+SGSNGP3001ME2,evc-name-4,AT&T Global Access Management_000000000,ST,IZEZ.508988..ATI,DOUBLE,33,15,pnf-name-1,32.120.75.3,2001:1890:fcfe:7000:7021:0:1:1,,1.1,SFP_1GE/Ethernet_10/100/1000M,M0630051,DOUBLE,,15,pnf-name-1,32.120.75.3,2001:1890:fcfe:7000:7021:0:1:1,,1.41,SFP_1GE/Ethernet_10/100/1000M
+SGSNGP3001ME2,evc-name-4,AT&T Global Access Management_000000000,ST,IZEZ.508988..ATI,DOUBLE,33,15,pnf-name-1,32.120.75.3,2001:1890:fcfe:7000:7021:0:1:1,,1.1,SFP_1GE/Ethernet_10/100/1000M,M0630051,DOUBLE,,15,pnf-name-1,32.120.75.3,2001:1890:fcfe:7000:7021:0:1:1,,1.41,SFP_1GE/Ethernet_10/100/1000M
+SGSNGP3001ME2,evc-name-1,AT&T Global Access Management_000000000,ST,IZEZ.508988..ATI,DOUBLE,33,15,pnf-name-1,32.120.75.3,2001:1890:fcfe:7000:7021:0:1:1,,1.1,SFP_1GE/Ethernet_10/100/1000M,M0630051,DOUBLE,,15,pnf-name-1,32.120.75.3,2001:1890:fcfe:7000:7021:0:1:1,,1.41,SFP_1GE/Ethernet_10/100/1000M
+PLWRSW1002ME2,evc-name-2,AT&T Global Access Management_000000000,BPT,BFEZ.552785..ATI,DOUBLE,,14,pnf-name-2,32.109.138.34,2001:1890:fcfe:4000:6161:0:1:1,"MODULE2 ",ae1_2.1,XFP_10GE,66595,DOUBLE,,401,pnf-name-2,32.109.138.34,2001:1890:fcfe:4000:6161:0:1:1,,1.25,SFP_1GE/Ethernet_10/100/1000M
+,evc-name-2,,,IZEZ.517090..ATI,DOUBLE,,4,pnf-name-3,32.109.138.50,2001:1890:fcfe:4000:6161:0:1:2,,1.32,SFP_1GE/Ethernet_10/100/1000M,BFEZ.552785..ATI,DOUBLE,,14,pnf-name-3,32.109.138.50,2001:1890:fcfe:4000:6161:0:1:2,MODULE2,ae2_2.1,XFP_10GE
+SGSNGP2003ME2,evc-name-3,AT&T Global Access Management_000000000,ST,BFEZ.536900..ATI,DOUBLE,34,740,pnf-name-4,32.120.75.18,2001:1890:fcfe:7000:7021:0:1:2,"MODULE3 ",ae101_3.1,XFP_10GE,M0651881,DOUBLE,34,8,pnf-name-4,32.120.75.18,2001:1890:fcfe:7000:7021:0:1:2,,1.7,SFP_1GE/Ethernet_10/100/1000M
+,evc-name-3,,,BFEZ.542287..ATI,DOUBLE,37,740,pnf-name-5,32.109.201.14,,,104_4,SFP_1GE/SFP+_10GE,BFEZ.536900..ATI,DOUBLE,35,740,pnf-name-5,32.109.201.14,,,101_1,SFP_1GE/SFP+_10GE
+,evc-name-3,,,IZEZ.597112..ATI,DOUBLE,36,3,pnf-name-6,32.120.75.66,2001:1890:fcfe:7000:7021:0:1:5,,1.39,SFP_1GE/Ethernet_10/100/1000M,BFEZ.542287..ATI,DOUBLE,36,740,pnf-name-6,32.120.75.66,2001:1890:fcfe:7000:7021:0:1:5,MODULE3,ae104_3.1,XFP_10GE
+SGSNGP2003ME2,evc-name-3,AT&T Global Access Management_000000000,ST,BFEZ.536900..ATI,DOUBLE,34,740,pnf-name-1,32.120.75.18,2001:1890:fcfe:7000:7021:0:1:2,"MODULE3 ",1.41,XFP_10GE,M0651881,DOUBLE,34,8,pnf-name-1,32.120.75.18,2001:1890:fcfe:7000:7021:0:1:2,,1.1,SFP_1GE/Ethernet_10/100/1000M
+SGSNGP2003ME2,evc-name-3,AT&T Global Access Management_000000000,ST,BFEZ.536900..ATI,DOUBLE,34,740,pnf-name-1,32.120.75.18,2001:1890:fcfe:7000:7021:0:1:2,"MODULE3 ",1.A1,XFP_10GE,M0651881,DOUBLE,34,8,pnf-name-1,32.120.75.18,2001:1890:fcfe:7000:7021:0:1:2,,1.1,SFP_1GE/Ethernet_10/100/1000M
diff --git a/src/test/resources/migration-input-files/widget-model-migration-data/widget-model-migration-input.csv b/src/test/resources/migration-input-files/widget-model-migration-data/widget-model-migration-input.csv
new file mode 100644
index 0000000..0d723b5
--- /dev/null
+++ b/src/test/resources/migration-input-files/widget-model-migration-data/widget-model-migration-input.csv
@@ -0,0 +1,92 @@
+action,fd7fb09e-d930-41b9-b83f-cfde9df48640,af593b4b-490e-4665-ad74-2f6351c0a7ce
+action-data,2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd,9551346c-7d8b-4daf-9926-b93e96e2344a
+allotted-resource,7ad0915f-25c0-4a70-b9bc-185a75f87564,f6d6a23d-a1a9-48ff-8419-b6530da2d381
+availability-zone,6c092fb1-21b2-456b-9e01-67fb4de1896e,61b88c01-d819-41c0-8e21-7fd7ba47148e
+az-and-dvs-switches,b2dea88d-78a0-49bf-95c9-5819df08e966,53dc00d4-e6d9-48ec-b6cc-3d3797e9b896
+class-of-service,d2fb27cc-15eb-4c4e-828e-71d41aaecc5b,18094b19-d16d-4822-8acf-e92c6aefa178
+cloud-region,2a160989-b202-47dd-874b-4a0f275998f7,425b2158-e51d-4509-9945-dad4556474a3
+complex,3a8ab1ee-9220-4fe8-b89c-9251d160ddc2,af91c2f7-35fc-43cf-a13d-443f385b2353
+configuration,5a175add-57e4-4a5d-8b02-c36f1d69c52b,166c050d-f69d-4305-943e-0bc58c3a26cf
+connector,22104c9f-29fd-462f-be07-96cd6b46dd33,4c01c948-7607-4d66-8a6c-99c2c2717936
+constrained-element-set,01102126-9c04-4a89-945b-b131e61e95d7,c0292b4f-ee97-40cc-8c2e-f967c48f5701
+ctag-assignment,44e5cb1f-0938-41aa-b766-d4595109fe89,fcb8d46b-b656-4ad6-8fa4-22cef74b443f
+ctag-pool,2056c41f-23b9-4de7-9f50-819adad37d76,46c51d4e-d67e-4a9c-b1f5-49b1e9c6fcaa
+customer,d4df5c27-98a1-4812-a8aa-c17f055b7a3f,c1d4305f-cdbd-4bbe-9069-a2f4978fd89e
+cvlan-tag-entry,c3878ffb-8d85-4114-bee6-e4074a9db10b,245cf4b0-7cc5-4eea-bbd9-753e939adcab
+dvs-switch,4cb44ae8-e3ab-452a-9f95-bcc8a44c55ea,98fbb471-1f86-428e-bd8a-c8a25de6fa23
+edge-prop-names,f0442326-8201-4d0e-857c-74b4ddcbfc9f,7a08cad4-8759-46a5-8245-095d1ba57ac6
+element-choice-set,af27fbfd-598d-44da-aeae-0f9d3a5fcd6a,9a011958-7165-47a3-b872-00951d1f09ae
+entitlement,7e27ba2e-b7db-4e13-9fae-d142152ef98a,ae75b5a0-d5e1-4f3a-b8fb-37626a753da3
+esr-system-info,5ded840b-42aa-4692-a7ac-9a6ed5f3146b,0562518b-e5b3-49f4-8ad8-19b43766c79d
+flavor,36200fb5-f251-4f5d-a520-7c5ad5c2cd4b,bace8d1c-a261-4041-9e37-823117415d0f
+generic-vnf,93a6166f-b3d5-4f06-b4ba-aed48d009ad9,acc6edd8-a8d4-4b93-afaa-0994068be14c
+group-assignment,fe578080-ce19-4604-8760-fc264fbb2565,7cc05f25-7ba2-42b7-a237-c5662a1689e1
+image,f6a038c2-820c-42ba-8c2b-375e24e8f932,3f4c7204-739b-4bbb-87a7-8a6856439c90
+include-node-filter,f05f804d-7057-4ffe-bdc5-39f2f0c9c9fd,2a2d8ad2-af0a-4e1f-9982-0c899e7dc827
+instance-group,8e6ee9dc-9017-444a-83b3-219edb018128,3bf1e610-45f7-4ad6-b833-ca4c5ee6a3fd
+inventory-item,69957f4a-2155-4b95-8d72-d6dd9b88b27b,cd57d844-9017-4078-aa19-926935a3d77c
+inventory-item-data,0e54bb87-bd6e-4a2b-ad1c-6d935b87ae51,87a383ae-cf03-432e-a9de-04e6a622d0fd
+ipsec-configuration,d949fd10-36bf-408a-ac7a-cad5004d2e0d,aca4c310-cb45-42bd-9f88-73e40ba7b962
+key-data,c23ea04d-1a3b-453d-bc49-a6c783a5e92b,f5faa464-c2f2-4cc3-89d2-a90452dc3a07
+l-interface,a32613fd-18b9-459e-aab8-fffb3912966a,cea0a982-8d55-4093-921e-418fbccf7060
+l3-interface-ipv4-address-list,41e76b6f-1e06-4fd4-82cd-81c50fc4574b,aad85df2-09be-40fa-b867-16415e4e10e2
+l3-interface-ipv6-address-list,d040621d-541a-477b-bb1b-a2b61b14e295,82966045-43ee-4982-8307-7e9610866140
+l3-network,9111f20f-e680-4001-b83f-19a2fc23bfc1,3d560d81-57d0-438b-a2a1-5334dba0651a
+lag-interface,ce95f7c3-b61b-4758-ae9e-7e943b1c103d,e0ee9bde-c1fc-4651-a95d-8e0597bf7d70
+lag-link,d29a087a-af59-4053-a3f8-0f95a92faa75,86ffe6e5-4d0e-4cec-80b5-5c38aa3eff98
+license,6889274b-a1dc-40ab-9090-93677e13e2e6,b9a9b337-1f86-42d3-b9f9-f987a089507c
+license-key-resource,24b25f8c-b8bd-4c62-9421-87c12667aac9,9022ebfe-b54f-4911-a6b2-8c3f5ec189b7
+logical-link,a1481a38-f8ba-4ae4-bdf1-06c2c6af4c54,fe012535-2c31-4a39-a739-612374c638a0
+metadatum,6bae950e-8939-41d3-a6a7-251b03e4c1fc,86dbb63a-265e-4614-993f-6771c30b56a5
+model,1f51c05c-b164-4c27-9c03-5cbb239fd6be,06d1418a-5faa-452d-a94b-a2829df5f67b
+model-constraint,ad70dd19-f156-4fb5-a865-97b5563b0d37,c28966f3-e758-4483-b37b-a90b05d3dd33
+model-element,753e813a-ba9e-4a1d-ab34-b2f6dc6eec0c,2076e726-3577-477a-a300-7fa65cd4df11
+model-ver,93f2f8bc-cb12-4a01-96c8-3d2649e4ab8f,b5cd462f-e426-4146-b1fe-5475ae272c3d
+multicast-configuration,666a06ee-4b57-46df-bacf-908da8f10c3f,ea78c9e3-514d-4a0a-9162-13837fa54c35
+named-query,5c3b7c33-afa3-4be5-8da7-1a5ac6f99896,80b712fd-0ad3-4180-a99c-8c995cf1cc32
+named-query-element,204c641a-3494-48c8-979a-86856f5fd32a,3c504d40-b847-424c-9d25-4fb7e0a3e994
+network-policy,a0ccd9dc-7062-4940-9bcc-e91dd28af510,6aa05779-94d7-4d8b-9bee-59ef2ab0c246
+network-profile,01f45471-4240-498c-a9e1-235dc0b8b4a6,2734b44a-b8a2-40f6-957d-6256589e5d00
+newvce,7c79e11f-a408-4593-aa86-ba948a1236af,4b05ec9c-c55d-4987-83ff-e08d6ddb694f
+oam-network,f4fb34f3-fd6e-4a8f-a3fb-4ab61a343b79,2851cf01-9c40-4064-87d4-6184a6fcff35
+p-interface,d2cdb2d0-fc1f-4a57-a89e-591b1c4e3754,94043c37-4e73-439c-a790-0fdd697924cd
+physical-link,9c523936-95b4-4d7f-9f53-6bdfe0cf2c05,c822d81f-822f-4304-9623-1025b53da568
+pnf,e9f1fa7d-c839-418a-9601-03dc0d2ad687,862b25a1-262a-4961-bdaa-cdc55d69785a
+port-group,03e8bb6b-b48a-46ae-b5d4-e5af577e6844,8ce940fb-55d7-4230-9e7f-a56cc2741f77
+property-constraint,81706bbd-981e-4362-ae20-995cbcb2d995,f4a863c3-6886-470a-a6ae-05723837ea45
+pserver,72f0d495-bc27-4653-9e1a-eef76bd34bc9,6d932c8f-463b-4e76-83fb-87acfbaa2e2d
+related-lookup,0988bab5-bf4f-4938-a419-ab249867d12a,468f6f5b-2996-41bb-b2a3-7cf9613ebb9b
+reserved-prop-names,ac49d26d-9163-430e-934a-13b738a04f5c,0c3e0ba3-618c-498d-9127-c8d42b00170f
+result-data,4e9b50aa-5227-4f6f-b489-62e6bbc03c79,ff656f23-6185-406f-9006-4b26834f3e1c
+route-table-reference,fed7e326-03a7-45ff-a3f2-471470d268c4,a8614b63-2636-4c4f-98df-fd448c4241db
+routing-instance,3ccbcbc7-d19e-44d5-a52f-7e18aa8d69fa,1c2ded4f-8b01-4193-829c-966847dfec3e
+secondary-filter,1380619d-dd1a-4cec-b755-c6407833e065,738ff299-6290-4c00-8998-bd0e96a07b93
+segmentation-assignment,c5171ae0-44fb-4c04-b482-d56702241a44,6e814aee-46e1-4583-a9d4-0049bfd2b59b
+service,ecce2c42-3957-4ae0-9442-54bc6afe27b6,07a3a60b-1b6c-4367-8173-8014386f89e3
+service-capability,f9cfec1b-18da-4bba-bd83-4b26cca115cd,b1a7cc05-d19d-443b-a5d1-733e325c4232
+service-instance,46b92144-923a-4d20-b85a-3cbd847668a9,82194af1-3c2c-485a-8f44-420e22a9eaa4
+service-subscription,5e68299a-79f2-4bfb-8fbc-2bae877a2459,2e1a602a-acd8-4f78-94ff-618b802a303b
+site-pair,7106bc02-6552-4fc3-8a56-4f3df9034531,db63f3e6-f8d1-484e-8d5e-191600b7914b
+site-pair-set,a5c6c1bc-dc38-468e-9459-bb08f87247df,5d4dae3e-b402-4bfd-909e-ece12ff75d26
+snapshot,962a7c8b-687f-4d32-a775-fe098e214bcd,24de00ef-aead-4b52-995b-0adf8d4bd90d
+sriov-vf,1e8b331f-3d4a-4160-b7aa-f4d5a8916625,04b2935f-33c4-40a9-8af0-8b52690042dc
+start-node-filter,aad96fd3-e75f-42fc-9777-3450c36f1168,083093a3-e407-447a-ba5d-7583e4d23e1d
+subnet,f902a6bc-6be4-4fe5-8458-a6ec0056b374,1b2c9ba7-e449-4831-ba15-3073672f5ef2
+tagged-inventory-item-list,c246f6e2-e3a1-4697-94c0-5672a7fbbf04,e78a7eaa-f65d-4919-9c2b-5b258c8c4d7e
+tenant,abcc54bc-bb74-49dc-9043-7f7171707545,97c26c99-6870-44c1-8a07-1d900d3f4ce6
+tunnel-xconnect,e7cb4ca8-e1a5-4487-a716-4ae0bcd8aef5,50b9e2fa-005c-4bbe-b651-3251dece4cd8
+update-node-key,6004cfa6-eb6d-4062-971f-b1fde6b74aa0,fe81c801-f65d-408a-b2b7-a729a18f8154
+vce,b6cf54b5-ec45-43e1-be64-97b4e1513333,bab6dceb-e7e6-4301-a5e0-a7399b48d792
+vf-module,c00563ae-812b-4e62-8330-7c4d0f47088a,ef86f9c5-2165-44f3-8fc3-96018b609ea5
+vig-server,8e8c22f1-fbdf-48ea-844c-8bdeb44e7b16,bed7c3b7-35d0-4cd9-abde-41b20e68b28e
+virtual-data-center,6dd43ced-d789-47af-a759-d3abc14e3ac1,5150abcf-0c5f-4593-9afe-a19c48fc4824
+vlan,257d88a5-a269-4c35-944f-aca04fbdb791,d2b1eaf1-ae59-4116-9ee4-aa0179faa4f8
+vnf-image,c4d3e747-ba4a-4b17-9896-94c6f18c19d3,f9a628ff-7aa0-40e2-a93d-02d91c950982
+vnfc,5761e0a7-c6df-4d8a-9ebd-b8f445054dec,96129eb9-f0de-4e05-8af2-73146473f766
+volume,0fbe2e8f-4d91-4415-a772-88387049b38d,ddd739b4-2b25-46c4-affc-41a32af5cc42
+volume-group,99d44c90-1f61-4418-b9a6-56586bf38c79,fcec1b02-b2d0-4834-aef8-d71be04717dd
+vpe,203817d3-829c-42d4-942d-2a935478e993,053ec3a7-5b72-492d-b54d-123805a9b967
+vpls-pe,b1566228-6785-4ce1-aea2-053736f80341,457ba89b-334c-4fbd-acc4-160ac0e0cdc0
+vpn-binding,21a146e5-9901-448c-9197-723076770119,9e23b675-db2b-488b-b459-57aa9857baa0
+vserver,8ecb2c5d-7176-4317-a255-26274edfdd53,ff69d4e0-a8e8-4108-bdb0-dd63217e63c7
+zone,f7f21a66-4714-431c-af17-52d64e21de95,16f7cb93-e807-4065-816b-9cdf391d4992