From ddc73b563fcd2b3e47b5d0f54139f20ed3cdcba1 Mon Sep 17 00:00:00 2001 From: abatos Date: Tue, 22 Aug 2017 14:23:21 -0400 Subject: [PATCH] Split out Titan specific dependencies from core Remove the Titan specific references within the gizmo core and prepare for dependency on new champ core library. Change-Id: I29a4e7b6528e8357715b095d8db5456cd01eb636 Issue-ID: AAI-21 Signed-off-by: abatos --- janus-deps-pom.xml | 90 +++++++++++ pom.xml | 88 ++--------- .../ajsc/crud-api_v1/crud-api/v1/routes/crud.route | 2 +- src/main/bin/start.sh | 18 +++ src/main/docker/Dockerfile | 3 + .../org/openecomp/crud/dao/champ/ChampDao.java | 174 ++------------------- .../openecomp/crud/logging/CrudServiceMsgs.java | 35 ----- .../crud/service/CrudGraphDataService.java | 37 +---- .../resources/logging/CrudServiceMsgs.properties | 18 --- .../org/openecomp/crud/dao/champ/ChampDaoTest.java | 4 +- titan-deps-pom.xml | 89 +++++++++++ 11 files changed, 236 insertions(+), 322 deletions(-) create mode 100644 janus-deps-pom.xml create mode 100644 titan-deps-pom.xml diff --git a/janus-deps-pom.xml b/janus-deps-pom.xml new file mode 100644 index 0000000..7a0cd77 --- /dev/null +++ b/janus-deps-pom.xml @@ -0,0 +1,90 @@ + + 4.0.0 + com.test + myjanus + 0.0.1-SNAPSHOT + pom + + + + + org.openecomp.aai + champ-janus + 1.1.1-AMDOCS-SNAPSHOT + + + org.janusgraph + janusgraph-cassandra + 0.1.1 + true + + + org.slf4j + slf4j-log4j12 + + + ch.qos.logback + logback-classic + + + org.apache.tinkerpop + gremlin-core + + + org.apache.tinkerpop + gremlin-groovy + + + + + org.janusgraph + janusgraph-hbase + 0.1.1 + true + + + org.apache.tinkerpop + gremlin-groovy + + + org.slf4j + slf4j-log4j12 + + + ch.qos.logback + logback-classic + + + org.apache.tinkerpop + gremlin-core + + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.0.1 + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/graph-deps/janus-deps + false + false + true + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index d16e93c..99dd62b 100644 --- a/pom.xml +++ b/pom.xml @@ -74,70 +74,6 @@ 2.6.2 - - com.thinkaurelius.titan - titan-cassandra - 1.0.0 - - - org.apache.tinkerpop - gremlin-groovy - - - org.slf4j - slf4j-log4j12 - - - ch.qos.logback - logback-classic - - - org.apache.tinkerpop - gremlin-core - - - - - - com.thinkaurelius.titan - titan-hbase - 1.0.0 - - - org.apache.tinkerpop - gremlin-groovy - - - org.slf4j - slf4j-log4j12 - - - ch.qos.logback - logback-classic - - - org.apache.tinkerpop - gremlin-core - - - - - - org.apache.hbase - hbase-client - 1.0.2 - - - org.slf4j - slf4j-log4j12 - - - com.google.guava - guava - - - - org.openecomp.aai.logging-service @@ -194,20 +130,30 @@ + + + + + org.apache.tinkerpop + tinkergraph-gremlin + 3.2.3 + test + - - com.thinkaurelius.titan - titan-cassandra - 1.0.0 + org.apache.tinkerpop + gremlin-core + 3.2.3 + test org.slf4j slf4j-log4j12 + + org.slf4j + jcl-over-slf4j + diff --git a/src/main/ajsc/crud-api_v1/crud-api/v1/routes/crud.route b/src/main/ajsc/crud-api_v1/crud-api/v1/routes/crud.route index 185aa6a..65420a3 100644 --- a/src/main/ajsc/crud-api_v1/crud-api/v1/routes/crud.route +++ b/src/main/ajsc/crud-api_v1/crud-api/v1/routes/crud.route @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/src/main/bin/start.sh b/src/main/bin/start.sh index 8a68460..003852f 100644 --- a/src/main/bin/start.sh +++ b/src/main/bin/start.sh @@ -39,6 +39,24 @@ fi CLASSPATH="$AJSC_HOME/lib/*" CLASSPATH="$CLASSPATH:$AJSC_HOME/extJars/" CLASSPATH="$CLASSPATH:$AJSC_HOME/etc/" + +# Check to see if the provided implementation exists in the image and add it to the classpath +for file in $( find ${BASEDIR}graph-deps/* -maxdepth 0 -type d ); do + CURRIMPL=$(echo $file | cut -d"/" -f6) + if [ "x$GRAPHIMPL" = "x$CURRIMPL" ]; then + CLASSPATH_GRAPHIMPL=$file + echo "Setting up graph implementation of $GRAPHIMPL" + else + SUPPORTED_GRAPHIMPL="$SUPPORTED_GRAPHIMPL $CURRIMPL" + fi +done +if [ -n "$CLASSPATH_GRAPHIMPL" ]; then + cp $CLASSPATH_GRAPHIMPL/* $AJSC_HOME/extJars/ +else + echo "Configured graph implementation '$GRAPHIMPL' is not supported. Acceptable implementations are one of: $SUPPORTED_GRAPHIMPL" + exit 1 +fi + PROPS="-DAJSC_HOME=$AJSC_HOME" PROPS="$PROPS -DAJSC_CONF_HOME=$BASEDIR/bundleconfig/" PROPS="$PROPS -Dlogback.configurationFile=$BASEDIR/bundleconfig/etc/logback.xml" diff --git a/src/main/docker/Dockerfile b/src/main/docker/Dockerfile index e4459d1..c342772 100644 --- a/src/main/docker/Dockerfile +++ b/src/main/docker/Dockerfile @@ -2,6 +2,7 @@ FROM ubuntu:14.04 ARG MICRO_HOME=/opt/app/crud-api ARG BIN_HOME=$MICRO_HOME/bin +ARG GRAPHLIB_HOME=$MICRO_HOME/graph-deps RUN apt-get update @@ -16,6 +17,8 @@ RUN export JAVA_HOME # Build up the deployment folder structure RUN mkdir -p $MICRO_HOME ADD swm/package/nix/dist_files/appl/crud-api/* $MICRO_HOME/ +RUN mkdir -p $GRAPHLIB_HOME +ADD graph-deps $GRAPHLIB_HOME RUN mkdir -p $BIN_HOME COPY *.sh $BIN_HOME RUN chmod 755 $BIN_HOME/* diff --git a/src/main/java/org/openecomp/crud/dao/champ/ChampDao.java b/src/main/java/org/openecomp/crud/dao/champ/ChampDao.java index c8a68e7..5e9d10a 100644 --- a/src/main/java/org/openecomp/crud/dao/champ/ChampDao.java +++ b/src/main/java/org/openecomp/crud/dao/champ/ChampDao.java @@ -23,17 +23,16 @@ */ package org.openecomp.crud.dao.champ; -import org.openecomp.aai.champ.ChampAPI; -import org.openecomp.aai.champ.ChampGraph; -import org.openecomp.aai.champ.exceptions.ChampMarshallingException; -import org.openecomp.aai.champ.exceptions.ChampObjectNotExistsException; -import org.openecomp.aai.champ.exceptions.ChampRelationshipNotExistsException; -import org.openecomp.aai.champ.exceptions.ChampSchemaViolationException; -import org.openecomp.aai.champ.exceptions.ChampUnmarshallingException; -import org.openecomp.aai.champ.graph.impl.TitanChampGraphImpl; -import org.openecomp.aai.champ.model.ChampObject; -import org.openecomp.aai.champ.model.ChampRelationship; -import org.openecomp.aai.champ.model.fluent.object.ObjectBuildOrPropertiesStep; +import org.openecomp.aai.champcore.ChampGraph; +import org.openecomp.aai.champcore.exceptions.ChampMarshallingException; +import org.openecomp.aai.champcore.exceptions.ChampObjectNotExistsException; +import org.openecomp.aai.champcore.exceptions.ChampRelationshipNotExistsException; +import org.openecomp.aai.champcore.exceptions.ChampSchemaViolationException; +import org.openecomp.aai.champcore.exceptions.ChampTransactionException; +import org.openecomp.aai.champcore.exceptions.ChampUnmarshallingException; +import org.openecomp.aai.champcore.model.ChampObject; +import org.openecomp.aai.champcore.model.ChampRelationship; +import org.openecomp.aai.champcore.model.fluent.object.ObjectBuildOrPropertiesStep; import org.openecomp.cl.api.Logger; import org.openecomp.cl.eelf.LoggerFactory; import org.openecomp.crud.dao.GraphDao; @@ -47,8 +46,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.Properties; -import java.util.Random; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -81,11 +78,6 @@ public class ChampDao implements GraphDao { DSE } - /** - * Set of configuration properties for the DAI. - */ - private Properties daoConfig; - /** * Instance of the API used for interacting with the Champ library. */ @@ -97,20 +89,12 @@ public class ChampDao implements GraphDao { /** * Creates a new instance of the ChampDao. * - * @param config - Set of configuration properties to be applied to this instance - * of the DAO. + * @param champGraph - Concrete implementation of the graph dao layer */ - public ChampDao(Properties config) { - - // Store the configuration properties. - daoConfig = config; - - // Apply the configuration to the DAO. - configure(); - + public ChampDao(ChampGraph champGraph) { + this.champApi = champGraph; } - @Override public Vertex getVertex(String id, String type) throws CrudException { @@ -635,112 +619,6 @@ public class ChampDao implements GraphDao { return edgeBuilder.build(); } - - /** - * Performs all one-time configuration operations which are required when creating - * a new instance of the DAO. - */ - private void configure() { - - // Instantiate the Champ library API. - try { - - // Determine which back end we are using. - switch (getBackendTypeFromConfig()) { - - case IN_MEMORY: - - logger.info(CrudServiceMsgs.INSTANTIATE_GRAPH_DAO, - "In Memory", - daoConfig.getProperty(CONFIG_GRAPH_NAME, DEFAULT_GRAPH_NAME), - "Not applicable"); - - champApi = ChampGraph.Factory.newInstance(ChampGraph.Type.IN_MEMORY, - daoConfig.getProperty(CONFIG_GRAPH_NAME, DEFAULT_GRAPH_NAME)); - - break; - - case TITAN: - try { - String db = daoConfig.getProperty(CONFIG_STORAGE_BACKEND_DB); - Short graphIdSuffix = (short) new Random().nextInt(Short.MAX_VALUE); - logger.info(CrudServiceMsgs.TITAN_GRAPH_INFO, GRAPH_UNQ_INSTANCE_ID_SUFFIX - + ": = " + graphIdSuffix); - if (db.equalsIgnoreCase(STORAGE_CASSANDRA_DB)) { - logger.info(CrudServiceMsgs.INSTANTIATE_GRAPH_DAO, "Titan with cassandra backend", - daoConfig.getProperty(CONFIG_GRAPH_NAME, DEFAULT_GRAPH_NAME), - daoConfig.getProperty(CONFIG_STORAGE_HOSTNAMES)); - - TitanChampGraphImpl.Builder champApiBuilder = - new TitanChampGraphImpl.Builder(daoConfig.getProperty(CONFIG_GRAPH_NAME, - DEFAULT_GRAPH_NAME)) - .property("storage.backend", "cassandrathrift") - .property(GRAPH_UNQ_INSTANCE_ID_SUFFIX, graphIdSuffix) - .property("storage.hostname", daoConfig.get(CONFIG_STORAGE_HOSTNAMES)); - - if (daoConfig.containsKey(CONFIG_EVENT_STREAM_PUBLISHER)) { - champApiBuilder.property("champ.event.stream.publisher", - daoConfig.get(CONFIG_EVENT_STREAM_PUBLISHER)); - } - - if (daoConfig.containsKey(CONFIG_EVENT_STREAM_NUM_PUBLISHERS)) { - champApiBuilder.property("champ.event.stream.publisher-pool-size", - daoConfig.get(CONFIG_EVENT_STREAM_NUM_PUBLISHERS)); - } - - champApi = champApiBuilder.build(); - - } else if (db.equalsIgnoreCase(STORAGE_HBASE_DB)) { - - logger.info(CrudServiceMsgs.INSTANTIATE_GRAPH_DAO, "Titan with Hbase backend", - daoConfig.getProperty(CONFIG_GRAPH_NAME, DEFAULT_GRAPH_NAME), - daoConfig.getProperty(CONFIG_STORAGE_HOSTNAMES)); - TitanChampGraphImpl.Builder champApiBuilder = - new TitanChampGraphImpl.Builder(daoConfig - .getProperty(CONFIG_GRAPH_NAME, DEFAULT_GRAPH_NAME)) - .property("storage.backend", "hbase") - .property("storage.hbase.ext.zookeeper.znode.parent", - daoConfig.get(CONFIG_HBASE_ZNODE_PARENT)) - .property("storage.port", daoConfig.get(CONFIG_STORAGE_PORT)) - .property(GRAPH_UNQ_INSTANCE_ID_SUFFIX, graphIdSuffix) - .property("storage.hostname", daoConfig.get(CONFIG_STORAGE_HOSTNAMES)); - - if (daoConfig.containsKey(CONFIG_EVENT_STREAM_PUBLISHER)) { - champApiBuilder.property("champ.event.stream.publisher", - daoConfig.get(CONFIG_EVENT_STREAM_PUBLISHER)); - } - - if (daoConfig.containsKey(CONFIG_EVENT_STREAM_NUM_PUBLISHERS)) { - champApiBuilder.property("champ.event.stream.publisher-pool-size", - daoConfig.get(CONFIG_EVENT_STREAM_NUM_PUBLISHERS)); - } - champApi = champApiBuilder.build(); - } else { - logger.error(CrudServiceMsgs.INVALID_GRAPH_BACKEND, - daoConfig.getProperty(CONFIG_STORAGE_BACKEND_DB)); - } - - } catch (com.thinkaurelius.titan.core.TitanException e) { - - logger.error(CrudServiceMsgs.INSTANTIATE_GRAPH_BACKEND_ERR, "Titan", e.getMessage()); - } - - - break; - - default: - logger.error(CrudServiceMsgs.INVALID_GRAPH_BACKEND, - daoConfig.getProperty(CONFIG_STORAGE_BACKEND)); - break; - } - - } catch (CrudException e) { - logger.error(CrudServiceMsgs.INSTANTIATE_GRAPH_BACKEND_ERR, - daoConfig.getProperty(CONFIG_STORAGE_BACKEND), e.getMessage()); - } - } - - /** * Performs any necessary shut down operations when the DAO is no longer needed. */ @@ -753,30 +631,4 @@ public class ChampDao implements GraphDao { champApi.shutdown(); } } - - - /** - * This helper function converts the 'graph back end type' config parameter into the - * corresponding {@link ChampAPI.Type}. - * - * @return - A {@link ChampAPI.Type} - * @throws CrudException - */ - private GraphType getBackendTypeFromConfig() throws CrudException { - - // Get the back end type from the DAO's configuration properties. - String backend = daoConfig.getProperty(CONFIG_STORAGE_BACKEND, "in-memory"); - - // Now, find the appropriate ChampAPI type and return it. - if (backend.equals("in-memory")) { - return GraphType.IN_MEMORY; - } else if (backend.equals("titan")) { - return GraphType.TITAN; - } - - // If we are here, then whatever was in the config properties didn't match to a supported - // back end type, so just throw an exception and let the caller figure it out. - throw new CrudException("Invalid graph backend type '" + backend + "' specified.", - javax.ws.rs.core.Response.Status.BAD_REQUEST); - } } diff --git a/src/main/java/org/openecomp/crud/logging/CrudServiceMsgs.java b/src/main/java/org/openecomp/crud/logging/CrudServiceMsgs.java index 71fb14b..265f327 100644 --- a/src/main/java/org/openecomp/crud/logging/CrudServiceMsgs.java +++ b/src/main/java/org/openecomp/crud/logging/CrudServiceMsgs.java @@ -60,16 +60,6 @@ public enum CrudServiceMsgs implements LogMessageEnum { */ OXM_LOAD_ERROR, - /** - * Instantiate data access layer for graph data store type: {0} graph: {1} using hosts: {2} - * - *

