aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaMont, William (wl2432) <wl2432@att.com>2019-01-22 15:02:47 -0500
committerLaMont, William (wl2432) <wl2432@att.com>2019-01-22 15:03:05 -0500
commit34ca2877182d1a505015578b0728f32452ac5cbb (patch)
tree324e52ca003d2acac7d2a40b8786d89b89886cb5
parent4e579fc1bca9fdc42d294b21541cfe80cb0c60a2 (diff)
update cacher repo with v15
Issue-ID: AAI-2112 Change-Id: I8aab3d9c498d217638d50b8fde5f500b556d7fd0 Signed-off-by: LaMont, William (wl2432) <wl2432@att.com>
-rw-r--r--pom.xml136
-rw-r--r--src/main/docker/docker-entrypoint.sh14
-rw-r--r--src/main/java/org/onap/aai/cacher/Application.java23
-rw-r--r--src/main/java/org/onap/aai/cacher/common/MongoConfig.java50
-rw-r--r--src/main/java/org/onap/aai/cacher/common/MongoHelperSingleton.java47
-rw-r--r--src/main/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessor.java105
-rw-r--r--src/main/java/org/onap/aai/cacher/dmaap/consumer/AAIParentEventConsumer.java13
-rw-r--r--src/main/java/org/onap/aai/cacher/dmaap/consumer/DmaapConsumerSingleton.java9
-rw-r--r--src/main/java/org/onap/aai/cacher/egestion/printer/strategy/AAIResourceGetAllPayloadPrinterStrategy.java205
-rw-r--r--src/main/java/org/onap/aai/cacher/egestion/printer/strategy/NonePayloadPrinterStrategy.java1
-rw-r--r--src/main/java/org/onap/aai/cacher/egestion/printer/strategy/PayloadPrinterType.java13
-rw-r--r--src/main/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceDmaapParserStrategy.java470
-rw-r--r--src/main/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceGetAllPayloadParserStrategy.java214
-rw-r--r--src/main/java/org/onap/aai/cacher/injestion/parser/strategy/PayloadParserType.java42
-rw-r--r--src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/AAIResourcesUriTemplates.java (renamed from src/main/java/org/onap/aai/cacher/injestion/parser/AAIResourcesUriTemplates.java)66
-rw-r--r--src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/AAIUriSegment.java73
-rw-r--r--src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/AAIRelatedToDetails.java54
-rw-r--r--src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/AAIResourceDmaapParserStrategy.java327
-rw-r--r--src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/DmaapAction.java38
-rw-r--r--src/main/java/org/onap/aai/cacher/model/CacheEntry.java56
-rw-r--r--src/main/java/org/onap/aai/cacher/service/helper/CacheHelperService.java78
-rw-r--r--src/main/java/org/onap/aai/cacher/service/rest/CacheKeyService.java7
-rw-r--r--src/main/java/org/onap/aai/cacher/service/rest/util/CacheKeyRequestValidation.java17
-rw-r--r--src/main/java/org/onap/aai/cacher/service/tasks/ScheduledTasks.java7
-rw-r--r--src/main/java/org/onap/aai/cacher/util/RestClient.java15
-rw-r--r--src/main/java/org/onap/aai/cacher/web/JerseyConfiguration.java1
-rw-r--r--src/main/resources/etc/appprops/aai-resources-uri-templates.properties2
-rw-r--r--src/main/resources/etc/appprops/aaiDmaaPEventConsumer.properties26
-rw-r--r--src/main/resources/etc/appprops/aaiconfig.properties8
-rw-r--r--src/main/resources/etc/appprops/error.properties1
-rw-r--r--src/main/resources/etc/appprops/initialcachekeyconfig.json8
-rw-r--r--src/main/resources/etc/auth/aai-client-cert.p12bin7954 -> 0 bytes
-rw-r--r--src/main/resources/logback.xml7
-rw-r--r--src/test/java/org/onap/aai/cacher/common/LimitTest.java429
-rw-r--r--src/test/java/org/onap/aai/cacher/common/MongoHelperSingletonNoFakeTest.java27
-rw-r--r--src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessorScenariosTest.java419
-rw-r--r--src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessorTest.java26
-rw-r--r--src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIEventConsumerTest.java67
-rw-r--r--src/test/java/org/onap/aai/cacher/injestion/parser/AAIResourcesUriTemplatesTest.java117
-rw-r--r--src/test/java/org/onap/aai/cacher/injestion/parser/InjestionTestComponent.java2
-rw-r--r--src/test/java/org/onap/aai/cacher/injestion/parser/PayloadParserServiceTest.java86
-rw-r--r--src/test/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceDmaapParserStrategyTest.java429
-rw-r--r--src/test/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceDmaapParserStrategyTestConstants.java12
-rw-r--r--src/test/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/AAIResourceDmaapParserStrategyTest.java360
-rw-r--r--src/test/java/org/onap/aai/cacher/model/CacheKeyTest.java20
-rw-r--r--src/test/java/org/onap/aai/cacher/service/helper/CacheHelperServiceScenariosTest.java50
-rw-r--r--src/test/java/org/onap/aai/cacher/service/rest/util/CacheKeyRequestValidationTest.java12
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/address-list.json4
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/allotted-resource.json53
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/create-generic-vnf-with-children-update-generic-vnf-property.json710
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/createPserverCreateCRWithNestingAndRelsToUpdateRemovingARelTest.json151
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/createPserverRelationshipsToNonExistingTest.json90
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/createPserverWithNestedDeleteNested.json56
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/createPserverWithoutNestedAddNested.json49
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/cvlan-tag-entry-create.json32
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/cvlan-tag-entry.json61
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/cvlan-tag.json61
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/deleteRelationship/1-create-logical-link.json4
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/deleteRelationship/2-create-generic-vnf.json4
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/deleteRelationship/3-create-rel-generic-vnf-vlan-to-logical-link.json6
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/deleteRelationship/4-delete-rel-to-generic-vnf-vlan-from-logical-link.json4
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/large-pserver.json4
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/linterfaceWithLinterfaceTest.json57
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/nos.json10
-rw-r--r--src/test/resources/test/payloads/dmaapEvents/vce.json4
-rw-r--r--src/test/resources/test/payloads/json/generic-vnfs-one-with-nesting-with-address-list.json86
-rw-r--r--src/test/resources/test/payloads/json/generic-vnfs-one-with-nesting.json78
-rw-r--r--src/test/resources/test/payloads/json/one-cr-with-nested-dupe-get-all.json183
-rw-r--r--src/test/resources/test/payloads/json/pservers-one-with-nesting.json143
-rw-r--r--src/test/resources/test/payloads/json/test-empty.json6
70 files changed, 4591 insertions, 1454 deletions
diff --git a/pom.xml b/pom.xml
index fd8ed5b..de64ad2 100644
--- 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 -->
@@ -394,66 +394,71 @@
<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>
@@ -470,7 +475,6 @@
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>
@@ -691,11 +695,11 @@
<!-- 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>
@@ -709,8 +713,8 @@
<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>
diff --git a/src/main/docker/docker-entrypoint.sh b/src/main/docker/docker-entrypoint.sh
index 06fd7f4..7d53478 100644
--- a/src/main/docker/docker-entrypoint.sh
+++ b/src/main/docker/docker-entrypoint.sh
@@ -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";
diff --git a/src/main/java/org/onap/aai/cacher/Application.java b/src/main/java/org/onap/aai/cacher/Application.java
index 9382f4b..6d40b68 100644
--- a/src/main/java/org/onap/aai/cacher/Application.java
+++ b/src/main/java/org/onap/aai/cacher/Application.java
@@ -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() {
diff --git a/src/main/java/org/onap/aai/cacher/common/MongoConfig.java b/src/main/java/org/onap/aai/cacher/common/MongoConfig.java
index d08930b..5c1a541 100644
--- a/src/main/java/org/onap/aai/cacher/common/MongoConfig.java
+++ b/src/main/java/org/onap/aai/cacher/common/MongoConfig.java
@@ -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;
}
diff --git a/src/main/java/org/onap/aai/cacher/common/MongoHelperSingleton.java b/src/main/java/org/onap/aai/cacher/common/MongoHelperSingleton.java
index 63638f1..a94f36a 100644
--- a/src/main/java/org/onap/aai/cacher/common/MongoHelperSingleton.java
+++ b/src/main/java/org/onap/aai/cacher/common/MongoHelperSingleton.java
@@ -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;
+ }
+
}
diff --git a/src/main/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessor.java b/src/main/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessor.java
index 5c684a2..3f28a26 100644
--- a/src/main/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessor.java
+++ b/src/main/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessor.java
@@ -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;
}
}
diff --git a/src/main/java/org/onap/aai/cacher/dmaap/consumer/AAIParentEventConsumer.java b/src/main/java/org/onap/aai/cacher/dmaap/consumer/AAIParentEventConsumer.java
index 8d64116..2530828 100644
--- a/src/main/java/org/onap/aai/cacher/dmaap/consumer/AAIParentEventConsumer.java
+++ b/src/main/java/org/onap/aai/cacher/dmaap/consumer/AAIParentEventConsumer.java
@@ -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="
diff --git a/src/main/java/org/onap/aai/cacher/dmaap/consumer/DmaapConsumerSingleton.java b/src/main/java/org/onap/aai/cacher/dmaap/consumer/DmaapConsumerSingleton.java
index 5c2faa3..a88e48d 100644
--- a/src/main/java/org/onap/aai/cacher/dmaap/consumer/DmaapConsumerSingleton.java
+++ b/src/main/java/org/onap/aai/cacher/dmaap/consumer/DmaapConsumerSingleton.java
@@ -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;
diff --git a/src/main/java/org/onap/aai/cacher/egestion/printer/strategy/AAIResourceGetAllPayloadPrinterStrategy.java b/src/main/java/org/onap/aai/cacher/egestion/printer/strategy/AAIResourceGetAllPayloadPrinterStrategy.java
index 8dfeb0b..4b483c3 100644
--- a/src/main/java/org/onap/aai/cacher/egestion/printer/strategy/AAIResourceGetAllPayloadPrinterStrategy.java
+++ b/src/main/java/org/onap/aai/cacher/egestion/printer/strategy/AAIResourceGetAllPayloadPrinterStrategy.java
@@ -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;
}
}
diff --git a/src/main/java/org/onap/aai/cacher/egestion/printer/strategy/NonePayloadPrinterStrategy.java b/src/main/java/org/onap/aai/cacher/egestion/printer/strategy/NonePayloadPrinterStrategy.java
index 3aecfe8..52001c9 100644
--- a/src/main/java/org/onap/aai/cacher/egestion/printer/strategy/NonePayloadPrinterStrategy.java
+++ b/src/main/java/org/onap/aai/cacher/egestion/printer/strategy/NonePayloadPrinterStrategy.java
@@ -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;
diff --git a/src/main/java/org/onap/aai/cacher/egestion/printer/strategy/PayloadPrinterType.java b/src/main/java/org/onap/aai/cacher/egestion/printer/strategy/PayloadPrinterType.java
index d83d622..b05bcab 100644
--- a/src/main/java/org/onap/aai/cacher/egestion/printer/strategy/PayloadPrinterType.java
+++ b/src/main/java/org/onap/aai/cacher/egestion/printer/strategy/PayloadPrinterType.java
@@ -20,10 +20,19 @@
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
index 6de0585..0000000
--- a/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceDmaapParserStrategy.java
+++ /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;
- }
- }
-}
diff --git a/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceGetAllPayloadParserStrategy.java b/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceGetAllPayloadParserStrategy.java
index 1c2f6cf..c03af62 100644
--- a/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceGetAllPayloadParserStrategy.java
+++ b/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceGetAllPayloadParserStrategy.java
@@ -17,12 +17,13 @@
* 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;
+ }
}
diff --git a/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/PayloadParserType.java b/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/PayloadParserType.java
index b497a8c..0e46b2f 100644
--- a/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/PayloadParserType.java
+++ b/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/PayloadParserType.java
@@ -20,26 +20,38 @@
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);
+ }
}
+
diff --git a/src/main/java/org/onap/aai/cacher/injestion/parser/AAIResourcesUriTemplates.java b/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/AAIResourcesUriTemplates.java
index 0885851..887e4d3 100644
--- a/src/main/java/org/onap/aai/cacher/injestion/parser/AAIResourcesUriTemplates.java
+++ b/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/AAIResourcesUriTemplates.java
@@ -17,11 +17,15 @@
* 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
index 0000000..7624a91
--- /dev/null
+++ b/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/AAIUriSegment.java
@@ -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
index 0000000..cd18ee8
--- /dev/null
+++ b/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/AAIRelatedToDetails.java
@@ -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
index 0000000..8d88a4a
--- /dev/null
+++ b/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/AAIResourceDmaapParserStrategy.java
@@ -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
index 0000000..73aafd3
--- /dev/null
+++ b/src/main/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/DmaapAction.java
@@ -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
diff --git a/src/main/java/org/onap/aai/cacher/model/CacheEntry.java b/src/main/java/org/onap/aai/cacher/model/CacheEntry.java
index ed6715e..0fd5c92 100644
--- a/src/main/java/org/onap/aai/cacher/model/CacheEntry.java
+++ b/src/main/java/org/onap/aai/cacher/model/CacheEntry.java
@@ -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;
}
}
diff --git a/src/main/java/org/onap/aai/cacher/service/helper/CacheHelperService.java b/src/main/java/org/onap/aai/cacher/service/helper/CacheHelperService.java
index 8b85174..9997609 100644
--- a/src/main/java/org/onap/aai/cacher/service/helper/CacheHelperService.java
+++ b/src/main/java/org/onap/aai/cacher/service/helper/CacheHelperService.java
@@ -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();
}
diff --git a/src/main/java/org/onap/aai/cacher/service/rest/CacheKeyService.java b/src/main/java/org/onap/aai/cacher/service/rest/CacheKeyService.java
index 962be77..432b23c 100644
--- a/src/main/java/org/onap/aai/cacher/service/rest/CacheKeyService.java
+++ b/src/main/java/org/onap/aai/cacher/service/rest/CacheKeyService.java
@@ -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 {
diff --git a/src/main/java/org/onap/aai/cacher/service/rest/util/CacheKeyRequestValidation.java b/src/main/java/org/onap/aai/cacher/service/rest/util/CacheKeyRequestValidation.java
index 4df1921..2f3ecde 100644
--- a/src/main/java/org/onap/aai/cacher/service/rest/util/CacheKeyRequestValidation.java
+++ b/src/main/java/org/onap/aai/cacher/service/rest/util/CacheKeyRequestValidation.java
@@ -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<>();
diff --git a/src/main/java/org/onap/aai/cacher/service/tasks/ScheduledTasks.java b/src/main/java/org/onap/aai/cacher/service/tasks/ScheduledTasks.java
index 78c88c7..7497f10 100644
--- a/src/main/java/org/onap/aai/cacher/service/tasks/ScheduledTasks.java
+++ b/src/main/java/org/onap/aai/cacher/service/tasks/ScheduledTasks.java
@@ -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);
}
}
diff --git a/src/main/java/org/onap/aai/cacher/util/RestClient.java b/src/main/java/org/onap/aai/cacher/util/RestClient.java
index 0caffd3..9613d81 100644
--- a/src/main/java/org/onap/aai/cacher/util/RestClient.java
+++ b/src/main/java/org/onap/aai/cacher/util/RestClient.java
@@ -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
diff --git a/src/main/java/org/onap/aai/cacher/web/JerseyConfiguration.java b/src/main/java/org/onap/aai/cacher/web/JerseyConfiguration.java
index 6498f2f..b18e840 100644
--- a/src/main/java/org/onap/aai/cacher/web/JerseyConfiguration.java
+++ b/src/main/java/org/onap/aai/cacher/web/JerseyConfiguration.java
@@ -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;
diff --git a/src/main/resources/etc/appprops/aai-resources-uri-templates.properties b/src/main/resources/etc/appprops/aai-resources-uri-templates.properties
index 44066e1..2e3de7a 100644
--- a/src/main/resources/etc/appprops/aai-resources-uri-templates.properties
+++ b/src/main/resources/etc/appprops/aai-resources-uri-templates.properties
@@ -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}
diff --git a/src/main/resources/etc/appprops/aaiDmaaPEventConsumer.properties b/src/main/resources/etc/appprops/aaiDmaaPEventConsumer.properties
index 398e175..378db93 100644
--- a/src/main/resources/etc/appprops/aaiDmaaPEventConsumer.properties
+++ b/src/main/resources/etc/appprops/aaiDmaaPEventConsumer.properties
@@ -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
diff --git a/src/main/resources/etc/appprops/aaiconfig.properties b/src/main/resources/etc/appprops/aaiconfig.properties
index 0524c13..36d616c 100644
--- a/src/main/resources/etc/appprops/aaiconfig.properties
+++ b/src/main/resources/etc/appprops/aaiconfig.properties
@@ -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
diff --git a/src/main/resources/etc/appprops/error.properties b/src/main/resources/etc/appprops/error.properties
index 896df00..48e375d 100644
--- a/src/main/resources/etc/appprops/error.properties
+++ b/src/main/resources/etc/appprops/error.properties
@@ -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
diff --git a/src/main/resources/etc/appprops/initialcachekeyconfig.json b/src/main/resources/etc/appprops/initialcachekeyconfig.json
index f1fdabe..d2bb66d 100644
--- a/src/main/resources/etc/appprops/initialcachekeyconfig.json
+++ b/src/main/resources/etc/appprops/initialcachekeyconfig.json
@@ -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
index 292efb7..0000000
--- a/src/main/resources/etc/auth/aai-client-cert.p12
+++ /dev/null
Binary files differ
diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml
index 9caabe6..3bcb0ba 100644
--- a/src/main/resources/logback.xml
+++ b/src/main/resources/logback.xml
@@ -170,7 +170,12 @@
<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
index 0000000..366181d
--- /dev/null
+++ b/src/test/java/org/onap/aai/cacher/common/LimitTest.java
@@ -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
diff --git a/src/test/java/org/onap/aai/cacher/common/MongoHelperSingletonNoFakeTest.java b/src/test/java/org/onap/aai/cacher/common/MongoHelperSingletonNoFakeTest.java
index 1a086bc..3f236a2 100644
--- a/src/test/java/org/onap/aai/cacher/common/MongoHelperSingletonNoFakeTest.java
+++ b/src/test/java/org/onap/aai/cacher/common/MongoHelperSingletonNoFakeTest.java
@@ -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());
}
diff --git a/src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessorScenariosTest.java b/src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessorScenariosTest.java
index 2c01f5a..c5d39a0 100644
--- a/src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessorScenariosTest.java
+++ b/src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessorScenariosTest.java
@@ -19,30 +19,28 @@
*/
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,13 +377,49 @@ 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 {
String nos = getEventPayload("nos");
@@ -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
diff --git a/src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessorTest.java b/src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessorTest.java
index 8fcd7e2..0a7bc4a 100644
--- a/src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessorTest.java
+++ b/src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIDmaapEventProcessorTest.java
@@ -19,14 +19,10 @@
*/
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);
}
diff --git a/src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIEventConsumerTest.java b/src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIEventConsumerTest.java
index 3ca3390..12d1416 100644
--- a/src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIEventConsumerTest.java
+++ b/src/test/java/org/onap/aai/cacher/dmaap/consumer/AAIEventConsumerTest.java
@@ -20,30 +20,17 @@
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() {
diff --git a/src/test/java/org/onap/aai/cacher/injestion/parser/AAIResourcesUriTemplatesTest.java b/src/test/java/org/onap/aai/cacher/injestion/parser/AAIResourcesUriTemplatesTest.java
index a48712f..d093b6c 100644
--- a/src/test/java/org/onap/aai/cacher/injestion/parser/AAIResourcesUriTemplatesTest.java
+++ b/src/test/java/org/onap/aai/cacher/injestion/parser/AAIResourcesUriTemplatesTest.java
@@ -19,27 +19,80 @@
*/
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
diff --git a/src/test/java/org/onap/aai/cacher/injestion/parser/InjestionTestComponent.java b/src/test/java/org/onap/aai/cacher/injestion/parser/InjestionTestComponent.java
index 34cc8a3..0d80aca 100644
--- a/src/test/java/org/onap/aai/cacher/injestion/parser/InjestionTestComponent.java
+++ b/src/test/java/org/onap/aai/cacher/injestion/parser/InjestionTestComponent.java
@@ -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());
diff --git a/src/test/java/org/onap/aai/cacher/injestion/parser/PayloadParserServiceTest.java b/src/test/java/org/onap/aai/cacher/injestion/parser/PayloadParserServiceTest.java
index 1579323..ddac8e3 100644
--- a/src/test/java/org/onap/aai/cacher/injestion/parser/PayloadParserServiceTest.java
+++ b/src/test/java/org/onap/aai/cacher/injestion/parser/PayloadParserServiceTest.java
@@ -19,21 +19,38 @@
*/
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
index 8a4ab0b..0000000
--- a/src/test/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceDmaapParserStrategyTest.java
+++ /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
diff --git a/src/test/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceDmaapParserStrategyTestConstants.java b/src/test/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceDmaapParserStrategyTestConstants.java
index 659c881..53017f0 100644
--- a/src/test/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceDmaapParserStrategyTestConstants.java
+++ b/src/test/java/org/onap/aai/cacher/injestion/parser/strategy/AAIResourceDmaapParserStrategyTestConstants.java
@@ -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
index 0000000..5a87323
--- /dev/null
+++ b/src/test/java/org/onap/aai/cacher/injestion/parser/strategy/aai/dmaap/AAIResourceDmaapParserStrategyTest.java
@@ -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
diff --git a/src/test/java/org/onap/aai/cacher/model/CacheKeyTest.java b/src/test/java/org/onap/aai/cacher/model/CacheKeyTest.java
index 19a3b3b..fb2baa2 100644
--- a/src/test/java/org/onap/aai/cacher/model/CacheKeyTest.java
+++ b/src/test/java/org/onap/aai/cacher/model/CacheKeyTest.java
@@ -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());
diff --git a/src/test/java/org/onap/aai/cacher/service/helper/CacheHelperServiceScenariosTest.java b/src/test/java/org/onap/aai/cacher/service/helper/CacheHelperServiceScenariosTest.java
index f4543ad..00beab6 100644
--- a/src/test/java/org/onap/aai/cacher/service/helper/CacheHelperServiceScenariosTest.java
+++ b/src/test/java/org/onap/aai/cacher/service/helper/CacheHelperServiceScenariosTest.java
@@ -19,18 +19,11 @@
*/
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());
+
+ }
}
diff --git a/src/test/java/org/onap/aai/cacher/service/rest/util/CacheKeyRequestValidationTest.java b/src/test/java/org/onap/aai/cacher/service/rest/util/CacheKeyRequestValidationTest.java
index 53f90a3..047ca05 100644
--- a/src/test/java/org/onap/aai/cacher/service/rest/util/CacheKeyRequestValidationTest.java
+++ b/src/test/java/org/onap/aai/cacher/service/rest/util/CacheKeyRequestValidationTest.java
@@ -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);
+ }
}
diff --git a/src/test/resources/test/payloads/dmaapEvents/address-list.json b/src/test/resources/test/payloads/dmaapEvents/address-list.json
index b2ea6b8..f8835f3 100644
--- a/src/test/resources/test/payloads/dmaapEvents/address-list.json
+++ b/src/test/resources/test/payloads/dmaapEvents/address-list.json
@@ -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
index 0000000..19b12e3
--- /dev/null
+++ b/src/test/resources/test/payloads/dmaapEvents/allotted-resource.json
@@ -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
index 0000000..299bd46
--- /dev/null
+++ b/src/test/resources/test/payloads/dmaapEvents/create-generic-vnf-with-children-update-generic-vnf-property.json
@@ -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
index 0000000..729e0d8
--- /dev/null
+++ b/src/test/resources/test/payloads/dmaapEvents/createPserverCreateCRWithNestingAndRelsToUpdateRemovingARelTest.json
@@ -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
index 0000000..98e5aac
--- /dev/null
+++ b/src/test/resources/test/payloads/dmaapEvents/createPserverRelationshipsToNonExistingTest.json
@@ -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
index 0000000..14fe9dc
--- /dev/null
+++ b/src/test/resources/test/payloads/dmaapEvents/createPserverWithNestedDeleteNested.json
@@ -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
index 0000000..de21ff1
--- /dev/null
+++ b/src/test/resources/test/payloads/dmaapEvents/createPserverWithoutNestedAddNested.json
@@ -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
index 0000000..062d788
--- /dev/null
+++ b/src/test/resources/test/payloads/dmaapEvents/cvlan-tag-entry-create.json
@@ -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
index 0000000..e6ac86f
--- /dev/null
+++ b/src/test/resources/test/payloads/dmaapEvents/cvlan-tag-entry.json
@@ -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
index 0000000..5be2593
--- /dev/null
+++ b/src/test/resources/test/payloads/dmaapEvents/cvlan-tag.json
@@ -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
diff --git a/src/test/resources/test/payloads/dmaapEvents/deleteRelationship/1-create-logical-link.json b/src/test/resources/test/payloads/dmaapEvents/deleteRelationship/1-create-logical-link.json
index 5277b3d..865a200 100644
--- a/src/test/resources/test/payloads/dmaapEvents/deleteRelationship/1-create-logical-link.json
+++ b/src/test/resources/test/payloads/dmaapEvents/deleteRelationship/1-create-logical-link.json
@@ -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": {
diff --git a/src/test/resources/test/payloads/dmaapEvents/deleteRelationship/2-create-generic-vnf.json b/src/test/resources/test/payloads/dmaapEvents/deleteRelationship/2-create-generic-vnf.json
index 57fe6a2..d723740 100644
--- a/src/test/resources/test/payloads/dmaapEvents/deleteRelationship/2-create-generic-vnf.json
+++ b/src/test/resources/test/payloads/dmaapEvents/deleteRelationship/2-create-generic-vnf.json
@@ -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": {
diff --git a/src/test/resources/test/payloads/dmaapEvents/deleteRelationship/3-create-rel-generic-vnf-vlan-to-logical-link.json b/src/test/resources/test/payloads/dmaapEvents/deleteRelationship/3-create-rel-generic-vnf-vlan-to-logical-link.json
index bdfabe8..1c542f9 100644
--- a/src/test/resources/test/payloads/dmaapEvents/deleteRelationship/3-create-rel-generic-vnf-vlan-to-logical-link.json
+++ b/src/test/resources/test/payloads/dmaapEvents/deleteRelationship/3-create-rel-generic-vnf-vlan-to-logical-link.json
@@ -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"
}
]
diff --git a/src/test/resources/test/payloads/dmaapEvents/deleteRelationship/4-delete-rel-to-generic-vnf-vlan-from-logical-link.json b/src/test/resources/test/payloads/dmaapEvents/deleteRelationship/4-delete-rel-to-generic-vnf-vlan-from-logical-link.json
index 20c2278..341589e 100644
--- a/src/test/resources/test/payloads/dmaapEvents/deleteRelationship/4-delete-rel-to-generic-vnf-vlan-from-logical-link.json
+++ b/src/test/resources/test/payloads/dmaapEvents/deleteRelationship/4-delete-rel-to-generic-vnf-vlan-from-logical-link.json
@@ -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": {
diff --git a/src/test/resources/test/payloads/dmaapEvents/large-pserver.json b/src/test/resources/test/payloads/dmaapEvents/large-pserver.json
index 1d7cf14..0ca88b2 100644
--- a/src/test/resources/test/payloads/dmaapEvents/large-pserver.json
+++ b/src/test/resources/test/payloads/dmaapEvents/large-pserver.json
@@ -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
index 0000000..cd59e8e
--- /dev/null
+++ b/src/test/resources/test/payloads/dmaapEvents/linterfaceWithLinterfaceTest.json
@@ -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
diff --git a/src/test/resources/test/payloads/dmaapEvents/nos.json b/src/test/resources/test/payloads/dmaapEvents/nos.json
index 3efe88f..74d2ae6 100644
--- a/src/test/resources/test/payloads/dmaapEvents/nos.json
+++ b/src/test/resources/test/payloads/dmaapEvents/nos.json
@@ -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": [
{
diff --git a/src/test/resources/test/payloads/dmaapEvents/vce.json b/src/test/resources/test/payloads/dmaapEvents/vce.json
index adae7ee..2d466ec 100644
--- a/src/test/resources/test/payloads/dmaapEvents/vce.json
+++ b/src/test/resources/test/payloads/dmaapEvents/vce.json
@@ -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
index 0000000..76374c4
--- /dev/null
+++ b/src/test/resources/test/payloads/json/generic-vnfs-one-with-nesting-with-address-list.json
@@ -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
index 0000000..eba9a99
--- /dev/null
+++ b/src/test/resources/test/payloads/json/generic-vnfs-one-with-nesting.json
@@ -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
index 0000000..1b4dd96
--- /dev/null
+++ b/src/test/resources/test/payloads/json/one-cr-with-nested-dupe-get-all.json
@@ -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
index 0000000..73e6293
--- /dev/null
+++ b/src/test/resources/test/payloads/json/pservers-one-with-nesting.json
@@ -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
index 0000000..07ab7ce
--- /dev/null
+++ b/src/test/resources/test/payloads/json/test-empty.json
@@ -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