diff options
author | 2019-01-22 15:02:47 -0500 | |
---|---|---|
committer | 2019-01-22 15:03:05 -0500 | |
commit | 34ca2877182d1a505015578b0728f32452ac5cbb (patch) | |
tree | 324e52ca003d2acac7d2a40b8786d89b89886cb5 | |
parent | 4e579fc1bca9fdc42d294b21541cfe80cb0c60a2 (diff) |
update cacher repo with v15
Issue-ID: AAI-2112
Change-Id: I8aab3d9c498d217638d50b8fde5f500b556d7fd0
Signed-off-by: LaMont, William (wl2432) <wl2432@att.com>
70 files changed, 4591 insertions, 1454 deletions
@@ -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 Binary files differdeleted file mode 100644 index 292efb7..0000000 --- a/src/main/resources/etc/auth/aai-client-cert.p12 +++ /dev/null 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 |