update cacher repo with v15 54/76154/1
authorLaMont, William (wl2432) <wl2432@att.com>
Tue, 22 Jan 2019 20:02:47 +0000 (15:02 -0500)
committerLaMont, William (wl2432) <wl2432@att.com>
Tue, 22 Jan 2019 20:03:05 +0000 (15:03 -0500)
Issue-ID: AAI-2112
Change-Id: I8aab3d9c498d217638d50b8fde5f500b556d7fd0
Signed-off-by: LaMont, William (wl2432) <wl2432@att.com>
70 files changed:
pom.xml
src/main/docker/docker-entrypoint.sh
src/main/java/org/onap/aai/cacher/Application.java
src/main/java/org/onap/aai/cacher/common/MongoConfig.java
src/main/java/org/onap/aai/cacher/common/MongoHelperSingleton.java
src/main/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessor.java
src/main/java/org/onap/aai/cacher/dmaap/consumer/AAIParentEventConsumer.java
src/main/java/org/onap/aai/cacher/dmaap/consumer/DmaapConsumerSingleton.java
src/main/java/org/onap/aai/cacher/egestion/printer/strategy/AAIResourceGetAllPayloadPrinterStrategy.java
src/main/java/org/onap/aai/cacher/egestion/printer/strategy/NonePayloadPrinterStrategy.java
src/main/java/org/onap/aai/cacher/egestion/printer/strategy/PayloadPrinterType.java
src/main/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceDmaapParserStrategy.java [deleted file]
src/main/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceGetAllPayloadParserStrategy.java
src/main/java/org/onap/aai/cacher/injestion/parser/strategy/PayloadParserType.java
src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/AAIResourcesUriTemplates.java [moved from src/main/java/org/onap/aai/cacher/injestion/parser/AAIResourcesUriTemplates.java with 70% similarity]
src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/AAIUriSegment.java [new file with mode: 0644]
src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/AAIRelatedToDetails.java [new file with mode: 0644]
src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/AAIResourceDmaapParserStrategy.java [new file with mode: 0644]
src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/DmaapAction.java [new file with mode: 0644]
src/main/java/org/onap/aai/cacher/model/CacheEntry.java
src/main/java/org/onap/aai/cacher/service/helper/CacheHelperService.java
src/main/java/org/onap/aai/cacher/service/rest/CacheKeyService.java
src/main/java/org/onap/aai/cacher/service/rest/util/CacheKeyRequestValidation.java
src/main/java/org/onap/aai/cacher/service/tasks/ScheduledTasks.java
src/main/java/org/onap/aai/cacher/util/RestClient.java
src/main/java/org/onap/aai/cacher/web/JerseyConfiguration.java
src/main/resources/etc/appprops/aai-resources-uri-templates.properties
src/main/resources/etc/appprops/aaiDmaaPEventConsumer.properties
src/main/resources/etc/appprops/aaiconfig.properties
src/main/resources/etc/appprops/error.properties
src/main/resources/etc/appprops/initialcachekeyconfig.json
src/main/resources/etc/auth/aai-client-cert.p12 [deleted file]
src/main/resources/logback.xml
src/test/java/org/onap/aai/cacher/common/LimitTest.java [new file with mode: 0644]
src/test/java/org/onap/aai/cacher/common/MongoHelperSingletonNoFakeTest.java
src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessorScenariosTest.java
src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessorTest.java
src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIEventConsumerTest.java
src/test/java/org/onap/aai/cacher/injestion/parser/AAIResourcesUriTemplatesTest.java
src/test/java/org/onap/aai/cacher/injestion/parser/InjestionTestComponent.java
src/test/java/org/onap/aai/cacher/injestion/parser/PayloadParserServiceTest.java
src/test/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceDmaapParserStrategyTest.java [deleted file]
src/test/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceDmaapParserStrategyTestConstants.java
src/test/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/AAIResourceDmaapParserStrategyTest.java [new file with mode: 0644]
src/test/java/org/onap/aai/cacher/model/CacheKeyTest.java
src/test/java/org/onap/aai/cacher/service/helper/CacheHelperServiceScenariosTest.java
src/test/java/org/onap/aai/cacher/service/rest/util/CacheKeyRequestValidationTest.java
src/test/resources/test/payloads/dmaapEvents/address-list.json
src/test/resources/test/payloads/dmaapEvents/allotted-resource.json [new file with mode: 0644]
src/test/resources/test/payloads/dmaapEvents/create-generic-vnf-with-children-update-generic-vnf-property.json [new file with mode: 0644]
src/test/resources/test/payloads/dmaapEvents/createPserverCreateCRWithNestingAndRelsToUpdateRemovingARelTest.json [new file with mode: 0644]
src/test/resources/test/payloads/dmaapEvents/createPserverRelationshipsToNonExistingTest.json [new file with mode: 0644]
src/test/resources/test/payloads/dmaapEvents/createPserverWithNestedDeleteNested.json [new file with mode: 0644]
src/test/resources/test/payloads/dmaapEvents/createPserverWithoutNestedAddNested.json [new file with mode: 0644]
src/test/resources/test/payloads/dmaapEvents/cvlan-tag-entry-create.json [new file with mode: 0644]
src/test/resources/test/payloads/dmaapEvents/cvlan-tag-entry.json [new file with mode: 0644]
src/test/resources/test/payloads/dmaapEvents/cvlan-tag.json [new file with mode: 0644]
src/test/resources/test/payloads/dmaapEvents/deleteRelationship/1-create-logical-link.json
src/test/resources/test/payloads/dmaapEvents/deleteRelationship/2-create-generic-vnf.json
src/test/resources/test/payloads/dmaapEvents/deleteRelationship/3-create-rel-generic-vnf-vlan-to-logical-link.json
src/test/resources/test/payloads/dmaapEvents/deleteRelationship/4-delete-rel-to-generic-vnf-vlan-from-logical-link.json
src/test/resources/test/payloads/dmaapEvents/large-pserver.json
src/test/resources/test/payloads/dmaapEvents/linterfaceWithLinterfaceTest.json [new file with mode: 0644]
src/test/resources/test/payloads/dmaapEvents/nos.json
src/test/resources/test/payloads/dmaapEvents/vce.json
src/test/resources/test/payloads/json/generic-vnfs-one-with-nesting-with-address-list.json [new file with mode: 0644]
src/test/resources/test/payloads/json/generic-vnfs-one-with-nesting.json [new file with mode: 0644]
src/test/resources/test/payloads/json/one-cr-with-nested-dupe-get-all.json [new file with mode: 0644]
src/test/resources/test/payloads/json/pservers-one-with-nesting.json [new file with mode: 0644]
src/test/resources/test/payloads/json/test-empty.json [new file with mode: 0644]

diff --git a/pom.xml b/pom.xml
index fd8ed5b..de64ad2 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -71,7 +71,7 @@
 
                <start-class>org.onap.aai.cacher.Application</start-class>
 
-               <aai-core.version>1.3.0</aai-core.version>
+               <aai-core.version>1.4.1-SNAPSHOT</aai-core.version>
                <activemq.version>5.15.8</activemq.version>
                
                <!-- Start of the jacoco plugin properties -->
                        <version>2.0.1</version>
                </dependency>
                <dependency>
-                       <groupId>org.onap.aai.aai-common</groupId>
-                       <artifactId>aai-core</artifactId>
-                       <version>${aai-core.version}</version>
-                       <exclusions>
-                               <exclusion>
-                                       <groupId>com.sun.jersey</groupId>
-                                       <artifactId>jersey-core</artifactId>
-                               </exclusion>
-                               <exclusion>
-                                       <groupId>org.slf4j</groupId>
-                                       <artifactId>slf4j-log4j12</artifactId>
-                               </exclusion>
-                               <exclusion>
-                                       <groupId>org.apache.cxf</groupId>
-                                       <artifactId>cxf-core</artifactId>
-                               </exclusion>
-                       </exclusions>
-               </dependency>
-               <dependency>
-                       <groupId>commons-configuration</groupId>
-                       <artifactId>commons-configuration</artifactId>
-                       <version>${commons.configuration.version}</version>
-                       <exclusions>
-                               <exclusion>
-                                       <artifactId>commons-lang</artifactId>
-                                       <groupId>commons-lang</groupId>
-                               </exclusion>
-                       </exclusions>
-               </dependency>
-               <dependency>
-                       <groupId>com.att.eelf</groupId>
-                       <artifactId>eelf-core</artifactId>
-                       <version>${eelf.core.version}</version>
-               </dependency>
-               <dependency>
-                       <groupId>ch.qos.logback</groupId>
-                       <artifactId>logback-core</artifactId>
-                       <version>${logback.version}</version>
-               </dependency>
-               <dependency>
-                       <groupId>ch.qos.logback</groupId>
-                       <artifactId>logback-classic</artifactId>
-                       <version>${logback.version}</version>
-               </dependency>
-               <dependency>
-                       <groupId>ch.qos.logback</groupId>
-                       <artifactId>logback-access</artifactId>
-                       <version>${logback.version}</version>
-               </dependency>
+            <groupId>org.onap.aai.aai-common</groupId>
+            <artifactId>aai-core</artifactId>
+            <version>${aai-core.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.sun.jersey</groupId>
+                    <artifactId>jersey-core</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-log4j12</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.cxf</groupId>
+                    <artifactId>cxf-core</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
                <dependency>
-                       <groupId>junit</groupId>
-                       <artifactId>junit</artifactId>
-                       <scope>test</scope>
+                       <groupId>org.onap.aai.schema-service</groupId>
+                       <artifactId>aai-schema</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
                </dependency>
                <dependency>
-                       <groupId>org.mockito</groupId>
-                       <artifactId>mockito-all</artifactId>
-                       <version>${mockito.version}</version>
-                       <scope>test</scope>
-               </dependency>
+            <groupId>commons-configuration</groupId>
+            <artifactId>commons-configuration</artifactId>
+            <version>${commons.configuration.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>commons-lang</artifactId>
+                    <groupId>commons-lang</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>        
+        <dependency>
+            <groupId>com.att.eelf</groupId>
+            <artifactId>eelf-core</artifactId>
+            <version>${eelf.core.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <version>${logback.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>${logback.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-access</artifactId>
+            <version>${logback.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-all</artifactId>
+            <version>${mockito.version}</version>
+            <scope>test</scope>
+        </dependency>
                <dependency>
                        <groupId>org.skyscreamer</groupId>
                        <artifactId>jsonassert</artifactId>
         Note - Use of this dme2 dependency is itself a harm to spring boot as this
         dependency will crash the application without this exclusion
         since the dme2 dependency does shading so we need exclude the javax servlet
-
         <dependency>
             <groupId>com.att.aft</groupId>
             <artifactId>dme2</artifactId>
                <!-- mention the logback.xml location through system property or environment 
                        variable to edit logback.xml at run time -->
                <resources>
-                       <resource>
-                               <directory>${project.basedir}/src/main/swm</directory>
-                               <targetPath>${project.build.directory}/swm</targetPath>
-                               <filtering>false</filtering>
-                       </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/swm</directory>
+                <targetPath>${project.build.directory}/swm</targetPath>
+                <filtering>false</filtering>
+            </resource>                
                        <resource>
                                <directory>${project.basedir}/src/main/resources</directory>
                                <includes>
                        <resource>
                                <directory>${project.basedir}/src/main/resources/etc/auth/</directory>
                                <includes>
-                                       <include>aai-client-cert.p12</include>
-                                       <include>tomcat_keystore</include>
+                                       <include>realm.properties</include>
+                                       <include>aai_keystore</include>
                                </includes>
                                <targetPath>${project.build.directory}/swm/package/nix/dist_files/opt/app/aai-cacher/appconfig</targetPath>
                                <filtering>true</filtering>
index 06fd7f4..7d53478 100644 (file)
@@ -3,11 +3,6 @@
 APP_HOME=$(pwd);
 RESOURCES_HOME=${APP_HOME}/resources/;
 
-export CHEF_CONFIG_REPO=${CHEF_CONFIG_REPO:-aai-config};
-export CHEF_GIT_URL=${CHEF_GIT_URL:-http://gerrit.onap.org/r/aai};
-export CHEF_CONFIG_GIT_URL=${CHEF_CONFIG_GIT_URL:-$CHEF_GIT_URL};
-export CHEF_DATA_GIT_URL=${CHEF_DATA_GIT_URL:-$CHEF_GIT_URL};
-
 export SERVER_PORT=${SERVER_PORT:-8444};
 
 USER_ID=${LOCAL_USER_ID:-9001}
@@ -29,7 +24,7 @@ if [ $(cat /etc/passwd | grep aaiadmin | wc -l) -eq 0 ]; then
        }
 fi;
 
-chown -R aaiadmin:aaiadmin /opt/app /opt/aai/logroot /var/chef
+chown -R aaiadmin:aaiadmin /opt/app /opt/aai/logroot
 find /opt/app/ -name "*.sh" -exec chmod +x {} +
 
 gosu aaiadmin ln -s bin scripts
@@ -66,8 +61,7 @@ fi;
 
 MIN_HEAP_SIZE=${MIN_HEAP_SIZE:-512m};
 MAX_HEAP_SIZE=${MAX_HEAP_SIZE:-1024m};
-MAX_PERM_SIZE=${MAX_PERM_SIZE:-512m};
-PERM_SIZE=${PERM_SIZE:-512m};
+MAX_METASPACE_SIZE=${MAX_METASPACE_SIZE:-512m};
 
 JAVA_CMD="exec gosu aaiadmin java";
 
@@ -78,8 +72,7 @@ JVM_OPTS="${JVM_OPTS} -Xmx${MAX_HEAP_SIZE}";
 
 JVM_OPTS="${JVM_OPTS} -XX:+PrintGCDetails";
 JVM_OPTS="${JVM_OPTS} -XX:+PrintGCTimeStamps";
-JVM_OPTS="${JVM_OPTS} -XX:MaxPermSize=${MAX_PERM_SIZE}";
-JVM_OPTS="${JVM_OPTS} -XX:PermSize=${PERM_SIZE}";
+JVM_OPTS="${JVM_OPTS} -XX:MaxMetaspaceSize=${MAX_METASPACE_SIZE}";
 
 JVM_OPTS="${JVM_OPTS} -server";
 JVM_OPTS="${JVM_OPTS} -XX:NewSize=512m";
@@ -114,6 +107,7 @@ JAVA_OPTS="${JAVA_OPTS} -DAFT_ENVIRONMENT=${AFT_ENVIRONMENT}";
 JAVA_OPTS="${JAVA_OPTS} -DAAI_BUILD_VERSION=${AAI_BUILD_VERSION}";
 JAVA_OPTS="${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom";
 JAVA_OPTS="${JAVA_OPTS} -Dlogback.configurationFile=./resources/logback.xml";
+JAVA_OPTS="${JAVA_OPTS} -Dgroovy.use.classvalue=true";
 JAVA_OPTS="${JAVA_OPTS} -Dloader.path=$APP_HOME/resources";
 if [ ! -z ${PROXY_HOST} ]; then
         JAVA_OPTS="${JAVA_OPTS} -DproxySet=true -DproxyHost=${PROXY_HOST} -DproxyPort=8080";
index 9382f4b..6d40b68 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.onap.aai.cacher;
 
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
 import org.onap.aai.cacher.config.PropertyPasswordConfiguration;
 import org.onap.aai.logging.LoggingContext;
 import org.onap.aai.logging.LoggingContext.StatusCode;
@@ -30,18 +32,20 @@ import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfigurat
 import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.web.support.SpringBootServletInitializer;
 import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.PropertySource;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
+import javax.annotation.PreDestroy;
 import java.util.UUID;
 
 @SpringBootApplication
 @EnableScheduling
 @EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
 @ComponentScan(basePackages = { "org.onap.aai.cacher", "com" })
-@PropertySource("classpath:application.properties")
 public class Application extends SpringBootServletInitializer {
+
     private static final String APP_NAME = "cacher";
+    private static final EELFLogger logger = EELFManager.getInstance().getLogger(Application.class.getName());
+
 
     @Override
     protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
@@ -66,6 +70,21 @@ public class Application extends SpringBootServletInitializer {
         app.addInitializers(new PropertyPasswordConfiguration());
         app.run(args);
 
+        logger.info("Cacher MicroService Started");
+        logger.error("Cacher MicroService Started");
+        logger.debug("Cacher MicroService Started");
+
+        System.out.println("Cacher MicroService Started");
+
+    }
+
+    @PreDestroy
+    public void cleanup(){
+        logger.info("Cacher MicroService shutting down.");
+        logger.error("Cacher MicroService shutting down.");
+        logger.debug("Cacher MicroService shutting down.");
+
+        System.out.println("Cacher MicroService shutting down.");
     }
 
     public static void setDefaultProps() {
index d08930b..5c1a541 100644 (file)
@@ -24,23 +24,27 @@ import com.att.eelf.configuration.EELFManager;
 import com.mongodb.DB;
 import com.mongodb.MongoClient;
 import com.mongodb.client.MongoDatabase;
+import de.flapdoodle.embed.mongo.Command;
 import de.flapdoodle.embed.mongo.MongodExecutable;
 import de.flapdoodle.embed.mongo.MongodProcess;
 import de.flapdoodle.embed.mongo.MongodStarter;
-import de.flapdoodle.embed.mongo.config.IMongodConfig;
-import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
-import de.flapdoodle.embed.mongo.config.Net;
+import de.flapdoodle.embed.mongo.config.*;
 import de.flapdoodle.embed.mongo.distribution.Version;
+import de.flapdoodle.embed.process.config.io.ProcessOutput;
+import de.flapdoodle.embed.process.io.Processors;
+import de.flapdoodle.embed.process.io.Slf4jLevel;
 import de.flapdoodle.embed.process.runtime.Network;
 import org.onap.aai.exceptions.AAIException;
 import org.onap.aai.logging.ErrorLogHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-import javax.annotation.PostConstruct;
 import java.io.IOException;
 
+
 @Configuration
 public class MongoConfig {
 
@@ -53,8 +57,10 @@ public class MongoConfig {
     @Value("${mongodb.port}")
     private int MONGO_DB_PORT;
 
+    private MongodProcess mongod;
+
     @Bean
-    public MongoClient mongoClient() {
+    public MongoClient mongoClient(MongodProcess mongodProcess) {
         try {
             // To connect to mongodb server
             MongoClient mongoC = new MongoClient(MONGO_DB_HOST, MONGO_DB_PORT);
@@ -83,21 +89,33 @@ public class MongoConfig {
     }
 
     @Bean
-    @PostConstruct
-    public MongodProcess mongoEmbedded() throws IOException, InterruptedException {
+    public MongodProcess mongoEmbedded() throws IOException {
 
-        MongodStarter starter = MongodStarter.getDefaultInstance();
-
-        String bindIp = MONGO_DB_HOST;
+        Logger logger = LoggerFactory.getLogger("mongo");
         int port = MONGO_DB_PORT;
-        IMongodConfig mongodConfig = new MongodConfigBuilder().version(Version.Main.PRODUCTION)
-                .net(new Net(port, Network.localhostIsIPv6())).configServer(false).build();
 
-        MongodExecutable mongodExecutable = starter.prepare(mongodConfig);
-        // Thread.sleep(20000L);
-        MongodProcess mongod = mongodExecutable.start();
+        IMongodConfig mongoConfigConfig = new MongodConfigBuilder()
+                .version(Version.Main.PRODUCTION)
+                .net(new Net(port, Network.localhostIsIPv6()))
+                .cmdOptions(new MongoCmdOptionsBuilder().enableTextSearch(true).useNoPrealloc(false).build())
+                .configServer(false)
+                .build();
+
+        ProcessOutput processOutput = new ProcessOutput(Processors.logTo(logger, Slf4jLevel.WARN), Processors.logTo(logger,
+                Slf4jLevel.WARN), Processors.logTo(logger, Slf4jLevel.WARN));
+
+        MongodExecutable mongodExecutable = MongodStarter
+                .getInstance((new RuntimeConfigBuilder())
+                        .defaults(Command.MongoD)
+                        .processOutput(processOutput)
+                        .build())
+                .prepare(mongoConfigConfig);
+
+        mongod = mongodExecutable.start();
+
         if (mongod.isProcessRunning()) {
-            System.out.println("RUNNING");
+            System.out.println("Embedded mongo RUNNING");
+            logger.info("Embedded mongo RUNNING");
         }
         return mongod;
     }
index 63638f1..a94f36a 100644 (file)
@@ -23,6 +23,7 @@ import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
 import com.google.common.collect.Lists;
 import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
 import com.mongodb.*;
 import com.mongodb.client.AggregateIterable;
 import com.mongodb.client.MongoCollection;
@@ -62,6 +63,8 @@ public class MongoHelperSingleton {
 
     private MongoDatabase mongoDatabase;
 
+    private JsonParser jsonParser = new JsonParser();
+
     @Autowired
     public MongoHelperSingleton(DB db, MongoDatabase mongoDatabase) {
         this.mongoDatabase = mongoDatabase;
@@ -167,11 +170,10 @@ public class MongoHelperSingleton {
         MongoCollection<Document> collection = mongoDatabase.getCollection(cacheEntry.getCollection());
 
         Document findQuery = Document.parse(cacheEntry.getFindQuery().toString());
-        Document payload = Document.parse(cacheEntry.getPayload().toString());
 
         if (!cacheEntry.isNested()) {
+            Document payload = Document.parse(cacheEntry.getPayload().toString());
             UpdateResult updateResult = collection.replaceOne(findQuery, payload, new UpdateOptions().upsert(true));
-
             return updateResult.wasAcknowledged();
         } else {
             CacheEntry localCacheEntry = CacheEntry.CacheEntryBuilder.createCacheEntry().deepCopy(cacheEntry).build();
@@ -184,7 +186,12 @@ public class MongoHelperSingleton {
 
             ArrayList<Document> filters = this.getFiltersAndUpdateNestedField(localCacheEntry);
             Document doc = new Document();
-            doc.put(localCacheEntry.getNestedField(), payload);
+            if (localCacheEntry.isNestedPayloadString()) {
+                doc.put(localCacheEntry.getNestedField(), localCacheEntry.getNestedString());
+            } else {
+                Document payload = Document.parse(cacheEntry.getPayload().toString());
+                doc.put(localCacheEntry.getNestedField(), payload);
+            }
             Document push = new Document();
             push.put("$push", doc);
 
@@ -266,7 +273,7 @@ public class MongoHelperSingleton {
                 Document.parse(localCacheEntry.getNestedFieldIdentifierObj().toString()));
         Document pull = new Document();
         pull.put("$pull", pullObj);
-        collection.findOneAndUpdate(nestedFind, pull, new FindOneAndUpdateOptions().arrayFilters(filters).upsert(true));
+        collection.findOneAndUpdate(nestedFind, pull, new FindOneAndUpdateOptions().upsert(true));
         // TODO remove wrapping if there are no entries in array.
 
     }
@@ -309,4 +316,36 @@ public class MongoHelperSingleton {
         return filters;
     }
 
+    public List<JsonObject> findByIds(String collection, List<String> ids) {
+        final List<JsonObject> results  = new ArrayList<>(ids.size());
+        Document findDoc = Document.parse("{}");
+        Document findIn = Document.parse("{}");
+        findIn.put("$in", ids);
+        findDoc.put("_id", findIn);
+        this.mongoDatabase.getCollection(collection)
+                .find(findDoc)
+                .iterator()
+                .forEachRemaining(doc -> results.add(jsonParser.parse(doc.toJson()).getAsJsonObject()));
+        return results;
+    }
+
+    /**
+     * Find in the specified collection all of the documents who's _id starts with (inclusive) prefix.
+     * @param collection collection to be searched
+     * @param prefix id prefix to be used in the search
+     * @return Collection of JsonObjects satisfying the search
+     */
+    public List<JsonObject> findAllWithIdsStartingWith(String collection, String prefix) {
+        final List<JsonObject> results  = new ArrayList<>();
+        Document findDoc = Document.parse("{}");
+        Document findIn = Document.parse("{}");
+        findIn.put("$regex", "^"+prefix);
+        findDoc.put("_id", findIn);
+        this.mongoDatabase.getCollection(collection)
+                .find(findDoc)
+                .iterator()
+                .forEachRemaining(doc -> results.add(jsonParser.parse(doc.toJson()).getAsJsonObject()));
+        return results;
+    }
+
 }
index 5c684a2..3f28a26 100644 (file)
@@ -21,13 +21,14 @@ package org.onap.aai.cacher.dmaap.consumer;
 
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
+import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
+import com.google.gson.JsonSyntaxException;
 import com.mongodb.MongoCommandException;
-import org.bson.Document;
-import org.json.JSONException;
-import org.json.JSONObject;
 import org.onap.aai.cacher.common.MongoHelperSingleton;
+import org.onap.aai.cacher.egestion.printer.PayloadPrinterService;
+import org.onap.aai.cacher.egestion.printer.strategy.PayloadPrinterType;
 import org.onap.aai.cacher.injestion.parser.PayloadParserService;
 import org.onap.aai.cacher.injestion.parser.strategy.PayloadParserType;
 import org.onap.aai.cacher.model.CacheEntry;
@@ -37,7 +38,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
-import java.util.Optional;
 
 @Service
 public class AAIDmaapEventProcessor implements DmaapProcessor {
@@ -46,21 +46,18 @@ public class AAIDmaapEventProcessor implements DmaapProcessor {
 
     private final JsonParser parser = new JsonParser();
 
-    private JSONObject event;
-    private JSONObject eventHeader;
-    private JSONObject eventBody;
-
     private MongoHelperSingleton mongoHelper;
     private PayloadParserService payloadParserService;
+    private PayloadPrinterService payloadPrinterService;
 
     @Autowired
-    public AAIDmaapEventProcessor(MongoHelperSingleton mongoHelper, PayloadParserService payloadParserService) {
+    public AAIDmaapEventProcessor(MongoHelperSingleton mongoHelper, PayloadParserService payloadParserService, PayloadPrinterService payloadPrinterService) {
         this.mongoHelper = mongoHelper;
         this.payloadParserService = payloadParserService;
+        this.payloadPrinterService = payloadPrinterService;
     }
 
-    public AAIDmaapEventProcessor() {
-    }
+    public AAIDmaapEventProcessor(){}
 
     /**
      * 
@@ -68,14 +65,13 @@ public class AAIDmaapEventProcessor implements DmaapProcessor {
      * @return
      */
     public void process(String eventMessage) throws Exception {
-        this.event = null;
-        this.eventHeader = null;
-        this.eventBody = null;
+        JsonObject event;
+        JsonObject eventHeader;
 
         try {
             LOGGER.debug("Processing event: " + eventMessage);
-            this.event = new JSONObject(eventMessage);
-        } catch (JSONException je) {
+            event = parser.parse(eventMessage).getAsJsonObject();
+        } catch (JsonSyntaxException | IllegalStateException je) {
             LOGGER.error("ERROR: Event is not valid JSON [" + eventMessage + "].");
             ErrorLogHelper.logException(new AAIException("AAI_4000", je));
             throw je;
@@ -83,8 +79,8 @@ public class AAIDmaapEventProcessor implements DmaapProcessor {
 
         try {
             LOGGER.debug("Validating event header.");
-            this.validateEventHeader(this.event);
-        } catch (JSONException je) {
+            eventHeader = this.getEventHeader(event);
+        } catch (JsonSyntaxException | IllegalStateException je) {
             LOGGER.error("ERROR: Event header is not valid [" + eventMessage + "].");
             ErrorLogHelper.logException(new AAIException("AAI_4000", je));
             throw je;
@@ -92,30 +88,32 @@ public class AAIDmaapEventProcessor implements DmaapProcessor {
 
         try {
             LOGGER.debug("Processing entity.");
-            eventBody = this.event.getJSONObject("entity");
-        } catch (JSONException je) {
+            validateEventBody(event);
+        } catch (JsonSyntaxException | IllegalStateException je) {
             LOGGER.error("ERROR: Event body is not valid JSON [" + eventMessage + "].");
             ErrorLogHelper.logException(new AAIException("AAI_4000", je));
             throw je;
         }
 
-        List<CacheEntry> dmaapCacheEntries = payloadParserService.doParse("aai-dmaap",
-                parser.parse(eventMessage).getAsJsonObject(), PayloadParserType.AAI_RESOURCE_DMAAP);
+        JsonObject dmaapJson = parser.parse(eventMessage).getAsJsonObject();
 
         // Get existing object if is update
-        Optional<Document> existingObj = Optional.empty();
-        if (this.eventHeader != null && "UPDATE".equals(eventHeader.getString("action"))) {
-            existingObj = mongoHelper.getObject(dmaapCacheEntries.get(0));
+        if (eventHeader != null && "UPDATE".equals(eventHeader.get("action").getAsString())) {
+            String uri = eventHeader.get("entity-link").getAsString()
+                    .replaceAll("/aai/v\\d+", "");
+            String type = eventHeader.getAsJsonObject().get("entity-type").getAsString();
+
+            List<JsonObject> found = mongoHelper.findAllWithIdsStartingWith(type, uri);
+            if (!found.isEmpty()) {
+                JsonArray ja = new JsonArray();
+                found.forEach(ja::add);
+                JsonObject existing = payloadPrinterService.createJson(type, ja, PayloadPrinterType.AAI_RESOURCE_GET_ALL_PRINTER);
+                dmaapJson.add("existing-obj", existing);
+            }
         }
 
-        // Add existing object to payload to be parsed by AAI_RESOURCE_DMAAP parser
-        if (existingObj.isPresent()) {
-            JsonObject eventMessageObj = parser.parse(eventMessage).getAsJsonObject();
-            eventMessageObj.add("existing-obj", parser.parse(existingObj.get().toJson()).getAsJsonObject());
-            eventMessage = eventMessageObj.toString();
-            dmaapCacheEntries = payloadParserService.doParse("aai-dmaap", parser.parse(eventMessage).getAsJsonObject(),
-                    PayloadParserType.AAI_RESOURCE_DMAAP);
-        }
+        List<CacheEntry> dmaapCacheEntries = payloadParserService.doParse("aai-dmaap",
+                dmaapJson, PayloadParserType.AAI_RESOURCE_DMAAP);
 
         for (CacheEntry cacheEntry : dmaapCacheEntries) {
             try {
@@ -139,37 +137,34 @@ public class AAIDmaapEventProcessor implements DmaapProcessor {
 
     }
 
+    private void validateEventBody(JsonObject event) {
+        if (!event.has("entity")) {
+            throw new JsonSyntaxException("Event header missing.");
+        }
+
+        event.get("entity").getAsJsonObject();
+    }
+
     /**
      * Validates that the event header has the id and source name for processing.
      * (needed for status response msg)
      * 
      * @param event
-     * @throws JSONException
+     * @throws JsonSyntaxException
      */
-    private void validateEventHeader(JSONObject event) throws JSONException {
-        eventHeader = event.getJSONObject("event-header");
-        if (this.eventHeader.getString("id") == null || this.eventHeader.getString("id").isEmpty()) {
-            throw new JSONException("Event header id missing.");
-        } else if (this.eventHeader.getString("source-name") == null
-                || this.eventHeader.getString("source-name").isEmpty()) {
-            throw new JSONException("Event header source-name missing.");
-        }
-    }
+    private JsonObject getEventHeader(JsonObject event) throws JsonSyntaxException {
 
-    /**
-     * 
-     * @return
-     */
-    public JSONObject getEventHeader() {
+        if (!event.has("event-header")) {
+            throw new JsonSyntaxException("Event header missing.");
+        }
+        JsonObject eventHeader = event.get("event-header").getAsJsonObject();
+        if (eventHeader.get("id") == null || eventHeader.get("id").getAsString().isEmpty()) {
+            throw new JsonSyntaxException("Event header id missing.");
+        } else if (eventHeader.get("source-name") == null || eventHeader.get("source-name").getAsString().isEmpty()) {
+            throw new JsonSyntaxException("Event header source-name missing.");
+        }
         return eventHeader;
-    }
 
-    /**
-     * 
-     * @return
-     */
-    public JSONObject getEventBody() {
-        return eventBody;
     }
 
 }
index 8d64116..2530828 100644 (file)
@@ -46,6 +46,7 @@ public class AAIParentEventConsumer {
 
     protected String dmaapPropertyHome = "";
     protected String dmaapConusmerId = "";
+    private String dmaapGroup;
     protected String transId = "";
 
     protected Properties aaiDmaapEventConsumerProperties = new Properties();
@@ -74,6 +75,11 @@ public class AAIParentEventConsumer {
         }
         this.dmaapConusmerId = dmaapConsumerSingleton.getDmaapConsumerId();
 
+        if (dmaapConsumerSingleton.getDmaapGroup() == null) {
+            dmaapConsumerSingleton.setDmaapGroup("cacher-" + UUID.randomUUID().toString());
+        }
+        this.dmaapGroup = dmaapConsumerSingleton.getDmaapGroup();
+
         processPropertyFiles(consumerPropFile);
         if (!injestConsumer) {
             this.aaiDmaapEventConsumer = MRClientFactory.createConsumer(this.aaiDmaapEventConsumerProperties.toString());
@@ -127,8 +133,10 @@ public class AAIParentEventConsumer {
             this.aaiDmaapEventConsumerProperties.load(reader);
         }
 
+
         aaiDmaapEventConsumerProperties.setProperty("id", this.dmaapConusmerId);
-        LOGGER.debug("Updated " + this.aaiDmaapEventConsumerPropertiesFile + " id " + this.dmaapConusmerId);
+        aaiDmaapEventConsumerProperties.setProperty("group", this.dmaapGroup);
+        LOGGER.debug("Updated " + this.aaiDmaapEventConsumerPropertiesFile + " group" + this.dmaapGroup + " id " + this.dmaapConusmerId);
 
         aaiDmaapEventConsumerProperties.setProperty("DME2preferredRouterFilePath", this.preferredRouterFilePath);
         if (aaiDmaapEventConsumerProperties.getProperty("password") != null
@@ -144,11 +152,12 @@ public class AAIParentEventConsumer {
         }
         LOGGER.debug("Using limit " + aaiDmaapEventConsumerProperties.getProperty("limit"));
         LOGGER.debug("Using filter " + aaiDmaapEventConsumerProperties.getProperty("filter"));
+
+        LOGGER.debug("Dmaap Properties = " + aaiDmaapEventConsumerProperties);
     }
 
     public void startProcessing(DmaapProcessor dmaapProcessor) throws Exception {
         int fetchFailCounter = 0;
-
         while (AAIConfig.get("aai.cacher.dmaap.consumer.enableEventProcessing").equals("true")) {
             try {
                 LOGGER.debug("processEvents=" + dmaapConsumerSingleton.getProcessEvents() + " isInitialized="
index 5c2faa3..a88e48d 100644 (file)
@@ -25,6 +25,8 @@ public class DmaapConsumerSingleton {
     private boolean isInitialized;
 
     private String dmaapConsumerId;
+    private String dmaapGroup;
+
 
     private String firstEventMessage;
 
@@ -70,6 +72,13 @@ public class DmaapConsumerSingleton {
     public void setDmaapConsumerId(String dmaapConsumerId) {
         this.dmaapConsumerId = dmaapConsumerId;
     }
+    public String getDmaapGroup() {
+        return dmaapGroup;
+    }
+
+    public void setDmaapGroup(String dmaapGroup) {
+        this.dmaapGroup = dmaapGroup;
+    }
 
     public String getDmaapConsumerId() {
         return dmaapConsumerId;
index 8dfeb0b..4b483c3 100644 (file)
@@ -21,29 +21,216 @@ package org.onap.aai.cacher.egestion.printer.strategy;
 
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
+import org.onap.aai.cacher.injestion.parser.strategy.aai.AAIResourcesUriTemplates;
+import org.onap.aai.cacher.injestion.parser.strategy.aai.AAIUriSegment;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.config.ConfigurableBeanFactory;
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
 
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * This strategy re constructs the aai objects as the parser for this strategy
+ * would have taken all nested objects and stored them separately
+ */
 @Component(value = "aai-resource-get-all-printer")
 @Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)
 public class AAIResourceGetAllPayloadPrinterStrategy implements PayloadPrinterStrategy {
 
+    private static final String RELATIONSHIP = "relationship";
+
+    private AAIResourcesUriTemplates aaiResourcesUriTemplates;
+
+    @Autowired
+    public AAIResourceGetAllPayloadPrinterStrategy(AAIResourcesUriTemplates aaiResourcesUriTemplates) {
+        this.aaiResourcesUriTemplates = aaiResourcesUriTemplates;
+    }
+
+
     /**
      * Create a jsonObject from the jsonArray for a specific collection
-     * 
-     * @param collectionName
-     * @param jsonArray
-     * @return
+     *
+     * @param collectionName name of the collection the json array is from.
+     * @param jsonArray json objects from the collection to be aggregated
+     * @return the cache payload reconstructed
      */
     @Override
     public JsonObject createJson(String collectionName, JsonArray jsonArray) {
-        if (jsonArray != null && jsonArray.size() > 0) {
-            JsonObject jsonObj = new JsonObject();
-            jsonObj.add(collectionName, jsonArray);
-            return jsonObj;
-        } else {
+
+        List<JsonObject> topLevels = new ArrayList<>();
+        Map<String, JsonObject> nested = new HashMap<>();
+
+        if (jsonArray == null || jsonArray.size() == 0) {
             return null;
         }
+
+        for (int i = 0; i < jsonArray.size(); i++) {
+            final JsonObject jsonObject = jsonArray.get(i).getAsJsonObject();
+            String id = jsonObject.get("_id").getAsString();
+            List<AAIUriSegment> segments = aaiResourcesUriTemplates.getAaiUriSegments(id);
+            if (segments.size() == 1) {
+                topLevels.add(jsonObject);
+            } else {
+                nested.put(id, jsonObject);
+            }
+        }
+
+        jsonArray = new JsonArray();
+        topLevels.forEach(top -> populateNested(top, nested));
+        topLevels.stream().filter(jsonObject -> jsonObject.size() > 0).forEach(jsonArray::add);
+        JsonObject jsonObj = new JsonObject();
+        jsonObj.add(collectionName, jsonArray);
+        return jsonObj;
+
+    }
+
+    /**
+     * For the json object collect and populate all of the nested objects
+     * @param jo JsonObject to be populated
+     */
+    private void populateNested(JsonObject jo, Map<String, JsonObject> nested) {
+        List<String> uris = new ArrayList<>();
+        MultiValueMap<Integer, String> lvlToUri = new LinkedMultiValueMap<>();
+        Map<String, JsonObject> uriToJson = new HashMap<>();
+        int lvl = 0;
+        String uri = jo.getAsJsonPrimitive("_id").getAsString();
+        lvlToUri.add(lvl, uri);
+        uriToJson.put(uri, jo);
+        uris.add(uri);
+
+        boolean foundNested = true;
+        int start = 0;
+        while (foundNested) {
+            List<JsonObject> nestedObjs = new ArrayList<>();
+            for (int i = start; i < uris.size(); i++) {
+                Set<String> nestedProps = nestedPropsToBePopulated(uriToJson.get(uris.get(i)));
+                nestedProps = cleanEmptyProps(uriToJson.get(uris.get(i)), nestedProps, nested);
+                nestedObjs.addAll(getNestedObjs(uriToJson.get(uris.get(i)), nestedProps, nested));
+            }
+            if (nestedObjs.isEmpty()) {
+                foundNested = false;
+            } else {
+                lvl++;
+                start = uris.size();
+                for (JsonObject nestedObj : nestedObjs) {
+                    String u = nestedObj.get("_id").getAsString();
+                    uris.add(u);
+                    uriToJson.put(u, nestedObj);
+                    lvlToUri.add(lvl, u);
+                }
+            }
+        }
+
+        uriToJson.values().forEach(jsonObject -> jsonObject.remove("_id"));
+
+        // skips the last lvl as it will not have any nested
+        for (int i = lvl-1; i >= 0; i--) {
+           lvlToUri.get(i).forEach(u -> {
+               Set<String> nestedProps = nestedPropsToBePopulated(uriToJson.get(u));
+               nestedProps.forEach(prop -> {
+                   if (uriToJson.get(u).get(prop).isJsonArray()) {
+                       JsonArray objs = new JsonArray();
+                       uriToJson.get(u).get(prop).getAsJsonArray().forEach(jsonElement -> {
+                           if (jsonElement != null
+                                   && jsonElement.isJsonPrimitive()
+                                   && jsonElement.getAsJsonPrimitive().isString()
+                                   && uriToJson.containsKey(jsonElement.getAsString())) {
+                               objs.add(uriToJson.get(jsonElement.getAsString()));
+                               uriToJson.remove(jsonElement.getAsString());
+                           }
+                       });
+                       uriToJson.get(u).add(prop, objs);
+                   } else if (uriToJson.get(u).get(prop).isJsonObject()) {
+                       JsonArray objs = new JsonArray();
+                       JsonObject jsonObject = uriToJson.get(u).get(prop).getAsJsonObject();
+                       String key = jsonObject.entrySet().iterator().next().getKey();
+                       jsonObject.get(key).getAsJsonArray().forEach(jsonElement -> {
+                           if (jsonElement != null
+                                   && jsonElement.isJsonPrimitive()
+                                   && jsonElement.getAsJsonPrimitive().isString()
+                                   && uriToJson.containsKey(jsonElement.getAsString())) {
+                               objs.add(uriToJson.get(jsonElement.getAsString()));
+                               uriToJson.remove(jsonElement.getAsString());
+                           }
+                       });
+                       uriToJson.get(u).get(prop).getAsJsonObject().add(key, objs);
+                   }
+               });
+           });
+        }
+        //return uriToJson.get(uri);
+    }
+
+    private Set<String> cleanEmptyProps(JsonObject jsonObject, Set<String> nestedProps, Map<String, JsonObject> nested) {
+        Set<String> updatedNested = new HashSet<>(nestedProps.size());
+        for (String nestedProp : nestedProps) {
+            if (jsonObject.get(nestedProp).isJsonObject()) {
+                String key = jsonObject.get(nestedProp).getAsJsonObject().entrySet().iterator().next().getKey();
+                if (jsonObject.get(nestedProp).getAsJsonObject().get(key).getAsJsonArray().size() == 0) {
+                    jsonObject.remove(nestedProp);
+                } else {
+                    updatedNested.add(nestedProp);
+                }
+            } else if (jsonObject.get(nestedProp).isJsonArray()) {
+                if (jsonObject.get(nestedProp).getAsJsonArray().size() == 0) {
+                    jsonObject.remove(nestedProp);
+                } else {
+                    updatedNested.add(nestedProp);
+                }
+            }
+        }
+
+        return updatedNested;
+    }
+
+    /**
+     * Collects the nested json objects from storage
+     * @param jsonObject the object with nested to be collected
+     * @param nestedProps the properties with nested objs to be collected
+     * @return Collected json object
+     */
+    private List<JsonObject> getNestedObjs(JsonObject jsonObject, Set<String> nestedProps, Map<String, JsonObject> nested) {
+        final List<JsonObject> objs = new ArrayList<>();
+
+        for (String nestedProp : nestedProps) {
+            List<String> uris = new ArrayList<>();
+            if (jsonObject.get(nestedProp).isJsonObject()) {
+                String key = jsonObject.get(nestedProp).getAsJsonObject().entrySet().iterator().next().getKey();
+                jsonObject.get(nestedProp).getAsJsonObject().get(key).getAsJsonArray()
+                        .iterator().forEachRemaining(jsonElement -> uris.add(jsonElement.getAsString()));
+            } else if (jsonObject.get(nestedProp).isJsonArray()) {
+                jsonObject.get(nestedProp).getAsJsonArray()
+                        .iterator().forEachRemaining(jsonElement -> uris.add(jsonElement.getAsString()));
+            }
+
+            uris.stream().filter(nested::containsKey).map(nested::get).forEach(objs::add);
+        }
+        return objs;
+    }
+
+    /**
+     * For the given JsonObject determine which properties have nested to be populated
+     * @param jsonObject to be scanned
+     * @return Set of property keys that have nested to be populated
+     */
+    private Set<String> nestedPropsToBePopulated(JsonObject jsonObject) {
+        Set<String> props = jsonObject.entrySet()
+                .stream()
+                .filter(nestedEntry -> nestedEntry.getValue().isJsonObject() &&
+                        aaiResourcesUriTemplates.hasType(nestedEntry.getValue().getAsJsonObject().entrySet().iterator().next().getKey()))
+                .map(Map.Entry::getKey)
+                .collect(Collectors.toSet());
+        props.addAll(jsonObject.entrySet()
+                .stream()
+                .filter(nestedEntry -> nestedEntry.getValue().isJsonArray() &&
+                        aaiResourcesUriTemplates.hasType(nestedEntry.getKey()))
+                .map(Map.Entry::getKey)
+                .collect(Collectors.toSet()));
+        props.remove("relationship-list");
+        return props;
     }
 }
index 3aecfe8..52001c9 100644 (file)
@@ -34,6 +34,7 @@ public class NonePayloadPrinterStrategy implements PayloadPrinterStrategy {
     @Override
     public JsonObject createJson(String collectionName, JsonArray jsonArray) {
         if (jsonArray != null && jsonArray.size() > 0) {
+            jsonArray.get(0).getAsJsonObject().remove("_id");
             return jsonArray.get(0).getAsJsonObject();
         } else {
             return null;
index d83d622..b05bcab 100644 (file)
 package org.onap.aai.cacher.egestion.printer.strategy;
 
 import java.util.Arrays;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 public enum PayloadPrinterType {
 
-    NONE_PRINTER("none-printer"), AAI_RESOURCE_GET_ALL_PRINTER("aai-resource-get-all-printer");
+    NONE_PRINTER("none-printer"),
+    AAI_RESOURCE_GET_ALL_PRINTER("aai-resource-get-all-printer");
+
+    private static final Map<String, PayloadPrinterType> MAP;
+    static {
+        MAP = Arrays.stream(values()).collect(Collectors.toMap(PayloadPrinterType::getValue, Function.identity()));
+    }
 
     private final String value;
 
@@ -41,6 +50,6 @@ public enum PayloadPrinterType {
     }
 
     public static PayloadPrinterType fromString(String text) {
-        return Arrays.stream(values()).filter(bl -> bl.getValue().equalsIgnoreCase(text)).findFirst().orElse(null);
+        return MAP.get(text);
     }
 }
diff --git a/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceDmaapParserStrategy.java b/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceDmaapParserStrategy.java
deleted file mode 100644 (file)
index 6de0585..0000000
+++ /dev/null
@@ -1,470 +0,0 @@
-/**
- * ============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.cacher.injestion.parser.strategy;
-
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import org.apache.commons.lang3.StringUtils;
-import org.onap.aai.cacher.injestion.parser.AAIResourcesUriTemplates;
-import org.onap.aai.cacher.injestion.parser.PayloadParserService;
-import org.onap.aai.cacher.model.CacheEntry;
-import org.onap.aai.cacher.model.DBAction;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.ConfigurableBeanFactory;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-import org.springframework.util.LinkedMultiValueMap;
-import org.springframework.util.MultiValueMap;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-/**
- * AAI resource get all parser strategy
- */
-@Component(value = "aai-resource-dmaap")
-@Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)
-public class AAIResourceDmaapParserStrategy implements PayloadParserStrategy {
-
-    protected AAIResourcesUriTemplates aaiResourcesUriTemplates;
-
-    private PayloadParserService payloadParserService;
-
-    private DmaapAction actionType;
-
-    @Autowired
-    public AAIResourceDmaapParserStrategy(AAIResourcesUriTemplates aaiResourcesUriTemplates,
-            PayloadParserService payloadParserService) {
-        this.aaiResourcesUriTemplates = aaiResourcesUriTemplates;
-        this.payloadParserService = payloadParserService;
-    }
-
-    /**
-     * Parses aai resources specific payloads generating the details for caching.
-     * 
-     * @param originalKey
-     * @param jsonObject
-     * @return
-     */
-    @Override
-    public List<CacheEntry> process(String originalKey, JsonObject jsonObject) {
-        final List<CacheEntry> cacheEntries = new ArrayList<>();
-
-        JsonObject header = jsonObject.getAsJsonObject("event-header");
-        JsonObject entity = jsonObject.getAsJsonObject("entity");
-        String topEntity = header.get("top-entity-type").getAsString();
-
-        actionType = DmaapAction.valueOf(header.get("action").getAsString());
-        boolean isTopLevel = topEntity.equals(header.get("entity-type").getAsString());
-        String fullUri = getFullUri(header);
-
-        CacheEntry cacheEntry = generateCacheEntry(entity, actionType, isTopLevel, fullUri);
-
-        cacheEntries.add(cacheEntry);
-
-        // determine relationships on the other end that need to be modified.
-        MultiValueMap<String, AAIResourceDmaapParserStrategy.AAIRelatedToDetails> relationships;
-        if (isTopLevel) {
-            relationships = getFromRelationshipFullUriToRelationshipObj(entity, fullUri);
-        } else {
-            relationships = getFromRelationshipFullUriToRelationshipObj(entity, getBaseUri(fullUri));
-        }
-        if (jsonObject.has("existing-obj")) {
-            adjustRelationshipsBasedOnExisting(jsonObject, fullUri, relationships);
-        }
-
-        JsonObject relatedToObj;
-        for (Map.Entry<String, List<AAIResourceDmaapParserStrategy.AAIRelatedToDetails>> relationship : relationships
-                .entrySet()) {
-            for (AAIResourceDmaapParserStrategy.AAIRelatedToDetails aaiRelatedToDetails : relationship.getValue()) {
-                relatedToObj = fullUriToRelationshipObj(relationship.getKey(), aaiRelatedToDetails.getLabel());
-                cacheEntries.add(generateCacheEntry(relatedToObj, aaiRelatedToDetails.getActionType(), false,
-                        aaiRelatedToDetails.getFullUri() + "/relationship-list/relationship/"
-                                + aaiResourcesUriTemplates.encodeProp(relationship.getKey())));
-            }
-        }
-
-        return cacheEntries;
-    }
-
-    private String getBaseUri(String fullUri) {
-        String uri = getUri(fullUri);
-        List<AAIUriSegment> uriSegmentList = getAaiUriSegments(uri);
-        return uriSegmentList.get(0).getSegment();
-    }
-
-    protected String getFullUriPrefix(String fullUri) {
-        return StringUtils.substring(fullUri, 0, StringUtils.ordinalIndexOf(fullUri, "/", 3));
-    }
-
-    protected CacheEntry generateCacheEntry(JsonObject entity, DmaapAction actionType, boolean isTopLevel,
-            String fullUri) {
-        String uri = getUri(fullUri);
-        List<AAIUriSegment> uriSegmentList = getAaiUriSegments(uri);
-        String id = uriSegmentList.get(0).getSegment();
-        String collection = uriSegmentList.get(0).getSegmentSingular();
-        JsonObject entityBody = getEntityBody(entity, uriSegmentList);
-        JsonObject findQuery = getFindQuery(uriSegmentList);
-        JsonObject nestedFindQuery = getNestedFindQuery(uriSegmentList);
-        String nestedField = getNestedField(uriSegmentList);
-        JsonObject nestedIdentifier = getNestedIdentifier(uriSegmentList);
-        DBAction dbAction = getDBAction(actionType);
-
-        return CacheEntry.CacheEntryBuilder.createCacheEntry().inCollection(collection).withDbAction(dbAction)
-                .withId(id).isNested(!isTopLevel).withPayload(entityBody).withFindQuery(findQuery)
-                .withNestedFind(nestedFindQuery).withNestedField(nestedField)
-                .withNestedFieldIdentifierObj(nestedIdentifier).build();
-    }
-
-    protected DBAction getDBAction(DmaapAction actionType) {
-        DBAction dbAction = DBAction.INSERT_REPLACE;
-        switch (actionType) {
-        case CREATE:
-            dbAction = DBAction.INSERT_REPLACE;
-            break;
-        case DELETE:
-            dbAction = DBAction.DELETE;
-            break;
-        case UPDATE:
-            dbAction = DBAction.UPDATE;
-            break;
-        }
-        return dbAction;
-    }
-
-    protected JsonObject getNestedIdentifier(List<AAIUriSegment> uriSegmentList) {
-        final JsonObject nestedIdentifier = new JsonObject();
-        if (uriSegmentList.size() > 1) {
-            AAIUriSegment lastSegment = uriSegmentList.get(uriSegmentList.size() - 1);
-            lastSegment.getSegmentKeyValues().forEach(nestedIdentifier::addProperty);
-        }
-        return nestedIdentifier;
-    }
-
-    protected String getNestedField(List<AAIUriSegment> uriSegmentList) {
-        StringBuilder nestedField = new StringBuilder();
-
-        if (uriSegmentList.size() > 1) {
-            if (uriSegmentList.get(1).getSegmentPlural().isPresent()) {
-                nestedField.append(uriSegmentList.get(1).getSegmentPlural().get()).append(".")
-                        .append(uriSegmentList.get(1).getSegmentSingular());
-            } else {
-                nestedField.append(uriSegmentList.get(1).getSegmentSingular());
-            }
-
-            for (int i = 2; i < uriSegmentList.size(); i++) {
-                if (uriSegmentList.get(i).getSegmentPlural().isPresent()) {
-                    nestedField.append(".$.").append(uriSegmentList.get(i).getSegmentPlural().get()).append(".")
-                            .append(uriSegmentList.get(i).getSegmentSingular());
-                } else {
-                    nestedField.append(".$.").append(uriSegmentList.get(i).getSegmentSingular());
-                }
-            }
-        }
-        return nestedField.toString();
-    }
-
-    protected JsonObject getNestedFindQuery(List<AAIUriSegment> uriSegmentList) {
-        return getFindQuery(uriSegmentList, true);
-    }
-
-    protected JsonObject getFindQuery(List<AAIUriSegment> uriSegmentList) {
-        return getFindQuery(uriSegmentList, false);
-    }
-
-    protected JsonObject getFindQuery(List<AAIUriSegment> uriSegmentList, boolean isNested) {
-        final JsonObject findQuery = new JsonObject();
-        if (uriSegmentList.isEmpty()) {
-            return findQuery;
-        }
-
-        AAIUriSegment aaiUriSegment = uriSegmentList.get(0);
-        findQuery.addProperty("_id", aaiUriSegment.getSegment());
-        aaiUriSegment.getSegmentKeyValues().forEach(findQuery::addProperty);
-
-        StringBuilder nestedField = new StringBuilder();
-        int segmentToProcess = uriSegmentList.size();
-        if (!isNested) {
-            segmentToProcess--;
-        }
-        for (int i = 1; i < segmentToProcess; i++) {
-            aaiUriSegment = uriSegmentList.get(i);
-            if (nestedField.length() != 0) {
-                nestedField.append(".");
-            }
-            if (aaiUriSegment.getSegmentPlural().isPresent()) {
-                nestedField.append(aaiUriSegment.getSegmentPlural().get()).append(".");
-            }
-            nestedField.append(aaiUriSegment.getSegmentSingular());
-            aaiUriSegment.getSegmentKeyValues()
-                    .forEach((k, v) -> findQuery.addProperty(nestedField.toString() + "." + k, v));
-        }
-        return findQuery;
-    }
-
-    /**
-     * strips away the parent wrapping from the dmaap events entity payload
-     * 
-     * @param entity
-     * @param uriSegmentList
-     * @return
-     */
-    protected JsonObject getEntityBody(JsonObject entity, List<AAIUriSegment> uriSegmentList) {
-
-        if (uriSegmentList.size() == 1) {
-            return entity;
-        }
-
-        JsonObject entityBody = entity.getAsJsonObject();
-
-        // if processing relationship no need to look for nested obj, entity is the obj
-        if (!"relationship".equals(uriSegmentList.get(uriSegmentList.size() - 1).getSegmentSingular())) {
-            for (int i = 1; i < uriSegmentList.size(); i++) {
-                if (uriSegmentList.get(i).getSegmentPlural().isPresent()) {
-                    entityBody = entityBody.getAsJsonObject(uriSegmentList.get(i).getSegmentPlural().get())
-                            .getAsJsonArray(uriSegmentList.get(i).getSegmentSingular()).get(0).getAsJsonObject();
-                } else {
-                    entityBody = entityBody.getAsJsonArray(uriSegmentList.get(i).getSegmentSingular()).get(0)
-                            .getAsJsonObject();
-                }
-
-            }
-        }
-
-        return entityBody;
-
-    }
-
-    protected List<AAIUriSegment> getAaiUriSegments(String uri) {
-        List<String> uriSegmentTemplates = aaiResourcesUriTemplates.uriToTemplates(uri);
-        List<String> uriSegments = aaiResourcesUriTemplates.uriToSegments(uri);
-
-        List<AAIUriSegment> uriSegmentList = new ArrayList<>(uriSegments.size());
-
-        AAIUriSegment aus;
-        for (int i = 0; i < uriSegments.size(); i++) {
-            aus = new AAIUriSegment(uriSegments.get(i), uriSegmentTemplates.get(i));
-            aus.setSegmentKeyValues(
-                    aaiResourcesUriTemplates.getUriTemplateMappings(aus.getSegment(), aus.getSegmentTemplate()));
-            uriSegmentList.add(aus);
-        }
-        return uriSegmentList;
-    }
-
-    /**
-     * For update events with an existing obj available adjust the cache actions to
-     * be taken on relationship objects.
-     * 
-     * @param jsonObject
-     * @param fullUri
-     * @param newObjectRelationships
-     */
-    private void adjustRelationshipsBasedOnExisting(JsonObject jsonObject, String fullUri,
-            MultiValueMap<String, AAIResourceDmaapParserStrategy.AAIRelatedToDetails> newObjectRelationships) {
-        JsonObject existingObj = jsonObject.getAsJsonObject("existing-obj");
-        MultiValueMap<String, AAIResourceDmaapParserStrategy.AAIRelatedToDetails> oldRelationships = getFromRelationshipFullUriToRelationshipObj(
-                existingObj, fullUri);
-        oldRelationships.forEach((k, v) -> {
-            if (newObjectRelationships.containsKey(k)) {
-                v.forEach(oldA -> {
-                    int found = -1;
-                    for (int i = 0; i < newObjectRelationships.get(k).size(); i++) {
-                        if (newObjectRelationships.get(k).get(i).getFullUri().equals(oldA.getFullUri())) {
-                            found = i;
-                            break;
-                        }
-                    }
-                    if (found != -1) {
-                        newObjectRelationships.get(k).remove(newObjectRelationships.get(k).get(found));
-                    } else {
-                        oldA.setActionType(DmaapAction.DELETE);
-                        newObjectRelationships.get(k).add(oldA);
-                    }
-                });
-            } else {
-                v.forEach(aaiRelatedToDetails -> {
-                    aaiRelatedToDetails.setActionType(DmaapAction.DELETE);
-                    newObjectRelationships.add(k, aaiRelatedToDetails);
-                });
-            }
-        });
-    }
-
-    /**
-     * Given fullUri uri generate an aai relationship obj
-     * 
-     * @param fullUri
-     * @return
-     */
-    protected JsonObject fullUriToRelationshipObj(String fullUri, String label) {
-        final JsonObject relObj = new JsonObject();
-        final JsonArray relData = new JsonArray();
-        String uri = getUri(fullUri);
-        List<AAIUriSegment> uriSegmentList = getAaiUriSegments(uri);
-
-        relObj.addProperty("related-to", uriSegmentList.get(uriSegmentList.size() - 1).getSegmentSingular());
-        if (label != null) {
-            relObj.addProperty("relationship-label", label);
-        }
-        relObj.addProperty("related-link", fullUri);
-
-        for (AAIUriSegment aaiUriSegment : uriSegmentList) {
-            aaiUriSegment.getSegmentKeyValues().forEach((k, v) -> {
-                JsonObject relDataEntry;
-                relDataEntry = new JsonObject();
-                relDataEntry.addProperty("relationship-key", aaiUriSegment.getSegmentSingular() + "." + k);
-                relDataEntry.addProperty("relationship-value", v);
-                relData.add(relDataEntry);
-            });
-        }
-        relObj.add("relationship-data", relData);
-
-        return relObj;
-    }
-
-    /**
-     *
-     * @param entity
-     * @param fullUri
-     * @return
-     */
-    protected MultiValueMap<String, AAIResourceDmaapParserStrategy.AAIRelatedToDetails> getFromRelationshipFullUriToRelationshipObj(
-            JsonObject entity, String fullUri) {
-        final MultiValueMap<String, AAIResourceDmaapParserStrategy.AAIRelatedToDetails> relationshipMapping = new LinkedMultiValueMap<>();
-        for (Map.Entry<String, JsonElement> e : entity.entrySet()) {
-            if (e.getKey().equals("relationship-list") && e.getValue().isJsonObject()) {
-                JsonArray relationships = e.getValue().getAsJsonObject().getAsJsonArray("relationship");
-                for (JsonElement relationship : relationships) {
-                    relationshipMapping.add(fullUri, new AAIResourceDmaapParserStrategy.AAIRelatedToDetails(
-                            relationship.getAsJsonObject().get("related-link").getAsString(),
-                            relationship.getAsJsonObject().get("relationship-label").getAsString(), actionType));
-                }
-            } else if (e.getValue().isJsonObject() && e.getValue().getAsJsonObject().entrySet().size() == 1) {
-                Map.Entry<String, JsonElement> entry = e.getValue().getAsJsonObject().entrySet().iterator().next();
-                if (entry.getValue().isJsonArray()) {
-                    String type = entry.getKey();
-                    JsonArray children = entry.getValue().getAsJsonArray();
-                    for (JsonElement child : children) {
-                        relationshipMapping.putAll(getFromRelationshipFullUriToRelationshipObj(child.getAsJsonObject(),
-                                fullUri + aaiResourcesUriTemplates.getUri(type, child.getAsJsonObject())));
-                    }
-                }
-            }
-        }
-        return relationshipMapping;
-    }
-
-    protected String getUri(String fullUri) {
-        return fullUri.replaceAll("/aai/v\\d+", "");
-    }
-
-    protected String getFullUri(JsonObject header) {
-        return header.get("entity-link").getAsString();
-    }
-
-    protected enum DmaapAction {
-        DELETE, UPDATE, CREATE
-    }
-
-    class AAIUriSegment {
-
-        private String segment;
-        private String segmentTemplate;
-        private Optional<String> segmentPlural = Optional.empty();
-        private String segmentSingular;
-        private Map<String, String> segmentKeyValues;
-
-        AAIUriSegment(String segment, String template) {
-            this.segment = segment;
-            this.segmentTemplate = template;
-            String[] segmentSplit = segment.split("/");
-            String[] templateSplit = template.split("/");
-            for (int i = 0; i < templateSplit.length; i++) {
-                if (templateSplit[i].contains("{")) {
-                    segmentSingular = segmentSplit[i - 1];
-                    if (!"".equals(segmentSplit[i - 2])) {
-                        segmentPlural = Optional.of(segmentSplit[i - 2]);
-                    }
-                    break;
-                }
-            }
-        }
-
-        String getSegment() {
-            return segment;
-        }
-
-        String getSegmentTemplate() {
-            return segmentTemplate;
-        }
-
-        Map<String, String> getSegmentKeyValues() {
-            return segmentKeyValues;
-        }
-
-        void setSegmentKeyValues(Map<String, String> segmentKeyValues) {
-            this.segmentKeyValues = segmentKeyValues;
-        }
-
-        Optional<String> getSegmentPlural() {
-            return segmentPlural;
-        }
-
-        String getSegmentSingular() {
-            return segmentSingular;
-        }
-    }
-
-    class AAIRelatedToDetails {
-        private String fullUri;
-        private String label;
-        private DmaapAction actionType;
-
-        public AAIRelatedToDetails(String fullUri, String label, DmaapAction actionType) {
-            this.fullUri = fullUri;
-            this.label = label;
-            this.actionType = actionType;
-        }
-
-        public String getFullUri() {
-            return fullUri;
-        }
-
-        public String getLabel() {
-            return label;
-        }
-
-        public DmaapAction getActionType() {
-            return actionType;
-        }
-
-        public void setActionType(DmaapAction actionType) {
-            this.actionType = actionType;
-        }
-
-        @Override
-        public String toString() {
-            return fullUri + " : " + label;
-        }
-    }
-}
index 1c2f6cf..c03af62 100644 (file)
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package org.onap.aai.cacher.injestion.parser.strategy;
 
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
-import org.onap.aai.cacher.injestion.parser.AAIResourcesUriTemplates;
+import org.onap.aai.cacher.injestion.parser.strategy.aai.AAIResourcesUriTemplates;
 import org.onap.aai.cacher.model.CacheEntry;
 import org.onap.aai.cacher.model.DBAction;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -30,56 +31,177 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory;
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
- * AAI resource get all parser strategy
+ * This parser strategy breaks down the all nested
+ * aai objects to be stored separately
  */
-@Component(value = "aai-resource-get-all")
+@Component(value="aai-resource-get-all")
 @Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)
 public class AAIResourceGetAllPayloadParserStrategy implements PayloadParserStrategy {
 
-    AAIResourcesUriTemplates aaiResourcesUriTemplates;
-
-    @Autowired
-    public AAIResourceGetAllPayloadParserStrategy(AAIResourcesUriTemplates aaiResourcesUriTemplates) {
-        this.aaiResourcesUriTemplates = aaiResourcesUriTemplates;
-    }
-
-    /**
-     * Parses aai resources specific payloads generating the details for .
-     * 
-     * @param originalKey
-     * @param jsonObject
-     * @return
-     */
-    @Override
-    public List<CacheEntry> process(String originalKey, JsonObject jsonObject) {
-        final List<CacheEntry> cacheEntries = new ArrayList<>();
-
-        String type = jsonObject.entrySet().iterator().next().getKey();
-
-        JsonArray ja = jsonObject.getAsJsonArray(type);
-        CacheEntry cacheEntry;
-        String uri;
-        JsonObject jo;
-        for (JsonElement jsonElement : ja) {
-            jo = jsonElement.getAsJsonObject();
-            uri = aaiResourcesUriTemplates.getUri(type, jo);
-            jsonObject.addProperty("_id", uri);
-            cacheEntry = CacheEntry.CacheEntryBuilder.createCacheEntry().withId(uri).inCollection(originalKey)
-                    .withFindQuery(getFindQuery(uri)).withPayload(jo).withDbAction(DBAction.INSERT_REPLACE).build();
-            cacheEntries.add(cacheEntry);
-        }
-
-        return cacheEntries;
-    }
-
-    protected JsonObject getFindQuery(String uri) {
-        JsonObject jo = new JsonObject();
-        jo.addProperty("_id", uri);
-        return jo;
-    }
+       private static final String RELATIONSHIP = "relationship";
+
+       protected AAIResourcesUriTemplates aaiResourcesUriTemplates;
+
+       @Autowired
+       public AAIResourceGetAllPayloadParserStrategy(AAIResourcesUriTemplates aaiResourcesUriTemplates) {
+               this.aaiResourcesUriTemplates = aaiResourcesUriTemplates;
+       }
+
+
+       /**
+        * Parses aai resources specific payloads generating the details for its cache entries.
+        * @param originalKey cache key for this entry
+        * @param jsonObject object to be broken down via this strategy
+        * @return List of cache entries to be stored
+        */
+       @Override
+       public List<CacheEntry> process(String originalKey, JsonObject jsonObject) {
+               return internalProcess(originalKey, jsonObject, "");
+       }
+
+       protected List<CacheEntry> internalProcess(String originalKey, JsonObject jsonObject, String baseUri) {
+               final List<CacheEntry> cacheEntries = getCacheEntries(originalKey, baseUri, jsonObject);
+               List<CacheEntry> nestedCacheEntries;
+               Set<String> nestedProperties;
+
+               boolean foundNested = true;
+               int start = 0;
+               while (foundNested) {
+                       nestedCacheEntries = new ArrayList<>();
+                       for (int i = start; i < cacheEntries.size(); i++) {
+                               nestedProperties = nestedPropsToBePopulated(cacheEntries.get(i).getPayload());
+                               if (!nestedProperties.isEmpty()) {
+                                       nestedCacheEntries.addAll(processEntriesWithNested(originalKey, cacheEntries.get(i), nestedProperties));
+                               }
+                       }
+                       if (nestedCacheEntries.isEmpty()) {
+                               foundNested = false;
+                       } else {
+                               start = cacheEntries.size();
+                               cacheEntries.addAll(nestedCacheEntries);
+                               foundNested = true;
+                       }
+               }
+
+               cacheEntries.forEach(cacheEntry ->
+                               cacheEntry.getPayload().addProperty("_id", cacheEntry.getId()));
+               return cacheEntries;
+       }
+
+       private Set<String> nestedPropsToBePopulated(JsonObject jsonObject) {
+               Set<String> props = jsonObject.entrySet()
+                               .stream()
+                               .filter(nestedEntry -> nestedEntry.getValue().isJsonObject() &&
+                                               aaiResourcesUriTemplates.hasType(nestedEntry.getValue().getAsJsonObject().entrySet().iterator().next().getKey()))
+                               .map(Map.Entry::getKey)
+                               .collect(Collectors.toSet());
+               props.addAll(jsonObject.entrySet()
+                               .stream()
+                               .filter(nestedEntry -> nestedEntry.getValue().isJsonArray() &&
+                                               aaiResourcesUriTemplates.hasType(nestedEntry.getKey()))
+                               .map(Map.Entry::getKey)
+                               .collect(Collectors.toSet()));
+               props.remove("relationship-list");
+               return props;
+       }
+
+
+       /**
+        * Replaces the nested object with the id to the object and generates a cache entry per object
+        * @param originalKey top node type
+        * @param cacheEntry with nested aai object
+        * @param nestedProperties the keys that contain nested properties
+        * @return List of CacheEntry for each nested json object
+        */
+       private List<CacheEntry> processEntriesWithNested(String originalKey, CacheEntry cacheEntry, Set<String> nestedProperties) {
+               final List<CacheEntry> cacheEntries = new ArrayList<>();
+
+               for (String nestedProperty : nestedProperties) {
+                       List<CacheEntry> nestedCacheEntries = new ArrayList<>();
+                       if (cacheEntry.getPayload().get(nestedProperty).isJsonObject()) {
+                               String type = cacheEntry.getPayload().get(nestedProperty).getAsJsonObject().entrySet().iterator().next().getKey();
+                               nestedCacheEntries =
+                                               getCacheEntries(originalKey, cacheEntry.getId(), cacheEntry.getPayload().get(nestedProperty).getAsJsonObject());
+                               JsonArray nestedElementsIds = new JsonArray();
+                               nestedCacheEntries.forEach(nestedCacheEntry -> nestedElementsIds.add(nestedCacheEntry.getId()));
+                               cacheEntry.getPayload().get(nestedProperty).getAsJsonObject().add(type, nestedElementsIds);
+                       } else if (cacheEntry.getPayload().get(nestedProperty).isJsonArray()) {
+                               nestedCacheEntries =
+                                               getCacheEntries(originalKey, cacheEntry.getId(), nestedProperty, cacheEntry.getPayload().get(nestedProperty).getAsJsonArray());
+                               JsonArray nestedElementsIds = new JsonArray();
+                               nestedCacheEntries.forEach(nestedCacheEntry -> nestedElementsIds.add(nestedCacheEntry.getId()));
+                               cacheEntry.getPayload().add(nestedProperty, nestedElementsIds);
+                       }
+                       cacheEntries.addAll(nestedCacheEntries);
+               }
+
+               return cacheEntries;
+       }
+
+
+       /**
+        * Generates the CacheEntries for all of the nested objects in the JsonObject
+        * @param originalKey the aai-node-type
+        * @param baseUri the base "parent" url used to populate full uri
+        * @param jsonObject the object to be scanned
+        * @return List of CacheEntries for all of the nested objects in the payload
+        */
+       protected List<CacheEntry> getCacheEntries(String originalKey, String baseUri, JsonObject jsonObject) {
+               String type = jsonObject.entrySet().iterator().next().getKey();
+               JsonArray ja = jsonObject.getAsJsonArray(type);
+               return getCacheEntries(originalKey, baseUri, type, ja);
+       }
+
+       /**
+        * Generates the CacheEntries for all of the nested objects in the JsonArray
+        * @param originalKey the top aai-node-type
+        * @param baseUri the base "parent" url used to populate full uri
+        * @param ja the JsonArray to be scanned
+        * @return List of CacheEntries for all of the nested objects in the payload
+        */
+       private List<CacheEntry> getCacheEntries(String originalKey, String baseUri, String type, JsonArray ja) {
+               final List<CacheEntry> cacheEntries = new ArrayList<>(ja.size());
+               final Set<String> uris = new HashSet<>(ja.size());
+               for (JsonElement jsonElement : ja) {
+                       String uri;
+                       JsonObject jo = jsonElement.getAsJsonObject();
+                       if (RELATIONSHIP.equals(type)) {
+                               uri = jo.get("related-link").getAsString().replaceAll("/aai/v\\d+", "");
+                       } else {
+                               uri = baseUri + aaiResourcesUriTemplates.getUri(type, jo);
+                       }
+                       // checks for nested dupes and does not create a cache entry for them
+                       if (uris.contains(uri)) {
+                               continue;
+                       } else {
+                               uris.add(uri);
+                       }
+                       CacheEntry cacheEntry = CacheEntry.CacheEntryBuilder.createCacheEntry()
+                                       .withId(uri)
+                                       .inCollection(originalKey)
+                                       .withFindQuery(getFindQuery(uri))
+                                       .withPayload(jo)
+                                       .withDbAction(DBAction.INSERT_REPLACE)
+                                       .build();
+                       cacheEntries.add(cacheEntry);
+               }
+
+               return cacheEntries;
+       }
+
+       /**
+        * Creates a find query payload
+        * @param uri used as the _id field for lookup
+        * @return the find query JsonObject
+        */
+       private JsonObject getFindQuery(String uri) {
+               JsonObject jo = new JsonObject();
+               jo.addProperty("_id", uri);
+               return jo;
+       }
 
 }
index b497a8c..0e46b2f 100644 (file)
 package org.onap.aai.cacher.injestion.parser.strategy;
 
 import java.util.Arrays;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 public enum PayloadParserType {
 
-    NONE("none"), AAI_RESOURCE_GET_ALL("aai-resource-get-all"), AAI_RESOURCE_DMAAP("aai-resource-dmaap");
-    private final String value;
+       NONE("none"),
+       AAI_RESOURCE_GET_ALL("aai-resource-get-all"),
+       AAI_RESOURCE_DMAAP("aai-resource-dmaap");
 
-    PayloadParserType(String input) {
-        this.value = input;
-    }
+       private static final Map<String, PayloadParserType> MAP;
+       static {
+               MAP = Arrays.stream(values()).collect(Collectors.toMap(PayloadParserType::getValue, Function.identity()));
+       }
 
-    public String getValue() {
-        return this.value;
-    }
+       private final String value;
 
-    @Override
-    public String toString() {
-        return this.value;
-    }
+       PayloadParserType(String input) {
+               this.value = input;
+       }
 
-    public static PayloadParserType fromString(String text) {
-        return Arrays.stream(values()).filter(bl -> bl.getValue().equalsIgnoreCase(text)).findFirst().orElse(null);
-    }
+       public String getValue() {
+               return this.value;
+       }
+
+       @Override
+       public String toString() {
+               return this.value;
+       }
+
+       public static PayloadParserType fromString(String text) {
+               return MAP.get(text);
+       }
 }
+
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-package org.onap.aai.cacher.injestion.parser;
+package org.onap.aai.cacher.injestion.parser.strategy.aai;
 
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
 import com.google.gson.JsonObject;
 import org.apache.commons.lang3.StringUtils;
+import org.onap.aai.annotations.Metadata;
 import org.onap.aai.cacher.util.AAIConstants;
+import org.reflections.Reflections;
 import org.springframework.beans.factory.config.ConfigurableBeanFactory;
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
@@ -29,6 +33,7 @@ import org.springframework.web.util.UriTemplate;
 import org.springframework.web.util.UriUtils;
 
 import javax.ws.rs.core.UriBuilder;
+import javax.xml.bind.annotation.XmlRootElement;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -39,6 +44,8 @@ import java.util.*;
 @Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)
 public class AAIResourcesUriTemplates {
 
+    private final static EELFLogger LOGGER = EELFManager.getInstance().getLogger(AAIResourcesUriTemplates.class);
+
     private final Map<String, String> typeToUriTemplate;
 
     public AAIResourcesUriTemplates() throws IOException {
@@ -53,6 +60,22 @@ public class AAIResourcesUriTemplates {
                 typeToUriTemplate.put("relationship", "/relationship-list/relationship/{related-link}");
             }
         }
+
+        Reflections reflections = new Reflections("org.onap.aai.domain.yang");
+        reflections.getTypesAnnotatedWith(Metadata.class)
+                .stream()
+                .filter(aClass -> "org.onap.aai.domain.yang".equals(aClass.getPackage().getName()))
+                .filter(aClass -> !aClass.getAnnotation(Metadata.class).uriTemplate().isEmpty())
+                .forEach(aClass -> typeToUriTemplate.put(
+                        aClass.getAnnotation(XmlRootElement.class).name(),
+                        aClass.getAnnotation(Metadata.class).uriTemplate())
+                );
+
+        LOGGER.info("AAI uri templates: " + typeToUriTemplate);
+    }
+
+    public boolean hasType(String type) {
+        return this.typeToUriTemplate.containsKey(type);
     }
 
     /**
@@ -65,6 +88,12 @@ public class AAIResourcesUriTemplates {
         return typeToUriTemplate.get(type);
     }
 
+    /**
+     * For the given template and uri get the variable key value pairs
+     * @param uri
+     * @param template
+     * @return
+     */
     public Map<String, String> getUriTemplateMappings(String uri, String template) {
 
         UriTemplate uriTemplate = new UriTemplate(template);
@@ -85,13 +114,20 @@ public class AAIResourcesUriTemplates {
         List<String> uriTemplateList = new ArrayList<>();
         String template = "";
         String truncatedUri = uri;
+        Optional<String> matchingStartingTemplate;
 
         while (truncatedUri.contains("/")) {
-            template = this.getMatchingStartingTemplate(truncatedUri).get();
+            matchingStartingTemplate = this.getMatchingStartingTemplate(truncatedUri);
+            if ( !matchingStartingTemplate.isPresent()) {
+                LOGGER.error("failed in uriToTemplates for truncatedUri " + truncatedUri);
+                // exception expected for missing template
+            }
+            template = matchingStartingTemplate.get();
             uriTemplateList.add(template);
             int count = StringUtils.countMatches(template, "/");
             if (count < StringUtils.countMatches(truncatedUri, "/")) {
-                truncatedUri = StringUtils.substring(truncatedUri,
+                truncatedUri = StringUtils.substring(
+                        truncatedUri,
                         StringUtils.ordinalIndexOf(truncatedUri, "/", count + 1));
             } else {
                 truncatedUri = "";
@@ -205,4 +241,28 @@ public class AAIResourcesUriTemplates {
             return "";
         }
     }
+
+    public String getAAIUriFromEntityUri(String fullUri) {
+        return fullUri.replaceAll("/aai/v\\d+", "");
+    }
+
+    public String getAAIUriFromEntityUriPrefix(String fullUri) {
+        return StringUtils.substring(fullUri, 0, StringUtils.ordinalIndexOf(fullUri, "/", 3));
+    }
+
+    public List<AAIUriSegment> getAaiUriSegments(String uri) {
+        List<String> uriSegmentTemplates = uriToTemplates(uri);
+        List<String> uriSegments = uriToSegments(uri);
+
+        List<AAIUriSegment> uriSegmentList = new ArrayList<>(uriSegments.size());
+
+        AAIUriSegment aus;
+        for (int i = 0; i < uriSegments.size(); i++) {
+            aus = new AAIUriSegment(uriSegments.get(i), uriSegmentTemplates.get(i));
+            aus.setSegmentKeyValues(
+                    getUriTemplateMappings(aus.getSegment(), aus.getSegmentTemplate()));
+            uriSegmentList.add(aus);
+        }
+        return uriSegmentList;
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/AAIUriSegment.java b/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/AAIUriSegment.java
new file mode 100644 (file)
index 0000000..7624a91
--- /dev/null
@@ -0,0 +1,73 @@
+/**
+ * ============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.cacher.injestion.parser.strategy.aai;
+
+import java.util.Map;
+import java.util.Optional;
+
+public class AAIUriSegment {
+
+       private String segment;
+       private String segmentTemplate;
+       private Optional<String> segmentPlural = Optional.empty();
+       private String segmentSingular;
+       private Map<String, String> segmentKeyValues;
+
+       public AAIUriSegment(String segment, String template) {
+               this.segment = segment;
+               this.segmentTemplate = template;
+               String[] segmentSplit = segment.split("/");
+               String[] templateSplit = template.split("/");
+               for (int i = 0; i < templateSplit.length; i++) {
+                       if (templateSplit[i].contains("{")) {
+                               segmentSingular = segmentSplit[i - 1];
+                               if (!"".equals(segmentSplit[i - 2])) {
+                                       segmentPlural = Optional.of(segmentSplit[i - 2]);
+                               }
+                               break;
+                       }
+               }
+       }
+
+       public String getSegment() {
+               return segment;
+       }
+
+       public String getSegmentTemplate() {
+               return segmentTemplate;
+       }
+
+       public Map<String, String> getSegmentKeyValues() {
+               return segmentKeyValues;
+       }
+
+       public void setSegmentKeyValues(Map<String, String> segmentKeyValues) {
+               this.segmentKeyValues = segmentKeyValues;
+       }
+
+       public Optional<String> getSegmentPlural() {
+               return segmentPlural;
+       }
+
+       public String getSegmentSingular() {
+               return segmentSingular;
+       }
+}
\ No newline at end of file
diff --git a/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/AAIRelatedToDetails.java b/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/AAIRelatedToDetails.java
new file mode 100644 (file)
index 0000000..cd18ee8
--- /dev/null
@@ -0,0 +1,54 @@
+/**
+ * ============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.cacher.injestion.parser.strategy.aai.dmaap;
+
+public class AAIRelatedToDetails {
+       private String fullUri;
+       private String label;
+       private DmaapAction actionType;
+
+       public AAIRelatedToDetails(String fullUri, String label, DmaapAction actionType) {
+               this.fullUri = fullUri;
+               this.label = label;
+               this.actionType = actionType;
+       }
+
+       public String getFullUri() {
+               return fullUri;
+       }
+
+       public String getLabel() {
+               return label;
+       }
+
+       public DmaapAction getActionType() {
+               return actionType;
+       }
+
+       public void setActionType(DmaapAction actionType) {
+               this.actionType = actionType;
+       }
+
+       @Override
+       public String toString() {
+               return fullUri + " : " + label;
+       }
+}
\ No newline at end of file
diff --git a/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/AAIResourceDmaapParserStrategy.java b/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/AAIResourceDmaapParserStrategy.java
new file mode 100644 (file)
index 0000000..8d88a4a
--- /dev/null
@@ -0,0 +1,327 @@
+/**
+ * ============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.cacher.injestion.parser.strategy.aai.dmaap;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import org.onap.aai.cacher.injestion.parser.strategy.AAIResourceGetAllPayloadParserStrategy;
+import org.onap.aai.cacher.injestion.parser.strategy.aai.AAIResourcesUriTemplates;
+import org.onap.aai.cacher.injestion.parser.strategy.aai.AAIUriSegment;
+import org.onap.aai.cacher.model.CacheEntry;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * AAI resource get all parser strategy
+ */
+@Component(value = "aai-resource-dmaap")
+@Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)
+public class AAIResourceDmaapParserStrategy extends AAIResourceGetAllPayloadParserStrategy {
+    
+    private final static EELFLogger LOGGER = EELFManager.getInstance().getLogger(AAIResourceDmaapParserStrategy.class);
+
+    @Autowired
+    public AAIResourceDmaapParserStrategy(AAIResourcesUriTemplates aaiResourcesUriTemplates) {
+        super(aaiResourcesUriTemplates);
+    }
+
+    /**
+     * Parses aai resources specific payloads generating the details for caching.
+     *
+     * @param originalKey
+     * @param jsonObject
+     * @return
+     */
+    @Override
+    public List<CacheEntry> process(String originalKey, JsonObject jsonObject) {
+        final List<CacheEntry> cacheEntries;
+
+        JsonObject header = jsonObject.getAsJsonObject("event-header");
+        String topEntityType = header.get("top-entity-type").getAsString();
+        String fullUri = header.get("entity-link").getAsString();
+        if ( fullUri.endsWith("/")) {
+            fullUri = fullUri.substring(0, fullUri.length() - 1);
+        }
+        String entityUri = aaiResourcesUriTemplates.getAAIUriFromEntityUri(fullUri);
+        String fullUriPrefix = aaiResourcesUriTemplates.getAAIUriFromEntityUriPrefix(fullUri);
+
+        DmaapAction actionType = DmaapAction.valueOf(header.get("action").getAsString());
+
+        List<AAIUriSegment> uriSegments = aaiResourcesUriTemplates.getAaiUriSegments(entityUri);
+
+        // get base uri so if is top lvl use "" else go 1 back from current node type. to reuse exist functions.
+        String baseUri = getBaseUri(uriSegments);
+
+        // get wrapped wrap obj it looks like a get-all result with 1
+        // will wrap address lists even though they do not normally have a wrapper
+        JsonObject wrappedEntityObject = getWrappedEntityObject(jsonObject.getAsJsonObject("entity"), uriSegments);
+
+        // get cache entries
+        cacheEntries = internalProcess(topEntityType, wrappedEntityObject, baseUri);
+
+        // modify action to map to dmaap event type
+        cacheEntries.forEach(cacheEntry -> cacheEntry.setDbAction(actionType.getDbAction()));
+
+        // cache entries for relationships
+        MultiValueMap<String, AAIRelatedToDetails> cacheEntriesRelationships =
+                getFromRelationshipFullUriToRelationshipObj(cacheEntries, fullUriPrefix, actionType);
+
+        if (jsonObject.has("existing-obj")) {
+            MultiValueMap<String, AAIRelatedToDetails> existingCacheEntriesRelationships =
+                    getFromRelationshipFullUriToRelationshipObj(
+                            internalProcess(topEntityType, jsonObject.getAsJsonObject("existing-obj"), baseUri),
+                            fullUriPrefix,
+                            actionType
+                    );
+            adjustRelationshipsBasedOnExisting(existingCacheEntriesRelationships, cacheEntriesRelationships);
+
+        }
+
+        cacheEntries.addAll(getRelationshipCacheEntries(cacheEntriesRelationships));
+
+        getParentUpdateCacheEntryIfNeeded(topEntityType, entityUri, actionType, uriSegments).ifPresent(cacheEntries::add);
+
+        return cacheEntries;
+    }
+
+    private Optional<CacheEntry> getParentUpdateCacheEntryIfNeeded(String topEntityType, String entityUri, DmaapAction actionType, List<AAIUriSegment> uriSegments) {
+
+        if (uriSegments.size() <= 1) {
+            return Optional.empty();
+        }
+
+        switch (actionType) {
+            case DELETE:
+                return Optional.of(getParentUpdateCacheEntry(topEntityType, entityUri, actionType, uriSegments));
+            case CREATE:
+                return Optional.of(getParentUpdateCacheEntry(topEntityType, entityUri, DmaapAction.UPDATE, uriSegments));
+            default:
+                return Optional.empty();
+        }
+    }
+
+    private CacheEntry getParentUpdateCacheEntry(String topEntityType, String entityUri, DmaapAction actionType, List<AAIUriSegment> uriSegments) {
+        String parentUri = String.join(
+                "",
+                uriSegments.stream().limit(uriSegments.size()-1).map(AAIUriSegment::getSegment).collect(Collectors.toList()));
+        JsonObject findQuery = new JsonObject();
+        findQuery.addProperty("_id", parentUri);
+        JsonObject nestedFindQuery = new JsonObject();
+        nestedFindQuery.addProperty("_id", parentUri);
+        StringBuilder nestedField = new StringBuilder();
+        uriSegments.get(uriSegments.size()-1).getSegmentPlural().ifPresent(plural -> nestedField.append(plural).append("."));
+        nestedField.append(uriSegments.get(uriSegments.size()-1).getSegmentSingular());
+        JsonObject nestedIdentifier = new JsonObject();
+        JsonArray ja = new JsonArray();
+        ja.add(entityUri);
+        nestedIdentifier.add("$in", ja);
+        return CacheEntry.CacheEntryBuilder.createCacheEntry()
+                .inCollection(topEntityType)
+                .withDbAction(actionType.getDbAction())
+                .withId(parentUri)
+                .isNested(true)
+                .isNestedPayloadString(true)
+                .withNestedString(entityUri)
+                .withFindQuery(findQuery)
+                .withNestedFind(nestedFindQuery)
+                .withNestedField(nestedField.toString())
+                .withNestedFieldIdentifierObj(nestedIdentifier)
+                .build();
+    }
+
+    private List<CacheEntry> getRelationshipCacheEntries(MultiValueMap<String, AAIRelatedToDetails> cacheEntriesRelationships) {
+        final List<CacheEntry> cacheEntries = new ArrayList<>();
+        JsonObject relatedToObj;
+        for (Map.Entry<String, List<AAIRelatedToDetails>> relationship : cacheEntriesRelationships.entrySet()) {
+            for (AAIRelatedToDetails aaiRelatedToDetails : relationship.getValue()) {
+                relatedToObj = fullUriToRelationshipObj(relationship.getKey(), aaiRelatedToDetails.getLabel());
+                cacheEntries.add(generateRelationshipCacheEntry(relatedToObj, aaiRelatedToDetails.getActionType(),
+                        aaiRelatedToDetails.getFullUri()));
+            }
+        }
+        return cacheEntries;
+    }
+
+    private CacheEntry generateRelationshipCacheEntry(JsonObject entity, DmaapAction actionType, String fullUri) {
+
+        String uri = aaiResourcesUriTemplates.getAAIUriFromEntityUri(fullUri);
+        List<AAIUriSegment> uriSegmentList = aaiResourcesUriTemplates.getAaiUriSegments(uri);
+        String collection = uriSegmentList.get(0).getSegmentSingular();
+        JsonObject findQuery = new JsonObject();
+        findQuery.addProperty("_id", uri);
+        JsonObject nestedFindQuery = new JsonObject();
+        nestedFindQuery.addProperty("_id", uri);
+        nestedFindQuery.addProperty("relationship-list.relationship.related-link", entity.get("related-link").getAsString());
+        String nestedField = "relationship-list.relationship";
+        JsonObject nestedIdentifier = new JsonObject();
+        nestedIdentifier.addProperty("related-link", entity.get("related-link").getAsString());
+
+        return CacheEntry.CacheEntryBuilder.createCacheEntry().inCollection(collection).withDbAction(actionType.getDbAction())
+                .withId(uri).isNested(true).withPayload(entity).withFindQuery(findQuery)
+                .withNestedFind(nestedFindQuery).withNestedField(nestedField)
+                .withNestedFieldIdentifierObj(nestedIdentifier).build();
+    }
+
+    private void adjustRelationshipsBasedOnExisting(MultiValueMap<String, AAIRelatedToDetails> existingCacheEntriesRelationships,
+                                                    MultiValueMap<String, AAIRelatedToDetails> cacheEntriesRelationships) {
+        existingCacheEntriesRelationships.forEach((k, v) -> {
+            if (cacheEntriesRelationships.containsKey(k)) {
+                v.forEach(oldA -> {
+                    int found = -1;
+                    for (int i = 0; i < cacheEntriesRelationships.get(k).size(); i++) {
+                        if (cacheEntriesRelationships.get(k).get(i).getFullUri().equals(oldA.getFullUri())) {
+                            found = i;
+                            break;
+                        }
+                    }
+                    if (found != -1) {
+                        cacheEntriesRelationships.get(k).remove(cacheEntriesRelationships.get(k).get(found));
+                    } else {
+                        oldA.setActionType(DmaapAction.DELETE);
+                        cacheEntriesRelationships.get(k).add(oldA);
+                    }
+                });
+            } else {
+                v.forEach(aaiRelatedToDetails -> {
+                    aaiRelatedToDetails.setActionType(DmaapAction.DELETE);
+                    cacheEntriesRelationships.add(k, aaiRelatedToDetails);
+                });
+            }
+        });
+    }
+
+    private MultiValueMap<String, AAIRelatedToDetails> getFromRelationshipFullUriToRelationshipObj(
+            List<CacheEntry> cacheEntries,
+            String fullUriPrefix,
+            DmaapAction actionType) {
+        final MultiValueMap<String, AAIRelatedToDetails> relationshipMapping = new LinkedMultiValueMap<>();
+        for (CacheEntry cacheEntry : cacheEntries) {
+            for (Map.Entry<String, JsonElement> e : cacheEntry.getPayload().entrySet()) {
+                if (e.getKey().equals("relationship-list") && e.getValue().isJsonObject()) {
+                    JsonArray relationships = e.getValue().getAsJsonObject().getAsJsonArray("relationship");
+                    for (JsonElement relationship : relationships) {
+                        relationshipMapping.add(fullUriPrefix + cacheEntry.getId(), new AAIRelatedToDetails(
+                                relationship.getAsJsonObject().get("related-link").getAsString(),
+                                relationship.getAsJsonObject().get("relationship-label").getAsString(), actionType));
+                    }
+                }
+            }
+        }
+        return relationshipMapping;
+    }
+
+    /**
+     * Given fullUri uri generate an aai relationship obj
+     *
+     * @param fullUri
+     * @return
+     */
+    protected JsonObject fullUriToRelationshipObj(String fullUri, String label) {
+        final JsonObject relObj = new JsonObject();
+        final JsonArray relData = new JsonArray();
+        String uri = aaiResourcesUriTemplates.getAAIUriFromEntityUri(fullUri);
+        List<AAIUriSegment> uriSegmentList = aaiResourcesUriTemplates.getAaiUriSegments(uri);
+
+        relObj.addProperty("related-to", uriSegmentList.get(uriSegmentList.size() - 1).getSegmentSingular());
+        if (label != null) {
+            relObj.addProperty("relationship-label", label);
+        }
+        relObj.addProperty("related-link", fullUri);
+
+        for (AAIUriSegment aaiUriSegment : uriSegmentList) {
+            aaiUriSegment.getSegmentKeyValues().forEach((k, v) -> {
+                JsonObject relDataEntry;
+                relDataEntry = new JsonObject();
+                relDataEntry.addProperty("relationship-key", aaiUriSegment.getSegmentSingular() + "." + k);
+                relDataEntry.addProperty("relationship-value", v);
+                relData.add(relDataEntry);
+            });
+        }
+        relObj.add("relationship-data", relData);
+
+        return relObj;
+    }
+
+    private JsonObject getWrappedEntityObject(JsonObject dmaapEntity, List<AAIUriSegment> uriSegments) {
+        JsonObject objectWrapper = new JsonObject();
+        JsonArray arrayWrapper = new JsonArray();
+        String arrayKey = uriSegments.get(0).getSegmentSingular();
+        JsonObject entityBody = dmaapEntity.getAsJsonObject();
+
+        if (uriSegments.size() > 1) {
+            Optional<String> segmentPlural;
+            String segmentSingular;
+            String jsonStr;
+            JsonObject jsonObj;
+            JsonArray jsonArray;
+            JsonElement jsonElement;
+
+            for (int i = 1; i < uriSegments.size(); i++) {
+
+                if (uriSegments.get(i).getSegmentPlural().isPresent()) {
+                    segmentPlural = uriSegments.get(i).getSegmentPlural();
+                    segmentSingular = uriSegments.get(i).getSegmentSingular();
+                    if ( segmentSingular.equals("cvlan-tag")) {
+                            // map to what is in the entity
+                        segmentSingular = "cvlan-tag-entry";
+                    }
+                    jsonObj = entityBody.getAsJsonObject(uriSegments.get(i).getSegmentPlural().get());
+                    jsonArray = jsonObj.getAsJsonArray(segmentSingular);
+                    if ( jsonArray == null ) {
+                        LOGGER.error("failed in getWrappedEntityObject " + segmentSingular + " not found in " + jsonObj );
+                        // exception expected for missing template
+                    }
+                    entityBody = jsonArray.get(0).getAsJsonObject();
+                    arrayKey = uriSegments.get(i).getSegmentSingular();
+                } else {
+                    entityBody = entityBody.getAsJsonArray(uriSegments.get(i).getSegmentSingular()).get(0).getAsJsonObject();
+                    arrayKey = uriSegments.get(i).getSegmentSingular();
+                }
+
+            }
+        }
+        arrayWrapper.add(entityBody);
+        objectWrapper.add(arrayKey, arrayWrapper);
+        return objectWrapper;
+    }
+
+    private String getBaseUri(List<AAIUriSegment> uriSegments) {
+        if (uriSegments.isEmpty() || uriSegments.size() == 1) {
+            return "";
+        }
+        return String.join("", uriSegments.subList(0, uriSegments.size()-1).stream().map(AAIUriSegment::getSegment).collect(Collectors.toList()));
+    }
+
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/DmaapAction.java b/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/DmaapAction.java
new file mode 100644 (file)
index 0000000..73aafd3
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * ============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.cacher.injestion.parser.strategy.aai.dmaap;
+
+import org.onap.aai.cacher.model.DBAction;
+
+public enum DmaapAction {
+        DELETE(DBAction.DELETE),
+        UPDATE(DBAction.UPDATE),
+        CREATE(DBAction.INSERT_REPLACE);
+
+        private final DBAction dbAction;
+        DmaapAction(DBAction dbAction) {
+            this.dbAction = dbAction;
+        }
+
+        public DBAction getDbAction() {
+            return dbAction;
+        }
+    }
\ No newline at end of file
index ed6715e..0fd5c92 100644 (file)
@@ -34,6 +34,8 @@ public class CacheEntry {
     protected JsonObject findQuery;
 
     protected boolean isNested = false;
+    protected boolean isNestedPayloadString = false;
+    protected  String nestedString;
     protected String nestedField;
     protected JsonObject nestedFind;
     protected JsonObject nestedFieldIdentifierObj;
@@ -89,6 +91,22 @@ public class CacheEntry {
         isNested = nested;
     }
 
+    public boolean isNestedPayloadString() {
+        return isNestedPayloadString;
+    }
+
+    public void setNestedPayloadString(boolean nestedPayloadString) {
+        isNestedPayloadString = nestedPayloadString;
+    }
+
+    public String getNestedString() {
+        return nestedString;
+    }
+
+    public void setNestedString(String nestedString) {
+        this.nestedString = nestedString;
+    }
+
     public String getNestedField() {
         return nestedField;
     }
@@ -114,15 +132,17 @@ public class CacheEntry {
     }
 
     public static final class CacheEntryBuilder {
-        protected DBAction dbAction;
-        protected String id;
-        protected String collection;
-        protected JsonObject payload;
-        protected JsonObject findQuery;
-        protected boolean isNested;
-        protected String nestedField;
-        protected JsonObject nestedFind;
-        protected JsonObject nestedFieldIdentifierObj;
+        private DBAction dbAction;
+        private String id;
+        private String collection;
+        private JsonObject payload;
+        private JsonObject findQuery;
+        private boolean isNested;
+        private String nestedField;
+        private JsonObject nestedFind;
+        private JsonObject nestedFieldIdentifierObj;
+        private boolean isNestedPayloadString = false;
+        private  String nestedString;
 
         private CacheEntryBuilder() {
         }
@@ -141,6 +161,9 @@ public class CacheEntry {
             nestedField = cacheEntry.getNestedField();
             nestedFind = cacheEntry.getNestedFind();
             nestedFieldIdentifierObj = cacheEntry.getNestedFieldIdentifierObj();
+            nestedString  = cacheEntry.getNestedString();
+            isNestedPayloadString = cacheEntry.isNestedPayloadString();
+
             return this;
         }
 
@@ -174,6 +197,16 @@ public class CacheEntry {
             return this;
         }
 
+        public CacheEntryBuilder isNestedPayloadString(boolean isNestedPayloadString) {
+            this.isNestedPayloadString = isNestedPayloadString;
+            return this;
+        }
+
+        public CacheEntryBuilder withNestedString(String nestedString) {
+            this.nestedString = nestedString;
+            return this;
+        }
+
         public CacheEntryBuilder withNestedField(String nestedField) {
             this.nestedField = nestedField;
             return this;
@@ -199,7 +232,10 @@ public class CacheEntry {
             cacheEntry.setNestedField(nestedField);
             cacheEntry.setNestedFind(nestedFind);
             cacheEntry.setNestedFieldIdentifierObj(nestedFieldIdentifierObj);
-            cacheEntry.isNested = this.isNested;
+            cacheEntry.setNested(this.isNested);
+            cacheEntry.setNestedPayloadString(this.isNestedPayloadString);
+            cacheEntry.setNestedString(this.nestedString);
+
             return cacheEntry;
         }
     }
index 8b85174..9997609 100644 (file)
@@ -24,6 +24,8 @@ import com.att.eelf.configuration.EELFManager;
 import com.google.common.collect.Lists;
 import com.google.gson.*;
 import com.mongodb.*;
+
+import org.apache.commons.lang3.StringUtils;
 import org.onap.aai.cacher.common.MongoHelperSingleton;
 import org.onap.aai.cacher.egestion.printer.PayloadPrinterService;
 import org.onap.aai.cacher.injestion.parser.PayloadParserService;
@@ -137,7 +139,6 @@ public class CacheHelperService {
                     // remove "_id" property from cache response
                     JsonParser parser = new JsonParser();
                     JsonObject jsonObj = (JsonObject) parser.parse(cursor.next().toString());
-                    jsonObj.remove("_id");
                     jsonArray.add(jsonObj);
                 }
             }
@@ -209,8 +210,11 @@ public class CacheHelperService {
 
     public Response forceSync(CacheKey ck) {
         if (isCurrentlyRunning(ck)) {
-            AAIException aaiException = new AAIException("AAI_4000", "Sync is currently running from another process.");
-            return buildExceptionResponse(aaiException);
+            AAIException aaiException = new AAIException("AAI_3000", "Sync is currently running from another process.");
+            ArrayList<String> templateVars = new ArrayList();
+            templateVars.add("/sync");
+            templateVars.add(ck.getCacheKey());
+            return buildExceptionResponse(aaiException, templateVars);
         } else if (isKeyPresent(ck, AAIConstants.COLLECTION_CACHEKEY)) {
             // populate cache and return status on sync
             ResponseEntity resp = rchs.triggerRestCall(ck);
@@ -232,8 +236,12 @@ public class CacheHelperService {
             result = this.retrieveCollectionString(ck, collection);
 
             if (result.equals("")) {
-                status = Status.NOT_FOUND;
-                EELF_LOGGER.error("Cannot not found the  cache key from mongodb");
+                EELF_LOGGER.error("Cannot not find the  cache key from mongodb " + ck.getCacheKey());
+                AAIException aaiException = new AAIException("AAI_3001", "cacheKey request");
+                ArrayList<String> templateVars = new ArrayList();
+                templateVars.add("/get");
+                templateVars.add(ck.getCacheKey());
+                return buildExceptionResponse(aaiException, templateVars);
             }
             return this.buildResponse(status, result);
         } catch (Exception e) {
@@ -251,6 +259,8 @@ public class CacheHelperService {
             if (result.equals("")) {
                 status = Status.NOT_FOUND;
                 EELF_LOGGER.error("Cannot not found the  cache key from mongodb");
+                AAIException aaiException = new AAIException("AAI_3001", "cacheKey get for" + ck.getCacheKey() );
+                return buildExceptionResponse(aaiException);
             }
             return this.buildResponse(status, result);
         } catch (Exception e) {
@@ -285,7 +295,11 @@ public class CacheHelperService {
                     result.append(cursor.next());
                 }
             } else {
-                status = Status.NOT_FOUND;
+                AAIException aaiException = new AAIException("AAI_3001", "cacheKey request");
+                ArrayList<String> templateVars = new ArrayList();
+                templateVars.add("/get");
+                templateVars.add("ALL");
+                return buildExceptionResponse(aaiException, templateVars);
             }
             return buildResponse(status, result.toString());
         } catch (Exception e) {
@@ -321,8 +335,11 @@ public class CacheHelperService {
             if (result.getN() > 0) {
                 status = Status.OK;
             } else {
-                // TODO set proper status for no results updated meaning it didn't find the key
-                status = Status.NOT_FOUND;
+                AAIException aaiException = new AAIException("AAI_3001", "cacheKey request");
+                ArrayList<String> templateVars = new ArrayList();
+                templateVars.add("/update");
+                templateVars.add(ck.getCacheKey());
+                return buildExceptionResponse(aaiException, templateVars);
             }
             return buildResponse(status, "{}");
         } catch (MongoException ex) {
@@ -354,8 +371,11 @@ public class CacheHelperService {
             status = Status.NO_CONTENT;
             return buildResponse(status, "{}");
         } else if (cacheKeyDelete.equals("NOT_FOUND")) {
-            status = Status.NOT_FOUND;
-            return buildResponse(status, "{}");
+            AAIException aaiException = new AAIException("AAI_3001", "cacheKey request");
+            ArrayList<String> templateVars = new ArrayList();
+            templateVars.add("/delete");
+            templateVars.add(id);
+            return buildExceptionResponse(aaiException, templateVars);
         } else {
             AAIException aaiException = new AAIException("AAI_5105");
             return buildExceptionResponse(aaiException);
@@ -369,8 +389,11 @@ public class CacheHelperService {
             status = Status.NO_CONTENT;
             return buildResponse(status, "{}");
         } else if (cacheDelete.equals("NOT_FOUND")) {
-            status = Status.NOT_FOUND;
-            return buildResponse(status, "{}");
+            AAIException aaiException = new AAIException("AAI_3001", "cacheKey request");
+            ArrayList<String> templateVars = new ArrayList();
+            templateVars.add("/delete");
+            templateVars.add(id);
+            return buildExceptionResponse(aaiException, templateVars);
         } else {
             AAIException aaiException = new AAIException("AAI_5105");
             return buildExceptionResponse(aaiException);
@@ -425,17 +448,32 @@ public class CacheHelperService {
         ck.setLastSyncSuccessTime(formatter.format(System.currentTimeMillis()));
         ck.setLastSyncEndTime(formatter.format(System.currentTimeMillis()));
         updateCacheKey(ck);
-        return buildResponse(Status.CREATED, "{}");
+        return buildResponse(Status.CREATED, null);
     }
 
     public Response buildResponse(Status status, String result) {
+        
+        if ( result == null ) {
+            return Response.status(status).type(MediaType.APPLICATION_JSON).build();
+        }
         return Response.status(status).type(MediaType.APPLICATION_JSON).entity(result).build();
     }
 
+    public Response buildMissingFieldResponse(List<String> fields) {
+        AAIException aaiException = new AAIException("AAI_6118");
+        ArrayList<String> templateVars = new ArrayList<>();
+        templateVars.add(StringUtils.join(fields, ", "));
+        ErrorLogHelper.logException(aaiException);
+        return Response.status(aaiException.getErrorObject().getHTTPResponseCode())
+                .entity(ErrorLogHelper.getRESTAPIErrorResponseWithLogging(
+                        Lists.newArrayList(MediaType.APPLICATION_JSON_TYPE), aaiException, templateVars))
+                .build();
+    }
+
     public Response buildValidationResponse(List<String> issues) {
         AAIException aaiException = new AAIException("AAI_3014");
         ArrayList<String> templateVars = new ArrayList<>();
-
+        
         if (templateVars.isEmpty()) {
             templateVars.add(issues.toString());
         }
@@ -444,13 +482,21 @@ public class CacheHelperService {
                 .entity(ErrorLogHelper.getRESTAPIErrorResponseWithLogging(
                         Lists.newArrayList(MediaType.APPLICATION_JSON_TYPE), aaiException, templateVars))
                 .build();
-    }
+    }    
 
+    public Response buildExceptionResponse(AAIException aaiException, ArrayList templateVars) {
+        ErrorLogHelper.logException(aaiException);
+        return Response.status(aaiException.getErrorObject().getHTTPResponseCode())
+                .entity(ErrorLogHelper.getRESTAPIErrorResponseWithLogging(
+                        Lists.newArrayList(MediaType.APPLICATION_JSON_TYPE), aaiException, templateVars))
+                .build();
+    }
+    
     public Response buildExceptionResponse(AAIException aaiException) {
         ErrorLogHelper.logException(aaiException);
         return Response.status(aaiException.getErrorObject().getHTTPResponseCode())
                 .entity(ErrorLogHelper.getRESTAPIErrorResponseWithLogging(
-                        Lists.newArrayList(MediaType.APPLICATION_JSON_TYPE), aaiException, new ArrayList<>()))
+                        Lists.newArrayList(MediaType.APPLICATION_JSON_TYPE), aaiException, new ArrayList()))
                 .build();
     }
 
index 962be77..432b23c 100644 (file)
@@ -58,8 +58,13 @@ public class CacheKeyService {
         EELF_LOGGER.info("Got the request to add cache key to mongodb");
         CacheKeyRequestValidation ckrv = new CacheKeyRequestValidation(CacheKeyRequestValidationType.ADD);
         JsonObject input = convertStringToJSON(payload);
-        List<String> issues = ckrv.validateCacheKeyRequest(input, chs);
+        List<String> missing = ckrv.checkMissingRequiredFields(input, chs);
         Response response;
+        if ( !missing.isEmpty()) {
+            response = chs.buildMissingFieldResponse(missing);
+            return response;
+        }
+        List<String> issues = ckrv.validateCacheKeyRequest(input, chs);
         if (!issues.isEmpty()) {
             response = chs.buildValidationResponse(issues);
         } else {
index 4df1921..2f3ecde 100644 (file)
@@ -33,6 +33,23 @@ public class CacheKeyRequestValidation {
     public CacheKeyRequestValidation(CacheKeyRequestValidationType type) {
         this.type = type;
     }
+    
+    public List<String> checkMissingRequiredFields(JsonObject input, CacheHelperService chs) {
+        ArrayList<String> results = new ArrayList<>();
+        if (input == null) {
+            return results;
+        }
+        CacheKey cacheKey = CacheKey.fromJson(input);
+        String baseUrl = cacheKey.getBaseUrl();
+        String uri = cacheKey.getURI();
+        if ( CacheKey.DEFAULT_VALUE.equals(baseUrl)) {
+            results.add("baseUrl");
+        }
+        if ( CacheKey.DEFAULT_VALUE.equals(uri)) {
+            results.add("URI");
+        }
+        return results;
+    }
 
     public List<String> validateCacheKeyRequest(JsonObject input, CacheHelperService chs) {
         ArrayList<String> results = new ArrayList<>();
index 78c88c7..7497f10 100644 (file)
@@ -98,7 +98,7 @@ public class ScheduledTasks {
             }
             // initialize the cache
             if (!cacheLoaded) {
-                LOGGER.info("Start loading cache @ " + dateFormat.format(new Date()));
+                LOGGER.info("initializing: Start loading cache @ " + dateFormat.format(new Date()));
                 init();
                 cacheLoaded = true;
             }
@@ -120,12 +120,13 @@ public class ScheduledTasks {
         for (CacheKey cacheKey : cacheKeys) {
             if ("onInit".equalsIgnoreCase(cacheKey.getTimingIndicator())) {
                 try {
+                    LOGGER.info("initializing: cacheKey " + cacheKey.getCacheKey() + " loading");
                     ResponseEntity respEntity = rchs.triggerRestCall(cacheKey);
                     if (respEntity.getStatusCode().is2xxSuccessful()) {
                         Response resp = chs.populateCache(cacheKey, (String) respEntity.getBody());
                         if (resp != null) {
                             if (resp.getStatus() == Response.Status.CREATED.getStatusCode()) {
-                                LOGGER.debug("cacheKey " + cacheKey.getCacheKey() + " loaded");
+                                LOGGER.info("initializing: cacheKey " + cacheKey.getCacheKey() + " loaded");
                             } else {
                                 LOGGER.error("unexpected 2xx response status for cacheKey " + cacheKey.getCacheKey()
                                         + " " + resp.getStatusInfo());
@@ -142,7 +143,7 @@ public class ScheduledTasks {
                 }
             }
         }
-
+        LOGGER.info("initializing: cache completed @ " + dateFormat.format(new Date()));
         DmaapConsumerSingleton.getInstance().setProcessEvents(true);
     }
 }
index 0caffd3..9613d81 100644 (file)
@@ -26,7 +26,6 @@ import org.apache.http.ssl.SSLContextBuilder;
 import org.onap.aai.util.AAIConfig;
 import org.springframework.boot.web.client.RestTemplateBuilder;
 import org.springframework.context.annotation.Bean;
-import org.springframework.core.env.Environment;
 import org.springframework.http.*;
 import org.springframework.http.client.ClientHttpResponse;
 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
@@ -43,12 +42,9 @@ import java.nio.charset.Charset;
 import java.security.KeyStore;
 import java.util.Collections;
 
-//@Component
 public class RestClient {
 
     private HttpClient restClient = null;
-    
-    private Environment environment;
 
     public RestClient() {
         this.restClient = initClient();
@@ -64,14 +60,15 @@ public class RestClient {
      */
     private HttpClient initClient() {
         HttpClient rc;
-
         try {
             String truststore_path = AAIConstants.AAI_HOME_ETC_AUTH
                     + AAIConfig.get(AAIConstants.AAI_TRUSTSTORE_FILENAME);
             String truststore_password = AAIConfig.get(AAIConstants.AAI_TRUSTSTORE_PASSWD);
-            SSLContextBuilder sslContextBuilder = SSLContextBuilder.create();
-     
-            SSLContext sslContext = sslContextBuilder
+            String keystore_path = AAIConstants.AAI_HOME_ETC_AUTH + AAIConfig.get(AAIConstants.AAI_KEYSTORE_FILENAME);
+            String keystore_password = AAIConfig.get(AAIConstants.AAI_KEYSTORE_PASSWD);
+            SSLContext sslContext = SSLContextBuilder.create()
+                    .loadKeyMaterial(loadPfx(keystore_path, keystore_password.toCharArray()),
+                            keystore_password.toCharArray())
                     .loadTrustMaterial(ResourceUtils.getFile(truststore_path), truststore_password.toCharArray())
                     .build();
 
@@ -118,7 +115,7 @@ public class RestClient {
                 urlUpdate = baseUrl;
             }
             HttpEntity httpEntity = new HttpEntity(headers);
-            responseEntity = restTemplate.exchange(urlUpdate + endpoint, HttpMethod.GET, httpEntity, String.class);
+            responseEntity = restTemplate.exchange(baseUrl + endpoint, HttpMethod.GET, httpEntity, String.class);
         } catch (Exception e) {
             e.printStackTrace();
             // TODO handle exceptions
index 6498f2f..b18e840 100644 (file)
@@ -33,7 +33,6 @@ import javax.annotation.Priority;
 import javax.ws.rs.ApplicationPath;
 import javax.ws.rs.container.ContainerRequestFilter;
 import javax.ws.rs.container.ContainerResponseFilter;
-
 import java.util.List;
 import java.util.Set;
 import java.util.logging.Logger;
index 44066e1..2e3de7a 100644 (file)
@@ -10,7 +10,7 @@ constrained-element-set=/constrained-element-sets/constrained-element-set/{const
 ctag-assignment=/ctag-assignments/ctag-assignment/{vlan-id-inner}
 ctag-pool=/ctag-pools/ctag-pool/{target-pe}/{availability-zone-name}
 customer=/business/customers/customer/{global-customer-id}
-cvlan-tag-entry=/cvlan-tags/cvlan-tag-entry/{cvlan-tag}
+cvlan-tag=/cvlan-tags/cvlan-tag/{cvlan-tag}
 dvs-switch=/dvs-switches/dvs-switch/{switch-name}
 element-choice-set=/element-choice-sets/element-choice-set/{element-choice-set-uuid}
 entitlement=/entitlements/entitlement/{group-uuid}/{resource-uuid}
index 398e175..378db93 100644 (file)
@@ -1,23 +1,31 @@
-TransportType=TBD
-Latitude=TBD
-Longitude=TBD
+TransportType=HTTPAAF
+Latitude=39.099727
+Longitude=-94.578567
 
 Version=1.0
-ServiceName=TBD
+ServiceName=dmaap-v1.dev.dmaap.dt.saat.acsi.att.com/events
 Environment=TEST
 Partner=BOT_R
 routeOffer=MR1SBKCD
 SubContextPath=/
 Protocol=http
 MethodType=GET
-username=TBD
-password=TBD
+username=m08479@aai.ecomp.att.com
+password=OBF:1qab1lbw1kfr1ffg1hzn1i231fhe1kcn1lfm1qcr
 contenttype=application/json
-host=TBD
+host=klsd048.ipcoe.att.com:3904,klsd055.ipcoe.att.com:3904,klsd056.ipcoe.att.com:3904
 topic=AAI-EVENT
 group=aaiEventConsumer-dev
 id=NA
 timeout=15000
 limit=1000
-filter={"event-header.domain":"devINT1"}
-sessionstickinessrequired=no
\ No newline at end of file
+filter={"event-header.domain":"uDev03"}
+AFT_DME2_EXCHANGE_REQUEST_HANDLERS=com.att.nsa.test.PreferredRouteRequestHandler
+AFT_DME2_EXCHANGE_REPLY_HANDLERS=com.att.nsa.test.PreferredRouteReplyHandler
+AFT_DME2_REQ_TRACE_ON=true
+AFT_ENVIRONMENT=AFTUAT
+AFT_DME2_EP_CONN_TIMEOUT=15000
+AFT_DME2_ROUNDTRIP_TIMEOUT_MS=240000
+AFT_DME2_EP_READ_TIMEOUT_MS=50000
+sessionstickinessrequired=no
+DME2preferredRouterFilePath=preferredRoute.txt
\ No newline at end of file
index 0524c13..36d616c 100644 (file)
@@ -1,5 +1,7 @@
-aai.truststore.filename=aai_keystore
-aai.truststore.passwd.x=OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0
+aai.truststore.filename=tomcat_keystore
+aai.truststore.passwd.x=OBF:1i9a1u2a1unz1lr61wn51wn11lss1unz1u301i6o
+aai.keystore.filename=aai-client-cert.p12
+aai.keystore.passwd.x=OBF:1i9a1u2a1unz1lr61wn51wn11lss1unz1u301i6o
 aai.logging.maxStackTraceEntries=10
-aai.cacher.dmaap.consumer.enableEventProcessing=false
+aai.cacher.dmaap.consumer.enableEventProcessing=true
 aai.cacher.dmaap.consumer.delayCheck=2
index 896df00..48e375d 100644 (file)
@@ -166,7 +166,6 @@ AAI_9101=5:0:WARN:9101:403:3300:User is not authorized to perform function
 #AAI_9106=5:0:WARN:9106:403:3300:Invalid AppId
 #AAI_9107=5:0:WARN:9107:403:3300:No Username in Request
 AAI_9107=5:0:WARN:9107:403:3300:SSL is not provided in request, please contact admin
-AAI_9108=5:0:WARN:9107:403:3300:Basic auth credentials is not provided in the request
 
 #--- aaiinstar: 9201-9299
 #AAI_9201=5:4:ERROR:9201:500:3002:Unable to send notification
index f1fdabe..d2bb66d 100644 (file)
@@ -4,7 +4,7 @@
                {
                        "cacheKey": "cloud-region",
                        "baseUrl": "https://AAI:AAI@localhost:8447",
-                       "module": "/aai/v13/",
+                       "module": "/aai/v14/",
                        "URI": "cloud-infrastructure/cloud-regions?depth=0&resultIndex=1&resultSize=3",
                        "timingIndicator": "onInit",
                        "httpMethod": "GET",
@@ -13,7 +13,7 @@
                {
                        "cacheKey": "complex",
                        "baseUrl": "https://AAI:AAI@localhost:8447",
-                       "module": "/aai/v13/",
+                       "module": "/aai/v14/",
                        "URI": "cloud-infrastructure/complexes?resultIndex=1&resultSize=3",
                        "timingIndicator": "onInit",
                        "httpMethod": "GET",
@@ -22,7 +22,7 @@
                {
                        "cacheKey": "pserver",
                        "baseUrl": "https://AAI:AAI@localhost:8447",
-                       "module": "/aai/v13/",
+                       "module": "/aai/v14/",
                        "URI": "cloud-infrastructure/pservers?depth=5807c3c3-92cd-44d7-a508-8539cd36ecda&resultIndex=1&resultSize=3",
                        "timingIndicator": "onInit",
                        "httpMethod": "GET",
@@ -31,7 +31,7 @@
                {
                        "cacheKey": "generic-vnf",
                        "baseUrl": "https://AAI:AAI@localhost:8447",
-                       "module": "/aai/v13/",
+                       "module": "/aai/v14/",
                        "URI": "network/generic-vnfs?depth=5807c3c3-92cd-44d7-a508-8539cd36ecda&resultIndex=1&resultSize=3",
                        "timingIndicator": "onInit",
                        "httpMethod": "GET",
diff --git a/src/main/resources/etc/auth/aai-client-cert.p12 b/src/main/resources/etc/auth/aai-client-cert.p12
deleted file mode 100644 (file)
index 292efb7..0000000
Binary files a/src/main/resources/etc/auth/aai-client-cert.p12 and /dev/null differ
index 9caabe6..3bcb0ba 100644 (file)
                        <pattern>${eelfLogPattern}</pattern>
                </encoder>
        </appender>
-       <logger name="org.onap.aai.cacher" level="DEBUG" additivity="false">
+
+       <logger name="mongo" level="DEBUG" additivity="false">
+               <appender-ref ref="external" />
+       </logger>
+
+       <logger name="org.onap.aai" level="DEBUG" additivity="false">
                <appender-ref ref="asyncDEBUG" />
                <appender-ref ref="asyncERROR" />
                <appender-ref ref="asyncMETRIC" />
diff --git a/src/test/java/org/onap/aai/cacher/common/LimitTest.java b/src/test/java/org/onap/aai/cacher/common/LimitTest.java
new file mode 100644 (file)
index 0000000..366181d
--- /dev/null
@@ -0,0 +1,429 @@
+/**
+ * ============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.cacher.common;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.mongodb.DB;
+import com.mongodb.MongoClient;
+import com.mongodb.client.MongoDatabase;
+import de.flapdoodle.embed.mongo.Command;
+import de.flapdoodle.embed.mongo.MongodExecutable;
+import de.flapdoodle.embed.mongo.MongodProcess;
+import de.flapdoodle.embed.mongo.MongodStarter;
+import de.flapdoodle.embed.mongo.config.*;
+import de.flapdoodle.embed.mongo.distribution.Version;
+import de.flapdoodle.embed.process.config.io.ProcessOutput;
+import de.flapdoodle.embed.process.io.Processors;
+import de.flapdoodle.embed.process.io.Slf4jLevel;
+import de.flapdoodle.embed.process.runtime.Network;
+import org.apache.commons.io.IOUtils;
+import org.json.JSONException;
+import org.junit.*;
+import org.junit.rules.TestName;
+import org.junit.runner.RunWith;
+import org.onap.aai.cacher.egestion.printer.PayloadPrinterService;
+import org.onap.aai.cacher.injestion.parser.PayloadParserService;
+import org.onap.aai.cacher.injestion.parser.strategy.PayloadParserType;
+import org.onap.aai.cacher.model.CacheKey;
+import org.onap.aai.cacher.service.helper.CacheHelperService;
+import org.onap.aai.cacher.util.AAIConstants;
+import org.skyscreamer.jsonassert.JSONAssert;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import javax.ws.rs.core.Response;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import static org.hamcrest.core.IsNot.not;
+import static org.hamcrest.core.StringContains.containsString;
+import static org.junit.Assert.*;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration
+public class LimitTest {
+
+       private static final String DB_NAME = LimitTest.class.getSimpleName();
+       private static MongoDatabase mongoDatabase;
+       private static DB db;
+       private static MongodProcess mongod;
+       private static MongoClient mongoC;
+
+       @Autowired private PayloadParserService payloadParserService;
+       @Autowired private PayloadPrinterService payloadPrinterService;
+       @Autowired private MongoHelperSingleton mongoHelperSingleton;
+       private CacheHelperService cacheHelperService;
+       private JsonParser parser = new JsonParser();
+
+
+       @Configuration
+       @ComponentScan({"org.onap.aai.cacher.egestion","org.onap.aai.cacher.injestion"})
+       public static class SpringConfig {
+               @Bean
+               public MongoHelperSingleton getMongoHelperSingleton() {
+                       return new MongoHelperSingleton(db, mongoDatabase);
+               }
+       }
+
+       @Rule
+       public TestName name = new TestName();
+
+       @BeforeClass
+       public static void setup() throws IOException, InterruptedException {
+
+               String bindIp = "localhost";
+               int port = 27017;
+               startEmbedded(port);
+               mongoC = new MongoClient(bindIp, port);
+               mongoDatabase = mongoC.getDatabase(DB_NAME);
+               db = mongoC.getDB(DB_NAME);
+       }
+
+       protected static void startEmbedded(int port) throws IOException {
+               Logger logger = LoggerFactory.getLogger("mongo");
+
+               IMongodConfig mongoConfigConfig = new MongodConfigBuilder()
+                               .version(Version.Main.PRODUCTION)
+                               .net(new Net(port, Network.localhostIsIPv6()))
+                               .cmdOptions(new MongoCmdOptionsBuilder().enableTextSearch(true).useNoPrealloc(false).build())
+                               .configServer(false)
+                               .build();
+
+               ProcessOutput processOutput = new ProcessOutput(Processors.logTo(logger, Slf4jLevel.WARN), Processors.logTo(logger,
+                               Slf4jLevel.WARN), Processors.logTo(logger, Slf4jLevel.WARN));
+
+               MongodExecutable mongodExecutable = MongodStarter
+                               .getInstance((new RuntimeConfigBuilder())
+                                               .defaults(Command.MongoD)
+                                               .processOutput(processOutput)
+                                               .build())
+                               .prepare(mongoConfigConfig);
+
+               mongod = mongodExecutable.start();
+       }
+
+       @AfterClass
+       public static void tearDown() {
+               if (mongod != null && mongod.isProcessRunning()) {
+                       mongod.stop();
+               }
+       }
+
+       @Before
+       public void init() {
+               cacheHelperService = new CacheHelperService();
+               cacheHelperService.setMongoHelper(mongoHelperSingleton);
+               cacheHelperService.setPayloadParserService(payloadParserService);
+               cacheHelperService.setPayloadPrinterService(payloadPrinterService);
+
+       }
+
+       @After
+       public void cleanup() {
+               final List<String> collectionNames = new ArrayList<>();
+               mongoDatabase.listCollections().iterator().forEachRemaining(document -> collectionNames.add(document.getString("name")));
+               collectionNames.forEach(collectionName -> mongoDatabase.getCollection(collectionName).drop());
+       }
+
+       @Test
+       public void testBsonLimitWhereCacheIsArrayOfSmallObjs() throws JSONException {
+
+               mongoDatabase.createCollection(AAIConstants.COLLECTION_CACHEKEY);
+               String genericVnfCacheKey = "{" +
+                               "'cacheKey': 'generic-vnf'," +
+                               "'baseUrl': 'https://localhost:8443'," +
+                               "'module': '/aai/v14/'," +
+                               "'URI': 'network/generic-vnf?depth=0'" +
+                               "}";
+               JsonObject ckJson = (JsonObject) parser.parse(genericVnfCacheKey);
+               CacheKey ck = CacheKey.fromJson(ckJson);
+               ck.setParserStrategy(PayloadParserType.AAI_RESOURCE_GET_ALL.getValue());
+               cacheHelperService.addCacheKey(ck);
+               ck = cacheHelperService.retrieveCacheKeyObject(ck);
+               System.out.println("\n\nCache key after insert");
+               System.out.println(ck.toString());
+
+               String collectionName = name.getMethodName();
+               mongoDatabase.createCollection(collectionName);
+
+               JsonObject genericVnfsObj = new JsonObject();
+               JsonArray genericVnfsArray = new JsonArray();
+               String genericVnfTemplate = "{" +
+                                       "'vnf-id':'%s'," +
+                                       "'vnf-name':'vn2f0-SDN'," +
+                                       "'vnf-type':'test-gvnf-type'," +
+                                       "'service-id':'a92a77d5a0-123e-4'," +
+                                       "'orchestration-status':'active'," +
+                                       "'in-maint':true," +
+                                       "'is-closed-loop-disabled':false," +
+                                       "'resource-version':'1506978203538'" +
+                               "}";
+
+               String vnfId;
+               JsonObject genericVnf;
+               for (int i = 0; i < 70000; i++) {
+                       vnfId = UUID.randomUUID().toString();
+                       genericVnf = parser.parse(String.format(genericVnfTemplate, vnfId)).getAsJsonObject();
+                       genericVnfsArray.add(genericVnf);
+               }
+
+               genericVnfsObj.add("generic-vnf", genericVnfsArray);
+
+               cacheHelperService.populateCache(ck, genericVnfsObj.toString());
+
+               ck = cacheHelperService.retrieveCacheKeyObject(ck);
+               System.out.println("Updated cache key");
+               System.out.println(ck.toString());
+
+               Response response = cacheHelperService.getData(ck);
+               assertEquals("Get is Successful", 200, response.getStatus());
+               JSONAssert.assertEquals(genericVnfsObj.toString(), response.getEntity().toString(), false);
+
+       }
+
+       @Test
+       public void testBsonLimitWhereCacheContainsOneLargeObj() throws JSONException {
+
+               mongoDatabase.createCollection(AAIConstants.COLLECTION_CACHEKEY);
+               String genericVnfCacheKey = "{" +
+                               "'cacheKey': 'generic-vnf'," +
+                               "'baseUrl': 'https://localhost:8443'," +
+                               "'module': '/aai/v14/'," +
+                               "'URI': 'network/generic-vnf?depth=0'" +
+                               "}";
+               JsonObject ckJson = (JsonObject) parser.parse(genericVnfCacheKey);
+               CacheKey ck = CacheKey.fromJson(ckJson);
+               ck.setParserStrategy(PayloadParserType.AAI_RESOURCE_GET_ALL.getValue());
+               cacheHelperService.addCacheKey(ck);
+               ck = cacheHelperService.retrieveCacheKeyObject(ck);
+               System.out.println("\n\nCache key after insert");
+               System.out.println(ck.toString());
+
+               String collectionName = name.getMethodName();
+               mongoDatabase.createCollection(collectionName);
+
+               JsonObject genericVnfsObj = new JsonObject();
+               JsonArray genericVnfsArray = new JsonArray();
+               String genericVnfTemplate = "{" +
+                               "'vnf-id':'%s'," +
+                               "'vnf-name':'vn2f0-SDN'," +
+                               "'vnf-type':'test-gvnf-type'," +
+                               "'service-id':'a92a77d5a0-123e-4'," +
+                               "'orchestration-status':'active'," +
+                               "'in-maint':true," +
+                               "'is-closed-loop-disabled':false," +
+                               "'resource-version':'1506978203538'" +
+                               "}";
+               String vnfId;
+               JsonObject genericVnf;
+               for (int i = 0; i < 20; i++) {
+                       vnfId = UUID.randomUUID().toString();
+                       genericVnf = parser.parse(String.format(genericVnfTemplate, vnfId)).getAsJsonObject();
+                       genericVnfsArray.add(genericVnf);
+               }
+
+               JsonObject vfModulesObj = new JsonObject();
+               JsonArray vfModulesArray = new JsonArray();
+               String vfModuleTemplate = "{" +
+                                       "'vf-module-id':'%s'," +
+                                       "'vf-module-name':'example-vf-module-name'," +
+                                       "'heat-stack-id':'example-heat-stack-id'," +
+                                       "'orchestration-status':'example-orchestration-status'," +
+                                       "'is-base-vf-module':true," +
+                                       "'automated-assignment':true" +
+                               "}";
+               String vfModuleId;
+               JsonObject vfModule;
+               for (int i = 0; i < 70000; i++) {
+                       vfModuleId = UUID.randomUUID().toString();
+                       vfModule = parser.parse(String.format(vfModuleTemplate, vfModuleId)).getAsJsonObject();
+                       vfModulesArray.add(vfModule);
+               }
+
+               vfModulesObj.add("vf-module", vfModulesArray);
+               genericVnfsArray.get(0).getAsJsonObject().add("vf-modules", vfModulesObj);
+               genericVnfsObj.add("generic-vnf", genericVnfsArray);
+
+               cacheHelperService.populateCache(ck, genericVnfsObj.toString());
+
+               ck = cacheHelperService.retrieveCacheKeyObject(ck);
+               System.out.println("Updated cache key");
+               System.out.println(ck.toString());
+
+               Response response = cacheHelperService.getData(ck);
+               assertEquals("Get is Successful", 200, response.getStatus());
+               JSONAssert.assertEquals(genericVnfsObj.toString(), response.getEntity().toString(), false);
+
+       }
+
+       @Test
+       public void testBsonLimitWhereCacheContainsOneSmallObj() throws JSONException {
+
+               mongoDatabase.createCollection(AAIConstants.COLLECTION_CACHEKEY);
+               String genericVnfCacheKey = "{" +
+                               "'cacheKey': 'generic-vnf'," +
+                               "'baseUrl': 'https://localhost:8443'," +
+                               "'module': '/aai/v14/'," +
+                               "'URI': 'network/generic-vnf?depth=0'" +
+                               "}";
+               JsonObject ckJson = (JsonObject) parser.parse(genericVnfCacheKey);
+               CacheKey ck = CacheKey.fromJson(ckJson);
+               ck.setParserStrategy(PayloadParserType.AAI_RESOURCE_GET_ALL.getValue());
+               cacheHelperService.addCacheKey(ck);
+               ck = cacheHelperService.retrieveCacheKeyObject(ck);
+               System.out.println("\n\nCache key after insert");
+               System.out.println(ck.toString());
+
+               String collectionName = name.getMethodName();
+               mongoDatabase.createCollection(collectionName);
+
+               JsonObject genericVnfsObj = new JsonObject();
+               JsonArray genericVnfsArray = new JsonArray();
+               String genericVnfTemplate = "{" +
+                               "'vnf-id':'%s'," +
+                               "'vnf-name':'vn2f0-SDN'," +
+                               "'vnf-type':'test-gvnf-type'," +
+                               "'service-id':'a92a77d5a0-123e-4'," +
+                               "'orchestration-status':'active'," +
+                               "'in-maint':true," +
+                               "'is-closed-loop-disabled':false," +
+                               "'resource-version':'1506978203538'" +
+                               "}";
+               String vnfId;
+               JsonObject genericVnf;
+               for (int i = 0; i < 2; i++) {
+                       vnfId = UUID.randomUUID().toString();
+                       genericVnf = parser.parse(String.format(genericVnfTemplate, vnfId)).getAsJsonObject();
+                       genericVnfsArray.add(genericVnf);
+               }
+
+               JsonObject vfModulesObj = new JsonObject();
+               JsonArray vfModulesArray = new JsonArray();
+               String vfModuleTemplate = "{" +
+                               "'vf-module-id':'%s'," +
+                               "'vf-module-name':'example-vf-module-name'," +
+                               "'heat-stack-id':'example-heat-stack-id'," +
+                               "'orchestration-status':'example-orchestration-status'," +
+                               "'is-base-vf-module':true," +
+                               "'automated-assignment':true" +
+                               "}";
+               String vfModuleId;
+               JsonObject vfModule;
+               for (int i = 0; i < 2; i++) {
+                       vfModuleId = UUID.randomUUID().toString();
+                       vfModule = parser.parse(String.format(vfModuleTemplate, vfModuleId)).getAsJsonObject();
+                       vfModulesArray.add(vfModule);
+               }
+
+               JsonArray addrArray = new JsonArray();
+               String addrTemplate = "{" +
+                               "'vip-ipv4-address': '%s'" +
+                               "}";
+               for (int i = 0; i < 2; i++) {
+                       String addr = UUID.randomUUID().toString();
+                       JsonObject addrObj = parser.parse(String.format(addrTemplate, addr)).getAsJsonObject();
+                       addrArray.add(addrObj);
+               }
+               vfModulesArray.get(0).getAsJsonObject().add("vip-ipv4-address-list", addrArray);
+               vfModulesObj.add("vf-module", vfModulesArray);
+               genericVnfsArray.get(0).getAsJsonObject().add("vf-modules", vfModulesObj);
+               genericVnfsObj.add("generic-vnf", genericVnfsArray);
+
+               System.out.println(genericVnfsObj.toString());
+               cacheHelperService.populateCache(ck, genericVnfsObj.toString());
+
+               ck = cacheHelperService.retrieveCacheKeyObject(ck);
+               System.out.println("Updated cache key");
+               System.out.println(ck.toString());
+
+               Response response = cacheHelperService.getData(ck);
+               assertEquals("Get is Successful", 200, response.getStatus());
+               JSONAssert.assertEquals(genericVnfsObj.toString(), response.getEntity().toString(), false);
+
+       }
+
+       @Test
+       public void testOneCrWithNestedDupeGetAll() throws JSONException, IOException {
+
+               mongoDatabase.createCollection(AAIConstants.COLLECTION_CACHEKEY);
+               String crKey = "{" +
+                               "'cacheKey': 'cloud-region'," +
+                               "'baseUrl': 'https://localhost:8443'," +
+                               "'module': '/aai/v14/'," +
+                               "'URI': '/cloud-infrastructure/cloud-regions'" +
+                               "}";
+               JsonObject ckJson = (JsonObject) parser.parse(crKey);
+               CacheKey ck = CacheKey.fromJson(ckJson);
+               ck.setParserStrategy(PayloadParserType.AAI_RESOURCE_GET_ALL.getValue());
+               cacheHelperService.addCacheKey(ck);
+               ck = cacheHelperService.retrieveCacheKeyObject(ck);
+               System.out.println("\n\nCache key after insert");
+               System.out.println(ck.toString());
+
+               String collectionName = name.getMethodName();
+               mongoDatabase.createCollection(collectionName);
+
+               String crs = getJsonPayload("one-cr-with-nested-dupe-get-all");
+
+               cacheHelperService.populateCache(ck, crs);
+
+               assertEquals(5, mongoHelperSingleton.findAllWithIdsStartingWith("cloud-region", "/cloud-infrastructure/cloud-regions/cloud-region/cloud-owner").size());
+
+               ck = cacheHelperService.retrieveCacheKeyObject(ck);
+               System.out.println("Updated cache key");
+               System.out.println(ck.toString());
+
+               Response response = cacheHelperService.getData(ck);
+               assertEquals("Get is Successful", 200, response.getStatus());
+               System.out.println("*********\n" + response.getEntity().toString() + "\n********");
+
+               assertThat("Stored does not contain empty array", response.getEntity().toString(), not(containsString("[]")));
+
+       }
+
+       private String getJsonPayload(String payload) throws IOException {
+               return getPayload("test/payloads/json/" + payload + ".json");
+       }
+
+       private 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);
+
+               return IOUtils.toString(inputStream);
+       }
+
+}
\ No newline at end of file
index 1a086bc..3f236a2 100644 (file)
@@ -25,14 +25,15 @@ import com.mongodb.MongoClient;
 import com.mongodb.client.MongoCollection;
 import com.mongodb.client.MongoDatabase;
 import com.mongodb.client.model.UpdateOptions;
+import de.flapdoodle.embed.mongo.Command;
 import de.flapdoodle.embed.mongo.MongodExecutable;
 import de.flapdoodle.embed.mongo.MongodProcess;
 import de.flapdoodle.embed.mongo.MongodStarter;
-import de.flapdoodle.embed.mongo.config.IMongodConfig;
-import de.flapdoodle.embed.mongo.config.MongoCmdOptionsBuilder;
-import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
-import de.flapdoodle.embed.mongo.config.Net;
+import de.flapdoodle.embed.mongo.config.*;
 import de.flapdoodle.embed.mongo.distribution.Version;
+import de.flapdoodle.embed.process.config.io.ProcessOutput;
+import de.flapdoodle.embed.process.io.Processors;
+import de.flapdoodle.embed.process.io.Slf4jLevel;
 import de.flapdoodle.embed.process.runtime.Network;
 import org.bson.Document;
 import org.json.JSONException;
@@ -42,6 +43,8 @@ import org.onap.aai.cacher.dmaap.consumer.AAIDmaapEventProcessorScenariosTest;
 import org.onap.aai.cacher.model.CacheEntry;
 import org.onap.aai.cacher.model.DBAction;
 import org.skyscreamer.jsonassert.JSONAssert;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -78,14 +81,24 @@ public class MongoHelperSingletonNoFakeTest {
        }
 
        protected static void startEmbedded(int port) throws IOException {
+               Logger logger = LoggerFactory.getLogger("mongo");
+
                IMongodConfig mongoConfigConfig = new MongodConfigBuilder()
                                .version(Version.Main.PRODUCTION)
                                .net(new Net(port, Network.localhostIsIPv6()))
-                               .cmdOptions(new MongoCmdOptionsBuilder().verbose(true).build())
+                               .cmdOptions(new MongoCmdOptionsBuilder().enableTextSearch(true).useNoPrealloc(false).build())
                                .configServer(false)
                                .build();
 
-               MongodExecutable mongodExecutable = MongodStarter.getDefaultInstance().prepare(mongoConfigConfig);
+               ProcessOutput processOutput = new ProcessOutput(Processors.logTo(logger, Slf4jLevel.WARN), Processors.logTo(logger,
+                               Slf4jLevel.WARN), Processors.logTo(logger, Slf4jLevel.WARN));
+
+               MongodExecutable mongodExecutable = MongodStarter
+                               .getInstance((new RuntimeConfigBuilder())
+                                               .defaults(Command.MongoD)
+                                               .processOutput(processOutput)
+                                               .build())
+                               .prepare(mongoConfigConfig);
 
                mongod = mongodExecutable.start();
        }
@@ -106,7 +119,7 @@ public class MongoHelperSingletonNoFakeTest {
        public void cleanup() {
                final List<String> collectionNames = new ArrayList<>();
                mongoDatabase.listCollections().iterator().forEachRemaining(document -> collectionNames.add(document.getString("name")));
-               collectionNames.stream().forEach(collectionName -> mongoDatabase.getCollection(collectionName).drop());
+               collectionNames.forEach(collectionName -> mongoDatabase.getCollection(collectionName).drop());
        }
 
 
index 2c01f5a..c5d39a0 100644 (file)
  */
 package org.onap.aai.cacher.dmaap.consumer;
 
+import com.github.fakemongo.Fongo;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.mongodb.DB;
 import com.mongodb.MongoClient;
 import com.mongodb.client.MongoDatabase;
-import de.flapdoodle.embed.mongo.MongodExecutable;
 import de.flapdoodle.embed.mongo.MongodProcess;
-import de.flapdoodle.embed.mongo.MongodStarter;
-import de.flapdoodle.embed.mongo.config.IMongodConfig;
-import de.flapdoodle.embed.mongo.config.MongoCmdOptionsBuilder;
-import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
-import de.flapdoodle.embed.mongo.config.Net;
-import de.flapdoodle.embed.mongo.distribution.Version;
-import de.flapdoodle.embed.process.runtime.Network;
 import org.apache.commons.io.IOUtils;
 import org.bson.Document;
+import org.hamcrest.Matchers;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.onap.aai.cacher.common.MongoHelperSingleton;
+import org.onap.aai.cacher.egestion.printer.PayloadPrinterService;
+import org.onap.aai.cacher.egestion.printer.strategy.PayloadPrinterType;
 import org.onap.aai.cacher.injestion.parser.InjestionTestComponent;
 import org.onap.aai.cacher.injestion.parser.PayloadParserService;
+import org.onap.aai.cacher.injestion.parser.strategy.PayloadParserType;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -51,10 +49,14 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import static junit.framework.TestCase.assertFalse;
+import static org.hamcrest.core.IsNot.not;
+import static org.hamcrest.core.StringContains.containsString;
 import static org.junit.Assert.*;
 
 @RunWith(SpringJUnit4ClassRunner.class)
@@ -72,6 +74,9 @@ public class AAIDmaapEventProcessorScenariosTest {
 
        @Autowired
        private AAIDmaapEventProcessor aaiDmaapEventProcessor;
+       @Autowired PayloadPrinterService payloadPrinterService;
+       @Autowired PayloadParserService payloadParserService;
+       @Autowired MongoHelperSingleton mongoHelperSingleton;
 
        @Bean
        public DB db() {
@@ -89,34 +94,15 @@ public class AAIDmaapEventProcessorScenariosTest {
        }
 
        @Bean
-       public AAIDmaapEventProcessor aaiDmaapEventProcessor(MongoHelperSingleton mongoHelperSingleton, PayloadParserService payloadParserService) {
-               return new AAIDmaapEventProcessor(mongoHelperSingleton, payloadParserService);
+       public AAIDmaapEventProcessor aaiDmaapEventProcessor(MongoHelperSingleton mongoHelperSingleton, PayloadParserService payloadParserService, PayloadPrinterService payloadPrinterService) {
+               return new AAIDmaapEventProcessor(mongoHelperSingleton, payloadParserService, payloadPrinterService);
        }
 
        @BeforeClass
        public static void setup() throws IOException, InterruptedException {
-
-               String bindIp = "localhost";
-               int port = 27017;
-               startEmbedded(port);
-
-               mongoC = new MongoClient(bindIp, port);
-               mongoDb = mongoC.getDatabase(DB_NAME);
-               db = mongoC.getDB(DB_NAME);
-
-       }
-
-       protected static void startEmbedded(int port) throws IOException {
-               IMongodConfig mongoConfigConfig = new MongodConfigBuilder()
-                               .version(Version.Main.PRODUCTION)
-                               .net(new Net(port, Network.localhostIsIPv6()))
-                               .cmdOptions(new MongoCmdOptionsBuilder().verbose(true).build())
-                               .configServer(false)
-                               .build();
-
-               MongodExecutable mongodExecutable = MongodStarter.getDefaultInstance().prepare(mongoConfigConfig);
-
-               mongod = mongodExecutable.start();
+               Fongo fongo = new Fongo(DB_NAME);
+               mongoDb = fongo.getDatabase(DB_NAME);
+               db = fongo.getDB(DB_NAME);
        }
 
        @AfterClass
@@ -136,7 +122,7 @@ public class AAIDmaapEventProcessorScenariosTest {
 
        @Test
        public void createPserverCreateCRWithNestingAndRelationshipsToTest() throws Exception {
-               String pserverCreate = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'pserver','top-entity-type':'pserver','entity-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'0c3b336d-6554-4ddf-a4d7-90f97876a966','source-name':'JUNIT','version':'v13','timestamp':'20180209-21:02:20:344'},'entity':{'hostname':'pserver-1','in-maint':false}}";
+               String pserverCreate = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'pserver','top-entity-type':'pserver','entity-link':'/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'0c3b336d-6554-4ddf-a4d7-90f97876a966','source-name':'JUNIT','version':'v14','timestamp':'20180209-21:02:20:344'},'entity':{'hostname':'pserver-1','in-maint':false}}";
 
                aaiDmaapEventProcessor.process(pserverCreate);
                assertNotEquals("pserver collection exists", mongoDatabase().getCollection("pserver"), null);
@@ -152,7 +138,7 @@ public class AAIDmaapEventProcessorScenariosTest {
                                mongoDatabase().getCollection("pserver")
                                                .find(Document.parse("{" +
                                                                "'hostname':'pserver-1'," +
-                                                               "'relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1'" +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1'" +
                                                                "}"))
                                                .iterator().hasNext()
                );
@@ -160,13 +146,13 @@ public class AAIDmaapEventProcessorScenariosTest {
                                mongoDatabase().getCollection("pserver")
                                                .find(Document.parse("{" +
                                                                "'hostname':'pserver-1'," +
-                                                               "'relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1'" +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1'" +
                                                                "}"))
                                                .iterator().hasNext()
                );
 
 
-               String crWithNestingAndWithRels = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'cloud-region','top-entity-type':'cloud-region','entity-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'3d567832-df00-49b5-b862-4d3a341dbec1','source-name':'JUNIT','version':'v13','timestamp':'20180515-10:57:55:750'},'entity':{'tenants':{'tenant':[{'vservers':{'vserver':[{'relationship-list':{'relationship':[{'related-to':'pserver','relationship-data':[{'relationship-value':'pserver-1','relationship-key':'pserver.hostname'}],'related-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1','relationship-label':'tosca.relationships.HostedOn'}]},'l-interfaces':{'l-interface':[{'interface-name':'l-int-1','interface-id':'l-int-1','l3-interface-ipv4-address-list':[{'neutron-network-id':'93fb399c-9bfc-4234-b2bb-a76eda38f117','neutron-subnet-id':'79e5bb69-24bb-4ea3-8d1d-c04fca5f5e1e','l3-interface-ipv4-address':'192.168.70.3'}],'relationship-list':{'relationship':[{'related-to':'pserver','relationship-data':[{'relationship-value':'pserver-1','relationship-key':'pserver.hostname'}],'related-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1','relationship-label':'tosca.relationships.HostedOn'}]}}]},'vserver-id':'vserver-1'}]},'tenant-id':'tenenat-1'}]},'cloud-owner':'onap-cloud-owner','cloud-region-id':'mtn6'}}";
+               String crWithNestingAndWithRels = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'cloud-region','top-entity-type':'cloud-region','entity-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'3d567832-df00-49b5-b862-4d3a341dbec1','source-name':'JUNIT','version':'v14','timestamp':'20180515-10:57:55:750'},'entity':{'tenants':{'tenant':[{'vservers':{'vserver':[{'relationship-list':{'relationship':[{'related-to':'pserver','relationship-data':[{'relationship-value':'pserver-1','relationship-key':'pserver.hostname'}],'related-link':'/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1','relationship-label':'tosca.relationships.HostedOn'}]},'l-interfaces':{'l-interface':[{'interface-name':'l-int-1','interface-id':'l-int-1','l3-interface-ipv4-address-list':[{'neutron-network-id':'93fb399c-9bfc-4234-b2bb-a76eda38f117','neutron-subnet-id':'79e5bb69-24bb-4ea3-8d1d-c04fca5f5e1e','l3-interface-ipv4-address':'192.168.70.3'}],'relationship-list':{'relationship':[{'related-to':'pserver','relationship-data':[{'relationship-value':'pserver-1','relationship-key':'pserver.hostname'}],'related-link':'/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1','relationship-label':'tosca.relationships.HostedOn'}]}}]},'vserver-id':'vserver-1'}]},'tenant-id':'tenenat-1'}]},'cloud-owner':'onap-cloud-owner','cloud-region-id':'mtn6'}}";
 
                aaiDmaapEventProcessor.process(crWithNestingAndWithRels);
 
@@ -175,7 +161,7 @@ public class AAIDmaapEventProcessorScenariosTest {
                                mongoDatabase().getCollection("pserver")
                                                .find(Document.parse("{" +
                                                                "'hostname':'pserver-1'," +
-                                                               "'relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1'" +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1'" +
                                                                "}"))
                                                .iterator().hasNext()
                );
@@ -183,7 +169,7 @@ public class AAIDmaapEventProcessorScenariosTest {
                                mongoDatabase().getCollection("pserver")
                                                .find(Document.parse("{" +
                                                                "'hostname':'pserver-1'," +
-                                                               "'relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1'" +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1'" +
                                                                "}"))
                                                .iterator().hasNext()
                );
@@ -192,44 +178,39 @@ public class AAIDmaapEventProcessorScenariosTest {
 
        @Test
        public void createCRWithNestingCreatePserverRelationshipsToNestedTest() throws Exception {
-               String crWithNesting = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'cloud-region','top-entity-type':'cloud-region','entity-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'3d567832-df00-49b5-b862-4d3a341dbec1','source-name':'JUNIT','version':'v13','timestamp':'20180515-10:57:55:750'},'entity':{'tenants':{'tenant':[{'vservers':{'vserver':[{'l-interfaces':{'l-interface':[{'interface-name':'l-int-1','interface-id':'l-int-1','l3-interface-ipv4-address-list':[{'neutron-network-id':'93fb399c-9bfc-4234-b2bb-a76eda38f117','neutron-subnet-id':'79e5bb69-24bb-4ea3-8d1d-c04fca5f5e1e','l3-interface-ipv4-address':'192.168.70.3'}]}]},'vserver-id':'vserver-1'}]},'tenant-id':'tenenat-1'}]},'cloud-owner':'onap-cloud-owner','cloud-region-id':'mtn6'}}";
+               String crWithNesting = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'cloud-region','top-entity-type':'cloud-region','entity-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'3d567832-df00-49b5-b862-4d3a341dbec1','source-name':'JUNIT','version':'v14','timestamp':'20180515-10:57:55:750'},'entity':{'tenants':{'tenant':[{'vservers':{'vserver':[{'l-interfaces':{'l-interface':[{'interface-name':'l-int-1','interface-id':'l-int-1','l3-interface-ipv4-address-list':[{'neutron-network-id':'93fb399c-9bfc-4234-b2bb-a76eda38f117','neutron-subnet-id':'79e5bb69-24bb-4ea3-8d1d-c04fca5f5e1e','l3-interface-ipv4-address':'192.168.70.3'}]}]},'vserver-id':'vserver-1'}]},'tenant-id':'tenenat-1'}]},'cloud-owner':'onap-cloud-owner','cloud-region-id':'mtn6'}}";
 
                aaiDmaapEventProcessor.process(crWithNesting);
 
                assertNotEquals("cloud-region collection exists", mongoDatabase().getCollection("cloud-region"), null);
 
-               String pserverWithRelsToNested = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'pserver','top-entity-type':'pserver','entity-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'0c3b336d-6554-4ddf-a4d7-90f97876a966','source-name':'JUNIT','version':'v13','timestamp':'20180209-21:02:20:344'},'entity':{'hostname':'pserver-1','in-maint':false,'relationship-list':{'relationship':[{'related-to':'vserver','relationship-label':'tosca.relationships.HostedOn','related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1','relationship-data':[{'relationship-key':'cloud-region.cloud-owner','relationship-value':'onap-cloud-owner'},{'relationship-key':'cloud-region.cloud-region-id','relationship-value':'mtn6'},{'relationship-key':'tenant.tenant-id','relationship-value':'tenenat-1'},{'relationship-key':'vserver.vserver-id','relationship-value':'vserver-1'}]},{'related-to':'l-interface','relationship-label':'tosca.relationships.HostedOn','related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1','relationship-data':[{'relationship-key':'cloud-region.cloud-owner','relationship-value':'onap-cloud-owner'},{'relationship-key':'cloud-region.cloud-region-id','relationship-value':'mtn6'},{'relationship-key':'tenant.tenant-id','relationship-value':'tenenat-1'},{'relationship-key':'vserver.vserver-id','relationship-value':'vserver-1'},{'relationship-key':'l-interface.interface-name','relationship-value':'l-int-1'}]}]}}}";
+               String pserverWithRelsToNested = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'pserver','top-entity-type':'pserver','entity-link':'/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'0c3b336d-6554-4ddf-a4d7-90f97876a966','source-name':'JUNIT','version':'v14','timestamp':'20180209-21:02:20:344'},'entity':{'hostname':'pserver-1','in-maint':false,'relationship-list':{'relationship':[{'related-to':'vserver','relationship-label':'tosca.relationships.HostedOn','related-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1','relationship-data':[{'relationship-key':'cloud-region.cloud-owner','relationship-value':'onap-cloud-owner'},{'relationship-key':'cloud-region.cloud-region-id','relationship-value':'mtn6'},{'relationship-key':'tenant.tenant-id','relationship-value':'tenenat-1'},{'relationship-key':'vserver.vserver-id','relationship-value':'vserver-1'}]},{'related-to':'l-interface','relationship-label':'tosca.relationships.HostedOn','related-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1','relationship-data':[{'relationship-key':'cloud-region.cloud-owner','relationship-value':'onap-cloud-owner'},{'relationship-key':'cloud-region.cloud-region-id','relationship-value':'mtn6'},{'relationship-key':'tenant.tenant-id','relationship-value':'tenenat-1'},{'relationship-key':'vserver.vserver-id','relationship-value':'vserver-1'},{'relationship-key':'l-interface.interface-name','relationship-value':'l-int-1'}]}]}}}";
 
                aaiDmaapEventProcessor.process(pserverWithRelsToNested);
                assertTrue("Now cloud-region->tenant->vserver now has relationship to pserver",
                                mongoDatabase().getCollection("cloud-region")
                                                .find(Document.parse("{" +
-                                                               "'cloud-owner':'onap-cloud-owner'," +
-                                                               "'cloud-region-id':'mtn6'," +
-                                                               "'tenants.tenant.tenant-id':'tenenat-1'," +
-                                                               "'tenants.tenant.vservers.vserver.vserver-id':'vserver-1'," +
-                                                               "'tenants.tenant.vservers.vserver.relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1'" +
-                                                               "}"))
+                                                       "'_id':'/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1'," +
+                                                       "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1'" +
+                                                       "}"))
                                                .iterator().hasNext()
                );
                assertTrue("Now cloud-region->tenant->vserver->l-interface now has relationship to pserver",
                                mongoDatabase().getCollection("cloud-region")
                                                .find(Document.parse("{" +
-                                                               "'cloud-owner':'onap-cloud-owner'," +
-                                                               "'cloud-region-id':'mtn6'," +
-                                                               "'tenants.tenant.tenant-id':'tenenat-1'," +
-                                                               "'tenants.tenant.vservers.vserver.vserver-id':'vserver-1'," +
-                                                               "'tenants.tenant.vservers.vserver.l-interfaces.l-interface.interface-name':'l-int-1'," +
-                                                               "'tenants.tenant.vservers.vserver.relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1'" +
+                                                               "'_id':'/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1'," +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1'" +
                                                                "}"))
                                                .iterator().hasNext()
                );
        }
 
-    @Ignore
+
        @Test
        public void createPserverCreateCRWithNestingAndRelsToUpdateRemovingARelTest() throws Exception {
-               String pserverCreate = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'pserver','top-entity-type':'pserver','entity-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'0c3b336d-6554-4ddf-a4d7-90f97876a966','source-name':'JUNIT','version':'v13','timestamp':'20180209-21:02:20:344'},'entity':{'hostname':'pserver-1','in-maint':false}}";
+
+               JsonObject payloads = parser.parse(getEventPayload("createPserverCreateCRWithNestingAndRelsToUpdateRemovingARelTest")).getAsJsonObject();
+               String pserverCreate = payloads.get("pserverCreate").toString();
 
                aaiDmaapEventProcessor.process(pserverCreate);
                assertNotEquals("pserver collection exists", mongoDatabase().getCollection("pserver"), null);
@@ -245,7 +226,7 @@ public class AAIDmaapEventProcessorScenariosTest {
                                mongoDatabase().getCollection("pserver")
                                                .find(Document.parse("{" +
                                                                "'hostname':'pserver-1'," +
-                                                               "'relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1'" +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1'" +
                                                                "}"))
                                                .iterator().hasNext()
                );
@@ -253,13 +234,13 @@ public class AAIDmaapEventProcessorScenariosTest {
                                mongoDatabase().getCollection("pserver")
                                                .find(Document.parse("{" +
                                                                "'hostname':'pserver-1'," +
-                                                               "'relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1'" +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1'" +
                                                                "}"))
                                                .iterator().hasNext()
                );
 
 
-               String crWithNestingAndWithRels = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'cloud-region','top-entity-type':'cloud-region','entity-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'3d567832-df00-49b5-b862-4d3a341dbec1','source-name':'JUNIT','version':'v13','timestamp':'20180515-10:57:55:750'},'entity':{'tenants':{'tenant':[{'vservers':{'vserver':[{'relationship-list':{'relationship':[{'related-to':'pserver','relationship-data':[{'relationship-value':'pserver-1','relationship-key':'pserver.hostname'}],'related-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1','relationship-label':'tosca.relationships.HostedOn'}]},'l-interfaces':{'l-interface':[{'interface-name':'l-int-1','interface-id':'l-int-1','l3-interface-ipv4-address-list':[{'neutron-network-id':'93fb399c-9bfc-4234-b2bb-a76eda38f117','neutron-subnet-id':'79e5bb69-24bb-4ea3-8d1d-c04fca5f5e1e','l3-interface-ipv4-address':'192.168.70.3'}],'relationship-list':{'relationship':[{'related-to':'pserver','relationship-data':[{'relationship-value':'pserver-1','relationship-key':'pserver.hostname'}],'related-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1','relationship-label':'tosca.relationships.HostedOn'}]}}]},'vserver-id':'vserver-1'}]},'tenant-id':'tenenat-1'}]},'cloud-owner':'onap-cloud-owner','cloud-region-id':'mtn6'}}";
+               String crWithNestingAndWithRels = payloads.get("crWithNestingAndWithRels").toString();
 
                aaiDmaapEventProcessor.process(crWithNestingAndWithRels);
 
@@ -268,7 +249,7 @@ public class AAIDmaapEventProcessorScenariosTest {
                                mongoDatabase().getCollection("pserver")
                                                .find(Document.parse("{" +
                                                                "'hostname':'pserver-1'," +
-                                                               "'relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1'" +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1'" +
                                                                "}"))
                                                .iterator().hasNext()
                );
@@ -276,36 +257,29 @@ public class AAIDmaapEventProcessorScenariosTest {
                                mongoDatabase().getCollection("pserver")
                                                .find(Document.parse("{" +
                                                                "'hostname':'pserver-1'," +
-                                                               "'relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1'" +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1'" +
                                                                "}"))
                                                .iterator().hasNext()
                );
 
 
-               String updatePserverWithoutInterfaceRel = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'pserver','top-entity-type':'pserver','entity-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1','event-type':'AAI-EVENT','domain':'JUNIT','action':'UPDATE','sequence-number':'0','id':'0c3b336d-6554-4ddf-a4d7-90f97876a966','source-name':'JUNIT','version':'v13','timestamp':'20180209-21:02:20:344'},'entity':{'hostname':'pserver-1','in-maint':false,'relationship-list':{'relationship':[{'related-to':'vserver','relationship-label':'tosca.relationships.HostedOn','related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1','relationship-data':[{'relationship-key':'cloud-region.cloud-owner','relationship-value':'onap-cloud-owner'},{'relationship-key':'cloud-region.cloud-region-id','relationship-value':'mtn6'},{'relationship-key':'tenant.tenant-id','relationship-value':'tenenat-1'},{'relationship-key':'vserver.vserver-id','relationship-value':'vserver-1'}]}]}}}";
+               String updatePserverWithoutInterfaceRel = payloads.get("updatePserverWithoutInterfaceRel").toString();
 
                aaiDmaapEventProcessor.process(updatePserverWithoutInterfaceRel);
 
                assertTrue("Now cloud-region->tenant->vserver should still have relationship to pserver",
                                mongoDatabase().getCollection("cloud-region")
                                                .find(Document.parse("{" +
-                                                               "'cloud-owner':'onap-cloud-owner'," +
-                                                               "'cloud-region-id':'mtn6'," +
-                                                               "'tenants.tenant.tenant-id':'tenenat-1'," +
-                                                               "'tenants.tenant.vservers.vserver.vserver-id':'vserver-1'," +
-                                                               "'tenants.tenant.vservers.vserver.relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1'" +
+                                                               "'_id':'/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1'," +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1'" +
                                                                "}"))
                                                .iterator().hasNext()
                );
                assertFalse("Now cloud-region->tenant->vserver->l-interface should not have relationship to pserver",
                                mongoDatabase().getCollection("cloud-region")
                                                .find(Document.parse("{" +
-                                                               "'cloud-owner':'onap-cloud-owner'," +
-                                                               "'cloud-region-id':'mtn6'," +
-                                                               "'tenants.tenant.tenant-id':'tenenat-1'," +
-                                                               "'tenants.tenant.vservers.vserver.vserver-id':'vserver-1'," +
-                                                               "'tenants.tenant.vservers.vserver.l-interfaces.l-interface.interface-name':'l-int-1'," +
-                                                               "'tenants.tenant.vservers.vserver.l-interfaces.l-interface.relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1'" +
+                                                               "'_id':'/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1'," +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1'" +
                                                                "}"))
                                                .iterator().hasNext()
                );
@@ -313,7 +287,7 @@ public class AAIDmaapEventProcessorScenariosTest {
 
        @Test
        public void createPserverCreateCRWithNestingAndRelationshipsToThenDeletePserverTest() throws Exception {
-               String pserverCreate = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'pserver','top-entity-type':'pserver','entity-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'0c3b336d-6554-4ddf-a4d7-90f97876a966','source-name':'JUNIT','version':'v13','timestamp':'20180209-21:02:20:344'},'entity':{'hostname':'pserver-1','in-maint':false}}";
+               String pserverCreate = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'pserver','top-entity-type':'pserver','entity-link':'/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'0c3b336d-6554-4ddf-a4d7-90f97876a966','source-name':'JUNIT','version':'v14','timestamp':'20180209-21:02:20:344'},'entity':{'hostname':'pserver-1','in-maint':false}}";
 
                aaiDmaapEventProcessor.process(pserverCreate);
                assertNotEquals("pserver collection exists", mongoDatabase().getCollection("pserver"), null);
@@ -329,7 +303,7 @@ public class AAIDmaapEventProcessorScenariosTest {
                                mongoDatabase().getCollection("pserver")
                                                .find(Document.parse("{" +
                                                                "'hostname':'pserver-1'," +
-                                                               "'relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1'" +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1'" +
                                                                "}"))
                                                .iterator().hasNext()
                );
@@ -337,13 +311,13 @@ public class AAIDmaapEventProcessorScenariosTest {
                                mongoDatabase().getCollection("pserver")
                                                .find(Document.parse("{" +
                                                                "'hostname':'pserver-1'," +
-                                                               "'relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1'" +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1'" +
                                                                "}"))
                                                .iterator().hasNext()
                );
 
 
-               String crWithNestingAndWithRels = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'cloud-region','top-entity-type':'cloud-region','entity-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'3d567832-df00-49b5-b862-4d3a341dbec1','source-name':'JUNIT','version':'v13','timestamp':'20180515-10:57:55:750'},'entity':{'tenants':{'tenant':[{'vservers':{'vserver':[{'relationship-list':{'relationship':[{'related-to':'pserver','relationship-data':[{'relationship-value':'pserver-1','relationship-key':'pserver.hostname'}],'related-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1','relationship-label':'tosca.relationships.HostedOn'}]},'l-interfaces':{'l-interface':[{'interface-name':'l-int-1','interface-id':'l-int-1','l3-interface-ipv4-address-list':[{'neutron-network-id':'93fb399c-9bfc-4234-b2bb-a76eda38f117','neutron-subnet-id':'79e5bb69-24bb-4ea3-8d1d-c04fca5f5e1e','l3-interface-ipv4-address':'192.168.70.3'}],'relationship-list':{'relationship':[{'related-to':'pserver','relationship-data':[{'relationship-value':'pserver-1','relationship-key':'pserver.hostname'}],'related-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1','relationship-label':'tosca.relationships.HostedOn'}]}}]},'vserver-id':'vserver-1'}]},'tenant-id':'tenenat-1'}]},'cloud-owner':'onap-cloud-owner','cloud-region-id':'mtn6'}}";
+               String crWithNestingAndWithRels = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'cloud-region','top-entity-type':'cloud-region','entity-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'3d567832-df00-49b5-b862-4d3a341dbec1','source-name':'JUNIT','version':'v14','timestamp':'20180515-10:57:55:750'},'entity':{'tenants':{'tenant':[{'vservers':{'vserver':[{'relationship-list':{'relationship':[{'related-to':'pserver','relationship-data':[{'relationship-value':'pserver-1','relationship-key':'pserver.hostname'}],'related-link':'/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1','relationship-label':'tosca.relationships.HostedOn'}]},'l-interfaces':{'l-interface':[{'interface-name':'l-int-1','interface-id':'l-int-1','l3-interface-ipv4-address-list':[{'neutron-network-id':'93fb399c-9bfc-4234-b2bb-a76eda38f117','neutron-subnet-id':'79e5bb69-24bb-4ea3-8d1d-c04fca5f5e1e','l3-interface-ipv4-address':'192.168.70.3'}],'relationship-list':{'relationship':[{'related-to':'pserver','relationship-data':[{'relationship-value':'pserver-1','relationship-key':'pserver.hostname'}],'related-link':'/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1','relationship-label':'tosca.relationships.HostedOn'}]}}]},'vserver-id':'vserver-1'}]},'tenant-id':'tenenat-1'}]},'cloud-owner':'onap-cloud-owner','cloud-region-id':'mtn6'}}";
 
                aaiDmaapEventProcessor.process(crWithNestingAndWithRels);
 
@@ -352,7 +326,7 @@ public class AAIDmaapEventProcessorScenariosTest {
                                mongoDatabase().getCollection("pserver")
                                                .find(Document.parse("{" +
                                                                "'hostname':'pserver-1'," +
-                                                               "'relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1'" +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1'" +
                                                                "}"))
                                                .iterator().hasNext()
                );
@@ -360,12 +334,12 @@ public class AAIDmaapEventProcessorScenariosTest {
                                mongoDatabase().getCollection("pserver")
                                                .find(Document.parse("{" +
                                                                "'hostname':'pserver-1'," +
-                                                               "'relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1'" +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1'" +
                                                                "}"))
                                                .iterator().hasNext()
                );
 
-               String pserverDelete = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'pserver','top-entity-type':'pserver','entity-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1','event-type':'AAI-EVENT','domain':'JUNIT','action':'DELETE','sequence-number':'0','id':'0c3b336d-6554-4ddf-a4d7-90f97876a966','source-name':'JUNIT','version':'v13','timestamp':'20180209-21:02:20:344'},'entity':{'hostname':'pserver-1','in-maint':false,'relationship-list':{'relationship':[{'related-to':'vserver','relationship-label':'tosca.relationships.HostedOn','related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1','relationship-data':[{'relationship-key':'cloud-region.cloud-owner','relationship-value':'onap-cloud-owner'},{'relationship-key':'cloud-region.cloud-region-id','relationship-value':'mtn6'},{'relationship-key':'tenant.tenant-id','relationship-value':'tenenat-1'},{'relationship-key':'vserver.vserver-id','relationship-value':'vserver-1'}]},{'related-to':'l-interface','relationship-label':'tosca.relationships.HostedOn','related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1','relationship-data':[{'relationship-key':'cloud-region.cloud-owner','relationship-value':'onap-cloud-owner'},{'relationship-key':'cloud-region.cloud-region-id','relationship-value':'mtn6'},{'relationship-key':'tenant.tenant-id','relationship-value':'tenenat-1'},{'relationship-key':'vserver.vserver-id','relationship-value':'vserver-1'},{'relationship-key':'l-interface.interface-name','relationship-value':'l-int-1'}]}]}}}";
+               String pserverDelete = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'pserver','top-entity-type':'pserver','entity-link':'/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1','event-type':'AAI-EVENT','domain':'JUNIT','action':'DELETE','sequence-number':'0','id':'0c3b336d-6554-4ddf-a4d7-90f97876a966','source-name':'JUNIT','version':'v14','timestamp':'20180209-21:02:20:344'},'entity':{'hostname':'pserver-1','in-maint':false,'relationship-list':{'relationship':[{'related-to':'vserver','relationship-label':'tosca.relationships.HostedOn','related-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1','relationship-data':[{'relationship-key':'cloud-region.cloud-owner','relationship-value':'onap-cloud-owner'},{'relationship-key':'cloud-region.cloud-region-id','relationship-value':'mtn6'},{'relationship-key':'tenant.tenant-id','relationship-value':'tenenat-1'},{'relationship-key':'vserver.vserver-id','relationship-value':'vserver-1'}]},{'related-to':'l-interface','relationship-label':'tosca.relationships.HostedOn','related-link':'/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1','relationship-data':[{'relationship-key':'cloud-region.cloud-owner','relationship-value':'onap-cloud-owner'},{'relationship-key':'cloud-region.cloud-region-id','relationship-value':'mtn6'},{'relationship-key':'tenant.tenant-id','relationship-value':'tenenat-1'},{'relationship-key':'vserver.vserver-id','relationship-value':'vserver-1'},{'relationship-key':'l-interface.interface-name','relationship-value':'l-int-1'}]}]}}}";
 
                aaiDmaapEventProcessor.process(pserverDelete);
                assertNotEquals("pserver collection exists", mongoDatabase().getCollection("pserver"), null);
@@ -374,23 +348,16 @@ public class AAIDmaapEventProcessorScenariosTest {
                assertFalse("Now cloud-region->tenant->vserver should not have relationship to pserver",
                                mongoDatabase().getCollection("cloud-region")
                                                .find(Document.parse("{" +
-                                                               "'cloud-owner':'onap-cloud-owner'," +
-                                                               "'cloud-region-id':'mtn6'," +
-                                                               "'tenants.tenant.tenant-id':'tenenat-1'," +
-                                                               "'tenants.tenant.vservers.vserver.vserver-id':'vserver-1'," +
-                                                               "'tenants.tenant.vservers.vserver.relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1'" +
+                                                               "'_id':'/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1'," +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1'" +
                                                                "}"))
                                                .iterator().hasNext()
                );
                assertFalse("Now cloud-region->tenant->vserver->l-interface should not have relationship to pserver",
                                mongoDatabase().getCollection("cloud-region")
                                                .find(Document.parse("{" +
-                                                               "'cloud-owner':'onap-cloud-owner'," +
-                                                               "'cloud-region-id':'mtn6'," +
-                                                               "'tenants.tenant.tenant-id':'tenenat-1'," +
-                                                               "'tenants.tenant.vservers.vserver.vserver-id':'vserver-1'," +
-                                                               "'tenants.tenant.vservers.vserver.l-interfaces.l-interface.interface-name':'l-int-1'," +
-                                                               "'tenants.tenant.vservers.vserver.l-interfaces.l-interface.relationship-list.relationship.related-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1'" +
+                                                               "'_id':'/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1'," +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1'" +
                                                                "}"))
                                                .iterator().hasNext()
                );
@@ -401,7 +368,7 @@ public class AAIDmaapEventProcessorScenariosTest {
        @Test
        public void createPserverRelationshipsToNonExistingTest() throws Exception {
 
-               String pserverWithRelsToNested = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'pserver','top-entity-type':'pserver','entity-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'0c3b336d-6554-4ddf-a4d7-90f97876a966','source-name':'JUNIT','version':'v13','timestamp':'20180209-21:02:20:344'},'entity':{'hostname':'pserver-1','in-maint':false,'relationship-list':{'relationship':[{'related-to':'cloud-region','relationship-label':'tosca.relationships.HostedOn','related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6','relationship-data':[{'relationship-key':'cloud-region.cloud-owner','relationship-value':'onap-cloud-owner'},{'relationship-key':'cloud-region.cloud-region-id','relationship-value':'mtn6'}]},{'related-to':'vserver','relationship-label':'tosca.relationships.HostedOn','related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1','relationship-data':[{'relationship-key':'cloud-region.cloud-owner','relationship-value':'onap-cloud-owner'},{'relationship-key':'cloud-region.cloud-region-id','relationship-value':'mtn6'},{'relationship-key':'tenant.tenant-id','relationship-value':'tenenat-1'},{'relationship-key':'vserver.vserver-id','relationship-value':'vserver-1'}]},{'related-to':'l-interface','relationship-label':'tosca.relationships.HostedOn','related-link':'/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1','relationship-data':[{'relationship-key':'cloud-region.cloud-owner','relationship-value':'onap-cloud-owner'},{'relationship-key':'cloud-region.cloud-region-id','relationship-value':'mtn6'},{'relationship-key':'tenant.tenant-id','relationship-value':'tenenat-1'},{'relationship-key':'vserver.vserver-id','relationship-value':'vserver-1'},{'relationship-key':'l-interface.interface-name','relationship-value':'l-int-1'}]}]}}}";
+               String pserverWithRelsToNested = getEventPayload("createPserverRelationshipsToNonExistingTest");
 
                aaiDmaapEventProcessor.process(pserverWithRelsToNested);
 
@@ -410,12 +377,48 @@ public class AAIDmaapEventProcessorScenariosTest {
        @Test
        public void linterfaceWithLinterfaceTest() throws Exception {
 
-               String linterfaceWithLinterface = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'l-interface','top-entity-type':'pserver','entity-link':'/aai/v13/cloud-infrastructure/pservers/pserver/c9e8ffb6-a360-4f9c-96c3-f5f0244dfe55-jenkins/lag-interfaces/lag-interface/8806d30d-e5f5-409e-9e9e-9b1c1943058d-jenkins/l-interfaces/l-interface/f4f9b9c7-eb83-4622-9d6f-14027a556ff5-jenkins/l-interfaces/l-interface/89796dd1-89a5-4ddc-bd13-324ba9bce3b6-jenkins','event-type':'AAI-EVENT','domain':'uINT1','action':'DELETE','sequence-number':'0','id':'9060077e-00a3-4239-80ed-855331b4d551','source-name':'FitNesse-Test-jenkins','version':'v13','timestamp':'20180625-01:24:04:857'},'entity':{'pserver-name2':'iqFmGNmNLM6','hostname':'c9e8ffb6-a360-4f9c-96c3-f5f0244dfe55-jenkins','lag-interfaces':{'lag-interface':[{'l-interfaces':{'l-interface':[{'l-interfaces':{'l-interface':[{'v6-wan-link-ip':'PuNFKRUUpd3','interface-name':'89796dd1-89a5-4ddc-bd13-324ba9bce3b6-jenkins','allowed-address-pairs':'RGo6MaADK','prov-status':'uot','macaddr':'xUj8TGre','interface-role':'SyT0hd9Uu4b','selflink':'HxDI','in-maint':false,'admin-status':'GDgD','is-port-mirrored':true,'resource-version':'1529889840462','is-ip-unnumbered':false,'network-name':'RXCo3p3p5BhBS','management-option':'jNiTd','interface-id':'4n8niH','interface-description':'drnTF3'}]},'interface-name':'f4f9b9c7-eb83-4622-9d6f-14027a556ff5-jenkins'}]},'interface-name':'8806d30d-e5f5-409e-9e9e-9b1c1943058d-jenkins'}]}}}";
-
+               String linterfaceWithLinterface = getEventPayload("linterfaceWithLinterfaceTest");
                aaiDmaapEventProcessor.process(linterfaceWithLinterface);
 
        }
 
+       @Test
+       public void createGenericVnfWithChildrenUpdateGenericVnfProperty() throws Exception {
+
+               JsonObject testPayloads = parser.parse(getEventPayload("create-generic-vnf-with-children-update-generic-vnf-property")).getAsJsonObject();
+
+               String createGvnfMsg = testPayloads.get("create-generic-vnf").getAsJsonObject().toString();
+               aaiDmaapEventProcessor.process(createGvnfMsg);
+               assertTrue("generic-vnf in collection with vnf-name",
+                               mongoDatabase().getCollection("generic-vnf")
+                                               .find(Document.parse("{" +
+                                                               "'_id':'/network/generic-vnfs/generic-vnf/generic-vnf-987654321-9-cleanup-later-PS2418'," +
+                                                               "'vnf-name':'example-vnf-name-val-45282'" +
+                                                               "}"))
+                                               .iterator().hasNext()
+               );
+
+               String updateGvnfMsg = testPayloads.get("update-generic-vnf").getAsJsonObject().toString();
+               aaiDmaapEventProcessor.process(updateGvnfMsg);
+               assertTrue("generic-vnf updated vnf-name",
+                               mongoDatabase().getCollection("generic-vnf")
+                                               .find(Document.parse("{" +
+                                                               "'_id':'/network/generic-vnfs/generic-vnf/generic-vnf-987654321-9-cleanup-later-PS2418'," +
+                                                               "'vnf-name':'example-vnf-name-val-45282-generic-vnf-987654321-9-cleanup-later-PS2418-patched'" +
+                                                               "}"))
+                                               .iterator().hasNext()
+               );
+               assertFalse("generic-vnf with vnf-name not in collection",
+                               mongoDatabase().getCollection("generic-vnf")
+                                               .find(Document.parse("{" +
+                                                               "'_id':'/network/generic-vnfs/generic-vnf/generic-vnf-987654321-9-cleanup-later-PS2418'," +
+                                                               "'vnf-name':'example-vnf-name-val-45282'" +
+                                                               "}"))
+                                               .iterator().hasNext()
+               );
+
+       }
+
        @Test
        public void nosTest() throws Exception {
 
@@ -425,12 +428,24 @@ public class AAIDmaapEventProcessorScenariosTest {
 
        }
 
-       @Test
+       @Test()
        public void addressListTest() throws Exception {
 
                String event = getEventPayload("address-list");
                aaiDmaapEventProcessor.process(event);
 
+               // verifies that the uri is valid
+               List<String> ids = payloadParserService.doParse("dmaap", event, PayloadParserType.AAI_RESOURCE_DMAAP)
+                               .stream().map(entry -> entry.getFindQuery().get("_id").getAsString()).collect(Collectors.toList());
+
+               for (String id : ids) {
+                       new URI(id);
+               }
+
+               assertEquals("No id should contain '//'", 0L, ids.stream().filter(id -> id.contains("//")).count());
+
+
+
        }
 
        @Test
@@ -448,18 +463,89 @@ public class AAIDmaapEventProcessorScenariosTest {
                aaiDmaapEventProcessor.process(event);
 
        }
+       
+          @Test
+           public void cvlanTagTest() throws Exception {
+
+               String event = getEventPayload("cvlan-tag");
+               aaiDmaapEventProcessor.process(event);
+               assertNotEquals("customer collection exists", mongoDatabase().getCollection("customer"), null);
+               assertEquals("customer collection contains 1", mongoDatabase().getCollection("customer").count(), 1);
+           }
+
+          @Test
+          public void cvlanTagEntryTest() throws Exception {
+
+              String event = getEventPayload("cvlan-tag-entry");
+
+              aaiDmaapEventProcessor.process(event);
+          }
+
+          @Test
+          public void cvlanTagEntryCreateTest() throws Exception {
+
+              String event = getEventPayload("cvlan-tag-entry-create");
+
+              aaiDmaapEventProcessor.process(event);
+          }
+          
+       @Test
+       public void allottedResourceUpdateTest() throws Exception {
+
+           String event = getEventPayload("allotted-resource");
+
+           aaiDmaapEventProcessor.process(event);
+       }          
 
        @Test
-       public void delRel() throws Exception {
+       public void delRelTest() throws Exception {
 
                String event = getEventPayload("deleteRelationship/1-create-logical-link");
                aaiDmaapEventProcessor.process(event);
+               assertTrue("Now logical-link should exist",
+                               mongoDatabase().getCollection("logical-link")
+                                               .find(Document.parse("{" +
+                                                               "'_id': '/network/logical-links/logical-link/logical-link'" +
+                                                               "}"))
+                                               .iterator().hasNext());
 
                event = getEventPayload("deleteRelationship/2-create-generic-vnf");
                aaiDmaapEventProcessor.process(event);
+               assertTrue("Now generic-vnf with nested l-interface with nested vlan should exist",
+                               mongoDatabase().getCollection("generic-vnf")
+                                               .find(Document.parse("{" +
+                                                               "'_id': '/network/generic-vnfs/generic-vnf/generic-vnf-id'" +
+                                                               "}"))
+                                               .iterator().hasNext());
+               assertTrue("Now nested l-interface should exist",
+                               mongoDatabase().getCollection("generic-vnf")
+                                               .find(Document.parse("{" +
+                                                               "'_id': '/network/generic-vnfs/generic-vnf/generic-vnf-id/l-interfaces/l-interface/l-interface-name-1'" +
+                                                               "}"))
+                                               .iterator().hasNext());
+               assertTrue("Now nested vlan should exist",
+                               mongoDatabase().getCollection("generic-vnf")
+                                               .find(Document.parse("{" +
+                                                               "'_id': '/network/generic-vnfs/generic-vnf/generic-vnf-id/l-interfaces/l-interface/l-interface-name-1/vlans/vlan/vlan-1'" +
+                                                               "}"))
+                                               .iterator().hasNext());
 
                event = getEventPayload("deleteRelationship/3-create-rel-generic-vnf-vlan-to-logical-link");
                aaiDmaapEventProcessor.process(event);
+               assertTrue("Now generic-vnf->l-interface->vlan should have relationship to logical-link",
+                               mongoDatabase().getCollection("generic-vnf")
+                                               .find(Document.parse("{" +
+                                                               "'_id': '/network/generic-vnfs/generic-vnf/generic-vnf-id/l-interfaces/l-interface/l-interface-name-1/vlans/vlan/vlan-1'," +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/network/logical-links/logical-link/logical-link'" +
+                                                               "}"))
+                                               .iterator().hasNext());
+               assertTrue("Now logical-link should have relationship to generic-vnf->l-interface->vlan",
+                               mongoDatabase().getCollection("logical-link")
+                                               .find(Document.parse("{" +
+                                                               "'_id': '/network/logical-links/logical-link/logical-link'," +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/network/generic-vnfs/generic-vnf/generic-vnf-id/l-interfaces/l-interface/l-interface-name-1/vlans/vlan/vlan-1'" +
+                                                               "}"))
+                                               .iterator().hasNext());
 
                event = getEventPayload("deleteRelationship/4-delete-rel-to-generic-vnf-vlan-from-logical-link");
                aaiDmaapEventProcessor.process(event);
@@ -467,16 +553,128 @@ public class AAIDmaapEventProcessorScenariosTest {
                assertFalse("Now generic-vnf->l-interface->vlan should not have relationship to logical-link",
                                mongoDatabase().getCollection("generic-vnf")
                                                .find(Document.parse("{" +
-                                                               "'_id': '/network/generic-vnfs/generic-vnf/generic-vnf-id'," +
-                                                               "'vnf-id': 'generic-vnf-id'," +
-                                                               "'l-interfaces.l-interface.interface-name': 'l-interface-name-1'," +
-                                                               "'l-interfaces.l-interface.vlans.vlan.vlan-interface': 'vlan-1'," +
-                                                               "'l-interfaces.l-interface.vlans.vlan.relationship-list.relationship.related-link':'/aai/v13/network/logical-links/logical-link/logical-link'" +
+                                                               "'_id': '/network/generic-vnfs/generic-vnf/generic-vnf-id/l-interfaces/l-interface/l-interface-name-1/vlans/vlan/vlan-1'," +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/network/logical-links/logical-link/logical-link'" +
+                                                               "}"))
+                                               .iterator().hasNext());
+               assertFalse("Now logical-link should not have relationship to generic-vnf->l-interface->vlan",
+                               mongoDatabase().getCollection("logical-link")
+                                               .find(Document.parse("{" +
+                                                               "'_id': '/network/logical-links/logical-link/logical-link'," +
+                                                               "'relationship-list.relationship.related-link':'/aai/v14/network/generic-vnfs/generic-vnf/generic-vnf-id/l-interfaces/l-interface/l-interface-name-1/vlans/vlan/vlan-1'" +
+                                                               "}"))
+                                               .iterator().hasNext());
+
+       }
+
+
+       @Test
+       public void createPserverWithNestedDeleteNestedTest() throws Exception {
+
+               String type = "pserver";
+               String topUri = "/cloud-infrastructure/pservers/pserver/pserver-1";
+
+               JsonObject testPayloads = parser.parse(getEventPayload("createPserverWithNestedDeleteNested")).getAsJsonObject();
+               String createPserver = testPayloads.get("createPserverWithNested").toString();
+
+               aaiDmaapEventProcessor.process(createPserver);
+               assertTrue("Now pserver should be in the collections",
+                               mongoDatabase().getCollection(type)
+                                               .find(Document.parse("{" +
+                                                               "'_id': '" + topUri + "'" +
+                                                               "}"))
+                                               .iterator().hasNext());
+               assertTrue("Now nested p-interface should exist",
+                               mongoDatabase().getCollection(type)
+                                               .find(Document.parse("{" +
+                                                               "'_id': '" + topUri + "/p-interfaces/p-interface/interface-1'" +
+                                                               "}"))
+                                               .iterator().hasNext());
+
+               JsonObject existing = readObj(type, topUri);
+               assertThat("Stored contains the nested", existing.toString(), containsString("\"interface-name\":\"interface-1\""));
+
+               String deleteNested = testPayloads.get("deletedNested").toString();
+
+               aaiDmaapEventProcessor.process(deleteNested);
+               assertTrue("Now pserver should still be in the collections",
+                               mongoDatabase().getCollection(type)
+                                               .find(Document.parse("{" +
+                                                               "'_id': '" + topUri + "'" +
+                                                               "}"))
+                                               .iterator().hasNext());
+               assertFalse("Now nested p-interface should not exist",
+                               mongoDatabase().getCollection(type)
+                                               .find(Document.parse("{" +
+                                                               "'_id': '" + topUri + "/p-interfaces/p-interface/interface-1'" +
+                                                               "}"))
+                                               .iterator().hasNext());
+
+               existing = readObj(type, topUri);
+               assertThat("Stored does not contain the nested", existing.toString(), not(containsString("\"interface-name\":\"interface-1\"")));
+               assertThat("Stored does not contain the wrapping", existing.toString(), not(containsString("[]")));
+
+       }
+
+       @Test
+       public void createPserverWithoutNestedAddNestedTest() throws Exception {
+
+               String type = "pserver";
+               String topUri = "/cloud-infrastructure/pservers/pserver/pserver-1";
+
+               JsonObject testPayloads = parser.parse(getEventPayload("createPserverWithoutNestedAddNested")).getAsJsonObject();
+               String createPserver = testPayloads.get("createPserverWithoutNested").toString();
+
+               aaiDmaapEventProcessor.process(createPserver);
+               assertTrue("Now pserver should be in the collections",
+                               mongoDatabase().getCollection(type)
+                                               .find(Document.parse("{" +
+                                                               "'_id': '" + topUri + "'" +
                                                                "}"))
                                                .iterator().hasNext());
+               assertFalse("Now nested p-interface should not exist",
+                               mongoDatabase().getCollection(type)
+                                               .find(Document.parse("{" +
+                                                               "'_id': '" + topUri + "/p-interfaces/p-interface/interface-1'" +
+                                                               "}"))
+                                               .iterator().hasNext());
+
+               JsonObject existing = readObj(type, topUri);
+               assertThat("Stored does not contain the nested", existing.toString(), not(containsString("\"interface-name\":\"interface-1\"")));
 
+
+               String addNested = testPayloads.get("addNested").toString();
+
+               aaiDmaapEventProcessor.process(addNested);
+               assertTrue("Now pserver should still be in the collections",
+                               mongoDatabase().getCollection(type)
+                                               .find(Document.parse("{" +
+                                                               "'_id': '" + topUri + "'" +
+                                                               "}"))
+                                               .iterator().hasNext());
+               assertTrue("Now nested p-interface should exist",
+                               mongoDatabase().getCollection(type)
+                                               .find(Document.parse("{" +
+                                                               "'_id': '" + topUri + "/p-interfaces/p-interface/interface-1'" +
+                                                               "}"))
+                                               .iterator().hasNext());
+               existing = readObj(type, topUri);
+               assertThat("Stored does contain the nested", existing.toString(), containsString("\"interface-name\":\"interface-1\""));
+
+       }
+
+       private JsonObject readObj(String type, String topUri) {
+               List<JsonObject> found = mongoHelperSingleton.findAllWithIdsStartingWith(type, topUri);
+               JsonObject existing = new JsonObject();
+               if (!found.isEmpty()) {
+                       JsonArray ja = new JsonArray();
+                       found.forEach(ja::add);
+                       existing = payloadPrinterService.createJson(type, ja, PayloadPrinterType.AAI_RESOURCE_GET_ALL_PRINTER);
+               }
+               return existing;
        }
 
+
        protected String getEventPayload(String eventpayloadName) throws IOException {
                return getPayload("test/payloads/dmaapEvents/" + eventpayloadName + ".json");
        }
@@ -493,4 +691,25 @@ public class AAIDmaapEventProcessorScenariosTest {
                return IOUtils.toString(inputStream);
        }
 
+
+       @Test
+       public void getAllPrinterObjectWithoutPropertiesButWithEmptyNestedObjectTest() throws IOException {
+               String payload = getPayload("test/payloads/json/test-empty.json");
+               System.out.println(payload);
+
+               JsonObject jsonObject = parser.parse(payload).getAsJsonObject();
+               System.out.println(jsonObject.toString());
+
+               JsonArray jsonArray = new JsonArray();
+               jsonArray.add(jsonObject);
+               JsonObject customer = new JsonObject();
+               customer.addProperty("_id","/business/customers/customer/test");
+               customer.addProperty("global-customer-id","test");
+               jsonArray.add(customer);
+               JsonObject recreated = payloadPrinterService.createJson("customer", jsonArray, PayloadPrinterType.AAI_RESOURCE_GET_ALL_PRINTER);
+               System.out.println(recreated.toString());
+
+               assertThat("Reconstructed get all should not have empty object. ", recreated.toString(), not(Matchers.containsString("{}")));
+
+       }
 }
\ No newline at end of file
index 8fcd7e2..0a7bc4a 100644 (file)
  */
 package org.onap.aai.cacher.dmaap.consumer;
 
-import org.json.JSONException;
-import org.json.JSONObject;
+import com.google.gson.JsonSyntaxException;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 
-import static org.junit.Assert.assertEquals;
-
 
 public class AAIDmaapEventProcessorTest {
     private AAIDmaapEventProcessor eventProcessor;
@@ -43,37 +39,27 @@ public class AAIDmaapEventProcessorTest {
        eventProcessor = new AAIDmaapEventProcessor();
     }
 
-    @Ignore
-    @Test
-    public void testValidEventMessage() throws Exception {
-       eventProcessor.process(validEventMessage);
-       JSONObject header = eventProcessor.getEventHeader();
-       JSONObject body = eventProcessor.getEventBody();
-       assertEquals("header id", "ABC",header.getString("id") );
-       assertEquals("hostname", "hostName",body.getString("hostname") );
-    }
-    
-    @Test(expected = JSONException.class)
+    @Test(expected = IllegalStateException.class)
     public void testJSONException() throws Exception {
        eventProcessor.process("invalidJson");
     }
     
-    @Test(expected = JSONException.class)
+    @Test(expected = JsonSyntaxException.class)
     public void testInvalidHeader() throws Exception {
        eventProcessor.process(invalidEventMessageHeader);
     }
     
-    @Test(expected = JSONException.class)
+    @Test(expected = JsonSyntaxException.class)
     public void testInvalidHeaderMissingId() throws Exception {
        eventProcessor.process(invalidEventMessageHeaderMissingId);
     }
     
-    @Test(expected = JSONException.class)
+    @Test(expected = JsonSyntaxException.class)
     public void testInvalidHeaderMissingSourceName() throws Exception {
        eventProcessor.process(invalidEventMessageHeaderMissingSourceName);
     }
     
-    @Test(expected = JSONException.class)
+    @Test(expected = JsonSyntaxException.class)
     public void testInvalidEventMessageBody() throws Exception {
        eventProcessor.process(invalidEventMessageBody);
     }
index 3ca3390..12d1416 100644 (file)
 package org.onap.aai.cacher.dmaap.consumer;
 
 import com.att.nsa.mr.client.MRConsumer;
+import com.github.fakemongo.Fongo;
 import com.mongodb.DB;
 import com.mongodb.MongoClient;
 import com.mongodb.client.MongoDatabase;
-
-import de.flapdoodle.embed.mongo.MongodExecutable;
 import de.flapdoodle.embed.mongo.MongodProcess;
-import de.flapdoodle.embed.mongo.MongodStarter;
-import de.flapdoodle.embed.mongo.config.IMongodConfig;
-import de.flapdoodle.embed.mongo.config.MongoCmdOptionsBuilder;
-import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
-import de.flapdoodle.embed.mongo.config.Net;
-import de.flapdoodle.embed.mongo.distribution.Version;
-import de.flapdoodle.embed.process.runtime.Network;
-
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Ignore;
-import org.junit.Test;
+import org.hamcrest.Matchers;
+import org.junit.*;
 import org.junit.runner.RunWith;
 import org.mockito.Mockito;
 import org.onap.aai.cacher.common.MongoHelperSingleton;
-import org.onap.aai.cacher.egestion.printer.EgestionTestComponent;
+import org.onap.aai.cacher.egestion.printer.PayloadPrinterService;
 import org.onap.aai.cacher.injestion.parser.InjestionTestComponent;
 import org.onap.aai.cacher.injestion.parser.PayloadParserService;
 import org.onap.aai.cacher.service.helper.RestClientHelperService;
@@ -58,6 +45,9 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
 
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertThat;
+
 //@Ignore
 @RunWith(SpringJUnit4ClassRunner.class)
 @Configuration
@@ -96,54 +86,35 @@ public class AAIEventConsumerTest  {
        }
        
        @Bean
-       public AAIDmaapEventProcessor aaiDmaapEventProcessor(MongoHelperSingleton mongoHelperSingleton, PayloadParserService payloadParserService) {
-               return new AAIDmaapEventProcessor(mongoHelperSingleton, payloadParserService);
+       public AAIDmaapEventProcessor aaiDmaapEventProcessor(MongoHelperSingleton mongoHelperSingleton, PayloadParserService payloadParserService, PayloadPrinterService payloadPrinterService) {
+               return new AAIDmaapEventProcessor(mongoHelperSingleton, payloadParserService, payloadPrinterService);
        }
 
 
        MRConsumer client;
-       private String validEventMessage = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'pserver','top-entity-type':'pserver','entity-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'0c3b336d-6554-4ddf-a4d7-90f97876a966','source-name':'JUNIT','version':'v13','timestamp':'20180209-21:02:20:344'},'entity':{'hostname':'pserver-1','in-maint':false}}";
-       private String validHeldEventMessage = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'pserver','top-entity-type':'pserver','entity-link':'/aai/v13/cloud-infrastructure/pservers/pserver/pserver-1','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'0c3b336d-6554-4ddf-a4d7-90f97876a966','source-name':'JUNIT','version':'v13','timestamp':'20180209-21:02:20:344'},'entity':{'hostname':'pserver-1','in-maint':false}}";
+       private String validEventMessage = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'pserver','top-entity-type':'pserver','entity-link':'/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'0c3b336d-6554-4ddf-a4d7-90f97876a966','source-name':'JUNIT','version':'v14','timestamp':'20180209-21:02:20:344'},'entity':{'hostname':'pserver-1','in-maint':false}}";
+       private String validHeldEventMessage = "{'cambria.partition':'AAI','event-header':{'severity':'NORMAL','entity-type':'pserver','top-entity-type':'pserver','entity-link':'/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1','event-type':'AAI-EVENT','domain':'JUNIT','action':'CREATE','sequence-number':'0','id':'0c3b336d-6554-4ddf-a4d7-90f97876a966','source-name':'JUNIT','version':'v14','timestamp':'20180209-21:02:20:344'},'entity':{'hostname':'pserver-1','in-maint':false}}";
        DmaapConsumerSingleton singleton = DmaapConsumerSingleton.getInstance();
        List<String> eventMessageList = new ArrayList<>();
 
-   
+
        @BeforeClass
-    public static void setUp() throws Exception {
-               String bindIp = "localhost";
-               int port = 27017;
-               startEmbedded(port);
-
-               mongoC = new MongoClient(bindIp, port);
-               mongoDb = mongoC.getDatabase(DB_NAME);
-               db = mongoC.getDB(DB_NAME);
-       
-    }
+       public static void setup() throws IOException, InterruptedException {
+               Fongo fongo = new Fongo(DB_NAME);
+               mongoDb = fongo.getDatabase(DB_NAME);
+               db = fongo.getDB(DB_NAME);
+       }
        
        @Before
     public void init() throws Exception {
                eventMessageList.add(validEventMessage);
-       //super.setupBundleconfig();
        aaiEventConsumer = new AAIEventConsumer("aaiDmaaPEventConsumer.properties", true);
        Properties prop = aaiEventConsumer.getDmaapEventConsumerProperties();
+       assertThat("dmaap group is generated", prop.getProperty("group"), Matchers.startsWith("cacher-"));
+               assertNotEquals("dmaap id generated", "NA", prop.getProperty("id"));
        client = Mockito.mock(MRConsumer.class);
        aaiEventConsumer.setConsumer(client);
-
-       
     }
-       
-       protected static void startEmbedded(int port) throws IOException {
-               IMongodConfig mongoConfigConfig = new MongodConfigBuilder()
-                               .version(Version.Main.PRODUCTION)
-                               .net(new Net(port, Network.localhostIsIPv6()))
-                               .cmdOptions(new MongoCmdOptionsBuilder().verbose(true).build())
-                               .configServer(false)
-                               .build();
-
-               MongodExecutable mongodExecutable = MongodStarter.getDefaultInstance().prepare(mongoConfigConfig);
-
-               mongod = mongodExecutable.start();
-       }
 
        @AfterClass
        public static void tearDown() {
index a48712f..d093b6c 100644 (file)
  */
 package org.onap.aai.cacher.injestion.parser;
 
+import com.github.fakemongo.Fongo;
+import com.mongodb.DB;
+import com.mongodb.MongoClient;
+import com.mongodb.client.MongoDatabase;
+import de.flapdoodle.embed.mongo.MongodProcess;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.onap.aai.cacher.common.MongoHelperSingleton;
+import org.onap.aai.cacher.injestion.parser.strategy.aai.AAIResourcesUriTemplates;
+import org.onap.aai.cacher.injestion.parser.strategy.aai.AAIUriSegment;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.io.IOException;
+import java.util.*;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.*;
 
 @RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = InjestionTestComponent.class)
+@ContextConfiguration(classes = {InjestionTestComponent.class, AAIResourcesUriTemplatesTest.class})
 public class AAIResourcesUriTemplatesTest {
 
+       private static final String DB_NAME = AAIResourcesUriTemplatesTest.class.getSimpleName();
+       private static MongoDatabase mongoDb;
+       private static DB db;
+       private static MongodProcess mongod;
+       private static MongoClient mongoC;
+
        @Autowired
        AAIResourcesUriTemplates aaiResourcesUriTemplates;
 
+
+       @Bean
+       public DB db() {
+               return db;
+       }
+
+       @Bean
+       public MongoDatabase mongoDatabase() {
+               return mongoDb;
+       }
+
+       @Bean
+       public MongoHelperSingleton mongoHelperSingleton(DB db, MongoDatabase mongoDb) {
+               return new MongoHelperSingleton(db, mongoDb);
+       }
+
+       @BeforeClass
+       public static void setup() throws IOException, InterruptedException {
+               Fongo fongo = new Fongo(DB_NAME);
+               mongoDb = fongo.getDatabase(DB_NAME);
+               db = fongo.getDB(DB_NAME);
+       }
+
+       @AfterClass
+       public static void tearDown() {
+               if (mongod != null && mongod.isProcessRunning()) {
+                       mongod.stop();
+               }
+       }
+
+       @After
+       public void cleanup() {
+               final List<String> collectionNames = new ArrayList<>();
+               mongoDb.listCollections().iterator().forEachRemaining(document -> collectionNames.add(document.getString("name")));
+               collectionNames.forEach(collectionName -> mongoDb.getCollection(collectionName).drop());
+       }
+
        @Test
        public void getUriTemplateByType() throws Exception {
 
@@ -134,4 +187,58 @@ public class AAIResourcesUriTemplatesTest {
                assertThat(aaiResourcesUriTemplates.getUriTemplateMappings(uri, template), is(expected));
        }
 
+       @Test
+       public void getAaiUriSegmentsTest() {
+
+               String uri = "/service-design-and-creation/services/service/id/l-interfaces/l-interface/name/p-interfaces/p-interface/name2";
+
+               List<AAIUriSegment> segments = aaiResourcesUriTemplates.getAaiUriSegments(uri);
+
+               assertEquals("3 segments are generated", 3, segments.size());
+
+               assertEquals("Segment 1 plural is services", "services", segments.get(0).getSegmentPlural().get());
+               assertEquals("Segment 2 plural is l-interfaces", "l-interfaces", segments.get(1).getSegmentPlural().get());
+               assertEquals("Segment 3 plural is p-interfaces", "p-interfaces", segments.get(2).getSegmentPlural().get());
+
+               assertEquals("Segment 1 singular is service", "service", segments.get(0).getSegmentSingular());
+               assertEquals("Segment 2 singular is l-interface", "l-interface", segments.get(1).getSegmentSingular());
+               assertEquals("Segment 3 singular is p-interface", "p-interface", segments.get(2).getSegmentSingular());
+
+               assertEquals("Segment 1 template",
+                               "/service-design-and-creation/services/service/{service-id}",
+                               segments.get(0).getSegmentTemplate());
+               assertEquals("Segment 2 template",
+                               "/l-interfaces/l-interface/{interface-name}",
+                               segments.get(1).getSegmentTemplate());
+               assertEquals("Segment 3 template",
+                               "/p-interfaces/p-interface/{interface-name}",
+                               segments.get(2).getSegmentTemplate());
+
+               assertEquals("Segment 1 uri",
+                               "/service-design-and-creation/services/service/id",
+                               segments.get(0).getSegment());
+               assertEquals("Segment 2 uri",
+                               "/l-interfaces/l-interface/name",
+                               segments.get(1).getSegment());
+               assertEquals("Segment 3 uri",
+                               "/p-interfaces/p-interface/name2",
+                               segments.get(2).getSegment());
+
+               Map<String, String> expected = new HashMap<>();
+               expected.put("service-id", "id");
+               assertEquals("Segment 1 mapping", expected, segments.get(0).getSegmentKeyValues());
+               expected = new HashMap<>();
+               expected.put("interface-name", "name");
+               assertEquals("Segment 2 mapping", expected, segments.get(1).getSegmentKeyValues());
+               expected = new HashMap<>();
+               expected.put("interface-name", "name2");
+               assertEquals("Segment 3 mapping", expected, segments.get(2).getSegmentKeyValues());
+       }
+
+       @Test
+       public void getFullUriPrefixTest() throws Exception {
+               assertEquals("/aai/v12", aaiResourcesUriTemplates.getAAIUriFromEntityUriPrefix(("/aai/v12/network/pnfs/pnf/pnf-name-value/p-interfaces/p-interface/xe-10%2F3%2F2/l-interfaces/l-interface/l-interface-name")));
+               assertEquals("/aai/v4", aaiResourcesUriTemplates.getAAIUriFromEntityUriPrefix("/aai/v4/names"));
+       }
+
 }
\ No newline at end of file
index 34cc8a3..0d80aca 100644 (file)
@@ -25,7 +25,7 @@ import org.springframework.context.annotation.Configuration;
 import java.nio.file.FileSystems;
 
 @Configuration
-@ComponentScan(basePackages = {"org.onap.aai.cacher.injestion"})
+@ComponentScan(basePackages = {"org.onap.aai.cacher.injestion","org.onap.aai.cacher.egestion"})
 public class InjestionTestComponent {
        public InjestionTestComponent() {
                System.setProperty("AJSC_HOME", FileSystems.getDefault().getPath(".").toAbsolutePath().toString());
index 1579323..ddac8e3 100644 (file)
  */
 package org.onap.aai.cacher.injestion.parser;
 
+import com.github.fakemongo.Fongo;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
+import com.mongodb.DB;
+import com.mongodb.MongoClient;
+import com.mongodb.client.MongoDatabase;
+import de.flapdoodle.embed.mongo.MongodExecutable;
+import de.flapdoodle.embed.mongo.MongodProcess;
+import de.flapdoodle.embed.mongo.MongodStarter;
+import de.flapdoodle.embed.mongo.config.IMongodConfig;
+import de.flapdoodle.embed.mongo.config.MongoCmdOptionsBuilder;
+import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
+import de.flapdoodle.embed.mongo.config.Net;
+import de.flapdoodle.embed.mongo.distribution.Version;
+import de.flapdoodle.embed.process.runtime.Network;
 import org.json.JSONException;
 import org.json.JSONObject;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.onap.aai.cacher.common.MongoHelperSingleton;
 import org.onap.aai.cacher.injestion.parser.strategy.PayloadParserType;
 import org.onap.aai.cacher.model.CacheEntry;
 import org.skyscreamer.jsonassert.JSONAssert;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
+import java.io.IOException;
 import java.util.List;
 
 import static org.hamcrest.CoreMatchers.is;
@@ -41,31 +58,72 @@ import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
 @RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = InjestionTestComponent.class)
+@ContextConfiguration(classes = {InjestionTestComponent.class,PayloadParserServiceTest.class})
 public class PayloadParserServiceTest {
 
+       private static final String DB_NAME = PayloadParserServiceTest.class.getSimpleName();
+       private static MongoDatabase mongoDb;
+       private static DB db;
+       private static MongodProcess mongod;
+       private static MongoClient mongoC;
+
        @Autowired
        private PayloadParserService parserService;
 
+
        private JsonParser parser = new JsonParser();
 
        private String aaiGetAllServiceResponse =
                        "{" +
-                       "       'service': [" +
-                       "               {" +
-                       "                       'service-id': 'service-id-1:1'," +
-                       "                       'service-description': 'A'," +
-                       "                       'resource-version': '1'" +
-                       "               }," +
-                       "               {" +
-                       "                       'service-id': 'service-id-2'," +
-                       "                       'service-description': 'B'," +
-                       "                       'resource-version': '2'" +
-                       "               }" +
-                       "       ]" +
-                       "}";
+                                       "       'service': [" +
+                                       "               {" +
+                                       "                       'service-id': 'service-id-1:1'," +
+                                       "                       'service-description': 'A'," +
+                                       "                       'resource-version': '1'" +
+                                       "               }," +
+                                       "               {" +
+                                       "                       'service-id': 'service-id-2'," +
+                                       "                       'service-description': 'B'," +
+                                       "                       'resource-version': '2'" +
+                                       "               }" +
+                                       "       ]" +
+                                       "}";
        private JsonObject aaiGetAllServiceResponseJson = parser.parse(aaiGetAllServiceResponse).getAsJsonObject();
 
+       @Bean
+       public DB db() {
+               return db;
+       }
+
+       @Bean
+       public MongoDatabase mongoDatabase() {
+               return mongoDb;
+       }
+
+       @Bean
+       public MongoHelperSingleton mongoHelperSingleton(DB db, MongoDatabase mongoDb) {
+               return new MongoHelperSingleton(db, mongoDb);
+       }
+
+       @BeforeClass
+       public static void setup() throws IOException, InterruptedException {
+               Fongo fongo = new Fongo(DB_NAME);
+               mongoDb = fongo.getDatabase(DB_NAME);
+               db = fongo.getDB(DB_NAME);
+       }
+
+       protected static void startEmbedded(int port) throws IOException {
+               IMongodConfig mongoConfigConfig = new MongodConfigBuilder()
+                               .version(Version.Main.PRODUCTION)
+                               .net(new Net(port, Network.localhostIsIPv6()))
+                               .cmdOptions(new MongoCmdOptionsBuilder().verbose(true).build())
+                               .configServer(false)
+                               .build();
+
+               MongodExecutable mongodExecutable = MongodStarter.getDefaultInstance().prepare(mongoConfigConfig);
+
+               mongod = mongodExecutable.start();
+       }
 
 
        private void print(List<CacheEntry> result) {
diff --git a/src/test/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceDmaapParserStrategyTest.java b/src/test/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceDmaapParserStrategyTest.java
deleted file mode 100644 (file)
index 8a4ab0b..0000000
+++ /dev/null
@@ -1,429 +0,0 @@
-/**
- * ============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.cacher.injestion.parser.strategy;
-
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-import org.json.JSONObject;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.onap.aai.cacher.injestion.parser.InjestionTestComponent;
-import org.onap.aai.cacher.injestion.parser.PayloadParserService;
-import org.onap.aai.cacher.model.CacheEntry;
-import org.skyscreamer.jsonassert.JSONAssert;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.util.MultiValueMap;
-
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = InjestionTestComponent.class)
-public class AAIResourceDmaapParserStrategyTest {
-
-       @Autowired
-       private PayloadParserService parserService;
-
-       @Autowired
-       @Qualifier("aai-resource-dmaap")
-       private AAIResourceDmaapParserStrategy aaiResourceDmaapParserStrategy;
-
-       private JsonParser parser = new JsonParser();
-
-       private JsonObject pserverCreateEvent = parser.parse(
-                       new FileReader("./src/test/resources/test/payloads/dmaap-pserver-create.json")).getAsJsonObject();
-
-       public AAIResourceDmaapParserStrategyTest() throws FileNotFoundException {}
-
-       private void print(List<CacheEntry> result) {
-               Gson gson = new GsonBuilder().setPrettyPrinting().create();
-               result.forEach(e -> System.out.println("\n\nCollection: " + e.getCollection() +
-                               "\nKey: " + e.getId() +
-                               "\nFind: " + gson.toJson(e.getFindQuery()) +
-                               "\nNestedFind: " + gson.toJson(e.getNestedFind()) +
-                               "\nNestedField: " + e.getNestedField() +
-                               "\nNestedFieldIdentifier: " + gson.toJson(e.getNestedFieldIdentifierObj()) +
-                               "\nPayload: " + gson.toJson(e.getPayload())));
-       }
-
-       @Test
-       public void test(){
-               List<CacheEntry> result =  parserService.doParse("dmaapEvent", pserverCreateEvent, PayloadParserType.AAI_RESOURCE_DMAAP);
-               print(result);
-       }
-
-
-       @Test
-       public void getUriTest() {
-               String fullUri = aaiResourceDmaapParserStrategy.getFullUri(pserverCreateEvent.getAsJsonObject("event-header"));
-               assertEquals("/aai/v12/cloud-infrastructure/pservers/pserver/dmaap-pserver-create", fullUri);
-               String uri = aaiResourceDmaapParserStrategy.getUri(fullUri);
-               assertEquals("/cloud-infrastructure/pservers/pserver/dmaap-pserver-create", uri);
-       }
-
-       @Test
-       public void getAaiUriSegmentsTest() {
-
-               String uri = "/service-design-and-creation/services/service/id/l-interfaces/l-interface/name/p-interfaces/p-interface/name2";
-
-               List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
-
-               assertEquals("3 segments are generated", 3, segments.size());
-
-               assertEquals("Segment 1 plural is services", "services", segments.get(0).getSegmentPlural().get());
-               assertEquals("Segment 2 plural is l-interfaces", "l-interfaces", segments.get(1).getSegmentPlural().get());
-               assertEquals("Segment 3 plural is p-interfaces", "p-interfaces", segments.get(2).getSegmentPlural().get());
-
-               assertEquals("Segment 1 singular is service", "service", segments.get(0).getSegmentSingular());
-               assertEquals("Segment 2 singular is l-interface", "l-interface", segments.get(1).getSegmentSingular());
-               assertEquals("Segment 3 singular is p-interface", "p-interface", segments.get(2).getSegmentSingular());
-
-               assertEquals("Segment 1 template",
-                               "/service-design-and-creation/services/service/{service-id}",
-                               segments.get(0).getSegmentTemplate());
-               assertEquals("Segment 2 template",
-                               "/l-interfaces/l-interface/{interface-name}",
-                               segments.get(1).getSegmentTemplate());
-               assertEquals("Segment 3 template",
-                               "/p-interfaces/p-interface/{interface-name}",
-                               segments.get(2).getSegmentTemplate());
-
-               assertEquals("Segment 1 uri",
-                               "/service-design-and-creation/services/service/id",
-                               segments.get(0).getSegment());
-               assertEquals("Segment 2 uri",
-                               "/l-interfaces/l-interface/name",
-                               segments.get(1).getSegment());
-               assertEquals("Segment 3 uri",
-                               "/p-interfaces/p-interface/name2",
-                               segments.get(2).getSegment());
-
-               Map<String, String> expected = new HashMap<>();
-               expected.put("service-id", "id");
-               assertEquals("Segment 1 mapping", expected, segments.get(0).getSegmentKeyValues());
-               expected = new HashMap<>();
-               expected.put("interface-name", "name");
-               assertEquals("Segment 2 mapping", expected, segments.get(1).getSegmentKeyValues());
-               expected = new HashMap<>();
-               expected.put("interface-name", "name2");
-               assertEquals("Segment 3 mapping", expected, segments.get(2).getSegmentKeyValues());
-       }
-
-       @Test
-       public void getEntityBodyChildTest() throws Exception {
-               String uri = "/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/ams1b/tenants/tenant/52fd05137ab4453bb53084a13c7bb7a4/vservers/vserver/vs-id";
-               String entityString =
-                               "{" +
-                               "       'tenants':" +
-                               "       {" +
-                               "               'tenant': [" +
-                               "                       {" +
-                               "                               'vservers':" +
-                               "                               {" +
-                               "                                       'vserver': [" +
-                               "                                               {" +
-                               "                                                       'in-maint': false," +
-                               "                                                       'resource-version': '1525978690717'," +
-                               "                                                       'vserver-name': 'slaa-regression-cr-id-api-server-449704329'," +
-                               "                                                       'vserver-id': 'vs-id'" +
-                               "                                               }" +
-                               "                                       ]" +
-                               "                               }," +
-                               "                               'tenant-id': 'ten-id'," +
-                               "                               'tenant-name': 'name'" +
-                               "                       }" +
-                               "               ]" +
-                               "       }," +
-                               "       'cloud-owner': 'cr-o'," +
-                               "       'owner-defined-type': 'lcp'," +
-                               "       'cloud-region-id': 'cr-id'" +
-                               "}";
-
-               JsonObject entity = parser.parse(entityString).getAsJsonObject();
-
-               List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
-
-               JsonObject result = aaiResourceDmaapParserStrategy.getEntityBody(entity, segments);
-
-               JSONAssert.assertEquals(
-                               new JSONObject(entity
-                                               .getAsJsonObject("tenants").getAsJsonArray("tenant").get(0)     .getAsJsonObject()
-                                               .getAsJsonObject("vservers").getAsJsonArray("vserver").get(0).getAsJsonObject()
-                                               .toString()),
-                               new JSONObject(result.toString()),
-                               true);
-
-       }
-
-       @Test
-       public void getEntityBodyTopTest() throws Exception {
-               String uri = "/cloud-infrastructure/pservers/pserver/hn";
-               String entityString = "{'hostname':'hn','in-maint':false,'resource-version':'1525801811662','pserver-id':'0A47B945-9C74-4CBE-AD72-0DECB966EB94'}";
-
-               JsonObject entity = parser.parse(entityString).getAsJsonObject();
-
-               List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
-
-               JsonObject result = aaiResourceDmaapParserStrategy.getEntityBody(entity, segments);
-
-               JSONAssert.assertEquals(
-                               new JSONObject(entity.toString()),
-                               new JSONObject(result.toString()),
-                               true);
-
-       }
-
-       @Test
-       public void getFindQueryTopTest() throws Exception {
-               String uri = "/cloud-infrastructure/pservers/pserver/hn";
-               JsonObject expected = parser.parse("{'_id':'/cloud-infrastructure/pservers/pserver/hn'," +
-                               "'hostname':'hn'}").getAsJsonObject();
-
-               List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
-               JsonObject findQuery = aaiResourceDmaapParserStrategy.getFindQuery(segments);
-
-               JSONAssert.assertEquals(
-                               new JSONObject(expected.toString()),
-                               new JSONObject(findQuery.toString()),
-                               true);
-       }
-
-       @Test
-       public void getFindQueryOneLevelTest() throws Exception {
-               String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1";
-               JsonObject expected = parser.parse("{'_id':'/cloud-infrastructure/pservers/pserver/hn'," +
-                               "'hostname':'hn'}").getAsJsonObject();
-
-               List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
-               JsonObject findQuery = aaiResourceDmaapParserStrategy.getFindQuery(segments);
-
-               JSONAssert.assertEquals(
-                               new JSONObject(expected.toString()),
-                               new JSONObject(findQuery.toString()),
-                               true);
-       }
-
-       @Test
-       public void getFindQueryTwoLevelTest() throws Exception {
-               String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1/l-interfaces/l-interface/interface-2";
-               JsonObject expected = parser.parse("{'_id':'/cloud-infrastructure/pservers/pserver/hn'," +
-                               "'hostname':'hn'," +
-                               "'p-interfaces.p-interface.interface-name':'interface-1'}").getAsJsonObject();
-
-               List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
-               JsonObject findQuery = aaiResourceDmaapParserStrategy.getFindQuery(segments);
-
-               JSONAssert.assertEquals(
-                               new JSONObject(expected.toString()),
-                               new JSONObject(findQuery.toString()),
-                               true);
-       }
-
-       @Test
-       public void getNestedFindQueryTopTest() throws Exception {
-               String uri = "/cloud-infrastructure/pservers/pserver/hn";
-               JsonObject expected = parser.parse("{'_id':'/cloud-infrastructure/pservers/pserver/hn'," +
-                               "'hostname':'hn'}").getAsJsonObject();
-
-               List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
-               JsonObject findQuery = aaiResourceDmaapParserStrategy.getNestedFindQuery(segments);
-
-               JSONAssert.assertEquals(
-                               new JSONObject(expected.toString()),
-                               new JSONObject(findQuery.toString()),
-                               true);
-       }
-
-       @Test
-       public void getNestedFindQueryOneLevelTest() throws Exception {
-               String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1";
-               JsonObject expected = parser.parse("{'_id':'/cloud-infrastructure/pservers/pserver/hn'," +
-                               "'hostname':'hn'," +
-                               "'p-interfaces.p-interface.interface-name':'interface-1'}").getAsJsonObject();
-
-               List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
-               JsonObject findQuery = aaiResourceDmaapParserStrategy.getNestedFindQuery(segments);
-
-               JSONAssert.assertEquals(
-                               new JSONObject(expected.toString()),
-                               new JSONObject(findQuery.toString()),
-                               true);
-       }
-
-       @Test
-       public void getNestedFindQueryTwoLevelTest() throws Exception {
-               String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1/l-interfaces/l-interface/interface-2";
-               JsonObject expected = parser.parse("{'_id':'/cloud-infrastructure/pservers/pserver/hn'," +
-                               "'hostname':'hn'," +
-                               "'p-interfaces.p-interface.interface-name':'interface-1'," +
-                               "'p-interfaces.p-interface.l-interfaces.l-interface.interface-name':'interface-2'}").getAsJsonObject();
-
-               List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
-               JsonObject findQuery = aaiResourceDmaapParserStrategy.getNestedFindQuery(segments);
-
-               JSONAssert.assertEquals(
-                               new JSONObject(expected.toString()),
-                               new JSONObject(findQuery.toString()),
-                               true);
-       }
-
-       @Test
-       public void getNestedFieldTopTest() throws Exception {
-               String uri = "/cloud-infrastructure/pservers/pserver/hn";
-               String expected = "";
-
-               List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
-               String nestedField = aaiResourceDmaapParserStrategy.getNestedField(segments);
-
-               assertEquals("Top nested field", expected, nestedField);
-       }
-
-       @Test
-       public void getNestedFieldOneLevelTest() throws Exception {
-               String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1";
-               String expected = "p-interfaces.p-interface";
-
-               List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
-               String nestedField = aaiResourceDmaapParserStrategy.getNestedField(segments);
-
-               assertEquals("Top nested field", expected, nestedField);
-       }
-
-       @Test
-       public void getNestedFieldTwoLevelTest() throws Exception {
-               String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1/l-interfaces/l-interface/interface-2";
-               String expected = "p-interfaces.p-interface.$.l-interfaces.l-interface";
-
-               List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
-               String nestedField = aaiResourceDmaapParserStrategy.getNestedField(segments);
-
-               assertEquals("Top nested field", expected, nestedField);
-       }
-
-       @Test
-       public void getNestedFieldThreeLevelOddCaseTest() throws Exception {
-               String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1/l-interfaces/l-interface/interface-2/l3-interface-ipv4-address-list/addressA";
-               String expected = "p-interfaces.p-interface.$.l-interfaces.l-interface.$.l3-interface-ipv4-address-list";
-
-               List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
-               String nestedField = aaiResourceDmaapParserStrategy.getNestedField(segments);
-
-               assertEquals("Top nested field", expected, nestedField);
-       }
-
-
-
-
-       @Test
-       public void getNestedIdentifierTopTest() throws Exception {
-               String uri = "/cloud-infrastructure/pservers/pserver/hn";
-               JsonObject expected = parser.parse("{}").getAsJsonObject();
-
-               List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
-               JsonObject nestedIdentifier = aaiResourceDmaapParserStrategy.getNestedIdentifier(segments);
-
-               JSONAssert.assertEquals(
-                               new JSONObject(expected.toString()),
-                               new JSONObject(nestedIdentifier.toString()),
-                               true);
-       }
-
-       @Test
-       public void getNestedIdentifierOneLevelTest() throws Exception {
-               String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1";
-               JsonObject expected = parser.parse("{'interface-name':'interface-1'}").getAsJsonObject();
-
-               List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
-               JsonObject nestedIdentifier = aaiResourceDmaapParserStrategy.getNestedIdentifier(segments);
-
-               JSONAssert.assertEquals(
-                               new JSONObject(expected.toString()),
-                               new JSONObject(nestedIdentifier.toString()),
-                               true);
-       }
-
-       @Test
-       public void getNestedIdentifierTwoLevelTest() throws Exception {
-               String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1/l-interfaces/l-interface/interface-2";
-               JsonObject expected = parser.parse("{'interface-name':'interface-2'}").getAsJsonObject();
-
-               List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
-               JsonObject nestedIdentifier = aaiResourceDmaapParserStrategy.getNestedIdentifier(segments);
-
-               JSONAssert.assertEquals(
-                               new JSONObject(expected.toString()),
-                               new JSONObject(nestedIdentifier.toString()),
-                               true);
-       }
-
-
-       @Test
-       public void getFullUriPrefixTest() throws Exception {
-               assertEquals("/aai/v12", aaiResourceDmaapParserStrategy.getFullUriPrefix("/aai/v12/network/pnfs/pnf/pnf-name-value/p-interfaces/p-interface/xe-10%2F3%2F2/l-interfaces/l-interface/l-interface-name"));
-               assertEquals("/aai/v4", aaiResourceDmaapParserStrategy.getFullUriPrefix("/aai/v4/names"));
-       }
-
-
-       @Test
-       public void fullUriToRelationshipObj() throws Exception {
-               String fullUri = AAIResourceDmaapParserStrategyTestConstants.VSERVER_URI;
-               String expectedRelObj = AAIResourceDmaapParserStrategyTestConstants.VSERVER_RELATIONSHIP_OBJ;
-               JsonObject relObj = aaiResourceDmaapParserStrategy.fullUriToRelationshipObj(fullUri, "tosca.relationships.HostedOn");
-
-               JSONAssert.assertEquals(new JSONObject(expectedRelObj), new JSONObject(relObj.toString()), true);
-       }
-
-       @Test
-       public void verifyRelationshipEntriesOnUpdateTest() throws Exception {
-               List<CacheEntry> result = aaiResourceDmaapParserStrategy
-                               .process("TEST", parser.parse(AAIResourceDmaapParserStrategyTestConstants.GENERIC_VNF_EVENT_WITH_2_RELAT).getAsJsonObject());
-
-               assertEquals(3, result.size());
-
-       }
-       @Test
-       public void verifyRelationshipEntriesSimpleEvent() throws Exception {
-               List<CacheEntry> result = aaiResourceDmaapParserStrategy
-                               .process("TEST", parser.parse(AAIResourceDmaapParserStrategyTestConstants.GENERIC_VNF_EVENT).getAsJsonObject());
-
-               assertEquals(1, result.size());
-
-       }
-
-       @Test
-       public void getFromRelationshipFullUriToRelationshipObjTest() throws Exception {
-                               String entity = AAIResourceDmaapParserStrategyTestConstants.FULL_PSERVER;
-                               String fullUri = AAIResourceDmaapParserStrategyTestConstants.FULL_PSERVER_URI;
-                               MultiValueMap<String, AAIResourceDmaapParserStrategy.AAIRelatedToDetails> result = aaiResourceDmaapParserStrategy.getFromRelationshipFullUriToRelationshipObj(parser.parse(entity).getAsJsonObject(), fullUri);
-
-                               assertEquals(3, result.size());
-
-       }
-}
\ No newline at end of file
index 659c881..53017f0 100644 (file)
@@ -193,7 +193,7 @@ public class AAIResourceDmaapParserStrategyTestConstants {
                                "               'severity': 'NORMAL'," +
                                "               'entity-type': 'generic-vnf'," +
                                "               'top-entity-type': 'generic-vnf'," +
-                               "               'entity-link': '/aai/v13/network/generic-vnfs/generic-vnf/cc1703a9-a63f-46c5-a6b1-7ff67f3a9848'," +
+                               "               'entity-link': '/aai/v14/network/generic-vnfs/generic-vnf/cc1703a9-a63f-46c5-a6b1-7ff67f3a9848'," +
                                "               'event-type': 'AAI-EVENT'," +
                                "               'domain': 'e2e1'," +
                                "               'action': 'UPDATE'," +
@@ -222,7 +222,7 @@ public class AAIResourceDmaapParserStrategyTestConstants {
                                "                               {" +
                                "                                       'related-to': 'service-instance'," +
                                "                                       'relationship-label': 'org.onap.relationships.inventory.ComposedOf'," +
-                               "                                       'related-link': '/aai/v13/business/customers/customer/1702_IT3_SubscGblID_20170426162928/service-subscriptions/service-subscription/XXXX-VMS/service-instances/service-instance/SERVERNAME'," +
+                               "                                       'related-link': '/aai/v14/business/customers/customer/1702_IT3_SubscGblID_20170426162928/service-subscriptions/service-subscription/XXXX-VMS/service-instances/service-instance/SERVERNAME'," +
                                "                                       'relationship-data': [" +
                                "                                               {" +
                                "                                                       'relationship-key': 'customer.global-customer-id'," +
@@ -246,7 +246,7 @@ public class AAIResourceDmaapParserStrategyTestConstants {
                                "                               {" +
                                "                                       'related-to': 'vserver'," +
                                "                                       'relationship-label': 'tosca.relationships.HostedOn'," +
-                               "                                       'related-link': '/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/AAIAIC25/tenants/tenant/SERVERNAME%3A%3AXXXX-VMS/vservers/vserver/e77451f2-1c07-4db4-b92b-9907b840fc8f'," +
+                               "                                       'related-link': '/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/AAIAIC25/tenants/tenant/SERVERNAME%3A%3AXXXX-VMS/vservers/vserver/e77451f2-1c07-4db4-b92b-9907b840fc8f'," +
                                "                                       'relationship-data': [" +
                                "                                               {" +
                                "                                                       'relationship-key': 'cloud-region.cloud-owner'," +
@@ -297,7 +297,7 @@ public class AAIResourceDmaapParserStrategyTestConstants {
                                "                                                                               'relationship-key': 'l3-network.network-id'" +
                                "                                                                       }" +
                                "                                                               ]," +
-                               "                                                               'related-link': '/aai/v13/network/l3-networks/l3-network/91eae07d-6f38-4fd8-b929-e7c04614c8c3'," +
+                               "                                                               'related-link': '/aai/v14/network/l3-networks/l3-network/91eae07d-6f38-4fd8-b929-e7c04614c8c3'," +
                                "                                                               'relationship-label': 'org.onap.relationships.inventory.Uses'," +
                                "                                                               'related-to-property': [" +
                                "                                                                       {" +
@@ -317,7 +317,7 @@ public class AAIResourceDmaapParserStrategyTestConstants {
                                "                               {" +
                                "                                       'related-to': 'vserver'," +
                                "                                       'relationship-label': 'tosca.relationships.HostedOn'," +
-                               "                                       'related-link': '/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/AAIAIC25/tenants/tenant/SERVERNAME%3A%3AXXXX-VMS/vservers/vserver/e77451f2-1c07-4db4-b92b-9907b840fc8f'," +
+                               "                                       'related-link': '/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/AAIAIC25/tenants/tenant/SERVERNAME%3A%3AXXXX-VMS/vservers/vserver/e77451f2-1c07-4db4-b92b-9907b840fc8f'," +
                                "                                       'relationship-data': [" +
                                "                                               {" +
                                "                                                       'relationship-key': 'cloud-region.cloud-owner'," +
@@ -355,7 +355,7 @@ public class AAIResourceDmaapParserStrategyTestConstants {
                        "               'severity': 'NORMAL'," +
                        "               'entity-type': 'generic-vnf'," +
                        "               'top-entity-type': 'generic-vnf'," +
-                       "               'entity-link': '/aai/v13/network/generic-vnfs/generic-vnf/cc1703a9-a63f-46c5-a6b1-7ff67f3a9848'," +
+                       "               'entity-link': '/aai/v14/network/generic-vnfs/generic-vnf/cc1703a9-a63f-46c5-a6b1-7ff67f3a9848'," +
                        "               'event-type': 'AAI-EVENT'," +
                        "               'domain': 'e2e1'," +
                        "               'action': 'UPDATE'," +
diff --git a/src/test/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/AAIResourceDmaapParserStrategyTest.java b/src/test/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/AAIResourceDmaapParserStrategyTest.java
new file mode 100644 (file)
index 0000000..5a87323
--- /dev/null
@@ -0,0 +1,360 @@
+/**
+ * ============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.cacher.injestion.parser.strategy.aai.dmaap;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import org.junit.Ignore;
+import org.junit.runner.RunWith;
+import org.onap.aai.cacher.injestion.parser.InjestionTestComponent;
+import org.onap.aai.cacher.injestion.parser.PayloadParserService;
+import org.onap.aai.cacher.model.CacheEntry;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.util.List;
+
+@Ignore("Due to rework tests from this class need to be moved/removed ")
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = InjestionTestComponent.class)
+public class AAIResourceDmaapParserStrategyTest {
+
+       @Autowired
+       private PayloadParserService parserService;
+
+       @Autowired
+       @Qualifier("aai-resource-dmaap")
+       private AAIResourceDmaapParserStrategy aaiResourceDmaapParserStrategy;
+
+       private JsonParser parser = new JsonParser();
+
+       private JsonObject pserverCreateEvent = parser.parse(
+                       new FileReader("./src/test/resources/test/payloads/dmaap-pserver-create.json")).getAsJsonObject();
+
+       public AAIResourceDmaapParserStrategyTest() throws FileNotFoundException {}
+
+       private void print(List<CacheEntry> result) {
+               Gson gson = new GsonBuilder().setPrettyPrinting().create();
+               result.forEach(e -> System.out.println("\n\nCollection: " + e.getCollection() +
+                               "\nKey: " + e.getId() +
+                               "\nFind: " + gson.toJson(e.getFindQuery()) +
+                               "\nNestedFind: " + gson.toJson(e.getNestedFind()) +
+                               "\nNestedField: " + e.getNestedField() +
+                               "\nNestedFieldIdentifier: " + gson.toJson(e.getNestedFieldIdentifierObj()) +
+                               "\nPayload: " + gson.toJson(e.getPayload())));
+       }
+
+//     @Test
+//     public void getEntityBodyChildTest() throws Exception {
+//             String uri = "/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/ams1b/tenants/tenant/52fd05137ab4453bb53084a13c7bb7a4/vservers/vserver/vs-id";
+//             String entityString =
+//                             "{" +
+//                             "       'tenants':" +
+//                             "       {" +
+//                             "               'tenant': [" +
+//                             "                       {" +
+//                             "                               'vservers':" +
+//                             "                               {" +
+//                             "                                       'vserver': [" +
+//                             "                                               {" +
+//                             "                                                       'in-maint': false," +
+//                             "                                                       'resource-version': '1525978690717'," +
+//                             "                                                       'vserver-name': 'slaa-regression-cr-id-api-server-449704329'," +
+//                             "                                                       'vserver-id': 'vs-id'" +
+//                             "                                               }" +
+//                             "                                       ]" +
+//                             "                               }," +
+//                             "                               'tenant-id': 'ten-id'," +
+//                             "                               'tenant-name': 'name'" +
+//                             "                       }" +
+//                             "               ]" +
+//                             "       }," +
+//                             "       'cloud-owner': 'cr-o'," +
+//                             "       'owner-defined-type': 'lcp'," +
+//                             "       'cloud-region-id': 'cr-id'" +
+//                             "}";
+//
+//             JsonObject entity = parser.parse(entityString).getAsJsonObject();
+//
+//             List<AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
+//
+//             JsonObject result = aaiResourceDmaapParserStrategy.getEntityBody(entity, segments);
+//
+//             JSONAssert.assertEquals(
+//                             new JSONObject(entity
+//                                             .getAsJsonObject("tenants").getAsJsonArray("tenant").get(0)     .getAsJsonObject()
+//                                             .getAsJsonObject("vservers").getAsJsonArray("vserver").get(0).getAsJsonObject()
+//                                             .toString()),
+//                             new JSONObject(result.toString()),
+//                             true);
+//
+//     }
+//
+//     @Test
+//     public void getEntityBodyTopTest() throws Exception {
+//             String uri = "/cloud-infrastructure/pservers/pserver/hn";
+//             String entityString = "{'hostname':'hn','in-maint':false,'resource-version':'1525801811662','pserver-id':'0A47B945-9C74-4CBE-AD72-0DECB966EB94'}";
+//
+//             JsonObject entity = parser.parse(entityString).getAsJsonObject();
+//
+//             List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
+//
+//             JsonObject result = aaiResourceDmaapParserStrategy.getEntityBody(entity, segments);
+//
+//             JSONAssert.assertEquals(
+//                             new JSONObject(entity.toString()),
+//                             new JSONObject(result.toString()),
+//                             true);
+//
+//     }
+//
+//     @Test
+//     public void getFindQueryTopTest() throws Exception {
+//             String uri = "/cloud-infrastructure/pservers/pserver/hn";
+//             JsonObject expected = parser.parse("{'_id':'/cloud-infrastructure/pservers/pserver/hn'," +
+//                             "'hostname':'hn'}").getAsJsonObject();
+//
+//             List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
+//             JsonObject findQuery = aaiResourceDmaapParserStrategy.getFindQuery(segments);
+//
+//             JSONAssert.assertEquals(
+//                             new JSONObject(expected.toString()),
+//                             new JSONObject(findQuery.toString()),
+//                             true);
+//     }
+//
+//     @Test
+//     public void getFindQueryOneLevelTest() throws Exception {
+//             String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1";
+//             JsonObject expected = parser.parse("{'_id':'/cloud-infrastructure/pservers/pserver/hn'," +
+//                             "'hostname':'hn'}").getAsJsonObject();
+//
+//             List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
+//             JsonObject findQuery = aaiResourceDmaapParserStrategy.getFindQuery(segments);
+//
+//             JSONAssert.assertEquals(
+//                             new JSONObject(expected.toString()),
+//                             new JSONObject(findQuery.toString()),
+//                             true);
+//     }
+//
+//     @Test
+//     public void getFindQueryTwoLevelTest() throws Exception {
+//             String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1/l-interfaces/l-interface/interface-2";
+//             JsonObject expected = parser.parse("{'_id':'/cloud-infrastructure/pservers/pserver/hn'," +
+//                             "'hostname':'hn'," +
+//                             "'p-interfaces.p-interface.interface-name':'interface-1'}").getAsJsonObject();
+//
+//             List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
+//             JsonObject findQuery = aaiResourceDmaapParserStrategy.getFindQuery(segments);
+//
+//             JSONAssert.assertEquals(
+//                             new JSONObject(expected.toString()),
+//                             new JSONObject(findQuery.toString()),
+//                             true);
+//     }
+//
+//     @Test
+//     public void getNestedFindQueryTopTest() throws Exception {
+//             String uri = "/cloud-infrastructure/pservers/pserver/hn";
+//             JsonObject expected = parser.parse("{'_id':'/cloud-infrastructure/pservers/pserver/hn'," +
+//                             "'hostname':'hn'}").getAsJsonObject();
+//
+//             List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
+//             JsonObject findQuery = aaiResourceDmaapParserStrategy.getNestedFindQuery(segments);
+//
+//             JSONAssert.assertEquals(
+//                             new JSONObject(expected.toString()),
+//                             new JSONObject(findQuery.toString()),
+//                             true);
+//     }
+//
+//     @Test
+//     public void getNestedFindQueryOneLevelTest() throws Exception {
+//             String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1";
+//             JsonObject expected = parser.parse("{'_id':'/cloud-infrastructure/pservers/pserver/hn'," +
+//                             "'hostname':'hn'," +
+//                             "'p-interfaces.p-interface.interface-name':'interface-1'}").getAsJsonObject();
+//
+//             List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
+//             JsonObject findQuery = aaiResourceDmaapParserStrategy.getNestedFindQuery(segments);
+//
+//             JSONAssert.assertEquals(
+//                             new JSONObject(expected.toString()),
+//                             new JSONObject(findQuery.toString()),
+//                             true);
+//     }
+//
+//     @Test
+//     public void getNestedFindQueryTwoLevelTest() throws Exception {
+//             String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1/l-interfaces/l-interface/interface-2";
+//             JsonObject expected = parser.parse("{'_id':'/cloud-infrastructure/pservers/pserver/hn'," +
+//                             "'hostname':'hn'," +
+//                             "'p-interfaces.p-interface.interface-name':'interface-1'," +
+//                             "'p-interfaces.p-interface.l-interfaces.l-interface.interface-name':'interface-2'}").getAsJsonObject();
+//
+//             List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
+//             JsonObject findQuery = aaiResourceDmaapParserStrategy.getNestedFindQuery(segments);
+//
+//             JSONAssert.assertEquals(
+//                             new JSONObject(expected.toString()),
+//                             new JSONObject(findQuery.toString()),
+//                             true);
+//     }
+//
+//     @Test
+//     public void getNestedFieldTopTest() throws Exception {
+//             String uri = "/cloud-infrastructure/pservers/pserver/hn";
+//             String expected = "";
+//
+//             List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
+//             String nestedField = aaiResourceDmaapParserStrategy.getNestedField(segments);
+//
+//             assertEquals("Top nested field", expected, nestedField);
+//     }
+//
+//     @Test
+//     public void getNestedFieldOneLevelTest() throws Exception {
+//             String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1";
+//             String expected = "p-interfaces.p-interface";
+//
+//             List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
+//             String nestedField = aaiResourceDmaapParserStrategy.getNestedField(segments);
+//
+//             assertEquals("Top nested field", expected, nestedField);
+//     }
+//
+//     @Test
+//     public void getNestedFieldTwoLevelTest() throws Exception {
+//             String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1/l-interfaces/l-interface/interface-2";
+//             String expected = "p-interfaces.p-interface.$.l-interfaces.l-interface";
+//
+//             List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
+//             String nestedField = aaiResourceDmaapParserStrategy.getNestedField(segments);
+//
+//             assertEquals("Top nested field", expected, nestedField);
+//     }
+//
+//     @Test
+//     public void getNestedFieldThreeLevelOddCaseTest() throws Exception {
+//             String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1/l-interfaces/l-interface/interface-2/l3-interface-ipv4-address-list/addressA";
+//             String expected = "p-interfaces.p-interface.$.l-interfaces.l-interface.$.l3-interface-ipv4-address-list";
+//
+//             List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
+//             String nestedField = aaiResourceDmaapParserStrategy.getNestedField(segments);
+//
+//             assertEquals("Top nested field", expected, nestedField);
+//     }
+//
+//
+//
+//
+//     @Test
+//     public void getNestedIdentifierTopTest() throws Exception {
+//             String uri = "/cloud-infrastructure/pservers/pserver/hn";
+//             JsonObject expected = parser.parse("{}").getAsJsonObject();
+//
+//             List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
+//             JsonObject nestedIdentifier = aaiResourceDmaapParserStrategy.getNestedIdentifier(segments);
+//
+//             JSONAssert.assertEquals(
+//                             new JSONObject(expected.toString()),
+//                             new JSONObject(nestedIdentifier.toString()),
+//                             true);
+//     }
+//
+//     @Test
+//     public void getNestedIdentifierOneLevelTest() throws Exception {
+//             String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1";
+//             JsonObject expected = parser.parse("{'interface-name':'interface-1'}").getAsJsonObject();
+//
+//             List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
+//             JsonObject nestedIdentifier = aaiResourceDmaapParserStrategy.getNestedIdentifier(segments);
+//
+//             JSONAssert.assertEquals(
+//                             new JSONObject(expected.toString()),
+//                             new JSONObject(nestedIdentifier.toString()),
+//                             true);
+//     }
+//
+//     @Test
+//     public void getNestedIdentifierTwoLevelTest() throws Exception {
+//             String uri = "/cloud-infrastructure/pservers/pserver/hn/p-interfaces/p-interface/interface-1/l-interfaces/l-interface/interface-2";
+//             JsonObject expected = parser.parse("{'interface-name':'interface-2'}").getAsJsonObject();
+//
+//             List<AAIResourceDmaapParserStrategy.AAIUriSegment> segments = aaiResourceDmaapParserStrategy.getAaiUriSegments(uri);
+//             JsonObject nestedIdentifier = aaiResourceDmaapParserStrategy.getNestedIdentifier(segments);
+//
+//             JSONAssert.assertEquals(
+//                             new JSONObject(expected.toString()),
+//                             new JSONObject(nestedIdentifier.toString()),
+//                             true);
+//     }
+//
+//
+//     @Test
+//     public void getFullUriPrefixTest() throws Exception {
+//             assertEquals("/aai/v12", aaiResourceDmaapParserStrategy.getFullUriPrefix("/aai/v12/network/pnfs/pnf/pnf-name-value/p-interfaces/p-interface/xe-10%2F3%2F2/l-interfaces/l-interface/l-interface-name"));
+//             assertEquals("/aai/v4", aaiResourceDmaapParserStrategy.getFullUriPrefix("/aai/v4/names"));
+//     }
+//
+//
+//     @Test
+//     public void fullUriToRelationshipObj() throws Exception {
+//             String fullUri = AAIResourceDmaapParserStrategyTestConstants.VSERVER_URI;
+//             String expectedRelObj = AAIResourceDmaapParserStrategyTestConstants.VSERVER_RELATIONSHIP_OBJ;
+//             JsonObject relObj = aaiResourceDmaapParserStrategy.fullUriToRelationshipObj(fullUri, "tosca.relationships.HostedOn");
+//
+//             JSONAssert.assertEquals(new JSONObject(expectedRelObj), new JSONObject(relObj.toString()), true);
+//     }
+//
+//     @Test
+//     public void verifyRelationshipEntriesOnUpdateTest() throws Exception {
+//             List<CacheEntry> result = aaiResourceDmaapParserStrategy
+//                             .process("TEST", parser.parse(AAIResourceDmaapParserStrategyTestConstants.GENERIC_VNF_EVENT_WITH_2_RELAT).getAsJsonObject());
+//
+//             assertEquals(3, result.size());
+//
+//     }
+//     @Test
+//     public void verifyRelationshipEntriesSimpleEvent() throws Exception {
+//             List<CacheEntry> result = aaiResourceDmaapParserStrategy
+//                             .process("TEST", parser.parse(AAIResourceDmaapParserStrategyTestConstants.GENERIC_VNF_EVENT).getAsJsonObject());
+//
+//             assertEquals(1, result.size());
+//
+//     }
+//
+//     @Test
+//     public void getFromRelationshipFullUriToRelationshipObjTest() throws Exception {
+//                             String entity = AAIResourceDmaapParserStrategyTestConstants.FULL_PSERVER;
+//                             String fullUri = AAIResourceDmaapParserStrategyTestConstants.FULL_PSERVER_URI;
+//                             MultiValueMap<String, AAIRelatedToDetails> result = aaiResourceDmaapParserStrategy.getFromRelationshipFullUriToRelationshipObj(parser.parse(entity).getAsJsonObject(), fullUri);
+//
+//                             assertEquals(3, result.size());
+//
+//     }
+}
\ No newline at end of file
index 19a3b3b..fb2baa2 100644 (file)
@@ -30,7 +30,7 @@ public class CacheKeyTest {
     public String inputGETOnInit = "{" +
             "'cacheKey': 'cloud-region'," +
             "'baseUrl': 'http://localhost:8447'," +
-            "'module': '/aai/v13/'," +
+            "'module': '/aai/v14/'," +
             "'URI': 'cloud-infrastructure/cloud-regions?depth=0&resultIndex=1&resultSize=3'," +
             "'timingIndicator': 'onInit'," +
             "'httpMethod': 'GET'}";
@@ -38,20 +38,20 @@ public class CacheKeyTest {
     public String inputGETFirstHitDefault = "{" +
             "'cacheKey': 'cloud-region'," +
             "'baseUrl': 'http://localhost:8447'," +
-            "'module': '/aai/v13/'," +
+            "'module': '/aai/v14/'," +
             "'URI': 'cloud-infrastructure/cloud-regions?depth=0&resultIndex=1&resultSize=3'}";
 
     public String inputGETScheduledDefault = "{" +
             "'cacheKey': 'cloud-region'," +
             "'baseUrl': 'http://localhost:8447'," +
-            "'module': '/aai/v13/'," +
+            "'module': '/aai/v14/'," +
             "'timingIndicator': 'scheduled'," +
             "'URI': 'cloud-infrastructure/cloud-regions?depth=0&resultIndex=1&resultSize=3'}";
 
     public String inputGETScheduledWithSyncInterval = "{" +
             "'cacheKey': 'cloud-region'," +
             "'baseUrl': 'http://localhost:8447'," +
-            "'module': '/aai/v13/'," +
+            "'module': '/aai/v14/'," +
             "'syncInterval': '2'," +
             "'timingIndicator': 'scheduled'," +
             "'URI': 'cloud-infrastructure/cloud-regions?depth=0&resultIndex=1&resultSize=3'}";
@@ -59,7 +59,7 @@ public class CacheKeyTest {
     public String inputGETScheduledWithSyncIntervalWithId = "{" +
             "'_id': 'cloud-region'," +
             "'baseUrl': 'http://localhost:8447'," +
-            "'module': '/aai/v13/'," +
+            "'module': '/aai/v14/'," +
             "'syncInterval': '2'," +
             "'timingIndicator': 'scheduled'," +
             "'URI': 'cloud-infrastructure/cloud-regions?depth=0&resultIndex=1&resultSize=3'}";
@@ -72,7 +72,7 @@ public class CacheKeyTest {
         CacheKey ck = CacheKey.fromJson(ckJson);
         assertEquals("cacheKey was incorrect", "cloud-region", ck.getCacheKey());
         assertEquals("baseUrl was incorrect", "http://localhost:8447", ck.getBaseUrl());
-        assertEquals("Module was incorrect", "/aai/v13/", ck.getModule());
+        assertEquals("Module was incorrect", "/aai/v14/", ck.getModule());
         assertEquals("URI was incorrect", "cloud-infrastructure/cloud-regions?depth=0&resultIndex=1&resultSize=3", ck.getURI());
         assertEquals("timingIndicator was incorrect", "onInit", ck.getTimingIndicator());
         assertEquals("Http Method was incorrect", "GET", ck.getHttpMethod());
@@ -89,7 +89,7 @@ public class CacheKeyTest {
         CacheKey ck = CacheKey.fromJson(ckJson);
         assertEquals("cacheKey was incorrect", "cloud-region", ck.getCacheKey());
         assertEquals("baseUrl was incorrect", "http://localhost:8447", ck.getBaseUrl());
-        assertEquals("Module was incorrect", "/aai/v13/", ck.getModule());
+        assertEquals("Module was incorrect", "/aai/v14/", ck.getModule());
         assertEquals("URI was incorrect", "cloud-infrastructure/cloud-regions?depth=0&resultIndex=1&resultSize=3", ck.getURI());
         assertEquals("timingIndicator was incorrect", "firstHit", ck.getTimingIndicator());
         assertEquals("Http Method was incorrect", "GET", ck.getHttpMethod());
@@ -123,7 +123,7 @@ public class CacheKeyTest {
         CacheKey ck = CacheKey.fromJson(ckJson);
         assertEquals("cacheKey was incorrect", "cloud-region", ck.getCacheKey());
         assertEquals("baseUrl was incorrect", "http://localhost:8447", ck.getBaseUrl());
-        assertEquals("Module was incorrect", "/aai/v13/", ck.getModule());
+        assertEquals("Module was incorrect", "/aai/v14/", ck.getModule());
         assertEquals("URI was incorrect", "cloud-infrastructure/cloud-regions?depth=0&resultIndex=1&resultSize=3", ck.getURI());
         assertEquals("timingIndicator was incorrect", "scheduled", ck.getTimingIndicator());
         assertEquals("Http Method was incorrect", "GET", ck.getHttpMethod());
@@ -140,7 +140,7 @@ public class CacheKeyTest {
         CacheKey ck = CacheKey.fromJson(ckJson);
         assertEquals("cacheKey was incorrect", "cloud-region", ck.getCacheKey());
         assertEquals("baseUrl was incorrect", "http://localhost:8447", ck.getBaseUrl());
-        assertEquals("Module was incorrect", "/aai/v13/", ck.getModule());
+        assertEquals("Module was incorrect", "/aai/v14/", ck.getModule());
         assertEquals("URI was incorrect", "cloud-infrastructure/cloud-regions?depth=0&resultIndex=1&resultSize=3", ck.getURI());
         assertEquals("timingIndicator was incorrect", "scheduled", ck.getTimingIndicator());
         assertEquals("Http Method was incorrect", "GET", ck.getHttpMethod());
@@ -157,7 +157,7 @@ public class CacheKeyTest {
         CacheKey ck = CacheKey.fromJson(ckJson);
         assertEquals("cacheKey was incorrect", "cloud-region", ck.getCacheKey());
         assertEquals("baseUrl was incorrect", "http://localhost:8447", ck.getBaseUrl());
-        assertEquals("Module was incorrect", "/aai/v13/", ck.getModule());
+        assertEquals("Module was incorrect", "/aai/v14/", ck.getModule());
         assertEquals("URI was incorrect", "cloud-infrastructure/cloud-regions?depth=0&resultIndex=1&resultSize=3", ck.getURI());
         assertEquals("timingIndicator was incorrect", "scheduled", ck.getTimingIndicator());
         assertEquals("Http Method was incorrect", "GET", ck.getHttpMethod());
index f4543ad..00beab6 100644 (file)
  */
 package org.onap.aai.cacher.service.helper;
 
+import com.github.fakemongo.Fongo;
 import com.mongodb.DB;
 import com.mongodb.MongoClient;
 import com.mongodb.client.MongoDatabase;
-import de.flapdoodle.embed.mongo.MongodExecutable;
 import de.flapdoodle.embed.mongo.MongodProcess;
-import de.flapdoodle.embed.mongo.MongodStarter;
-import de.flapdoodle.embed.mongo.config.IMongodConfig;
-import de.flapdoodle.embed.mongo.config.MongoCmdOptionsBuilder;
-import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
-import de.flapdoodle.embed.mongo.config.Net;
-import de.flapdoodle.embed.mongo.distribution.Version;
-import de.flapdoodle.embed.process.runtime.Network;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -49,6 +42,7 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
+import javax.ws.rs.core.Response;
 import java.io.IOException;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
@@ -56,9 +50,8 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
-import javax.ws.rs.core.Response;
-
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 @RunWith(SpringJUnit4ClassRunner.class)
 @Configuration
@@ -120,28 +113,9 @@ public class CacheHelperServiceScenariosTest {
 
        @BeforeClass
        public static void setup() throws IOException, InterruptedException {
-
-               String bindIp = "localhost";
-               int port = 27017;
-               startEmbedded(port);
-
-               mongoC = new MongoClient(bindIp, port);
-               mongoDb = mongoC.getDatabase(DB_NAME);
-               db = mongoC.getDB(DB_NAME);
-
-       }
-
-       protected static void startEmbedded(int port) throws IOException {
-               IMongodConfig mongoConfigConfig = new MongodConfigBuilder()
-                               .version(Version.Main.PRODUCTION)
-                               .net(new Net(port, Network.localhostIsIPv6()))
-                               .cmdOptions(new MongoCmdOptionsBuilder().verbose(true).build())
-                               .configServer(false)
-                               .build();
-
-               MongodExecutable mongodExecutable = MongodStarter.getDefaultInstance().prepare(mongoConfigConfig);
-
-               mongod = mongodExecutable.start();
+               Fongo fongo = new Fongo(DB_NAME);
+               mongoDb = fongo.getDatabase(DB_NAME);
+               db = fongo.getDB(DB_NAME);
        }
 
        @AfterClass
@@ -203,7 +177,7 @@ public class CacheHelperServiceScenariosTest {
         cacheHelperService.updateCacheKey(retrieveCk);
 
         resp = cacheHelperService.forceSync(retrieveCk);
-        assertEquals("forceSync", 500, resp.getStatus());
+        assertEquals("forceSync", 400, resp.getStatus());
         retrieveCk.lastSyncStartTime = syncStartTime;
         retrieveCk.lastSyncEndTime = syncEndTime;
         assertTrue("isShouldTrigger2", cacheHelperService.isShouldTrigger(retrieveCk));
@@ -229,4 +203,12 @@ public class CacheHelperServiceScenariosTest {
                assertEquals("buildExceptionResponse", 500, resp.getStatus());
                
        }
+    
+    @Test
+    public void buildMissingFieldResponseTest() throws Exception {
+        List<String> issueList = Arrays.asList("First Field", "Second Field");
+        Response resp = cacheHelperService.buildMissingFieldResponse(issueList);
+        assertEquals("buildMissingFieldResponse", 400, resp.getStatus());
+        
+    }  
 }
index 53f90a3..047ca05 100644 (file)
@@ -25,6 +25,7 @@ import org.junit.Test;
 import org.mockito.Mockito;
 import org.onap.aai.cacher.service.helper.CacheHelperService;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import static org.junit.Assert.assertEquals;
@@ -86,5 +87,14 @@ public class CacheKeyRequestValidationTest {
        Mockito.when(cacheHelperService.isKeyPresent(Mockito.any(), Mockito.anyString())).thenReturn(true);
        List<String> results = updateCacheKeyRequestValidation.validateCacheKeyRequest(parser.parse(nonEmptyPayload).getAsJsonObject(), cacheHelperService);
        assertEquals("update existing CacheKey ok", 0, results.size());
-    }   
+    }
+    
+    @Test
+    public void testAddNewCacheKeyMissingFields() {
+        List<String> results = addCacheKeyRequestValidation.checkMissingRequiredFields(parser.parse(nonEmptyPayload).getAsJsonObject(), cacheHelperService);
+        List<String> exp = new ArrayList<String>();
+        exp.add("baseUrl");
+        exp.add("URI");
+        assertEquals("missing rqd fields", exp, results);
+    }
 }
index b2ea6b8..f8835f3 100644 (file)
@@ -4,14 +4,14 @@
     "severity": "NORMAL",
     "entity-type": "l3-interface-ipv4-address-list",
     "top-entity-type": "generic-vnf",
-    "entity-link": "/aai/v13/network/generic-vnfs/generic-vnf/generic-vnf-987654321-39-jenkins/l-interfaces/l-interface/interface-name-generic-vnf-987654321-39-jenkins/vlans/vlan/vlan-interface-generic-vnf-987654321-39-jenkins/l3-interface-ipv4-address-list/l3-interface-ipv4-address-generic-vnf-987654321-39-jenkins",
+    "entity-link": "/aai/v14/network/generic-vnfs/generic-vnf/generic-vnf-987654321-39-jenkins/l-interfaces/l-interface/interface-name-generic-vnf-987654321-39-jenkins/vlans/vlan/vlan-interface-generic-vnf-987654321-39-jenkins/l3-interface-ipv4-address-list/l3-interface-ipv4-address-generic-vnf-987654321-39-jenkins",
     "event-type": "AAI-EVENT",
     "domain": "uINT1",
     "action": "DELETE",
     "sequence-number": "0",
     "id": "7a899562-a0c1-414e-83aa-0021a5c7646b",
     "source-name": "FitNesse-Test-generic-vnf-AAI-9278-02",
-    "version": "v13",
+    "version": "v14",
     "timestamp": "20180625-00:05:26:664"
   },
   "entity": {
diff --git a/src/test/resources/test/payloads/dmaapEvents/allotted-resource.json b/src/test/resources/test/payloads/dmaapEvents/allotted-resource.json
new file mode 100644 (file)
index 0000000..19b12e3
--- /dev/null
@@ -0,0 +1,53 @@
+{
+    "cambria.partition": "AAI",
+    "event-header": {
+        "severity": "NORMAL",
+        "entity-type": "allotted-resource",
+        "top-entity-type": "customer",
+        "entity-link": "/aai/v15/business/customers/customer/customer-12083-jenkins/service-subscriptions/service-subscription/HOSTED-COMMUNICATIONS/service-instances/service-instance/servInstance-12083-jenkins/allotted-resources/allotted-resource/vfModule2-12083-jenkins/",
+        "event-type": "AAI-EVENT",
+        "domain": "uINT5",
+        "action": "UPDATE",
+        "sequence-number": "0",
+        "id": "070f11ad-751e-43ba-a393-fd3380aba19e",
+        "source-name": "FitNesse-Test-jenkins",
+        "version": "v15",
+        "timestamp": "20190115-07:42:54:258"
+    },
+    "entity": {
+        "global-customer-id": "customer-12083-jenkins",
+        "service-subscriptions": {
+            "service-subscription": [{
+                "service-type": "HOSTED-COMMUNICATIONS",
+                "service-instances": {
+                    "service-instance": [{
+                        "service-instance-id": "servInstance-12083-jenkins",
+                        "allotted-resources": {
+                            "allotted-resource": [{
+                                "selflink": "selflink-12083",
+                                "relationship-list": {
+                                    "relationship": [{
+                                        "related-to": "configuration",
+                                        "relationship-data": [{
+                                            "relationship-value": "config-12083-jenkins",
+                                            "relationship-key": "configuration.configuration-id"
+                                        }],
+                                        "related-link": "/aai/v15/network/configurations/configuration/config-12083-jenkins",
+                                        "relationship-label": "org.onap.relationships.inventory.Uses"
+                                    }]
+                                },
+                                "role": "role-12083",
+                                "resource-version": "1547538174222",
+                                "description": "description-12083",
+                                "operational-status": "operational-status-12083",
+                                "id": "vfModule2-12083-jenkins",
+                                "type": "type-12083",
+                                "orchestration-status": "orchestration-status-12083"
+                            }]
+                        }
+                    }]
+                }
+            }]
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/test/resources/test/payloads/dmaapEvents/create-generic-vnf-with-children-update-generic-vnf-property.json b/src/test/resources/test/payloads/dmaapEvents/create-generic-vnf-with-children-update-generic-vnf-property.json
new file mode 100644 (file)
index 0000000..299bd46
--- /dev/null
@@ -0,0 +1,710 @@
+{
+  "create-generic-vnf": {
+    "cambria.partition": "AAI",
+    "event-header": {
+      "severity": "NORMAL",
+      "entity-type": "generic-vnf",
+      "top-entity-type": "generic-vnf",
+      "entity-link": "/aai/v14/network/generic-vnfs/generic-vnf/generic-vnf-987654321-9-cleanup-later-PS2418",
+      "event-type": "AAI-EVENT",
+      "domain": "uINT4",
+      "action": "CREATE",
+      "sequence-number": "0",
+      "id": "034bcf6a-3d1c-4083-932e-368c1b9d7095",
+      "source-name": "FitNesse-Test-PS2418",
+      "version": "v14",
+      "timestamp": "20180925-14:20:58:309"
+    },
+    "entity": {
+      "entitlements": {
+        "entitlement": [{
+          "resource-version": "1537885258241",
+          "group-uuid": "entitlement-group-uuid-generic-vnf-987654321-9-cleanup-later-PS2418",
+          "resource-uuid": "example-resource-uuid-val-23438"
+        }
+        ]
+      },
+      "service-id": "example-service-id-val-86237",
+      "vnf-id": "generic-vnf-987654321-9-cleanup-later-PS2418",
+      "nf-type": "example-nf-type-val-6894",
+      "l-interfaces": {
+        "l-interface": [{
+          "v6-wan-link-ip": "example-v6-wan-link-ip-val-89762",
+          "vlans": {
+            "vlan": [{
+              "vlan-description": "example-vlan-description-val-78275",
+              "vpn-key": "example-vpn-key-val-72775",
+              "prov-status": "example-prov-status-val-22546",
+              "vlan-id-inner": 99053100,
+              "vlan-id-outer": 78357943,
+              "orchestration-status": "example-orchestration-status-val-68023",
+              "speed-value": "example-speed-value-val-80431",
+              "in-maint": true,
+              "l3-interface-ipv6-address-list": [{
+                "resource-version": "1537885258053",
+                "neutron-network-id": "example-neutron-network-id-val-3701",
+                "neutron-subnet-id": "example-neutron-subnet-id-val-10882",
+                "l3-interface-ipv6-prefix-length": 59706574,
+                "vlan-id-inner": 15251621,
+                "is-floating": true,
+                "l3-interface-ipv6-address": "l3-interface-ipv6-address-1-generic-vnf-987654321-9-cleanup-later-PS2418",
+                "vlan-id-outer": 53340121
+              }
+              ],
+              "resource-version": "1537885258033",
+              "is-ip-unnumbered": true,
+              "speed-units": "example-speed-units-val-39623",
+              "vlan-interface": "vlan-interface-1-generic-vnf-987654321-9-cleanup-later-PS2418",
+              "backdoor-connection": "example-backdoor-connection-val-37365",
+              "l3-interface-ipv4-address-list": [{
+                "l3-interface-ipv4-prefix-length": 66218823,
+                "resource-version": "1537885258043",
+                "neutron-network-id": "example-neutron-network-id-val-88451",
+                "neutron-subnet-id": "example-neutron-subnet-id-val-46196",
+                "vlan-id-inner": 15889692,
+                "l3-interface-ipv4-address": "l3-interface-ipv4-address-1-generic-vnf-987654321-9-cleanup-later-PS2418",
+                "is-floating": true,
+                "vlan-id-outer": 74465804
+              }
+              ]
+            }
+            ]
+          },
+          "l-interfaces": {
+            "l-interface": [{
+              "v6-wan-link-ip": "example-v6-wan-link-ip-val-69650",
+              "interface-name": "interface-name-2-generic-vnf-987654321-9-cleanup-later-PS2418",
+              "allowed-address-pairs": "example-allowed-address-pairs-val-68306",
+              "prov-status": "example-prov-status-val-69853",
+              "macaddr": "example-macaddr-val-34300",
+              "interface-role": "example-interface-role-val-41338",
+              "selflink": "example-selflink-val-22090",
+              "in-maint": true,
+              "admin-status": "example-admin-status-val-98172",
+              "is-port-mirrored": true,
+              "resource-version": "1537885258078",
+              "is-ip-unnumbered": true,
+              "network-name": "example-network-name-val-33414",
+              "management-option": "example-management-option-val-72200",
+              "interface-id": "example-interface-id-val-92751",
+              "interface-description": "example-interface-description-val-86621"
+            }
+            ]
+          },
+          "interface-name": "interface-name-1-generic-vnf-987654321-9-cleanup-later-PS2418",
+          "allowed-address-pairs": "example-allowed-address-pairs-val-88303",
+          "prov-status": "example-prov-status-val-30354",
+          "macaddr": "example-macaddr-val-74995",
+          "interface-role": "example-interface-role-val-62829",
+          "selflink": "example-selflink-val-34970",
+          "in-maint": true,
+          "admin-status": "example-admin-status-val-4462",
+          "l3-interface-ipv6-address-list": [{
+            "resource-version": "1537885258101",
+            "neutron-network-id": "example-neutron-network-id-val-32443",
+            "neutron-subnet-id": "example-neutron-subnet-id-val-40815",
+            "l3-interface-ipv6-prefix-length": 19424600,
+            "vlan-id-inner": 92534837,
+            "is-floating": true,
+            "l3-interface-ipv6-address": "l3-interface-ipv6-address-2-generic-vnf-987654321-9-cleanup-later-PS2418",
+            "vlan-id-outer": 78261005
+          }
+          ],
+          "is-port-mirrored": true,
+          "resource-version": "1537885258026",
+          "is-ip-unnumbered": true,
+          "sriov-vfs": {
+            "sriov-vf": [{
+              "vf-vlan-filter": "example-vf-vlan-filter-val-47642",
+              "vf-vlan-strip": true,
+              "neutron-network-id": "example-neutron-network-id-val-78281",
+              "vf-broadcast-allow": true,
+              "vf-mac-anti-spoof-check": true,
+              "vf-unknown-multicast-allow": true,
+              "pci-id": "pci-id-1-generic-vnf-987654321-9-cleanup-later-PS2418",
+              "vf-mirrors": "example-vf-mirrors-val-98879",
+              "resource-version": "1537885258066",
+              "vf-link-status": "example-vf-link-status-val-51961",
+              "vf-mac-filter": "example-vf-mac-filter-val-75865",
+              "vf-insert-stag": true,
+              "vf-vlan-anti-spoof-check": true,
+              "vf-unknown-unicast-allow": true
+            }
+            ]
+          },
+          "network-name": "example-network-name-val-78237",
+          "management-option": "example-management-option-val-79362",
+          "interface-id": "example-interface-id-val-4824",
+          "interface-description": "example-interface-description-val-37355",
+          "l3-interface-ipv4-address-list": [{
+            "l3-interface-ipv4-prefix-length": 10115565,
+            "resource-version": "1537885258089",
+            "neutron-network-id": "example-neutron-network-id-val-77940",
+            "neutron-subnet-id": "example-neutron-subnet-id-val-24000",
+            "vlan-id-inner": 23368411,
+            "l3-interface-ipv4-address": "l3-interface-ipv4-address-2-generic-vnf-987654321-9-cleanup-later-PS2418",
+            "is-floating": true,
+            "vlan-id-outer": 32534763
+          }
+          ]
+        }
+        ]
+      },
+      "license-assignment-group-uuid": "example-license-assignment-group-uuid-val-60560",
+      "ipv4-loopback0-address": "example-ipv4-loopback0-address-val-37789",
+      "vnf-type": "example-vnf-type-val-46131",
+      "vlan-id-outer": 64688648,
+      "nf-function": "example-nf-function-val-27812",
+      "nm-profile-name": "example-nm-profile-name-val-6359",
+      "vmemory": 60496544,
+      "mso-catalog-key": "example-mso-catalog-key-val-35618",
+      "ipv4-oam-gateway-address": "example-ipv4-oam-gateway-address-val-18049",
+      "as-number": "example-as-number-val-65840",
+      "vmemory-units": "example-vmemory-units-val-98278",
+      "vnf-name2": "example-vnf-name2-val-8575",
+      "vcpu-units": "example-vcpu-units-val-32161",
+      "prov-status": "example-prov-status-val-99438",
+      "equipment-role": "example-equipment-role-val-75743",
+      "ipv4-oam-address": "example-ipv4-oam-address-val-14031",
+      "vf-modules": {
+        "vf-module": [{
+          "vf-module-name": "example-vf-module-name-val-34236",
+          "selflink": "example-selflink-val-53032",
+          "contrail-service-instance-fqdn": "example-contrail-service-instance-fqdn-val-9525",
+          "heat-stack-id": "example-heat-stack-id-val-30553",
+          "resource-version": "1537885258217",
+          "is-base-vf-module": true,
+          "vf-module-id": "vf-module-id-generic-vnf-987654321-9-cleanup-later-PS2418",
+          "module-index": 511,
+          "orchestration-status": "example-orchestration-status-val-56709",
+          "automated-assignment": true
+        }
+        ]
+      },
+      "vnf-name": "example-vnf-name-val-45282",
+      "vdisk": 42236577,
+      "nf-role": "example-nf-role-val-66079",
+      "ipv4-oam-gateway-address-prefix-length": 54487,
+      "vcpu": 53671028,
+      "entitlement-assignment-group-uuid": "example-entitlement-assignment-group-uuid-val-15128",
+      "regional-resource-zone": "example-regional-resource-zone-val-73874",
+      "management-v6-address": "example-management-v6-address-val-25900",
+      "operational-status": "example-operational-status-val-17036",
+      "vdisk-units": "example-vdisk-units-val-96988",
+      "entitlement-resource-uuid": "example-entitlement-resource-uuid-val-20774",
+      "orchestration-status": "example-orchestration-status-val-19396",
+      "nf-naming-code": "example-nf-naming-code-val-92256",
+      "selflink": "example-selflink-val-44462",
+      "heat-stack-id": "example-heat-stack-id-val-37828",
+      "license-key-uuid": "example-license-key-uuid-val-66274",
+      "license-key": "example-license-key-val-66815",
+      "lag-interfaces": {
+        "lag-interface": [{
+          "interface-role": "example-interface-role-val-83678",
+          "speed-value": "example-speed-value-val-38117",
+          "in-maint": true,
+          "resource-version": "1537885258117",
+          "l-interfaces": {
+            "l-interface": [{
+              "v6-wan-link-ip": "example-v6-wan-link-ip-val-56250",
+              "vlans": {
+                "vlan": [{
+                  "vlan-description": "example-vlan-description-val-47496",
+                  "vpn-key": "example-vpn-key-val-38828",
+                  "prov-status": "example-prov-status-val-99970",
+                  "vlan-id-inner": 89782443,
+                  "vlan-id-outer": 92728211,
+                  "orchestration-status": "example-orchestration-status-val-65649",
+                  "speed-value": "example-speed-value-val-87106",
+                  "in-maint": true,
+                  "l3-interface-ipv6-address-list": [{
+                    "resource-version": "1537885258152",
+                    "neutron-network-id": "example-neutron-network-id-val-73096",
+                    "neutron-subnet-id": "example-neutron-subnet-id-val-80915",
+                    "l3-interface-ipv6-prefix-length": 54785197,
+                    "vlan-id-inner": 25109147,
+                    "is-floating": true,
+                    "l3-interface-ipv6-address": "l3-interface-ipv6-address-3-generic-vnf-987654321-9-cleanup-later-PS2418",
+                    "vlan-id-outer": 79074706
+                  }
+                  ],
+                  "resource-version": "1537885258133",
+                  "is-ip-unnumbered": true,
+                  "speed-units": "example-speed-units-val-43767",
+                  "vlan-interface": "vlan-interface-2-generic-vnf-987654321-9-cleanup-later-PS2418",
+                  "backdoor-connection": "example-backdoor-connection-val-42851",
+                  "l3-interface-ipv4-address-list": [{
+                    "l3-interface-ipv4-prefix-length": 95616468,
+                    "resource-version": "1537885258142",
+                    "neutron-network-id": "example-neutron-network-id-val-60156",
+                    "neutron-subnet-id": "example-neutron-subnet-id-val-25666",
+                    "vlan-id-inner": 14957493,
+                    "l3-interface-ipv4-address": "l3-interface-ipv4-address-3-generic-vnf-987654321-9-cleanup-later-PS2418",
+                    "is-floating": true,
+                    "vlan-id-outer": 96248912
+                  }
+                  ]
+                }
+                ]
+              },
+              "l-interfaces": {
+                "l-interface": [{
+                  "v6-wan-link-ip": "example-v6-wan-link-ip-val-60751",
+                  "interface-name": "interface-name-5-generic-vnf-987654321-9-cleanup-later-PS2418",
+                  "allowed-address-pairs": "example-allowed-address-pairs-val-66261",
+                  "prov-status": "example-prov-status-val-79263",
+                  "macaddr": "example-macaddr-val-54377",
+                  "interface-role": "example-interface-role-val-57457",
+                  "selflink": "example-selflink-val-7547",
+                  "in-maint": true,
+                  "admin-status": "example-admin-status-val-99281",
+                  "is-port-mirrored": true,
+                  "resource-version": "1537885258177",
+                  "is-ip-unnumbered": true,
+                  "network-name": "example-network-name-val-53451",
+                  "management-option": "example-management-option-val-31869",
+                  "interface-id": "example-interface-id-val-21202",
+                  "interface-description": "example-interface-description-val-62128"
+                }
+                ]
+              },
+              "interface-name": "interface-name-4-generic-vnf-987654321-9-cleanup-later-PS2418",
+              "allowed-address-pairs": "example-allowed-address-pairs-val-67284",
+              "prov-status": "example-prov-status-val-41209",
+              "macaddr": "example-macaddr-val-27005",
+              "interface-role": "example-interface-role-val-28263",
+              "selflink": "example-selflink-val-41633",
+              "in-maint": true,
+              "admin-status": "example-admin-status-val-66518",
+              "l3-interface-ipv6-address-list": [{
+                "resource-version": "1537885258199",
+                "neutron-network-id": "example-neutron-network-id-val-62532",
+                "neutron-subnet-id": "example-neutron-subnet-id-val-98579",
+                "l3-interface-ipv6-prefix-length": 12026525,
+                "vlan-id-inner": 43455241,
+                "is-floating": true,
+                "l3-interface-ipv6-address": "l3-interface-ipv6-address-4-generic-vnf-987654321-9-cleanup-later-PS2418",
+                "vlan-id-outer": 25084087
+              }
+              ],
+              "is-port-mirrored": true,
+              "resource-version": "1537885258127",
+              "is-ip-unnumbered": true,
+              "sriov-vfs": {
+                "sriov-vf": [{
+                  "vf-vlan-filter": "example-vf-vlan-filter-val-18397",
+                  "vf-vlan-strip": true,
+                  "neutron-network-id": "example-neutron-network-id-val-15801",
+                  "vf-broadcast-allow": true,
+                  "vf-mac-anti-spoof-check": true,
+                  "vf-unknown-multicast-allow": true,
+                  "pci-id": "pci-id-2-generic-vnf-987654321-9-cleanup-later-PS2418",
+                  "vf-mirrors": "example-vf-mirrors-val-361",
+                  "resource-version": "1537885258167",
+                  "vf-link-status": "example-vf-link-status-val-32153",
+                  "vf-mac-filter": "example-vf-mac-filter-val-17599",
+                  "vf-insert-stag": true,
+                  "vf-vlan-anti-spoof-check": true,
+                  "vf-unknown-unicast-allow": true
+                }
+                ]
+              },
+              "network-name": "example-network-name-val-38641",
+              "management-option": "example-management-option-val-84248",
+              "interface-id": "example-interface-id-val-45628",
+              "interface-description": "example-interface-description-val-88021",
+              "l3-interface-ipv4-address-list": [{
+                "l3-interface-ipv4-prefix-length": 77529761,
+                "resource-version": "1537885258187",
+                "neutron-network-id": "example-neutron-network-id-val-58736",
+                "neutron-subnet-id": "example-neutron-subnet-id-val-42120",
+                "vlan-id-inner": 60074034,
+                "l3-interface-ipv4-address": "l3-interface-ipv4-address-4-generic-vnf-987654321-9-cleanup-later-PS2418",
+                "is-floating": true,
+                "vlan-id-outer": 97685113
+              }
+              ]
+            }
+            ]
+          },
+          "interface-name": "interface-name-3-generic-vnf-987654321-9-cleanup-later-PS2418",
+          "speed-units": "example-speed-units-val-67991",
+          "prov-status": "example-prov-status-val-33056",
+          "interface-description": "example-interface-description-val-473",
+          "interface-id": "example-interface-id-val-12642"
+        }
+        ]
+      },
+      "summary-status": "example-summary-status-val-6834",
+      "encrypted-access-flag": true,
+      "licenses": {
+        "license": [{
+          "resource-version": "1537885258229",
+          "group-uuid": "license-group-uuid-generic-vnf-987654321-9-cleanup-later-PS2418",
+          "resource-uuid": "example-resource-uuid-val-55651"
+        }
+        ]
+      },
+      "in-maint": true,
+      "nm-lan-v6-address": "example-nm-lan-v6-address-val-1909",
+      "resource-version": "1537885258008",
+      "regional-resource-subzone": "example-regional-resource-subzone-val-57379",
+      "management-option": "example-management-option-val-43163",
+      "is-closed-loop-disabled": true
+    }
+  },
+  "update-generic-vnf": {
+    "cambria.partition": "AAI",
+    "event-header": {
+      "severity": "NORMAL",
+      "entity-type": "generic-vnf",
+      "top-entity-type": "generic-vnf",
+      "entity-link": "/aai/v14/network/generic-vnfs/generic-vnf/generic-vnf-987654321-9-cleanup-later-PS2418",
+      "event-type": "AAI-EVENT",
+      "domain": "uINT4",
+      "action": "UPDATE",
+      "sequence-number": "0",
+      "id": "a1c98b90-7592-43ee-a68b-918201a0666b",
+      "source-name": "FitNesse-Relationship-Test-PS2418",
+      "version": "v14",
+      "timestamp": "20180925-14:20:59:170"
+    },
+    "entity": {
+      "entitlements": {
+        "entitlement": [{
+          "resource-version": "1537885258241",
+          "group-uuid": "entitlement-group-uuid-generic-vnf-987654321-9-cleanup-later-PS2418",
+          "resource-uuid": "example-resource-uuid-val-23438"
+        }
+        ]
+      },
+      "service-id": "example-service-id-val-86237",
+      "vnf-id": "generic-vnf-987654321-9-cleanup-later-PS2418",
+      "nf-type": "example-nf-type-val-6894",
+      "l-interfaces": {
+        "l-interface": [{
+          "v6-wan-link-ip": "example-v6-wan-link-ip-val-89762",
+          "vlans": {
+            "vlan": [{
+              "vlan-description": "example-vlan-description-val-78275",
+              "vpn-key": "example-vpn-key-val-72775",
+              "prov-status": "example-prov-status-val-22546",
+              "vlan-id-inner": 99053100,
+              "vlan-id-outer": 78357943,
+              "orchestration-status": "example-orchestration-status-val-68023",
+              "speed-value": "example-speed-value-val-80431",
+              "in-maint": true,
+              "l3-interface-ipv6-address-list": [{
+                "resource-version": "1537885258053",
+                "neutron-network-id": "example-neutron-network-id-val-3701",
+                "neutron-subnet-id": "example-neutron-subnet-id-val-10882",
+                "l3-interface-ipv6-prefix-length": 59706574,
+                "vlan-id-inner": 15251621,
+                "is-floating": true,
+                "l3-interface-ipv6-address": "l3-interface-ipv6-address-1-generic-vnf-987654321-9-cleanup-later-PS2418",
+                "vlan-id-outer": 53340121
+              }
+              ],
+              "resource-version": "1537885258033",
+              "is-ip-unnumbered": true,
+              "speed-units": "example-speed-units-val-39623",
+              "vlan-interface": "vlan-interface-1-generic-vnf-987654321-9-cleanup-later-PS2418",
+              "backdoor-connection": "example-backdoor-connection-val-37365",
+              "l3-interface-ipv4-address-list": [{
+                "l3-interface-ipv4-prefix-length": 66218823,
+                "resource-version": "1537885258043",
+                "neutron-network-id": "example-neutron-network-id-val-88451",
+                "neutron-subnet-id": "example-neutron-subnet-id-val-46196",
+                "vlan-id-inner": 15889692,
+                "l3-interface-ipv4-address": "l3-interface-ipv4-address-1-generic-vnf-987654321-9-cleanup-later-PS2418",
+                "is-floating": true,
+                "vlan-id-outer": 74465804
+              }
+              ]
+            }
+            ]
+          },
+          "l-interfaces": {
+            "l-interface": [{
+              "v6-wan-link-ip": "example-v6-wan-link-ip-val-69650",
+              "interface-name": "interface-name-2-generic-vnf-987654321-9-cleanup-later-PS2418",
+              "allowed-address-pairs": "example-allowed-address-pairs-val-68306",
+              "prov-status": "example-prov-status-val-69853",
+              "macaddr": "example-macaddr-val-34300",
+              "interface-role": "example-interface-role-val-41338",
+              "selflink": "example-selflink-val-22090",
+              "in-maint": true,
+              "admin-status": "example-admin-status-val-98172",
+              "is-port-mirrored": true,
+              "resource-version": "1537885258078",
+              "is-ip-unnumbered": true,
+              "network-name": "example-network-name-val-33414",
+              "management-option": "example-management-option-val-72200",
+              "interface-id": "example-interface-id-val-92751",
+              "interface-description": "example-interface-description-val-86621"
+            }
+            ]
+          },
+          "interface-name": "interface-name-1-generic-vnf-987654321-9-cleanup-later-PS2418",
+          "allowed-address-pairs": "example-allowed-address-pairs-val-88303",
+          "prov-status": "example-prov-status-val-30354",
+          "macaddr": "example-macaddr-val-74995",
+          "interface-role": "example-interface-role-val-62829",
+          "selflink": "example-selflink-val-34970",
+          "in-maint": true,
+          "admin-status": "example-admin-status-val-4462",
+          "l3-interface-ipv6-address-list": [{
+            "resource-version": "1537885258101",
+            "neutron-network-id": "example-neutron-network-id-val-32443",
+            "neutron-subnet-id": "example-neutron-subnet-id-val-40815",
+            "l3-interface-ipv6-prefix-length": 19424600,
+            "vlan-id-inner": 92534837,
+            "is-floating": true,
+            "l3-interface-ipv6-address": "l3-interface-ipv6-address-2-generic-vnf-987654321-9-cleanup-later-PS2418",
+            "vlan-id-outer": 78261005
+          }
+          ],
+          "is-port-mirrored": true,
+          "resource-version": "1537885258026",
+          "is-ip-unnumbered": true,
+          "sriov-vfs": {
+            "sriov-vf": [{
+              "vf-vlan-filter": "example-vf-vlan-filter-val-47642",
+              "vf-vlan-strip": true,
+              "neutron-network-id": "example-neutron-network-id-val-78281",
+              "vf-broadcast-allow": true,
+              "vf-mac-anti-spoof-check": true,
+              "vf-unknown-multicast-allow": true,
+              "pci-id": "pci-id-1-generic-vnf-987654321-9-cleanup-later-PS2418",
+              "vf-mirrors": "example-vf-mirrors-val-98879",
+              "resource-version": "1537885258066",
+              "vf-link-status": "example-vf-link-status-val-51961",
+              "vf-mac-filter": "example-vf-mac-filter-val-75865",
+              "vf-insert-stag": true,
+              "vf-vlan-anti-spoof-check": true,
+              "vf-unknown-unicast-allow": true
+            }
+            ]
+          },
+          "network-name": "example-network-name-val-78237",
+          "management-option": "example-management-option-val-79362",
+          "interface-id": "example-interface-id-val-4824",
+          "interface-description": "example-interface-description-val-37355",
+          "l3-interface-ipv4-address-list": [{
+            "l3-interface-ipv4-prefix-length": 10115565,
+            "resource-version": "1537885258089",
+            "neutron-network-id": "example-neutron-network-id-val-77940",
+            "neutron-subnet-id": "example-neutron-subnet-id-val-24000",
+            "vlan-id-inner": 23368411,
+            "l3-interface-ipv4-address": "l3-interface-ipv4-address-2-generic-vnf-987654321-9-cleanup-later-PS2418",
+            "is-floating": true,
+            "vlan-id-outer": 32534763
+          }
+          ]
+        }
+        ]
+      },
+      "license-assignment-group-uuid": "example-license-assignment-group-uuid-val-60560",
+      "ipv4-loopback0-address": "example-ipv4-loopback0-address-val-37789",
+      "vnf-type": "example-vnf-type-val-46131-generic-vnf-987654321-9-cleanup-later-PS2418-patched",
+      "vlan-id-outer": 64688648,
+      "nf-function": "example-nf-function-val-27812",
+      "nm-profile-name": "example-nm-profile-name-val-6359",
+      "vmemory": 60496544,
+      "mso-catalog-key": "example-mso-catalog-key-val-35618",
+      "ipv4-oam-gateway-address": "example-ipv4-oam-gateway-address-val-18049",
+      "as-number": "example-as-number-val-65840",
+      "vmemory-units": "example-vmemory-units-val-98278",
+      "vnf-name2": "example-vnf-name2-val-8575-generic-vnf-987654321-9-cleanup-later-PS2418-patched",
+      "vcpu-units": "example-vcpu-units-val-32161",
+      "prov-status": "example-prov-status-val-99438",
+      "equipment-role": "example-equipment-role-val-75743",
+      "ipv4-oam-address": "example-ipv4-oam-address-val-14031",
+      "vf-modules": {
+        "vf-module": [{
+          "vf-module-name": "example-vf-module-name-val-34236",
+          "selflink": "example-selflink-val-53032",
+          "contrail-service-instance-fqdn": "example-contrail-service-instance-fqdn-val-9525",
+          "heat-stack-id": "example-heat-stack-id-val-30553",
+          "resource-version": "1537885258217",
+          "is-base-vf-module": true,
+          "vf-module-id": "vf-module-id-generic-vnf-987654321-9-cleanup-later-PS2418",
+          "module-index": 511,
+          "orchestration-status": "example-orchestration-status-val-56709",
+          "automated-assignment": true
+        }
+        ]
+      },
+      "vnf-name": "example-vnf-name-val-45282-generic-vnf-987654321-9-cleanup-later-PS2418-patched",
+      "vdisk": 42236577,
+      "nf-role": "example-nf-role-val-66079",
+      "ipv4-oam-gateway-address-prefix-length": 54487,
+      "vcpu": 53671028,
+      "entitlement-assignment-group-uuid": "example-entitlement-assignment-group-uuid-val-15128",
+      "regional-resource-zone": "example-regional-resource-zone-val-73874",
+      "management-v6-address": "example-management-v6-address-val-25900",
+      "operational-status": "example-operational-status-val-17036",
+      "vdisk-units": "example-vdisk-units-val-96988",
+      "entitlement-resource-uuid": "example-entitlement-resource-uuid-val-20774",
+      "orchestration-status": "example-orchestration-status-val-19396",
+      "nf-naming-code": "example-nf-naming-code-val-92256",
+      "selflink": "example-selflink-val-44462",
+      "heat-stack-id": "example-heat-stack-id-val-37828",
+      "license-key-uuid": "example-license-key-uuid-val-66274",
+      "license-key": "example-license-key-val-66815",
+      "lag-interfaces": {
+        "lag-interface": [{
+          "interface-role": "example-interface-role-val-83678",
+          "speed-value": "example-speed-value-val-38117",
+          "in-maint": true,
+          "resource-version": "1537885258117",
+          "l-interfaces": {
+            "l-interface": [{
+              "v6-wan-link-ip": "example-v6-wan-link-ip-val-56250",
+              "vlans": {
+                "vlan": [{
+                  "vlan-description": "example-vlan-description-val-47496",
+                  "vpn-key": "example-vpn-key-val-38828",
+                  "prov-status": "example-prov-status-val-99970",
+                  "vlan-id-inner": 89782443,
+                  "vlan-id-outer": 92728211,
+                  "orchestration-status": "example-orchestration-status-val-65649",
+                  "speed-value": "example-speed-value-val-87106",
+                  "in-maint": true,
+                  "l3-interface-ipv6-address-list": [{
+                    "resource-version": "1537885258152",
+                    "neutron-network-id": "example-neutron-network-id-val-73096",
+                    "neutron-subnet-id": "example-neutron-subnet-id-val-80915",
+                    "l3-interface-ipv6-prefix-length": 54785197,
+                    "vlan-id-inner": 25109147,
+                    "is-floating": true,
+                    "l3-interface-ipv6-address": "l3-interface-ipv6-address-3-generic-vnf-987654321-9-cleanup-later-PS2418",
+                    "vlan-id-outer": 79074706
+                  }
+                  ],
+                  "resource-version": "1537885258133",
+                  "is-ip-unnumbered": true,
+                  "speed-units": "example-speed-units-val-43767",
+                  "vlan-interface": "vlan-interface-2-generic-vnf-987654321-9-cleanup-later-PS2418",
+                  "backdoor-connection": "example-backdoor-connection-val-42851",
+                  "l3-interface-ipv4-address-list": [{
+                    "l3-interface-ipv4-prefix-length": 95616468,
+                    "resource-version": "1537885258142",
+                    "neutron-network-id": "example-neutron-network-id-val-60156",
+                    "neutron-subnet-id": "example-neutron-subnet-id-val-25666",
+                    "vlan-id-inner": 14957493,
+                    "l3-interface-ipv4-address": "l3-interface-ipv4-address-3-generic-vnf-987654321-9-cleanup-later-PS2418",
+                    "is-floating": true,
+                    "vlan-id-outer": 96248912
+                  }
+                  ]
+                }
+                ]
+              },
+              "l-interfaces": {
+                "l-interface": [{
+                  "v6-wan-link-ip": "example-v6-wan-link-ip-val-60751",
+                  "interface-name": "interface-name-5-generic-vnf-987654321-9-cleanup-later-PS2418",
+                  "allowed-address-pairs": "example-allowed-address-pairs-val-66261",
+                  "prov-status": "example-prov-status-val-79263",
+                  "macaddr": "example-macaddr-val-54377",
+                  "interface-role": "example-interface-role-val-57457",
+                  "selflink": "example-selflink-val-7547",
+                  "in-maint": true,
+                  "admin-status": "example-admin-status-val-99281",
+                  "is-port-mirrored": true,
+                  "resource-version": "1537885258177",
+                  "is-ip-unnumbered": true,
+                  "network-name": "example-network-name-val-53451",
+                  "management-option": "example-management-option-val-31869",
+                  "interface-id": "example-interface-id-val-21202",
+                  "interface-description": "example-interface-description-val-62128"
+                }
+                ]
+              },
+              "interface-name": "interface-name-4-generic-vnf-987654321-9-cleanup-later-PS2418",
+              "allowed-address-pairs": "example-allowed-address-pairs-val-67284",
+              "prov-status": "example-prov-status-val-41209",
+              "macaddr": "example-macaddr-val-27005",
+              "interface-role": "example-interface-role-val-28263",
+              "selflink": "example-selflink-val-41633",
+              "in-maint": true,
+              "admin-status": "example-admin-status-val-66518",
+              "l3-interface-ipv6-address-list": [{
+                "resource-version": "1537885258199",
+                "neutron-network-id": "example-neutron-network-id-val-62532",
+                "neutron-subnet-id": "example-neutron-subnet-id-val-98579",
+                "l3-interface-ipv6-prefix-length": 12026525,
+                "vlan-id-inner": 43455241,
+                "is-floating": true,
+                "l3-interface-ipv6-address": "l3-interface-ipv6-address-4-generic-vnf-987654321-9-cleanup-later-PS2418",
+                "vlan-id-outer": 25084087
+              }
+              ],
+              "is-port-mirrored": true,
+              "resource-version": "1537885258127",
+              "is-ip-unnumbered": true,
+              "sriov-vfs": {
+                "sriov-vf": [{
+                  "vf-vlan-filter": "example-vf-vlan-filter-val-18397",
+                  "vf-vlan-strip": true,
+                  "neutron-network-id": "example-neutron-network-id-val-15801",
+                  "vf-broadcast-allow": true,
+                  "vf-mac-anti-spoof-check": true,
+                  "vf-unknown-multicast-allow": true,
+                  "pci-id": "pci-id-2-generic-vnf-987654321-9-cleanup-later-PS2418",
+                  "vf-mirrors": "example-vf-mirrors-val-361",
+                  "resource-version": "1537885258167",
+                  "vf-link-status": "example-vf-link-status-val-32153",
+                  "vf-mac-filter": "example-vf-mac-filter-val-17599",
+                  "vf-insert-stag": true,
+                  "vf-vlan-anti-spoof-check": true,
+                  "vf-unknown-unicast-allow": true
+                }
+                ]
+              },
+              "network-name": "example-network-name-val-38641",
+              "management-option": "example-management-option-val-84248",
+              "interface-id": "example-interface-id-val-45628",
+              "interface-description": "example-interface-description-val-88021",
+              "l3-interface-ipv4-address-list": [{
+                "l3-interface-ipv4-prefix-length": 77529761,
+                "resource-version": "1537885258187",
+                "neutron-network-id": "example-neutron-network-id-val-58736",
+                "neutron-subnet-id": "example-neutron-subnet-id-val-42120",
+                "vlan-id-inner": 60074034,
+                "l3-interface-ipv4-address": "l3-interface-ipv4-address-4-generic-vnf-987654321-9-cleanup-later-PS2418",
+                "is-floating": true,
+                "vlan-id-outer": 97685113
+              }
+              ]
+            }
+            ]
+          },
+          "interface-name": "interface-name-3-generic-vnf-987654321-9-cleanup-later-PS2418",
+          "speed-units": "example-speed-units-val-67991",
+          "prov-status": "example-prov-status-val-33056",
+          "interface-description": "example-interface-description-val-473",
+          "interface-id": "example-interface-id-val-12642"
+        }
+        ]
+      },
+      "summary-status": "example-summary-status-val-6834",
+      "encrypted-access-flag": true,
+      "licenses": {
+        "license": [{
+          "resource-version": "1537885258229",
+          "group-uuid": "license-group-uuid-generic-vnf-987654321-9-cleanup-later-PS2418",
+          "resource-uuid": "example-resource-uuid-val-55651"
+        }
+        ]
+      },
+      "in-maint": true,
+      "nm-lan-v6-address": "example-nm-lan-v6-address-val-1909",
+      "resource-version": "1537885258942",
+      "regional-resource-subzone": "example-regional-resource-subzone-val-57379",
+      "management-option": "example-management-option-val-43163",
+      "is-closed-loop-disabled": true
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/test/resources/test/payloads/dmaapEvents/createPserverCreateCRWithNestingAndRelsToUpdateRemovingARelTest.json b/src/test/resources/test/payloads/dmaapEvents/createPserverCreateCRWithNestingAndRelsToUpdateRemovingARelTest.json
new file mode 100644 (file)
index 0000000..729e0d8
--- /dev/null
@@ -0,0 +1,151 @@
+{
+  "pserverCreate": {
+    "cambria.partition": "AAI",
+    "event-header": {
+      "severity": "NORMAL",
+      "entity-type": "pserver",
+      "top-entity-type": "pserver",
+      "entity-link": "/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1",
+      "event-type": "AAI-EVENT",
+      "domain": "JUNIT",
+      "action": "CREATE",
+      "sequence-number": "0",
+      "id": "0c3b336d-6554-4ddf-a4d7-90f97876a966",
+      "source-name": "JUNIT",
+      "version": "v14",
+      "timestamp": "20180209-21:02:20:344"
+    },
+    "entity": {
+      "hostname": "pserver-1",
+      "in-maint": false
+    }
+  },
+  "crWithNestingAndWithRels": {
+    "cambria.partition": "AAI",
+    "event-header": {
+      "severity": "NORMAL",
+      "entity-type": "cloud-region",
+      "top-entity-type": "cloud-region",
+      "entity-link": "/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6",
+      "event-type": "AAI-EVENT",
+      "domain": "JUNIT",
+      "action": "CREATE",
+      "sequence-number": "0",
+      "id": "3d567832-df00-49b5-b862-4d3a341dbec1",
+      "source-name": "JUNIT",
+      "version": "v14",
+      "timestamp": "20180515-10:57:55:750"
+    },
+    "entity": {
+      "tenants": {
+        "tenant": [
+          {
+            "vservers": {
+              "vserver": [
+                {
+                  "relationship-list": {
+                    "relationship": [
+                      {
+                        "related-to": "pserver",
+                        "relationship-data": [
+                          {
+                            "relationship-value": "pserver-1",
+                            "relationship-key": "pserver.hostname"
+                          }
+                        ],
+                        "related-link": "/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1",
+                        "relationship-label": "tosca.relationships.HostedOn"
+                      }
+                    ]
+                  },
+                  "l-interfaces": {
+                    "l-interface": [
+                      {
+                        "interface-name": "l-int-1",
+                        "interface-id": "l-int-1",
+                        "l3-interface-ipv4-address-list": [
+                          {
+                            "neutron-network-id": "93fb399c-9bfc-4234-b2bb-a76eda38f117",
+                            "neutron-subnet-id": "79e5bb69-24bb-4ea3-8d1d-c04fca5f5e1e",
+                            "l3-interface-ipv4-address": "192.168.70.3"
+                          }
+                        ],
+                        "relationship-list": {
+                          "relationship": [
+                            {
+                              "related-to": "pserver",
+                              "relationship-data": [
+                                {
+                                  "relationship-value": "pserver-1",
+                                  "relationship-key": "pserver.hostname"
+                                }
+                              ],
+                              "related-link": "/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1",
+                              "relationship-label": "tosca.relationships.HostedOn"
+                            }
+                          ]
+                        }
+                      }
+                    ]
+                  },
+                  "vserver-id": "vserver-1"
+                }
+              ]
+            },
+            "tenant-id": "tenenat-1"
+          }
+        ]
+      },
+      "cloud-owner": "onap-cloud-owner",
+      "cloud-region-id": "mtn6"
+    }
+  },
+  "updatePserverWithoutInterfaceRel": {
+    "cambria.partition": "AAI",
+    "event-header": {
+      "severity": "NORMAL",
+      "entity-type": "pserver",
+      "top-entity-type": "pserver",
+      "entity-link": "/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1",
+      "event-type": "AAI-EVENT",
+      "domain": "JUNIT",
+      "action": "UPDATE",
+      "sequence-number": "0",
+      "id": "0c3b336d-6554-4ddf-a4d7-90f97876a966",
+      "source-name": "JUNIT",
+      "version": "v14",
+      "timestamp": "20180209-21:02:20:344"
+    },
+    "entity": {
+      "hostname": "pserver-1",
+      "in-maint": false,
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "vserver",
+            "relationship-label": "tosca.relationships.HostedOn",
+            "related-link": "/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1",
+            "relationship-data": [
+              {
+                "relationship-key": "cloud-region.cloud-owner",
+                "relationship-value": "onap-cloud-owner"
+              },
+              {
+                "relationship-key": "cloud-region.cloud-region-id",
+                "relationship-value": "mtn6"
+              },
+              {
+                "relationship-key": "tenant.tenant-id",
+                "relationship-value": "tenenat-1"
+              },
+              {
+                "relationship-key": "vserver.vserver-id",
+                "relationship-value": "vserver-1"
+              }
+            ]
+          }
+        ]
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/test/resources/test/payloads/dmaapEvents/createPserverRelationshipsToNonExistingTest.json b/src/test/resources/test/payloads/dmaapEvents/createPserverRelationshipsToNonExistingTest.json
new file mode 100644 (file)
index 0000000..98e5aac
--- /dev/null
@@ -0,0 +1,90 @@
+{
+  "cambria.partition": "AAI",
+  "event-header": {
+    "severity": "NORMAL",
+    "entity-type": "pserver",
+    "top-entity-type": "pserver",
+    "entity-link": "/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1",
+    "event-type": "AAI-EVENT",
+    "domain": "JUNIT",
+    "action": "CREATE",
+    "sequence-number": "0",
+    "id": "0c3b336d-6554-4ddf-a4d7-90f97876a966",
+    "source-name": "JUNIT",
+    "version": "v14",
+    "timestamp": "20180209-21:02:20:344"
+  },
+  "entity": {
+    "hostname": "pserver-1",
+    "in-maint": false,
+    "relationship-list": {
+      "relationship": [
+        {
+          "related-to": "cloud-region",
+          "relationship-label": "tosca.relationships.HostedOn",
+          "related-link": "/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6",
+          "relationship-data": [
+            {
+              "relationship-key": "cloud-region.cloud-owner",
+              "relationship-value": "onap-cloud-owner"
+            },
+            {
+              "relationship-key": "cloud-region.cloud-region-id",
+              "relationship-value": "mtn6"
+            }
+          ]
+        },
+        {
+          "related-to": "vserver",
+          "relationship-label": "tosca.relationships.HostedOn",
+          "related-link": "/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1",
+          "relationship-data": [
+            {
+              "relationship-key": "cloud-region.cloud-owner",
+              "relationship-value": "onap-cloud-owner"
+            },
+            {
+              "relationship-key": "cloud-region.cloud-region-id",
+              "relationship-value": "mtn6"
+            },
+            {
+              "relationship-key": "tenant.tenant-id",
+              "relationship-value": "tenenat-1"
+            },
+            {
+              "relationship-key": "vserver.vserver-id",
+              "relationship-value": "vserver-1"
+            }
+          ]
+        },
+        {
+          "related-to": "l-interface",
+          "relationship-label": "tosca.relationships.HostedOn",
+          "related-link": "/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/mtn6/tenants/tenant/tenenat-1/vservers/vserver/vserver-1/l-interfaces/l-interface/l-int-1",
+          "relationship-data": [
+            {
+              "relationship-key": "cloud-region.cloud-owner",
+              "relationship-value": "onap-cloud-owner"
+            },
+            {
+              "relationship-key": "cloud-region.cloud-region-id",
+              "relationship-value": "mtn6"
+            },
+            {
+              "relationship-key": "tenant.tenant-id",
+              "relationship-value": "tenenat-1"
+            },
+            {
+              "relationship-key": "vserver.vserver-id",
+              "relationship-value": "vserver-1"
+            },
+            {
+              "relationship-key": "l-interface.interface-name",
+              "relationship-value": "l-int-1"
+            }
+          ]
+        }
+      ]
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/test/resources/test/payloads/dmaapEvents/createPserverWithNestedDeleteNested.json b/src/test/resources/test/payloads/dmaapEvents/createPserverWithNestedDeleteNested.json
new file mode 100644 (file)
index 0000000..14fe9dc
--- /dev/null
@@ -0,0 +1,56 @@
+{
+  "createPserverWithNested": {
+    "cambria.partition": "AAI",
+    "event-header": {
+      "severity": "NORMAL",
+      "entity-type": "pserver",
+      "top-entity-type": "pserver",
+      "entity-link": "/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1",
+      "event-type": "AAI-EVENT",
+      "domain": "test",
+      "action": "CREATE",
+      "sequence-number": "0",
+      "id": "40925a50-b9d3-423a-8054-e772f9a1fde2",
+      "source-name": "test",
+      "version": "v14",
+      "timestamp": "20180927-05:02:12:378"
+    },
+    "entity": {
+      "hostname": "pserver-1",
+      "p-interfaces": {
+        "p-interface": [
+          {
+            "interface-name": "interface-1"
+          }
+        ]
+      }
+    }
+  },
+  "deletedNested": {
+    "cambria.partition": "AAI",
+    "event-header": {
+      "severity": "NORMAL",
+      "entity-type": "p-interface",
+      "top-entity-type": "pserver",
+      "entity-link": "/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1/p-interfaces/p-interface/interface-1",
+      "event-type": "AAI-EVENT",
+      "domain": "test",
+      "action": "DELETE",
+      "sequence-number": "0",
+      "id": "40925a50-b9d3-423a-8054-e772f9a1fde2",
+      "source-name": "test",
+      "version": "v14",
+      "timestamp": "20180927-05:02:12:378"
+    },
+    "entity": {
+      "hostname": "pserver-1",
+      "p-interfaces": {
+        "p-interface": [
+          {
+            "interface-name": "interface-1"
+          }
+        ]
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/test/resources/test/payloads/dmaapEvents/createPserverWithoutNestedAddNested.json b/src/test/resources/test/payloads/dmaapEvents/createPserverWithoutNestedAddNested.json
new file mode 100644 (file)
index 0000000..de21ff1
--- /dev/null
@@ -0,0 +1,49 @@
+{
+  "createPserverWithoutNested": {
+    "cambria.partition": "AAI",
+    "event-header": {
+      "severity": "NORMAL",
+      "entity-type": "pserver",
+      "top-entity-type": "pserver",
+      "entity-link": "/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1",
+      "event-type": "AAI-EVENT",
+      "domain": "test",
+      "action": "CREATE",
+      "sequence-number": "0",
+      "id": "40925a50-b9d3-423a-8054-e772f9a1fde2",
+      "source-name": "test",
+      "version": "v14",
+      "timestamp": "20180927-05:02:12:378"
+    },
+    "entity": {
+      "hostname": "pserver-1"
+    }
+  },
+  "addNested": {
+    "cambria.partition": "AAI",
+    "event-header": {
+      "severity": "NORMAL",
+      "entity-type": "p-interface",
+      "top-entity-type": "pserver",
+      "entity-link": "/aai/v14/cloud-infrastructure/pservers/pserver/pserver-1/p-interfaces/p-interface/interface-1",
+      "event-type": "AAI-EVENT",
+      "domain": "test",
+      "action": "CREATE",
+      "sequence-number": "0",
+      "id": "40925a50-b9d3-423a-8054-e772f9a1fde2",
+      "source-name": "test",
+      "version": "v14",
+      "timestamp": "20180927-05:02:12:378"
+    },
+    "entity": {
+      "hostname": "pserver-1",
+      "p-interfaces": {
+        "p-interface": [
+          {
+            "interface-name": "interface-1"
+          }
+        ]
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/test/resources/test/payloads/dmaapEvents/cvlan-tag-entry-create.json b/src/test/resources/test/payloads/dmaapEvents/cvlan-tag-entry-create.json
new file mode 100644 (file)
index 0000000..062d788
--- /dev/null
@@ -0,0 +1,32 @@
+{
+    "cambria.partition": "AAI",
+    "event-header": {
+        "severity": "NORMAL",
+        "entity-type": "cvlan-tag",
+        "top-entity-type": "vce",
+        "entity-link": "/aai/v14/network/vces/vce/test-vnf-id/port-groups/port-group/test-interface-id/cvlan-tags/cvlan-tag/123321",
+        "event-type": "AAI-EVENT",
+        "domain": "uINT4",
+        "action": "CREATE",
+        "sequence-number": "0",
+        "id": "87c97593-dcd1-482e-afc5-d5d558e36a36",
+        "source-name": "sourcetest",
+        "version": "v14",
+        "timestamp": "20190103-22:05:33:786"
+    },
+    "entity": {
+        "vnf-id": "test-vnf-id",
+        "vnf-name": "test-vnf-name",
+        "port-groups": {
+            "port-group": [{
+                "cvlan-tags": {
+                    "cvlan-tag-entry": [{
+                        "resource-version": "1546553133766",
+                        "cvlan-tag": 123321
+                    }]
+                },
+                "interface-id": "test-interface-id"
+            }]
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/test/resources/test/payloads/dmaapEvents/cvlan-tag-entry.json b/src/test/resources/test/payloads/dmaapEvents/cvlan-tag-entry.json
new file mode 100644 (file)
index 0000000..e6ac86f
--- /dev/null
@@ -0,0 +1,61 @@
+{
+    "cambria.partition": "AAI",
+    "event-header": {
+        "severity": "NORMAL",
+        "entity-type": "service-instance",
+        "top-entity-type": "customer",
+        "entity-link": "/aai/v14/business/customers/customer/081/service-subscriptions/service-subscription/SDN-ETHERNET-INTERNET/service-instances/service-instance/MIS%2F1810%2F25081%2FSW_INTERNET",
+        "event-type": "AAI-EVENT",
+        "domain": "IST4-1810",
+        "action": "UPDATE",
+        "sequence-number": "0",
+        "id": "fcecbaa8-3295-43f5-8560-e7caf2e89d01",
+        "source-name": "SDNC",
+        "version": "v14",
+        "timestamp": "20181129-19:41:57:088"
+    },
+    "entity": {
+        "global-customer-id": "081",
+        "subscriber-name": "1810_25_AT_PG_081",
+        "service-subscriptions": {
+            "service-subscription": [{
+                "service-type": "SDN-ETHERNET-INTERNET",
+                "service-instances": {
+                    "service-instance": [{
+                        "relationship-list": {
+                            "relationship": [{
+                                "related-to": "cvlan-tag-entry",
+                                "relationship-data": [{
+                                    "relationship-value": "3b61d9ad-7b88-4e21-87e6-c5e832da669a",
+                                    "relationship-key": "vce.vnf-id"
+                                }, {
+                                    "relationship-value": "mtn08415vbc.ipag",
+                                    "relationship-key": "port-group.interface-id"
+                                }, {
+                                    "relationship-value": "2006",
+                                    "relationship-key": "cvlan-tag-entry.cvlan-tag"
+                                }],
+                                "related-link": "/aai/v14/network/vces/vce/3b61d9ad-7b88-4e21-87e6-c5e832da669a/port-groups/port-group/mtn08415vbc.ipag/cvlan-tags/cvlan-tag-entry/2006",
+                                "relationship-label": "org.onap.relationships.inventory.ComposedOf"
+                            }, {
+                                "related-to": "vce",
+                                "relationship-data": [{
+                                    "relationship-value": "3b61d9ad-7b88-4e21-87e6-c5e832da669a",
+                                    "relationship-key": "vce.vnf-id"
+                                }],
+                                "related-link": "/aai/v14/network/vces/vce/3b61d9ad-7b88-4e21-87e6-c5e832da669a",
+                                "relationship-label": "org.onap.relationships.inventory.ComposedOf",
+                                "related-to-property": [{
+                                    "property-key": "vce.vnf-name",
+                                    "property-value": "mtn08415vbc"
+                                }]
+                            }]
+                        },
+                        "service-instance-id": "MIS/1810/25081/SW_INTERNET",
+                        "resource-version": "1543520517015"
+                    }]
+                }
+            }]
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/test/resources/test/payloads/dmaapEvents/cvlan-tag.json b/src/test/resources/test/payloads/dmaapEvents/cvlan-tag.json
new file mode 100644 (file)
index 0000000..5be2593
--- /dev/null
@@ -0,0 +1,61 @@
+{
+    "cambria.partition": "AAI",
+    "event-header": {
+        "severity": "NORMAL",
+        "entity-type": "service-instance",
+        "top-entity-type": "customer",
+        "entity-link": "/aai/v14/business/customers/customer/081/service-subscriptions/service-subscription/SDN-ETHERNET-INTERNET/service-instances/service-instance/MIS%2F1810%2F25081%2FSW_INTERNET",
+        "event-type": "AAI-EVENT",
+        "domain": "IST4-1810",
+        "action": "UPDATE",
+        "sequence-number": "0",
+        "id": "fcecbaa8-3295-43f5-8560-e7caf2e89d01",
+        "source-name": "SDNC",
+        "version": "v14",
+        "timestamp": "20181129-19:41:57:088"
+    },
+    "entity": {
+        "global-customer-id": "081",
+        "subscriber-name": "1810_25_AT_PG_081",
+        "service-subscriptions": {
+            "service-subscription": [{
+                "service-type": "SDN-ETHERNET-INTERNET",
+                "service-instances": {
+                    "service-instance": [{
+                        "relationship-list": {
+                            "relationship": [{
+                                "related-to": "cvlan-tag",
+                                "relationship-data": [{
+                                    "relationship-value": "3b61d9ad-7b88-4e21-87e6-c5e832da669a",
+                                    "relationship-key": "vce.vnf-id"
+                                }, {
+                                    "relationship-value": "mtn08415vbc.ipag",
+                                    "relationship-key": "port-group.interface-id"
+                                }, {
+                                    "relationship-value": "2006",
+                                    "relationship-key": "cvlan-tag.cvlan-tag"
+                                }],
+                                "related-link": "/aai/v14/network/vces/vce/3b61d9ad-7b88-4e21-87e6-c5e832da669a/port-groups/port-group/mtn08415vbc.ipag/cvlan-tags/cvlan-tag/2006",
+                                "relationship-label": "org.onap.relationships.inventory.ComposedOf"
+                            }, {
+                                "related-to": "vce",
+                                "relationship-data": [{
+                                    "relationship-value": "3b61d9ad-7b88-4e21-87e6-c5e832da669a",
+                                    "relationship-key": "vce.vnf-id"
+                                }],
+                                "related-link": "/aai/v14/network/vces/vce/3b61d9ad-7b88-4e21-87e6-c5e832da669a",
+                                "relationship-label": "org.onap.relationships.inventory.ComposedOf",
+                                "related-to-property": [{
+                                    "property-key": "vce.vnf-name",
+                                    "property-value": "mtn08415vbc"
+                                }]
+                            }]
+                        },
+                        "service-instance-id": "MIS/1810/25081/SW_INTERNET",
+                        "resource-version": "1543520517015"
+                    }]
+                }
+            }]
+        }
+    }
+}
\ No newline at end of file
index 5277b3d..865a200 100644 (file)
@@ -4,14 +4,14 @@
     "severity": "NORMAL",
     "entity-type": "logical-link",
     "top-entity-type": "logical-link",
-    "entity-link": "/aai/v13/network/logical-links/logical-link/logical-link",
+    "entity-link": "/aai/v14/network/logical-links/logical-link/logical-link",
     "event-type": "AAI-EVENT",
     "domain": "uINT1",
     "action": "CREATE",
     "sequence-number": "0",
     "id": "fe89fd6b-8b1b-4ab6-8b3a-d5bb7942dbee",
     "source-name": "junit",
-    "version": "v13",
+    "version": "v14",
     "timestamp": "20180712-17:47:24:042"
   },
   "entity": {
index 57fe6a2..d723740 100644 (file)
@@ -4,14 +4,14 @@
     "severity": "NORMAL",
     "entity-type": "generic-vnf",
     "top-entity-type": "generic-vnf",
-    "entity-link": "/aai/v13/network/generic-vnfs/generic-vnf/generic-vnf-id",
+    "entity-link": "/aai/v14/network/generic-vnfs/generic-vnf/generic-vnf-id",
     "event-type": "AAI-EVENT",
     "domain": "uINT1",
     "action": "CREATE",
     "sequence-number": "0",
     "id": "d56359e7-4dcb-471a-9a6a-2afbb353b5bd",
     "source-name": "junit",
-    "version": "v13",
+    "version": "v14",
     "timestamp": "20180712-17:47:24:440"
   },
   "entity": {
index bdfabe8..1c542f9 100644 (file)
@@ -4,14 +4,14 @@
     "severity": "NORMAL",
     "entity-type": "vlan",
     "top-entity-type": "generic-vnf",
-    "entity-link": "/aai/v13/network/generic-vnfs/generic-vnf/generic-vnf-id/l-interfaces/l-interface/l-interface-name-1/vlans/vlan/vlan-1",
+    "entity-link": "/aai/v14/network/generic-vnfs/generic-vnf/generic-vnf-id/l-interfaces/l-interface/l-interface-name-1/vlans/vlan/vlan-1",
     "event-type": "AAI-EVENT",
     "domain": "uINT1",
     "action": "UPDATE",
     "sequence-number": "0",
     "id": "bd2bc927-d28b-4472-a582-317c4c19c98b",
     "source-name": "FitNesse-Relationship-Test-ps2418",
-    "version": "v13",
+    "version": "v14",
     "timestamp": "20180712-17:47:24:609"
   },
   "entity": {
@@ -28,7 +28,7 @@
                   "relationship-key": "logical-link.link-name"
                 }
                 ],
-                "related-link": "/aai/v13/network/logical-links/logical-link/logical-link",
+                "related-link": "/aai/v14/network/logical-links/logical-link/logical-link",
                 "relationship-label": "org.onap.relationships.inventory.Uses"
               }
               ]
index 20c2278..341589e 100644 (file)
@@ -4,14 +4,14 @@
     "severity": "NORMAL",
     "entity-type": "logical-link",
     "top-entity-type": "logical-link",
-    "entity-link": "/aai/v13/network/logical-links/logical-link/logical-link",
+    "entity-link": "/aai/v14/network/logical-links/logical-link/logical-link",
     "event-type": "AAI-EVENT",
     "domain": "uINT1",
     "action": "UPDATE",
     "sequence-number": "0",
     "id": "3f9ea0cf-da42-4a9e-817b-7fb1eab0cabe",
     "source-name": "junit",
-    "version": "v13",
+    "version": "v14",
     "timestamp": "20180712-17:47:25:057"
   },
   "entity": {
index 1d7cf14..0ca88b2 100644 (file)
@@ -4,14 +4,14 @@
     "severity": "NORMAL",
     "entity-type": "pserver",
     "top-entity-type": "pserver",
-    "entity-link": "/aai/v13/cloud-infrastructure/pservers/pserver/c9e8ffb6-a360-4f9c-96c3-f5f0244dfe55-jenkins",
+    "entity-link": "/aai/v14/cloud-infrastructure/pservers/pserver/c9e8ffb6-a360-4f9c-96c3-f5f0244dfe55-jenkins",
     "event-type": "AAI-EVENT",
     "domain": "uINT1",
     "action": "UPDATE",
     "sequence-number": "0",
     "id": "5cc57cd2-c55c-4bbc-bf92-cba20b6d2bf3",
     "source-name": "FitNesse-Test-jenkins",
-    "version": "v13",
+    "version": "v14",
     "timestamp": "20180625-01:24:01:437"
   },
   "entity": {
diff --git a/src/test/resources/test/payloads/dmaapEvents/linterfaceWithLinterfaceTest.json b/src/test/resources/test/payloads/dmaapEvents/linterfaceWithLinterfaceTest.json
new file mode 100644 (file)
index 0000000..cd59e8e
--- /dev/null
@@ -0,0 +1,57 @@
+{
+  "cambria.partition": "AAI",
+  "event-header": {
+    "severity": "NORMAL",
+    "entity-type": "l-interface",
+    "top-entity-type": "pserver",
+    "entity-link": "/aai/v14/cloud-infrastructure/pservers/pserver/c9e8ffb6-a360-4f9c-96c3-f5f0244dfe55-jenkins/lag-interfaces/lag-interface/8806d30d-e5f5-409e-9e9e-9b1c1943058d-jenkins/l-interfaces/l-interface/f4f9b9c7-eb83-4622-9d6f-14027a556ff5-jenkins/l-interfaces/l-interface/89796dd1-89a5-4ddc-bd13-324ba9bce3b6-jenkins",
+    "event-type": "AAI-EVENT",
+    "domain": "uINT1",
+    "action": "DELETE",
+    "sequence-number": "0",
+    "id": "9060077e-00a3-4239-80ed-855331b4d551",
+    "source-name": "FitNesse-Test-jenkins",
+    "version": "v14",
+    "timestamp": "20180625-01:24:04:857"
+  },
+  "entity": {
+    "pserver-name2": "iqFmGNmNLM6",
+    "hostname": "c9e8ffb6-a360-4f9c-96c3-f5f0244dfe55-jenkins",
+    "lag-interfaces": {
+      "lag-interface": [
+        {
+          "l-interfaces": {
+            "l-interface": [
+              {
+                "l-interfaces": {
+                  "l-interface": [
+                    {
+                      "v6-wan-link-ip": "PuNFKRUUpd3",
+                      "interface-name": "89796dd1-89a5-4ddc-bd13-324ba9bce3b6-jenkins",
+                      "allowed-address-pairs": "RGo6MaADK",
+                      "prov-status": "uot",
+                      "macaddr": "xUj8TGre",
+                      "interface-role": "SyT0hd9Uu4b",
+                      "selflink": "HxDI",
+                      "in-maint": false,
+                      "admin-status": "GDgD",
+                      "is-port-mirrored": true,
+                      "resource-version": "1529889840462",
+                      "is-ip-unnumbered": false,
+                      "network-name": "RXCo3p3p5BhBS",
+                      "management-option": "jNiTd",
+                      "interface-id": "4n8niH",
+                      "interface-description": "drnTF3"
+                    }
+                  ]
+                },
+                "interface-name": "f4f9b9c7-eb83-4622-9d6f-14027a556ff5-jenkins"
+              }
+            ]
+          },
+          "interface-name": "8806d30d-e5f5-409e-9e9e-9b1c1943058d-jenkins"
+        }
+      ]
+    }
+  }
+}
\ No newline at end of file
index 3efe88f..74d2ae6 100644 (file)
@@ -4,14 +4,14 @@
     "severity": "NORMAL",
     "entity-type": "nos-server",
     "top-entity-type": "cloud-region",
-    "entity-link": "/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/AAIAIC25/tenants/tenant/tenant-987654321-8991-ps2418/nos-servers/nos-server/nos-server-987654321-8991-ps2418",
+    "entity-link": "/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/onap-cloud-owner/AAIAIC25/tenants/tenant/tenant-987654321-8991-ps2418/nos-servers/nos-server/nos-server-987654321-8991-ps2418",
     "event-type": "AAI-EVENT",
     "domain": "uINT1",
     "action": "CREATE",
     "sequence-number": "0",
     "id": "90105aab-78f6-4d83-83b4-48488998a9bd",
     "source-name": "SDNC",
-    "version": "v13",
+    "version": "v14",
     "timestamp": "20180625-15:29:20:696"
   },
   "entity": {
@@ -32,7 +32,7 @@
                           "relationship-key": "generic-vnf.vnf-id"
                         }
                       ],
-                      "related-link": "/aai/v13/network/generic-vnfs/generic-vnf/generic-vnf-987654321-89911-ps2418",
+                      "related-link": "/aai/v14/network/generic-vnfs/generic-vnf/generic-vnf-987654321-89911-ps2418",
                       "relationship-label": "tosca.relationships.HostedOn",
                       "related-to-property": [
                         {
@@ -49,7 +49,7 @@
                           "relationship-key": "generic-vnf.vnf-id"
                         }
                       ],
-                      "related-link": "/aai/v13/network/generic-vnfs/generic-vnf/generic-vnf-987654321-89922-ps2418",
+                      "related-link": "/aai/v14/network/generic-vnfs/generic-vnf/generic-vnf-987654321-89922-ps2418",
                       "relationship-label": "tosca.relationships.HostedOn",
                       "related-to-property": [
                         {
@@ -66,7 +66,7 @@
                           "relationship-key": "pserver.hostname"
                         }
                       ],
-                      "related-link": "/aai/v13/cloud-infrastructure/pservers/pserver/pserver-987654321-8991-ps2418",
+                      "related-link": "/aai/v14/cloud-infrastructure/pservers/pserver/pserver-987654321-8991-ps2418",
                       "relationship-label": "tosca.relationships.HostedOn",
                       "related-to-property": [
                         {
index adae7ee..2d466ec 100644 (file)
@@ -4,14 +4,14 @@
     "severity": "NORMAL",
     "entity-type": "vce",
     "top-entity-type": "vce",
-    "entity-link": "/aai/v13/network/vces/vce/vce-987654321-311-ps2418",
+    "entity-link": "/aai/v14/network/vces/vce/vce-987654321-311-ps2418",
     "event-type": "AAI-EVENT",
     "domain": "uINT1",
     "action": "DELETE",
     "sequence-number": "0",
     "id": "b10f1221-1c3f-42d2-987b-3071818cb613",
     "source-name": "FitNesse-Test-ps2418",
-    "version": "v13",
+    "version": "v14",
     "timestamp": "20180627-16:35:28:464"
   },
   "entity": {
diff --git a/src/test/resources/test/payloads/json/generic-vnfs-one-with-nesting-with-address-list.json b/src/test/resources/test/payloads/json/generic-vnfs-one-with-nesting-with-address-list.json
new file mode 100644 (file)
index 0000000..76374c4
--- /dev/null
@@ -0,0 +1,86 @@
+{
+  "generic-vnf": [
+    {
+      "vnf-id": "69baf763-b82f-4904-b800-8f59f86d64c8",
+      "vnf-name": "vn2f0-SDN",
+      "vnf-type": "test-gvnf-type",
+      "service-id": "a92a77d5a0-123e-4",
+      "orchestration-status": "active",
+      "in-maint": true,
+      "is-closed-loop-disabled": false,
+      "resource-version": "1506978203538",
+      "vf-modules": {
+        "vf-module": [
+          {
+            "vf-module-id": "3a3ac831-4e53-4c2e-bec3-6703bc818f8a",
+            "vf-module-name": "example-vf-module-name",
+            "heat-stack-id": "example-heat-stack-id",
+            "orchestration-status": "example-orchestration-status",
+            "is-base-vf-module": true,
+            "automated-assignment": true,
+            "vip-ipv4-address-list": [
+              {
+                "vip-ipv4-address": "12345"
+              },
+              {
+                "vip-ipv4-address": "67890"
+              }
+            ]
+          },
+          {
+            "vf-module-id": "9eb3fb5d-7c9c-4ec0-ad73-e1ca6a4b45c4",
+            "vf-module-name": "example-vf-module-name",
+            "heat-stack-id": "example-heat-stack-id",
+            "orchestration-status": "example-orchestration-status",
+            "is-base-vf-module": true,
+            "automated-assignment": true
+          },
+          {
+            "vf-module-id": "d79f5d9e-fb3f-4b22-9392-8f6a0ede9348",
+            "vf-module-name": "example-vf-module-name",
+            "heat-stack-id": "example-heat-stack-id",
+            "orchestration-status": "example-orchestration-status",
+            "is-base-vf-module": true,
+            "automated-assignment": true
+          },
+          {
+            "vf-module-id": "fa5a1a04-16a6-4211-a6fe-7c3db50825fc",
+            "vf-module-name": "example-vf-module-name",
+            "heat-stack-id": "example-heat-stack-id",
+            "orchestration-status": "example-orchestration-status",
+            "is-base-vf-module": true,
+            "automated-assignment": true
+          },
+          {
+            "vf-module-id": "c8ea54eb-c28d-40a4-85fa-8f9005d9bf6e",
+            "vf-module-name": "example-vf-module-name",
+            "heat-stack-id": "example-heat-stack-id",
+            "orchestration-status": "example-orchestration-status",
+            "is-base-vf-module": true,
+            "automated-assignment": true
+          }
+        ]
+      }
+    },
+    {
+      "vnf-id": "e7cb342a-b1ca-4e58-80d5-1c92dd63730f",
+      "vnf-name": "vn2f0-SDN",
+      "vnf-type": "test-gvnf-type",
+      "service-id": "a92a77d5a0-123e-4",
+      "orchestration-status": "active",
+      "in-maint": true,
+      "is-closed-loop-disabled": false,
+      "resource-version": "1506978203538"
+    },
+    {
+      "vnf-id": "bb580c02-dcb2-48e3-904f-379a25fb1d01",
+      "vnf-name": "vn2f0-SDN",
+      "vnf-type": "test-gvnf-type",
+      "service-id": "a92a77d5a0-123e-4",
+      "orchestration-status": "active",
+      "in-maint": true,
+      "is-closed-loop-disabled": false,
+      "resource-version": "1506978203538"
+    }
+  ]
+}
diff --git a/src/test/resources/test/payloads/json/generic-vnfs-one-with-nesting.json b/src/test/resources/test/payloads/json/generic-vnfs-one-with-nesting.json
new file mode 100644 (file)
index 0000000..eba9a99
--- /dev/null
@@ -0,0 +1,78 @@
+{
+  "generic-vnf": [
+    {
+      "vnf-id": "69baf763-b82f-4904-b800-8f59f86d64c8",
+      "vnf-name": "vn2f0-SDN",
+      "vnf-type": "test-gvnf-type",
+      "service-id": "a92a77d5a0-123e-4",
+      "orchestration-status": "active",
+      "in-maint": true,
+      "is-closed-loop-disabled": false,
+      "resource-version": "1506978203538",
+      "vf-modules": {
+        "vf-module": [
+          {
+            "vf-module-id": "3a3ac831-4e53-4c2e-bec3-6703bc818f8a",
+            "vf-module-name": "example-vf-module-name",
+            "heat-stack-id": "example-heat-stack-id",
+            "orchestration-status": "example-orchestration-status",
+            "is-base-vf-module": true,
+            "automated-assignment": true
+          },
+          {
+            "vf-module-id": "9eb3fb5d-7c9c-4ec0-ad73-e1ca6a4b45c4",
+            "vf-module-name": "example-vf-module-name",
+            "heat-stack-id": "example-heat-stack-id",
+            "orchestration-status": "example-orchestration-status",
+            "is-base-vf-module": true,
+            "automated-assignment": true
+          },
+          {
+            "vf-module-id": "d79f5d9e-fb3f-4b22-9392-8f6a0ede9348",
+            "vf-module-name": "example-vf-module-name",
+            "heat-stack-id": "example-heat-stack-id",
+            "orchestration-status": "example-orchestration-status",
+            "is-base-vf-module": true,
+            "automated-assignment": true
+          },
+          {
+            "vf-module-id": "fa5a1a04-16a6-4211-a6fe-7c3db50825fc",
+            "vf-module-name": "example-vf-module-name",
+            "heat-stack-id": "example-heat-stack-id",
+            "orchestration-status": "example-orchestration-status",
+            "is-base-vf-module": true,
+            "automated-assignment": true
+          },
+          {
+            "vf-module-id": "c8ea54eb-c28d-40a4-85fa-8f9005d9bf6e",
+            "vf-module-name": "example-vf-module-name",
+            "heat-stack-id": "example-heat-stack-id",
+            "orchestration-status": "example-orchestration-status",
+            "is-base-vf-module": true,
+            "automated-assignment": true
+          }
+        ]
+      }
+    },
+    {
+      "vnf-id": "e7cb342a-b1ca-4e58-80d5-1c92dd63730f",
+      "vnf-name": "vn2f0-SDN",
+      "vnf-type": "test-gvnf-type",
+      "service-id": "a92a77d5a0-123e-4",
+      "orchestration-status": "active",
+      "in-maint": true,
+      "is-closed-loop-disabled": false,
+      "resource-version": "1506978203538"
+    },
+    {
+      "vnf-id": "bb580c02-dcb2-48e3-904f-379a25fb1d01",
+      "vnf-name": "vn2f0-SDN",
+      "vnf-type": "test-gvnf-type",
+      "service-id": "a92a77d5a0-123e-4",
+      "orchestration-status": "active",
+      "in-maint": true,
+      "is-closed-loop-disabled": false,
+      "resource-version": "1506978203538"
+    }
+  ]
+}
diff --git a/src/test/resources/test/payloads/json/one-cr-with-nested-dupe-get-all.json b/src/test/resources/test/payloads/json/one-cr-with-nested-dupe-get-all.json
new file mode 100644 (file)
index 0000000..1b4dd96
--- /dev/null
@@ -0,0 +1,183 @@
+{
+  "cloud-region": [
+    {
+      "cloud-owner": "cloud-owner",
+      "cloud-region-id": "cloud-id",
+      "cloud-region-version": "2.5",
+      "cloud-type": "cloud-type-1",
+      "cloud-zone": "rs-CloudZone",
+      "owner-defined-type": "1",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-link": "/aai/v14/cloud-infrastructure/pservers/pserver/2abau-tessst.hostname4.test.com-rs804s",
+            "related-to": "pserver",
+            "related-to-property": [
+              {
+                "property-key": "pserver.pserver-name2"
+              }
+            ],
+            "relationship-data": [
+              {
+                "relationship-key": "pserver.hostname",
+                "relationship-value": "2abau-tessst.hostname4.test.com-rs804s"
+              }
+            ],
+            "relationship-label": "org.onap.relationships.inventory.LocatedIn"
+          }
+        ]
+      },
+      "resource-version": "1535381565645",
+      "tenants": {
+        "tenant": [
+          {
+            "resource-version": "1535381565926",
+            "tenant-id": "tenant-id",
+            "tenant-name": "tenant-name-987654321-09",
+            "vservers": {
+              "vserver": [
+                {
+                  "in-maint": false,
+                  "is-closed-loop-disabled": false,
+                  "l-interfaces": {
+                    "l-interface": [
+                      {
+                        "in-maint": false,
+                        "interface-id": "ae3f7b37-1885-40ea-bbf4-e78edd7466a9",
+                        "interface-name": "l-interface-key",
+                        "is-ip-unnumbered": false,
+                        "is-port-mirrored": false,
+                        "macaddr": "fa:16:3e:77:0c:86",
+                        "network-name": "VLAN_OVERLAY_422",
+                        "resource-version": "1535381640126",
+                        "selflink": "https://network-aic.pdk1.cci.att.com:9696/v2.0/ports/ae3f7b37-1885-40ea-bbf4-e78edd7466a9",
+                        "sriov-vfs": {
+                          "sriov-vf": [
+                            {
+                              "neutron-network-id": "example-neutron-network-id-val-22522",
+                              "pci-id": "sirov-id",
+                              "relationship-list": {
+                                "relationship": [
+                                  {
+                                    "related-link": "/aai/v14/cloud-infrastructure/pservers/pserver/2abau-tessst.hostname4.test.com-rs804s/p-interfaces/p-interface/NA/sriov-pfs/sriov-pf/0000%3A81%3A00.30",
+                                    "related-to": "sriov-pf",
+                                    "relationship-data": [
+                                      {
+                                        "relationship-key": "pserver.hostname",
+                                        "relationship-value": "2abau-tessst.hostname4.test.com-rs804s"
+                                      },
+                                      {
+                                        "relationship-key": "p-interface.interface-name",
+                                        "relationship-value": "NA"
+                                      },
+                                      {
+                                        "relationship-key": "sriov-pf.pf-pci-id",
+                                        "relationship-value": "0000:81:00.30"
+                                      }
+                                    ],
+                                    "relationship-label": "org.onap.relationships.inventory.Uses"
+                                  }
+                                ]
+                              },
+                              "resource-version": "1535381640154",
+                              "vf-insert-stag": true,
+                              "vf-link-status": "example-vf-link-status-val-72770",
+                              "vf-mac-filter": "example-vf-mac-filter-val-74354",
+                              "vf-vlan-filter": "example-vf-vlan-filter-val-7707"
+                            }
+                          ]
+                        }
+                      }
+                    ]
+                  },
+                  "relationship-list": {
+                    "relationship": [
+                      {
+                        "related-link": "/aai/v14/cloud-infrastructure/pservers/pserver/2abau-tessst.hostname4.test.com-rs804s",
+                        "related-to": "pserver",
+                        "related-to-property": [
+                          {
+                            "property-key": "pserver.pserver-name2"
+                          }
+                        ],
+                        "relationship-data": [
+                          {
+                            "relationship-key": "pserver.hostname",
+                            "relationship-value": "2abau-tessst.hostname4.test.com-rs804s"
+                          }
+                        ],
+                        "relationship-label": "tosca.relationships.HostedOn"
+                      }
+                    ]
+                  },
+                  "resource-version": "1535381640077",
+                  "vserver-id": "vserver-id",
+                  "vserver-name": "rs804s",
+                  "vserver-name2": "this-should-be-there",
+                  "vserver-selflink": "https://compute-aic.pdk1.cci.att.com:8774/v2/9eee808655904f46b0c614dd1186baae/servers/b964a6fb-f57b-48d3-9220-e95a6bc27f1e"
+                },
+                {
+                  "in-maint": false,
+                  "is-closed-loop-disabled": false,
+                  "l-interfaces": {
+                    "l-interface": [
+                      {
+                        "in-maint": false,
+                        "interface-id": "ae3f7b37-1885-40ea-bbf4-e78edd7466a9",
+                        "interface-name": "l-interface-key",
+                        "is-ip-unnumbered": false,
+                        "is-port-mirrored": false,
+                        "macaddr": "fa:16:3e:77:0c:86",
+                        "network-name": "VLAN_OVERLAY_422",
+                        "resource-version": "1535381640201",
+                        "selflink": "https://network-aic.pdk1.cci.att.com:9696/v2.0/ports/ae3f7b37-1885-40ea-bbf4-e78edd7466a9",
+                        "sriov-vfs": {
+                          "sriov-vf": [
+                            {
+                              "neutron-network-id": "example-neutron-network-id-val-22522",
+                              "pci-id": "sirov-id",
+                              "resource-version": "1535381640214",
+                              "vf-insert-stag": true,
+                              "vf-link-status": "example-vf-link-status-val-72770",
+                              "vf-mac-filter": "example-vf-mac-filter-val-74354",
+                              "vf-vlan-filter": "example-vf-vlan-filter-val-7707"
+                            }
+                          ]
+                        }
+                      }
+                    ]
+                  },
+                  "relationship-list": {
+                    "relationship": [
+                      {
+                        "related-link": "/aai/v14/cloud-infrastructure/pservers/pserver/2abau-tessst.hostname4.test.com-rs804s",
+                        "related-to": "pserver",
+                        "related-to-property": [
+                          {
+                            "property-key": "pserver.pserver-name2"
+                          }
+                        ],
+                        "relationship-data": [
+                          {
+                            "relationship-key": "pserver.hostname",
+                            "relationship-value": "2abau-tessst.hostname4.test.com-rs804s"
+                          }
+                        ],
+                        "relationship-label": "tosca.relationships.HostedOn"
+                      }
+                    ]
+                  },
+                  "resource-version": "1535381640180",
+                  "vserver-id": "vserver-id",
+                  "vserver-name": "rs804s",
+                  "vserver-name2": "this-should-be-there",
+                  "vserver-selflink": "https://compute-aic.pdk1.cci.att.com:8774/v2/9eee808655904f46b0c614dd1186baae/servers/b964a6fb-f57b-48d3-9220-e95a6bc27f1e"
+                }
+              ]
+            }
+          }
+        ]
+      }
+    }
+  ]
+}
\ No newline at end of file
diff --git a/src/test/resources/test/payloads/json/pservers-one-with-nesting.json b/src/test/resources/test/payloads/json/pservers-one-with-nesting.json
new file mode 100644 (file)
index 0000000..73e6293
--- /dev/null
@@ -0,0 +1,143 @@
+{
+  "pserver": [
+    {
+      "hostname": "USAUTOUFTIL2001UJZZ01",
+      "p-interfaces": {
+        "p-interface": [
+          {
+            "interface-name": "ge-0/0/10",
+            "relationship-list": {
+              "relationship": [
+                {
+                  "related-link": "/aai/v14/network/physical-links/physical-link/HIS.1702.03053.121",
+                  "related-to": "physical-link",
+                  "relationship-data": [
+                    {
+                      "relationship-key": "physical-link.link-name",
+                      "relationship-value": "HIS.1702.03053.121"
+                    }
+                  ],
+                  "relationship-label": "tosca.relationships.network.LinksTo"
+                }
+              ]
+            }
+          },
+          {
+            "interface-name": "ge-0/0/11",
+            "relationship-list": {
+              "relationship": [
+                {
+                  "related-link": "/aai/v14/network/physical-links/physical-link/HIS.1702.03053.122",
+                  "related-to": "physical-link",
+                  "relationship-data": [
+                    {
+                      "relationship-key": "physical-link.link-name",
+                      "relationship-value": "HIS.1702.03053.122"
+                    }
+                  ],
+                  "relationship-label": "tosca.relationships.network.LinksTo"
+                }
+              ]
+            }
+          }
+        ]
+      },
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-link": "/aai/v14/network/generic-vnfs/generic-vnf/205c64eb-88b1-490a-a838-b0080e6902bc",
+            "related-to": "generic-vnf",
+            "related-to-property": [
+              {
+                "property-key": "generic-vnf.vnf-name",
+                "property-value": "USAUTOUFTIL2001UJDM02"
+              }
+            ],
+            "relationship-data": [
+              {
+                "relationship-key": "generic-vnf.vnf-id",
+                "relationship-value": "205c64eb-88b1-490a-a838-b0080e6902bc"
+              }
+            ],
+            "relationship-label": "tosca.relationships.HostedOn"
+          },
+          {
+            "related-link": "/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/att-aic/AAIAIC25/tenants/tenant/USAUTOUFTIL2001UJZZ01%3A%3AuCPE/vservers/vserver/74a47c2c-b53f-4264-87fc-bb85c7f49207",
+            "related-to": "vserver",
+            "related-to-property": [
+              {
+                "property-key": "vserver.vserver-name",
+                "property-value": "USAUTOUFTIL2001UJZZ01-USAUTOUFTIL2001UJTE03"
+              }
+            ],
+            "relationship-data": [
+              {
+                "relationship-key": "cloud-region.cloud-owner",
+                "relationship-value": "att-aic"
+              },
+              {
+                "relationship-key": "cloud-region.cloud-region-id",
+                "relationship-value": "AAIAIC25"
+              },
+              {
+                "relationship-key": "tenant.tenant-id",
+                "relationship-value": "USAUTOUFTIL2001UJZZ01::uCPE"
+              },
+              {
+                "relationship-key": "vserver.vserver-id",
+                "relationship-value": "74a47c2c-b53f-4264-87fc-bb85c7f49207"
+              }
+            ],
+            "relationship-label": "tosca.relationships.HostedOn"
+          },
+          {
+            "related-link": "/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/att-aic/AAIAIC25/tenants/tenant/USAUTOUFTIL2001UJZZ01%3A%3AuCPE/vservers/vserver/afce2113-297a-436c-811a-acf9981fff68",
+            "related-to": "vserver",
+            "related-to-property": [
+              {
+                "property-key": "vserver.vserver-name",
+                "property-value": "USAUTOUFTIL2001UJZZ01-vjunos0"
+              }
+            ],
+            "relationship-data": [
+              {
+                "relationship-key": "cloud-region.cloud-owner",
+                "relationship-value": "att-aic"
+              },
+              {
+                "relationship-key": "cloud-region.cloud-region-id",
+                "relationship-value": "AAIAIC25"
+              },
+              {
+                "relationship-key": "tenant.tenant-id",
+                "relationship-value": "USAUTOUFTIL2001UJZZ01::uCPE"
+              },
+              {
+                "relationship-key": "vserver.vserver-id",
+                "relationship-value": "afce2113-297a-436c-811a-acf9981fff68"
+              }
+            ],
+            "relationship-label": "tosca.relationships.HostedOn"
+          },
+          {
+            "related-link": "/aai/v14/cloud-infrastructure/complexes/complex/STLSMO0914",
+            "related-to": "complex",
+            "relationship-data": [
+              {
+                "relationship-key": "complex.physical-location-id",
+                "relationship-value": "STLSMO0914"
+              }
+            ],
+            "relationship-label": "org.onap.relationships.inventory.LocatedIn"
+          }
+        ]
+      }
+    },
+    {
+      "hostname": "pserver-2"
+    },
+    {
+      "hostname": "pserver-3"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/src/test/resources/test/payloads/json/test-empty.json b/src/test/resources/test/payloads/json/test-empty.json
new file mode 100644 (file)
index 0000000..07ab7ce
--- /dev/null
@@ -0,0 +1,6 @@
+{
+  "_id" : "/business/customers/customer/testCustomer",
+  "service-subscriptions" : {
+    "service-subscription" : ["/business/customers/customer/testCustomer/service-subscriptions/service-subscription/testSS"]
+  }
+}
\ No newline at end of file