From: Nandkishor Patke Date: Wed, 5 Jun 2024 03:02:14 +0000 (+0000) Subject: Merge "Release 1.14.0 maven artifact" X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;ds=sidebyside;h=HEAD;hp=4f1dc27fb502b6b84e1af90b05b56fd97d8e9194;p=aai%2Faai-common.git Merge "Release 1.14.0 maven artifact" --- diff --git a/aai-aaf-auth/pom.xml b/aai-aaf-auth/pom.xml index 0fa1e8c8..f0ef4a96 100644 --- a/aai-aaf-auth/pom.xml +++ b/aai-aaf-auth/pom.xml @@ -6,7 +6,7 @@ org.onap.aai.aai-common aai-parent - 1.13.6-SNAPSHOT + 1.14.0-SNAPSHOT ../aai-parent/pom.xml aai-aaf-auth diff --git a/aai-annotations/pom.xml b/aai-annotations/pom.xml index cae569de..7f92056d 100644 --- a/aai-annotations/pom.xml +++ b/aai-annotations/pom.xml @@ -27,7 +27,7 @@ org.onap.aai.aai-common aai-parent - 1.13.6-SNAPSHOT + 1.14.0-SNAPSHOT ../aai-parent/pom.xml aai-annotations diff --git a/aai-auth/pom.xml b/aai-auth/pom.xml index 7ff240b9..5de5805a 100644 --- a/aai-auth/pom.xml +++ b/aai-auth/pom.xml @@ -27,7 +27,7 @@ org.onap.aai.aai-common aai-parent - 1.13.6-SNAPSHOT + 1.14.0-SNAPSHOT ../aai-parent/pom.xml aai-auth diff --git a/aai-common-docker/aai-common-images/pom.xml b/aai-common-docker/aai-common-images/pom.xml index 1695edbc..a4d4cd7a 100644 --- a/aai-common-docker/aai-common-images/pom.xml +++ b/aai-common-docker/aai-common-images/pom.xml @@ -25,11 +25,11 @@ org.onap.aai.aai-common aai-common-docker - 1.13.6-SNAPSHOT + 1.14.0-SNAPSHOT aai-common-images - 1.13.6-SNAPSHOT + 1.14.0-SNAPSHOT pom aai-aai-common-images Contains dockerfiles for aai-common images (alpine and ubuntu based). diff --git a/aai-common-docker/aai-haproxy-image/pom.xml b/aai-common-docker/aai-haproxy-image/pom.xml index 5f439483..df458adc 100644 --- a/aai-common-docker/aai-haproxy-image/pom.xml +++ b/aai-common-docker/aai-haproxy-image/pom.xml @@ -25,11 +25,11 @@ org.onap.aai.aai-common aai-common-docker - 1.13.6-SNAPSHOT + 1.14.0-SNAPSHOT aai-haproxy-image - 1.13.6-SNAPSHOT + 1.14.0-SNAPSHOT pom aai-aai-haproxy-image Contains dockerfiles for aai-haproxy image. diff --git a/aai-common-docker/pom.xml b/aai-common-docker/pom.xml index 5c0298b9..bdf67218 100644 --- a/aai-common-docker/pom.xml +++ b/aai-common-docker/pom.xml @@ -26,7 +26,7 @@ org.onap.aai.aai-common aai-parent - 1.13.6-SNAPSHOT + 1.14.0-SNAPSHOT ../aai-parent/pom.xml diff --git a/aai-core/pom.xml b/aai-core/pom.xml index b9814e8e..86ae0971 100644 --- a/aai-core/pom.xml +++ b/aai-core/pom.xml @@ -26,7 +26,7 @@ limitations under the License. org.onap.aai.aai-common aai-parent - 1.13.6-SNAPSHOT + 1.14.0-SNAPSHOT ../aai-parent/pom.xml aai-core @@ -365,6 +365,12 @@ limitations under the License. org.skyscreamer jsonassert test + + + com.vaadin.external.google + android-json + + org.apache.httpcomponents @@ -396,6 +402,10 @@ limitations under the License. com.fasterxml.jackson.core jackson-annotations + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + com.fasterxml.jackson.dataformat jackson-dataformat-yaml diff --git a/aai-core/src/main/java/org/onap/aai/dbgen/GraphSONPartialIO.java b/aai-core/src/main/java/org/onap/aai/dbgen/GraphSONPartialIO.java index 6c2eee15..c097a5bf 100644 --- a/aai-core/src/main/java/org/onap/aai/dbgen/GraphSONPartialIO.java +++ b/aai-core/src/main/java/org/onap/aai/dbgen/GraphSONPartialIO.java @@ -129,16 +129,6 @@ public final class GraphSONPartialIO this.version = version; } - /** - * @deprecated As of release 3.2.2, replaced by {@link #onMapper(Consumer)}. - */ - @Deprecated - @Override - public Io.Builder registry(final IoRegistry registry) { - this.registry = registry; - return this; - } - @Override public Io.Builder onMapper(final Consumer onMapper) { this.onMapper = onMapper; diff --git a/aai-core/src/main/java/org/onap/aai/dbmap/AAIGraph.java b/aai-core/src/main/java/org/onap/aai/dbmap/AAIGraph.java index d9994f52..15f57c13 100644 --- a/aai-core/src/main/java/org/onap/aai/dbmap/AAIGraph.java +++ b/aai-core/src/main/java/org/onap/aai/dbmap/AAIGraph.java @@ -70,6 +70,7 @@ public class AAIGraph { } this.loadGraph(rtConfig, serviceName); } catch (Exception e) { + logger.error("Failed to instantiate graph", e); throw new RuntimeException("Failed to instantiate graphs", e); } } diff --git a/aai-core/src/main/java/org/onap/aai/prevalidation/ValidationService.java b/aai-core/src/main/java/org/onap/aai/prevalidation/ValidationService.java index 70e16e27..939c8389 100644 --- a/aai-core/src/main/java/org/onap/aai/prevalidation/ValidationService.java +++ b/aai-core/src/main/java/org/onap/aai/prevalidation/ValidationService.java @@ -29,6 +29,7 @@ import java.net.ConnectException; import java.net.SocketTimeoutException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -46,7 +47,6 @@ import org.onap.aai.rest.ueb.NotificationEvent; import org.onap.aai.restclient.RestClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Profile; @@ -63,55 +63,33 @@ import org.springframework.stereotype.Service; @Profile("pre-validation") public class ValidationService { - /** - * Error indicating that the service trying to connect is down - */ static final String CONNECTION_REFUSED_STRING = "Connection refused to the validation microservice due to service unreachable"; - - /** - * Error indicating that the server is unable to reach the port - * Could be server related connectivity issue - */ static final String CONNECTION_TIMEOUT_STRING = "Connection timeout to the validation microservice as this could " + "indicate the server is unable to reach port, " + "please check on server by running: nc -w10 -z -v ${VALIDATION_HOST} ${VALIDATION_PORT}"; - - /** - * Error indicating that the request exceeded the allowed time - * - * Note: This means that the service could be active its - * just taking some time to process our request - */ static final String REQUEST_TIMEOUT_STRING = "Request to validation service took longer than the currently set timeout"; - static final String VALIDATION_ENDPOINT = "/v1/validate"; static final String VALIDATION_HEALTH_ENDPOINT = "/v1/info"; + private static final Logger LOGGER = LoggerFactory.getLogger(ValidationService.class); private static final String ENTITY_TYPE = "entity-type"; private static final String ACTION = "action"; private static final String SOURCE_NAME = "source-name"; - private static final String DELETE = "DELETE"; - private static final Logger LOGGER = LoggerFactory.getLogger(ValidationService.class); - private final RestClient validationRestClient; - private final String appName; - private final Set validationNodeTypes; + private final Gson gson; private List exclusionList; - private final Gson gson; - - @Autowired public ValidationService(@Qualifier("validationRestClient") RestClient validationRestClient, @Value("${spring.application.name}") String appName, @Value("${validation.service.node-types}") String validationNodes, - @Value("${validation.service.exclusion-regexes}") String exclusionRegexes) { + @Value("${validation.service.exclusion-regexes:#{null}}") String exclusionRegexes) { this.validationRestClient = validationRestClient; this.appName = appName; @@ -129,20 +107,19 @@ public class ValidationService { @PostConstruct public void initialize() throws AAIException { + doHealthCheckRequest(); + } + private void doHealthCheckRequest() throws AAIException { Map httpHeaders = new HashMap<>(); - httpHeaders.put("X-FromAppId", appName); httpHeaders.put("X-TransactionID", UUID.randomUUID().toString()); httpHeaders.put("Content-Type", "application/json"); ResponseEntity healthCheckResponse = null; - try { - healthCheckResponse = validationRestClient.execute(VALIDATION_HEALTH_ENDPOINT, HttpMethod.GET, httpHeaders, null); - } catch (Exception ex) { AAIException validationException = new AAIException("AAI_4021", ex); throw validationException; @@ -160,50 +137,29 @@ public class ValidationService { } public void validate(List notificationEvents) throws AAIException { - - if (notificationEvents == null || notificationEvents.isEmpty()) { + if (notificationEvents == null || notificationEvents.isEmpty() || isSourceExcluded(notificationEvents)) { return; } - { - // Get the first notification and if the source of that notification - // is in one of the regexes then we skip sending it to validation - NotificationEvent notification = notificationEvents.get(0); - Introspector eventHeader = notification.getEventHeader(); - if (eventHeader != null) { - String source = eventHeader.getValue(SOURCE_NAME); - for (Pattern pattern : exclusionList) { - if (pattern.matcher(source).matches()) { - return; - } - } - } - - } - for (NotificationEvent event : notificationEvents) { - Introspector eventHeader = event.getEventHeader(); - if (eventHeader == null) { // Should I skip processing the request and let it continue // or fail the request and cause client impact continue; } - String entityType = eventHeader.getValue(ENTITY_TYPE); - String action = eventHeader.getValue(ACTION); - - /** + /* * Skipping the delete events for now * Note: Might revisit this later when validation supports DELETE events */ - if (DELETE.equalsIgnoreCase(action)) { + if (isDelete(eventHeader)) { continue; } + String entityType = eventHeader.getValue(ENTITY_TYPE); if (this.shouldValidate(entityType)) { - List violations = this.preValidate(event.getNotificationEvent()); + List violations = preValidate(event.getNotificationEvent()); if (!violations.isEmpty()) { AAIException aaiException = new AAIException("AAI_4019"); aaiException.getTemplateVars().addAll(violations); @@ -213,10 +169,33 @@ public class ValidationService { } } - List preValidate(String body) throws AAIException { + /** + * Determine if event is of type delete + */ + private boolean isDelete(Introspector eventHeader) { + String action = eventHeader.getValue(ACTION); + return DELETE.equalsIgnoreCase(action); + } + + /** + * Checks the `source` attribute of the first event to determine if validation should be skipped + * @param notificationEvents + * @return + */ + private boolean isSourceExcluded(List notificationEvents) { + // Get the first notification and if the source of that notification + // is in one of the regexes then we skip sending it to validation + NotificationEvent notification = notificationEvents.get(0); + Introspector eventHeader = notification.getEventHeader(); + if (eventHeader != null) { + String source = eventHeader.getValue(SOURCE_NAME); + return exclusionList.stream().anyMatch(pattern -> pattern.matcher(source).matches()); + } + return false; + } + public List preValidate(String body) throws AAIException { Map httpHeaders = new HashMap<>(); - httpHeaders.put("X-FromAppId", appName); httpHeaders.put("X-TransactionID", UUID.randomUUID().toString()); httpHeaders.put("Content-Type", "application/json"); @@ -224,26 +203,19 @@ public class ValidationService { List violations = new ArrayList<>(); ResponseEntity responseEntity; try { - responseEntity = validationRestClient.execute(VALIDATION_ENDPOINT, HttpMethod.POST, httpHeaders, body); - Object responseBody = responseEntity.getBody(); if (isSuccess(responseEntity)) { LOGGER.debug("Validation Service returned following response status code {} and body {}", responseEntity.getStatusCodeValue(), responseEntity.getBody()); } else if (responseBody != null) { - Validation validation = null; - try { - validation = gson.fromJson(responseBody.toString(), Validation.class); - } catch (JsonSyntaxException jsonException) { - LOGGER.warn("Unable to convert the response body {}", jsonException.getMessage()); - } + Validation validation = getValidation(responseBody); if (validation == null) { LOGGER.debug("Validation Service following status code {} with body {}", responseEntity.getStatusCodeValue(), responseEntity.getBody()); } else { - violations.addAll(extractViolations(validation)); + violations = extractViolations(validation); } } else { LOGGER.warn("Unable to convert the response body null"); @@ -267,27 +239,27 @@ public class ValidationService { return violations; } + private Validation getValidation(Object responseBody) { + Validation validation = null; + try { + validation = gson.fromJson(responseBody.toString(), Validation.class); + } catch (JsonSyntaxException jsonException) { + LOGGER.warn("Unable to convert the response body {}", jsonException.getMessage()); + } + return validation; + } + boolean isSuccess(ResponseEntity responseEntity) { return responseEntity != null && responseEntity.getStatusCode().is2xxSuccessful(); } - List extractViolations(Validation validation) { - - List errorMessages = new ArrayList<>(); - - if (validation == null) { - return errorMessages; + public List extractViolations(Validation validation) { + if (validation == null || validation.getViolations() == null) { + return Collections.emptyList(); } - - List violations = validation.getViolations(); - - if (violations != null && !violations.isEmpty()) { - for (Violation violation : validation.getViolations()) { - LOGGER.info(violation.getErrorMessage()); - errorMessages.add(violation.getErrorMessage()); - } - } - - return errorMessages; + return validation.getViolations().stream() + .map(Violation::getErrorMessage) + .peek(LOGGER::info) + .collect(Collectors.toList()); } } diff --git a/aai-core/src/main/java/org/onap/aai/query/builder/GraphTraversalBuilder.java b/aai-core/src/main/java/org/onap/aai/query/builder/GraphTraversalBuilder.java index c5c4512e..24e5ec8b 100644 --- a/aai-core/src/main/java/org/onap/aai/query/builder/GraphTraversalBuilder.java +++ b/aai-core/src/main/java/org/onap/aai/query/builder/GraphTraversalBuilder.java @@ -34,7 +34,7 @@ import java.util.Set; import org.apache.tinkerpop.gremlin.process.traversal.P; import org.apache.tinkerpop.gremlin.process.traversal.Path; -import org.apache.tinkerpop.gremlin.process.traversal.Step; +import org.apache.tinkerpop.gremlin.process.traversal.Pop; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traversal.Admin; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; @@ -688,6 +688,15 @@ public abstract class GraphTraversalBuilder extends QueryBuilder { return this; } + @Override + public QueryBuilder select(Pop pop, String name) { + this.traversal.select(pop, name); + + stepIndex++; + + return this; + } + @Override public QueryBuilder select(String... names) { if (names.length == 1) { diff --git a/aai-core/src/main/java/org/onap/aai/query/builder/GremlinQueryBuilder.java b/aai-core/src/main/java/org/onap/aai/query/builder/GremlinQueryBuilder.java index 4500a47e..db1c78ae 100644 --- a/aai-core/src/main/java/org/onap/aai/query/builder/GremlinQueryBuilder.java +++ b/aai-core/src/main/java/org/onap/aai/query/builder/GremlinQueryBuilder.java @@ -29,6 +29,7 @@ import com.google.common.collect.Multimap; import java.util.*; import org.apache.tinkerpop.gremlin.process.traversal.Path; +import org.apache.tinkerpop.gremlin.process.traversal.Pop; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree; @@ -827,6 +828,14 @@ public abstract class GremlinQueryBuilder extends QueryBuilder { return this; } + @Override + public QueryBuilder select(Pop pop, String name) { + this.list.add(".select(Pop." + pop.toString() + ",'" + name + "')"); + stepIndex++; + + return this; + } + @Override public QueryBuilder select(String... names) { String stepString = ".select('"; diff --git a/aai-core/src/main/java/org/onap/aai/query/builder/QueryBuilder.java b/aai-core/src/main/java/org/onap/aai/query/builder/QueryBuilder.java index 66532529..309ffa16 100644 --- a/aai-core/src/main/java/org/onap/aai/query/builder/QueryBuilder.java +++ b/aai-core/src/main/java/org/onap/aai/query/builder/QueryBuilder.java @@ -31,6 +31,7 @@ import java.util.Map; import javax.ws.rs.core.MultivaluedMap; import org.apache.tinkerpop.gremlin.process.traversal.Path; +import org.apache.tinkerpop.gremlin.process.traversal.Pop; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree; import org.apache.tinkerpop.gremlin.structure.Edge; @@ -704,6 +705,8 @@ public abstract class QueryBuilder implements Iterator { public abstract QueryBuilder select(String name); + public abstract QueryBuilder select(Pop pop, String name); + public abstract QueryBuilder select(String... names); public abstract QueryBuilder until(QueryBuilder builder); diff --git a/aai-core/src/main/java/org/onap/aai/rest/db/HttpEntry.java b/aai-core/src/main/java/org/onap/aai/rest/db/HttpEntry.java index 28d66dd0..7ecdd6d5 100644 --- a/aai-core/src/main/java/org/onap/aai/rest/db/HttpEntry.java +++ b/aai-core/src/main/java/org/onap/aai/rest/db/HttpEntry.java @@ -155,49 +155,22 @@ public class HttpEntry { } public HttpEntry setHttpEntryProperties(SchemaVersion version, String serverBase) { - this.version = version; - this.loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, version); - this.dbEngine = new JanusGraphDBEngine(queryStyle, loader); - - getDbEngine().startTransaction(); - this.notification = new UEBNotification(loader, loaderFactory, schemaVersions); - if ("true".equals(AAIConfig.get("aai.notification.depth.all.enabled", "true"))) { - this.notificationDepth = AAIProperties.MAXIMUM_DEPTH; - } else { - this.notificationDepth = AAIProperties.MINIMUM_DEPTH; - } - + setHttpEntryProperties(version); this.serverBase = serverBase; return this; } public HttpEntry setHttpEntryProperties(SchemaVersion version, UEBNotification notification) { - this.version = version; - this.loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, version); - this.dbEngine = new JanusGraphDBEngine(queryStyle, loader); - + setHttpEntryProperties(version); this.notification = notification; - - if ("true".equals(AAIConfig.get("aai.notification.depth.all.enabled", "true"))) { - this.notificationDepth = AAIProperties.MAXIMUM_DEPTH; - } else { - this.notificationDepth = AAIProperties.MINIMUM_DEPTH; - } - // start transaction on creation - getDbEngine().startTransaction(); return this; } public HttpEntry setHttpEntryProperties(SchemaVersion version, UEBNotification notification, int notificationDepth) { - this.version = version; - this.loader = loaderFactory.createLoaderForVersion(introspectorFactoryType, version); - this.dbEngine = new JanusGraphDBEngine(queryStyle, loader); - + setHttpEntryProperties(version); this.notification = notification; this.notificationDepth = notificationDepth; - // start transaction on creation - getDbEngine().startTransaction(); return this; } diff --git a/aai-core/src/main/java/org/onap/aai/rest/ueb/UEBNotification.java b/aai-core/src/main/java/org/onap/aai/rest/ueb/UEBNotification.java index be30c468..0c8fde62 100644 --- a/aai-core/src/main/java/org/onap/aai/rest/ueb/UEBNotification.java +++ b/aai-core/src/main/java/org/onap/aai/rest/ueb/UEBNotification.java @@ -98,42 +98,15 @@ public class UEBNotification { Introspector obj, HashMap relatedObjects, String basePath) throws AAIException, UnsupportedEncodingException { - String action = "UPDATE"; - - if (status.equals(Status.CREATED)) { - action = "CREATE"; - } else if (status.equals(Status.OK)) { - action = "UPDATE"; - } else if (status.equals(Status.NO_CONTENT)) { - action = "DELETE"; - } + String action = getAction(status); try { Introspector eventHeader = currentVersionLoader.introspectorFromName("notification-event-header"); URIToObject parser = new URIToObject(currentVersionLoader, uri, relatedObjects); - if ((basePath != null) && (!basePath.isEmpty())) { - if (!(basePath.startsWith("/"))) { - basePath = "/" + basePath; - } - if (!(basePath.endsWith("/"))) { - basePath = basePath + "/"; - } - } else { - // default - basePath = "/aai/"; - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Please check the schema.uri.base.path as it didn't seem to be set"); - } - } + basePath = formatBasePath(basePath); - String uriStr = getUri(uri.toString(), basePath); - String entityLink; - if (uriStr.startsWith("/")) { - entityLink = basePath + notificationVersion + uriStr; - } else { - entityLink = basePath + notificationVersion + "/" + uriStr; - } + String entityLink = formatEntityLink(uri, basePath); eventHeader.setValue("entity-link", entityLink); eventHeader.setValue("action", action); @@ -191,6 +164,48 @@ public class UEBNotification { } } + private String formatEntityLink(URI uri, String basePath) { + String uriStr = getUri(uri.toString(), basePath); + String entityLink; + if (uriStr.startsWith("/")) { + entityLink = basePath + notificationVersion + uriStr; + } else { + entityLink = basePath + notificationVersion + "/" + uriStr; + } + return entityLink; + } + + private String formatBasePath(String basePath) { + if ((basePath != null) && (!basePath.isEmpty())) { + if (!(basePath.startsWith("/"))) { + basePath = "/" + basePath; + } + if (!(basePath.endsWith("/"))) { + basePath = basePath + "/"; + } + } else { + // default + basePath = "/aai/"; + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Please check the schema.uri.base.path as it didn't seem to be set"); + } + } + return basePath; + } + + private String getAction(Status status) { + String action = "UPDATE"; + + if (status.equals(Status.CREATED)) { + action = "CREATE"; + } else if (status.equals(Status.OK)) { + action = "UPDATE"; + } else if (status.equals(Status.NO_CONTENT)) { + action = "DELETE"; + } + return action; + } + /** * Trigger events. * diff --git a/aai-core/src/main/java/org/onap/aai/restcore/search/AAIAbstractGroovyShell.java b/aai-core/src/main/java/org/onap/aai/restcore/search/AAIAbstractGroovyShell.java index 4a8760ec..f63df4b2 100644 --- a/aai-core/src/main/java/org/onap/aai/restcore/search/AAIAbstractGroovyShell.java +++ b/aai-core/src/main/java/org/onap/aai/restcore/search/AAIAbstractGroovyShell.java @@ -59,7 +59,7 @@ public abstract class AAIAbstractGroovyShell { "org.apache.tinkerpop.gremlin.process.traversal.Order"); imports.addImports("org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__", "org.apache.tinkerpop.gremlin.structure.T", "org.apache.tinkerpop.gremlin.process.traversal.P", - "org.onap.aai.edges.enums.EdgeType", "java.util.Map.Entry"); + "org.onap.aai.edges.enums.EdgeType", "java.util.Map.Entry","org.apache.tinkerpop.gremlin.process.traversal.Pop"); imports.addStarImports("java.util"); CompilerConfiguration config = new CompilerConfiguration(); config.addCompilationCustomizers(custom, imports); diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/GraphSON.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/GraphSON.java index c0ba860f..89970e24 100644 --- a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/GraphSON.java +++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/GraphSON.java @@ -36,6 +36,7 @@ import java.util.Optional; import org.apache.tinkerpop.gremlin.structure.Direction; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper; +import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONVersion; import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONWriter; import org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry; import org.onap.aai.serialization.queryformats.exceptions.AAIFormatQueryResultFormatNotSupported; @@ -47,8 +48,13 @@ public class GraphSON implements FormatMapper { private static final Logger logger = LoggerFactory.getLogger(GraphSON.class); + // TODO: Use v2 or v3 here + // v2 is the default starting from Janusgraph 0.3.0 + // Further reference: https://tinkerpop.apache.org/docs/3.3.0/dev/io/#graphson + private static final GraphSONVersion version = GraphSONVersion.V1_0; + private final GraphSONMapper mapper = - GraphSONMapper.build().addRegistry(JanusGraphIoRegistry.getInstance()).create(); + GraphSONMapper.build().version(version).addRegistry(JanusGraphIoRegistry.getInstance()).create(); private final GraphSONWriter writer = GraphSONWriter.build().mapper(mapper).create(); @Override diff --git a/aai-core/src/test/java/org/onap/aai/AAISetup.java b/aai-core/src/test/java/org/onap/aai/AAISetup.java index a44226c8..e1fc351f 100644 --- a/aai-core/src/test/java/org/onap/aai/AAISetup.java +++ b/aai-core/src/test/java/org/onap/aai/AAISetup.java @@ -30,6 +30,8 @@ import org.onap.aai.edges.EdgeIngestor; import org.onap.aai.introspection.LoaderFactory; import org.onap.aai.introspection.MoxyLoader; import org.onap.aai.nodes.NodeIngestor; +import org.onap.aai.prevalidation.ValidationConfiguration; +import org.onap.aai.prevalidation.ValidationService; import org.onap.aai.rest.db.HttpEntry; import org.onap.aai.serialization.db.EdgeSerializer; import org.onap.aai.serialization.queryformats.QueryFormatTestHelper; @@ -49,7 +51,7 @@ import org.springframework.test.context.web.WebAppConfiguration; @ContextConfiguration( classes = {ConfigConfiguration.class, AAIConfigTranslator.class, EdgeIngestor.class, EdgeSerializer.class, NodeIngestor.class, SpringContextAware.class, IntrospectionConfig.class, RestBeanConfig.class, - XmlFormatTransformerConfiguration.class}) + XmlFormatTransformerConfiguration.class, ValidationService.class, ValidationConfiguration.class}) @TestPropertySource( properties = {"schema.uri.base.path = /aai", "schema.xsd.maxoccurs = 5000", "schema.translator.list=config", "schema.nodes.location=src/test/resources/onap/oxm", diff --git a/aai-core/src/test/java/org/onap/aai/TinkerpopUpgradeTests.java b/aai-core/src/test/java/org/onap/aai/TinkerpopUpgradeTests.java index 799f6060..f443b308 100644 --- a/aai-core/src/test/java/org/onap/aai/TinkerpopUpgradeTests.java +++ b/aai-core/src/test/java/org/onap/aai/TinkerpopUpgradeTests.java @@ -24,6 +24,7 @@ import org.junit.experimental.categories.Categories; import org.junit.experimental.categories.Categories.IncludeCategory; import org.junit.runner.RunWith; import org.junit.runners.Suite.SuiteClasses; +import org.onap.aai.db.DbMethHelperTest; import org.onap.aai.introspection.sideeffect.DataLinkTest; import org.onap.aai.parsers.query.GraphTraversalTest; import org.onap.aai.query.builder.TraversalQueryTest; @@ -45,7 +46,8 @@ import org.onap.aai.query.builder.TraversalURIOptimizedQueryTest; DataLinkTest.class, GraphTraversalTest.class, TraversalQueryTest.class, - TraversalURIOptimizedQueryTest.class + TraversalURIOptimizedQueryTest.class, + DbMethHelperTest.class }) public class TinkerpopUpgradeTests { } diff --git a/aai-core/src/test/java/org/onap/aai/db/DbMethHelperTest.java b/aai-core/src/test/java/org/onap/aai/db/DbMethHelperTest.java index 16faa5f1..c79b9148 100644 --- a/aai-core/src/test/java/org/onap/aai/db/DbMethHelperTest.java +++ b/aai-core/src/test/java/org/onap/aai/db/DbMethHelperTest.java @@ -36,6 +36,7 @@ import org.apache.commons.io.IOUtils; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.apache.tinkerpop.gremlin.structure.VertexProperty; import org.janusgraph.core.JanusGraphFactory; import org.junit.After; import org.junit.AfterClass; @@ -44,10 +45,12 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.onap.aai.AAISetup; +import org.onap.aai.TinkerpopUpgrade; import org.onap.aai.exceptions.AAIException; import org.onap.aai.introspection.Introspector; import org.onap.aai.introspection.Loader; @@ -62,6 +65,7 @@ import org.onap.aai.setup.SchemaVersion; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; +@Category(TinkerpopUpgrade.class) @RunWith(value = Parameterized.class) @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS) public class DbMethHelperTest extends AAISetup { @@ -127,12 +131,10 @@ public class DbMethHelperTest extends AAISetup { map.put("pserver.hostname", "testSearchVertexByIdentityMap-pserver-hostname-01"); Optional optionalVertex; - try { - optionalVertex = dbMethHelper.searchVertexByIdentityMap(type, map); - } catch (Exception e) { - throw new Exception(e); - } - Assert.assertEquals("vp[hostname->testSearchVertexById]", optionalVertex.get().property("hostname").toString()); + optionalVertex = dbMethHelper.searchVertexByIdentityMap(type, map); + + String hostname = (String) optionalVertex.get().property("hostname").value(); + Assert.assertEquals("testSearchVertexByIdentityMap-pserver-hostname-01", hostname); } @Test(expected = AmbiguousMapAAIException.class) diff --git a/aai-core/src/test/java/org/onap/aai/rest/db/HttpEntryTest.java b/aai-core/src/test/java/org/onap/aai/rest/db/HttpEntryTest.java index 371c07a5..59a0f1f1 100644 --- a/aai-core/src/test/java/org/onap/aai/rest/db/HttpEntryTest.java +++ b/aai-core/src/test/java/org/onap/aai/rest/db/HttpEntryTest.java @@ -31,6 +31,8 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.fasterxml.jackson.core.JsonProcessingException; @@ -82,6 +84,7 @@ import org.onap.aai.introspection.Introspector; import org.onap.aai.introspection.Loader; import org.onap.aai.introspection.ModelType; import org.onap.aai.parsers.query.QueryParser; +import org.onap.aai.prevalidation.ValidationService; import org.onap.aai.rest.db.responses.ErrorResponse; import org.onap.aai.rest.db.responses.Relationship; import org.onap.aai.rest.db.responses.RelationshipWrapper; @@ -93,11 +96,14 @@ import org.onap.aai.serialization.engines.TransactionalGraphEngine; import org.onap.aai.util.AAIConfig; import org.skyscreamer.jsonassert.JSONAssert; import org.skyscreamer.jsonassert.JSONCompareMode; +import org.springframework.boot.test.mock.mockito.MockBean; @RunWith(value = Parameterized.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class HttpEntryTest extends AAISetup { + @MockBean ValidationService validationService; + protected static final MediaType APPLICATION_JSON = MediaType.valueOf("application/json"); private static final Set VALID_HTTP_STATUS_CODES = new HashSet<>(); @@ -116,7 +122,7 @@ public class HttpEntryTest extends AAISetup { */ @Parameterized.Parameters(name = "QueryStyle.{0}") public static Collection data() { - return Arrays.asList(new Object[][] { { QueryStyle.TRAVERSAL }, { QueryStyle.TRAVERSAL_URI } }); + return Arrays.asList(new Object[][] { { QueryStyle.TRAVERSAL } }); } private Loader loader; @@ -196,8 +202,15 @@ public class HttpEntryTest extends AAISetup { .put("equip-type", "theEquipType") .toString(); + JSONObject expectedResponseBody = new JSONObject() + .put("hostname", "theHostname") + .put("equip-type", "theEquipType"); Response response = doRequest(traversalHttpEntry, loader, dbEngine, HttpMethod.GET, uri, requestBody); + JSONObject actualResponseBody = new JSONObject(response.getEntity().toString()); + + JSONAssert.assertEquals(expectedResponseBody, actualResponseBody, JSONCompareMode.NON_EXTENSIBLE); assertEquals("Expected the pserver to be returned", 200, response.getStatus()); + verify(validationService, times(1)).validate(any()); } @Test @@ -216,6 +229,7 @@ public class HttpEntryTest extends AAISetup { Response response = doRequest(traversalHttpEntry, loader, dbEngine, HttpMethod.PUT, uri, requestBody); assertEquals("Expecting the pserver to be created", 201, response.getStatus()); + verify(validationService, times(1)).validate(any()); } @Test @@ -254,6 +268,7 @@ public class HttpEntryTest extends AAISetup { assertEquals("Expecting the pserver to be updated", 200, response.getStatus()); assertTrue("That old properties are removed", traversal.V().has("hostname", "updatedHostname").hasNot("number-of-cpus").hasNext()); + verify(validationService, times(1)).validate(any()); } @Test @@ -322,6 +337,7 @@ public class HttpEntryTest extends AAISetup { traversal.V().has("aai-node-type", "p-interface").has("aai-uri", uri).has("interface-name", "p1") .out("tosca.relationships.network.BindsTo").has("aai-node-type", "pserver") .has("hostname", "hostname").hasNext()); + verify(validationService, times(1)).validate(any()); } @Test @@ -341,6 +357,7 @@ public class HttpEntryTest extends AAISetup { assertTrue("object should be updated while keeping old properties", traversal.V().has("aai-node-type", "pserver").has("hostname", "new-hostname") .has("equip-type", "the-equip-type").hasNext()); + verify(validationService, times(1)).validate(any()); } @Test @@ -357,6 +374,7 @@ public class HttpEntryTest extends AAISetup { doDelete(resourceVersion, uri, "pserver").getStatus()); assertTrue("Expecting the pserver to be deleted", !traversal.V().has("aai-node-type", "pserver").has("hostname", "the-hostname").hasNext()); + verify(validationService, times(1)).validate(any()); } @Test @@ -406,6 +424,7 @@ public class HttpEntryTest extends AAISetup { .has(EdgeProperty.PREVENT_DELETE.toString(), "IN"); assertTrue("p-server has incoming edge from complex", vertexQuery.hasNext()); assertTrue("Created Edge has expected properties", edgeQuery.hasNext()); + verify(validationService, times(1)).validate(any()); } @Test @@ -524,6 +543,7 @@ public class HttpEntryTest extends AAISetup { assertEquals("Expected get to succeed", 200, response.getStatus()); assertThat(responseEntity, containsString("/cloud-infrastructure/pservers/pserver/pserver-1")); assertThat(responseEntity, containsString("/cloud-infrastructure/pservers/pserver/pserver-2")); + verify(validationService, times(1)).validate(any()); } @Test @@ -559,6 +579,7 @@ public class HttpEntryTest extends AAISetup { assertEquals("Expected the response to be successful", 200, response.getStatus()); assertThat("Related pserver is returned", response.getEntity().toString(), containsString("\"hostname\":\"related-to-pserver\"")); + verify(validationService, times(1)).validate(any()); } @@ -588,6 +609,7 @@ public class HttpEntryTest extends AAISetup { Response response = doRequest(traversalHttpEntry, loader, dbEngine, HttpMethod.GET, uri, requestBody); assertThat("Related to pserver is returned.", response.getEntity().toString(), containsString("\"hostname\":\"abstract-pserver\"")); + verify(validationService, times(1)).validate(any()); } @Test @@ -634,6 +656,7 @@ public class HttpEntryTest extends AAISetup { relationships[0].getRelatedLink()); assertEquals("complex.physical-location-id", relationships[0].getRelationshipData()[0].getRelationshipKey()); assertEquals("related-to-complex", relationships[0].getRelationshipData()[0].getRelationshipValue()); + verify(validationService, times(1)).validate(any()); } @Test @@ -693,6 +716,7 @@ public class HttpEntryTest extends AAISetup { JSONAssert.assertEquals(expectedResponseBody, actualResponseBody, JSONCompareMode.NON_EXTENSIBLE); queryParameters.remove("format"); + verify(validationService, times(1)).validate(any()); } @Test @@ -810,4 +834,29 @@ public class HttpEntryTest extends AAISetup { int depth = traversalHttpEntry.setDepth(null, depthParam); assertEquals(AAIProperties.MAXIMUM_DEPTH.intValue(), depth); } + + @Test + public void thatEventsAreValidated() throws AAIException, UnsupportedEncodingException { + String uri = "/cloud-infrastructure/pservers/pserver/theHostname"; + traversal.addV() + .property("aai-node-type", "pserver") + .property("hostname", "theHostname") + .property("equip-type", "theEquipType") + .property(AAIProperties.AAI_URI, uri) + .next(); + String requestBody = new JSONObject() + .put("hostname", "theHostname") + .put("equip-type", "theEquipType") + .toString(); + + JSONObject expectedResponseBody = new JSONObject() + .put("hostname", "theHostname") + .put("equip-type", "theEquipType"); + Response response = doRequest(traversalHttpEntry, loader, dbEngine, HttpMethod.GET, uri, requestBody); + JSONObject actualResponseBody = new JSONObject(response.getEntity().toString()); + + JSONAssert.assertEquals(expectedResponseBody, actualResponseBody, JSONCompareMode.NON_EXTENSIBLE); + assertEquals("Expected the pserver to be returned", 200, response.getStatus()); + verify(validationService, times(1)).validate(any()); + } } diff --git a/aai-els-onap-logging/pom.xml b/aai-els-onap-logging/pom.xml index aa0782b7..84016814 100644 --- a/aai-els-onap-logging/pom.xml +++ b/aai-els-onap-logging/pom.xml @@ -4,7 +4,7 @@ org.onap.aai.aai-common aai-parent - 1.13.6-SNAPSHOT + 1.14.0-SNAPSHOT ../aai-parent/pom.xml aai-els-onap-logging @@ -140,6 +140,12 @@ org.springframework.boot spring-boot-starter-test test + + + com.vaadin.external.google + android-json + + junit diff --git a/aai-els-onap-logging/src/main/java/org/onap/aai/logging/ErrorLogHelper.java b/aai-els-onap-logging/src/main/java/org/onap/aai/logging/ErrorLogHelper.java index 97548d99..bb2fe268 100644 --- a/aai-els-onap-logging/src/main/java/org/onap/aai/logging/ErrorLogHelper.java +++ b/aai-els-onap-logging/src/main/java/org/onap/aai/logging/ErrorLogHelper.java @@ -383,8 +383,7 @@ public class ErrorLogHelper { } private static ErrorObject getRestErrorObject(AAIException aaiException) { - final int restErrorCode = Integer.parseInt(aaiException.getErrorObject().getRESTErrorCode()); - return ErrorLogHelper.getErrorObject("AAI_" + restErrorCode); + return ErrorLogHelper.getErrorObject("AAI_" + aaiException.getErrorObject().getRESTErrorCode()); } public static Fault createPolicyFault(AAIException aaiException, String text, List variables) { diff --git a/aai-els-onap-logging/src/test/java/org/onap/aai/logging/ErrorLogHelperTest.java b/aai-els-onap-logging/src/test/java/org/onap/aai/logging/ErrorLogHelperTest.java index ea9d44b9..73890a0a 100644 --- a/aai-els-onap-logging/src/test/java/org/onap/aai/logging/ErrorLogHelperTest.java +++ b/aai-els-onap-logging/src/test/java/org/onap/aai/logging/ErrorLogHelperTest.java @@ -265,7 +265,7 @@ public class ErrorLogHelperTest { Info info = ErrorLogHelper.getRestApiInfoResponse(aaiExceptionsMap); ErrorMessage errorMessage = info.getErrorMessages().get(0); assertEquals("INF0001", errorMessage.getMessageId()); - assertEquals("Internal Error (msg=%1) (ec=%2)", errorMessage.getText()); + assertEquals("Success X-FromAppId=%1 X-TransactionId=%2 (msg=%3) (ec=%4)", errorMessage.getText()); assertEquals("Successful health check:OK", errorMessage.getVariables().get(0)); assertEquals("0.0.0002", errorMessage.getVariables().get(1)); } diff --git a/aai-failover/pom.xml b/aai-failover/pom.xml index 1206bdd0..93953544 100644 --- a/aai-failover/pom.xml +++ b/aai-failover/pom.xml @@ -5,7 +5,7 @@ org.onap.aai.aai-common aai-parent - 1.13.6-SNAPSHOT + 1.14.0-SNAPSHOT ../aai-parent/pom.xml 4.0.0 diff --git a/aai-parent/pom.xml b/aai-parent/pom.xml index 25ca2a9c..2fd8e887 100644 --- a/aai-parent/pom.xml +++ b/aai-parent/pom.xml @@ -27,7 +27,7 @@ limitations under the License. org.onap.aai.aai-common aai-common - 1.13.6-SNAPSHOT + 1.14.0-SNAPSHOT aai-parent aai-parent @@ -62,13 +62,13 @@ limitations under the License. 2.0.0-oss 2.3.31 31.1-jre - 3.2.11 + 3.3.0 + 0.3.3 2.5.15 2.9.1 2.0.0.0 2.2 2.11.4 - 0.2.3 1.2 2.3.1 2.3.0.1 diff --git a/aai-rest/pom.xml b/aai-rest/pom.xml index 9e8697e6..72d3d30a 100644 --- a/aai-rest/pom.xml +++ b/aai-rest/pom.xml @@ -29,7 +29,7 @@ org.onap.aai.aai-common aai-parent - 1.13.6-SNAPSHOT + 1.14.0-SNAPSHOT ../aai-parent/pom.xml aai-rest @@ -103,6 +103,12 @@ org.springframework.boot spring-boot-starter-test test + + + com.vaadin.external.google + android-json + + org.springframework.boot diff --git a/aai-schema-abstraction/pom.xml b/aai-schema-abstraction/pom.xml index a0dc76c6..76d48328 100644 --- a/aai-schema-abstraction/pom.xml +++ b/aai-schema-abstraction/pom.xml @@ -28,7 +28,7 @@ org.onap.aai.aai-common aai-parent - 1.13.6-SNAPSHOT + 1.14.0-SNAPSHOT ../aai-parent/pom.xml diff --git a/aai-schema-ingest/pom.xml b/aai-schema-ingest/pom.xml index dd83c92c..ef9793a9 100644 --- a/aai-schema-ingest/pom.xml +++ b/aai-schema-ingest/pom.xml @@ -26,7 +26,7 @@ limitations under the License. org.onap.aai.aai-common aai-parent - 1.13.6-SNAPSHOT + 1.14.0-SNAPSHOT ../aai-parent/pom.xml aai-schema-ingest diff --git a/aai-schema-ingest/src/main/java/org/onap/aai/nodes/NodeIngestor.java b/aai-schema-ingest/src/main/java/org/onap/aai/nodes/NodeIngestor.java index a3d477ee..cf278060 100644 --- a/aai-schema-ingest/src/main/java/org/onap/aai/nodes/NodeIngestor.java +++ b/aai-schema-ingest/src/main/java/org/onap/aai/nodes/NodeIngestor.java @@ -140,6 +140,7 @@ public class NodeIngestor { schemaPerVersion.put(version, createCombinedSchema(inputStreams, version, retrieveLocalSchema)); } } catch (JAXBException | ParserConfigurationException | SAXException | IOException e) { + LOGGER.error("Schema ingestion failed", e); throw new ExceptionInInitializerError(e); } } diff --git a/aai-utils/pom.xml b/aai-utils/pom.xml index 68dc4dc6..cf682ed7 100644 --- a/aai-utils/pom.xml +++ b/aai-utils/pom.xml @@ -27,7 +27,7 @@ org.onap.aai.aai-common aai-parent - 1.13.6-SNAPSHOT + 1.14.0-SNAPSHOT ../aai-parent/pom.xml aai-utils diff --git a/pom.xml b/pom.xml index 1aba0756..5f3b2314 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ org.onap.aai.aai-common aai-common - 1.13.6-SNAPSHOT + 1.14.0-SNAPSHOT pom aai-aai-common Contains all of the common code for resources and traversal repos diff --git a/releases/1.13.6-container-release.yaml b/releases/1.13.6-container-release.yaml new file mode 100644 index 00000000..3d30c075 --- /dev/null +++ b/releases/1.13.6-container-release.yaml @@ -0,0 +1,11 @@ +distribution_type: container +container_release_tag: 1.13.6 +project: aai-common +ref: 286bfbfb686254577788c8b49417e3b50ee5c858 +containers: + - name: aai-common-alpine + version: latest + - name: aai-common-ubuntu + version: latest + - name: aai-haproxy + version: latest diff --git a/releases/1.14.0-maven-release.yaml b/releases/1.14.0-maven-release.yaml new file mode 100644 index 00000000..d29f95a0 --- /dev/null +++ b/releases/1.14.0-maven-release.yaml @@ -0,0 +1,4 @@ +distribution_type: maven +log_dir: aai-aai-common-maven-stage-master/1450/ +project: aai-common +version: 1.14.0 diff --git a/version.properties b/version.properties index 53fad524..5dfb2ddd 100644 --- a/version.properties +++ b/version.properties @@ -4,8 +4,8 @@ # because they are used in Jenkins, whose plug-in doesn't support major_version=1 -minor_version=13 -patch_version=6 +minor_version=14 +patch_version=0 base_version=${major_version}.${minor_version}.${patch_version}