Arguments: - * {0} = Graph data store technology type - * {1} = Graph name - * {2} = Hosts list - */ - INSTANTIATE_GRAPH_DAO, - /** * Stopping ChampDAO... * @@ -77,23 +67,6 @@ public enum CrudServiceMsgs implements LogMessageEnum { */ STOPPING_CHAMP_DAO, - /** - * Unsupported graph database {0} specified. - * - *

Arguments: - * {0} = Graph database back end. - */ - INVALID_GRAPH_BACKEND, - - /** - * Failure instantiating {0} graph database backend. Cause: {1} - * - *

Arguments: - * {0} - Graph database type. - * {1} - Failure cause. - */ - INSTANTIATE_GRAPH_BACKEND_ERR, - /** * Failure instantiating CRUD Rest Service. Cause: {0} * @@ -102,14 +75,6 @@ public enum CrudServiceMsgs implements LogMessageEnum { */ INSTANTIATE_AUTH_ERR, - /** - * Any info log related to titan graph - * - *

Arguments: - * {0} - Info. - */ - TITAN_GRAPH_INFO, - /** * Arguments: * {0} Opertaion diff --git a/src/main/java/org/openecomp/crud/service/CrudGraphDataService.java b/src/main/java/org/openecomp/crud/service/CrudGraphDataService.java index 8693505..e6d6748 100644 --- a/src/main/java/org/openecomp/crud/service/CrudGraphDataService.java +++ b/src/main/java/org/openecomp/crud/service/CrudGraphDataService.java @@ -23,16 +23,13 @@ */ package org.openecomp.crud.service; -import org.onap.aai.event.api.EventPublisher; - +import org.openecomp.aai.champcore.ChampGraph; import org.openecomp.crud.dao.GraphDao; import org.openecomp.crud.dao.champ.ChampDao; import org.openecomp.crud.entity.Edge; import org.openecomp.crud.entity.Vertex; import org.openecomp.crud.exception.CrudException; import org.openecomp.crud.parser.CrudResponseBuilder; -import org.openecomp.crud.util.CrudProperties; -import org.openecomp.crud.util.CrudServiceConstants; import org.openecomp.schema.OxmModelLoader; import org.openecomp.schema.OxmModelValidator; import org.openecomp.schema.RelationshipSchemaLoader; @@ -40,42 +37,14 @@ import org.openecomp.schema.RelationshipSchemaValidator; import java.util.List; import java.util.Map; -import java.util.Properties; public class CrudGraphDataService { private GraphDao dao; - public CrudGraphDataService(EventPublisher champEventPublisher) throws CrudException { - - // Configure the GraphDao and wire it - Properties champProperties = new Properties(); - champProperties.put(ChampDao.CONFIG_STORAGE_BACKEND, "titan"); - champProperties.put(ChampDao.CONFIG_STORAGE_BACKEND_DB, - CrudProperties.get(CrudServiceConstants.CRD_STORAGE_BACKEND_DB, "hbase")); - champProperties.put(ChampDao.CONFIG_STORAGE_HOSTNAMES, - CrudProperties.get(CrudServiceConstants.CRD_GRAPH_HOST)); - champProperties.put(ChampDao.CONFIG_STORAGE_PORT, - CrudProperties.get(CrudServiceConstants.CRD_GRAPH_PORT, "2181")); - champProperties.put(ChampDao.CONFIG_HBASE_ZNODE_PARENT, - CrudProperties.get(CrudServiceConstants.CRD_HBASE_ZNODE_PARENT, "/hbase-unsecure")); - - if (CrudProperties.get("crud.graph.name") != null) { - champProperties.put(ChampDao.CONFIG_GRAPH_NAME, CrudProperties.get("crud.graph.name")); - } - - if (champEventPublisher != null) { - champProperties.put(ChampDao.CONFIG_EVENT_STREAM_PUBLISHER, champEventPublisher); - } - - if (CrudProperties.get(ChampDao.CONFIG_EVENT_STREAM_NUM_PUBLISHERS) != null) { - champProperties.put(ChampDao.CONFIG_EVENT_STREAM_NUM_PUBLISHERS, - Integer.parseInt(CrudProperties.get(ChampDao.CONFIG_EVENT_STREAM_NUM_PUBLISHERS))); - } - - ChampDao champDao = new ChampDao(champProperties); + public CrudGraphDataService(ChampGraph graphImpl) throws CrudException { - this.dao = champDao; + this.dao = new ChampDao(graphImpl); //load the schemas OxmModelLoader.loadModels(); diff --git a/src/main/resources/logging/CrudServiceMsgs.properties b/src/main/resources/logging/CrudServiceMsgs.properties index 850574f..13554e5 100644 --- a/src/main/resources/logging/CrudServiceMsgs.properties +++ b/src/main/resources/logging/CrudServiceMsgs.properties @@ -42,22 +42,10 @@ INVALID_OXM_DIR=\ CRD0005I|\ Invalid OXM dir: {0}\ -INSTANTIATE_GRAPH_DAO=\ - CRD0006I|\ - Instantiate data access layer for graph data store type: {0} graph: {1} using hosts: {2} - LOADED_OXM_FILE=\ CRD0007I|\ Successfully loaded schema: {0} -INVALID_GRAPH_BACKEND=\ - CRD0301E|\ - Unsupported graph database {0} specified. - -INSTANTIATE_GRAPH_BACKEND_ERR=\ - CRD0302E|\ - Failure instantiating {0} graph database backend. Cause: {1} - EXCEPTION_DURING_METHOD_CALL=\ CRD0502E|\ Failed to {0} request for {1} due to: {2}|\ @@ -67,9 +55,3 @@ EXCEPTION_DURING_METHOD_CALL=\ OXM_LOAD_ERROR=\ CRD0503E|\ Unable to load OXM schema: {0} - - -TITAN_GRAPH_INFO=\ - CRD0504I|\ - Titan Graph Info: {0} - \ No newline at end of file diff --git a/src/test/java/org/openecomp/crud/dao/champ/ChampDaoTest.java b/src/test/java/org/openecomp/crud/dao/champ/ChampDaoTest.java index b11e274..a895066 100644 --- a/src/test/java/org/openecomp/crud/dao/champ/ChampDaoTest.java +++ b/src/test/java/org/openecomp/crud/dao/champ/ChampDaoTest.java @@ -35,10 +35,10 @@ public class ChampDaoTest { // Create an instance of the Champ DAO, backed by the Champ library's in-memory back end // for testing purposes. - Properties champDaoProperties = new Properties(); + Map champDaoProperties = new HashMap(); champDaoProperties.put(ChampDao.CONFIG_STORAGE_BACKEND, "in-memory"); champDaoProperties.put(ChampDao.CONFIG_GRAPH_NAME, GRAPH_NAME); - champDao = new ChampDao(champDaoProperties); + champDao = new ChampDao(new InMemoryChampGraphImpl.Builder().properties(champDaoProperties).build()); } diff --git a/titan-deps-pom.xml b/titan-deps-pom.xml new file mode 100644 index 0000000..869c9a1 --- /dev/null +++ b/titan-deps-pom.xml @@ -0,0 +1,89 @@ + + 4.0.0 + com.test + mytitan + 0.0.1-SNAPSHOT + pom + + + + + + org.openecomp.aai + champ-titan + 1.1.1-AMDOCS-SNAPSHOT + + + com.thinkaurelius.titan + titan-cassandra + 1.0.0 + + + org.apache.tinkerpop + gremlin-groovy + + + org.slf4j + slf4j-log4j12 + + + ch.qos.logback + logback-classic + + + org.apache.tinkerpop + gremlin-core + + + + + com.thinkaurelius.titan + titan-hbase + 1.0.0 + + + org.apache.tinkerpop + gremlin-groovy + + + org.slf4j + slf4j-log4j12 + + + ch.qos.logback + logback-classic + + + org.apache.tinkerpop + gremlin-core + + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.0.1 + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/graph-deps/titan-deps + false + false + true + + + + + + + + \ No newline at end of file -- 2.16.6