From ed47d0c5d004b1ce099090100dda6dc1d963782c Mon Sep 17 00:00:00 2001 From: "Thomas Nelson Jr (arthurdent3) tn1381@att.com" Date: Thu, 8 Mar 2018 01:55:21 -0500 Subject: Docker Updates for CSIT Udates fro Docker and also a few bug fixes. Change-Id: I48d8ee81412c7ce664e6b3e33c06e952afad734e Issue-ID: MUSIC-32, MUSIC-51 Signed-off-by: Thomas Nelson Jr (arthurdent3) tn1381@att.com --- distribution/cassandra/Dockerfile | 3 +- distribution/cassandra/docker-entrypoint.sh | 17 ++++- distribution/cassandra/music_single.cql | 2 +- distribution/dockermusic/README.md | 17 +++++ .../dockermusic/properties/music.properties | 19 +++++ distribution/dockermusic/start.sh | 82 ++++++++++++++++++++++ pom.xml | 2 +- src/main/java/org/onap/music/main/CachingUtil.java | 18 ++--- src/main/java/org/onap/music/main/MusicCore.java | 7 +- src/main/java/org/onap/music/main/MusicUtil.java | 4 +- .../org/onap/music/rest/RestMusicAdminAPI.java | 14 ++-- .../java/org/onap/music/rest/RestMusicDataAPI.java | 7 +- .../org/onap/music/unittests/MusicUtilTest.java | 4 +- version.properties | 2 +- 14 files changed, 175 insertions(+), 23 deletions(-) create mode 100644 distribution/dockermusic/README.md create mode 100644 distribution/dockermusic/properties/music.properties create mode 100644 distribution/dockermusic/start.sh diff --git a/distribution/cassandra/Dockerfile b/distribution/cassandra/Dockerfile index 0e851f47..9405fcb3 100644 --- a/distribution/cassandra/Dockerfile +++ b/distribution/cassandra/Dockerfile @@ -4,5 +4,6 @@ RUN mkdir -p /docker-entrypoint-initdb.d && mkdir -p /home/cassandra/.cassandra COPY cassandra.yaml /etc/cassandra/ COPY music_single.cql /docker-entrypoint-initdb.d/ COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh -RUN chmod 755 /usr/local/bin/docker-entrypoint.sh +RUN chmod 755 /usr/local/bin/docker-entrypoint.sh && chown -R cassandra /docker-entrypoint-initdb.d + ENTRYPOINT ["docker-entrypoint.sh"] diff --git a/distribution/cassandra/docker-entrypoint.sh b/distribution/cassandra/docker-entrypoint.sh index e46dea9f..cec4587b 100644 --- a/distribution/cassandra/docker-entrypoint.sh +++ b/distribution/cassandra/docker-entrypoint.sh @@ -60,10 +60,25 @@ if [ "$1" = 'cassandra' ]; then fi done fi + +for f in /docker-entrypoint-initdb.d/*.cql; do + if [ "${CASSUSER}" ]; then + sed -ri 's/CASSUSER/'${CASSUSER}'/' "$f" + fi + if [ "${CASSPASS}" ]; then + sed -ri 's/CASSPASS/'${CASSPASS}'/' "$f" + fi +done + + + + echo "################################ Let run Scripts ##############################" for f in /docker-entrypoint-initdb.d/*; do + case "$f" in - *.cql) echo "$0: running $f" && until cqlsh -u cassandra -p cassandra -f "$f"; do >&2 echo "Cassandra is unavailable - sleeping"; sleep 2; done & ;; + *.cql) + echo "$0: running $f" && until cqlsh -u cassandra -p cassandra -f "$f"; do >&2 echo "Cassandra is unavailable - sleeping"; sleep 2; done & ;; *) echo "$0: ignoring $f" ;; esac echo diff --git a/distribution/cassandra/music_single.cql b/distribution/cassandra/music_single.cql index 11eb2df0..b8a60cd1 100644 --- a/distribution/cassandra/music_single.cql +++ b/distribution/cassandra/music_single.cql @@ -16,5 +16,5 @@ CREATE TABLE IF NOT EXISTS admin.keyspace_master ( PRIMARY KEY (uuid) ); -CREATE ROLE IF NOT EXISTS nelson24 WITH PASSWORD = 'winman123' AND SUPERUSER = True AND LOGIN = True; +CREATE ROLE IF NOT EXISTS CASSUSER WITH PASSWORD = 'CASSPASS' AND SUPERUSER = True AND LOGIN = True; ALTER ROLE cassandra WITH PASSWORD = 'SomeLongRandomStringNoonewillthinkof'; diff --git a/distribution/dockermusic/README.md b/distribution/dockermusic/README.md new file mode 100644 index 00000000..436921b0 --- /dev/null +++ b/distribution/dockermusic/README.md @@ -0,0 +1,17 @@ +### Docker Setup for Single instance of MUSIC + +

Please update the properties/music.properties file to fit your env.
+Update the start.sh file.
+The beginning of the start.sh file contains various variables.

+ +CASS_IMG - Cassandra Image
+TOMCAT_IMG - Tomcat Image
+ZK_IMG - Zookeeper Image
+MUSIC_IMG - Music Image containing the MUSIC war file.
+WORK_DIR - Default to PWD.
+CASS_USERNAME - Username for Cassandra - should match cassandra.user in music.properties +file
+CASS_PASSWORD - Password for Cassandra - should match cassandra.password in music.properties.
+ +MUSIC Logs will be saved in logs/MUSIC after start of tomcat.
+ diff --git a/distribution/dockermusic/properties/music.properties b/distribution/dockermusic/properties/music.properties new file mode 100644 index 00000000..02ba435c --- /dev/null +++ b/distribution/dockermusic/properties/music.properties @@ -0,0 +1,19 @@ +my.public.ip=localhost +all.public.ips=localhost +my.id=0 +all.ids=0 +####################################### +# Optional current values are defaults +####################################### +zookeeper.host=music-zk +cassandra.host=music-db +#music.ip=localhost +#debug=true +#music.rest.ip=localhost +#lock.lease.period=6000 +cassandra.user=xxuserxxx +cassandra.password=xxpasswordxx +# AAF Endpoint if using AAF +#aaf.endpoint.url= + + diff --git a/distribution/dockermusic/start.sh b/distribution/dockermusic/start.sh new file mode 100644 index 00000000..57b05890 --- /dev/null +++ b/distribution/dockermusic/start.sh @@ -0,0 +1,82 @@ +# +# ------------------------------------------------------------------------- +# Copyright (c) 2017 AT&T Intellectual Property +# +# 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. +# +# ------------------------------------------------------------------------- +# In this example we are building a docker bridge network(music-net) for all +# the containers +# Then we connect the host bridge network(bridge) to the internal network(music-net) +# +# +# +CASS_IMG=nexus3.onap.org:10001/onap/music/cassandra_music:latest +TOMCAT_IMG=nexus3.onap.org:10001/library/tomcat:8.0 +ZK_IMG=nexus3.onap.org:10001/library/zookeeper:3.4 +MUSIC_IMG=nexus3.onap.org:10001/onap/music/music:latest +WORK_DIR=${PWD} +CASS_USERNAME=cassandra1 +CASS_PASSWORD=cassandra1 + +if [ "$1" = "start" ]; then + +# Create Volume for mapping war file and tomcat +docker volume create music-vol; + +# Create a network for all the containers to run in. +docker network create music-net; + +# Start Cassandra +docker run -d --rm --name music-db --network music-net \ +-p "7000:7000" -p "7001:7001" -p "7199:7199" -p "9042:9042" -p "9160:9160" \ +-e CASSNAME=${CASS_USERNAME} \ +-e CASSPASS=${CASS_PASSWORD} \ +${CASS_IMG}; + +# Start Music war +docker run -d --rm --name music-war \ +-v music-vol:/app \ +${MUSIC_IMG}; + +# Start Zookeeper +docker run -d --rm --name music-zk --network music-net +-p "2181:2181" -p "2888:2888" -p "3888:3888" \ +${ZK_IMG}; + +# Delay for Cassandra +sleep 20; + +# Start Up tomcat - Needs to have properties,logs dir and war file volume mapped. +docker run -d --rm --name music-tomcat --network music-net -p "8080:8080" \ +-v music-vol:/usr/local/tomcat/webapps \ +-v ${WORK_DIR}/properties:/opt/app/music/etc:ro \ +-v ${WORK_DIR}/logs:/opt/app/music/logs \ +${TOMCAT_IMG}; + +# Connect tomcat to host bridge network so that its port can be seen. +docker network connect bridge music-tomcat; + +fi + + +# Shutdown and clean up. +if [ "$1" = "stop" ]; then +docker stop music-war; +docker stop music-db; +docker stop music-zk; +docker stop music-tomcat; +docker network rm music-net; +sleep 5; +docker volume rm music-vol; +fi diff --git a/pom.xml b/pom.xml index dbc24ba2..891c3a2b 100755 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ org.onap.music MUSIC war - 2.4.14 + 2.4.15 This is the MUSIC REST interface, packaged as a war file. diff --git a/src/main/java/org/onap/music/main/CachingUtil.java b/src/main/java/org/onap/music/main/CachingUtil.java index 40dffa2d..aee3abbf 100755 --- a/src/main/java/org/onap/music/main/CachingUtil.java +++ b/src/main/java/org/onap/music/main/CachingUtil.java @@ -392,11 +392,9 @@ public class CachingUtil implements Runnable { } PreparedQueryObject queryObject = new PreparedQueryObject(); queryObject.appendQueryString( - "select * from admin.keyspace_master where application_name = ? and username = ? and password = ? allow filtering"); + "select * from admin.keyspace_master where application_name = ? allow filtering"); try { queryObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), ns)); - queryObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), userId)); - queryObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), password)); } catch(Exception e) { resultMap.put("Exception", "Unable to process input data. Invalid input data type. Please check ns, userId and password values. "+e.getMessage()); @@ -412,16 +410,20 @@ public class CachingUtil implements Runnable { return resultMap; } if (rs == null) { - logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.AUTHENTICATIONERROR, ErrorSeverity.WARN, ErrorTypes.AUTHENTICATIONERROR); - logger.error(EELFLoggerDelegate.errorLogger,"Namespace, UserId and password doesn't match. namespace: "+ns+" and userId: "+userId); - - resultMap.put("Exception", "Namespace, UserId and password doesn't match. namespace: "+ns+" and userId: "+userId); + logger.error(EELFLoggerDelegate.errorLogger,"Application is not onboarded. Please contact admin."); + resultMap.put("Exception", "Application is not onboarded. Please contact admin."); } else { + if(!(rs.getString("username").equals(userId)) && !(rs.getString("password").equals("password"))) { + logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.AUTHENTICATIONERROR, ErrorSeverity.WARN, ErrorTypes.AUTHENTICATIONERROR); + logger.error(EELFLoggerDelegate.errorLogger,"Namespace, UserId and password doesn't match. namespace: "+ns+" and userId: "+userId); + resultMap.put("Exception", "Namespace, UserId and password doesn't match. namespace: "+ns+" and userId: "+userId); + return resultMap; + } boolean is_aaf = rs.getBool("is_aaf"); String keyspace = rs.getString("keyspace_name"); if (!is_aaf) { if (!keyspace.equals(MusicUtil.DEFAULTKEYSPACENAME)) { - logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.MISSINGINFO ,ErrorSeverity.WARN, ErrorTypes.DATAERROR); + logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.MISSINGINFO ,ErrorSeverity.WARN, ErrorTypes.DATAERROR); logger.error(EELFLoggerDelegate.errorLogger,"Non AAF applications are allowed to have only one keyspace per application."); resultMap.put("Exception", "Non AAF applications are allowed to have only one keyspace per application."); diff --git a/src/main/java/org/onap/music/main/MusicCore.java b/src/main/java/org/onap/music/main/MusicCore.java index fdf43a45..73a6ee55 100644 --- a/src/main/java/org/onap/music/main/MusicCore.java +++ b/src/main/java/org/onap/music/main/MusicCore.java @@ -119,7 +119,12 @@ public class MusicCore { logger.info(EELFLoggerDelegate.applicationLogger,"Acquiring data store handle"); long start = System.currentTimeMillis(); if (mDstoreHandle == null) { - mDstoreHandle = new MusicDataStore(); + // Quick Fix - Best to put this into every call to getDSHandle? + if (! MusicUtil.getMyCassaHost().equals("localhost") ) { + mDstoreHandle = new MusicDataStore(MusicUtil.getMyCassaHost()); + } else { + mDstoreHandle = new MusicDataStore(); + } } if(mDstoreHandle.getSession() == null) { String message = "Connection to Cassandra has not been enstablished." diff --git a/src/main/java/org/onap/music/main/MusicUtil.java b/src/main/java/org/onap/music/main/MusicUtil.java index 5bc9f94f..0f77614e 100755 --- a/src/main/java/org/onap/music/main/MusicUtil.java +++ b/src/main/java/org/onap/music/main/MusicUtil.java @@ -394,7 +394,7 @@ public class MusicUtil { MusicUtil.cassPwd = cassPwd; } - public static String convertToCQLDataType(DataType type, Object valueObj) { + public static String convertToCQLDataType(DataType type, Object valueObj) throws Exception { String value = ""; switch (type.getName()) { @@ -459,7 +459,7 @@ public class MusicUtil { * @return */ - public static String jsonMaptoSqlString(Map jMap, String lineDelimiter) { + public static String jsonMaptoSqlString(Map jMap, String lineDelimiter) throws Exception{ StringBuilder sqlString = new StringBuilder(); int counter = 0; for (Map.Entry entry : jMap.entrySet()) { diff --git a/src/main/java/org/onap/music/rest/RestMusicAdminAPI.java b/src/main/java/org/onap/music/rest/RestMusicAdminAPI.java index 849c3a98..cbe9ec9c 100755 --- a/src/main/java/org/onap/music/rest/RestMusicAdminAPI.java +++ b/src/main/java/org/onap/music/rest/RestMusicAdminAPI.java @@ -167,8 +167,14 @@ public class RestMusicAdminAPI { Row row = (Row) it.next(); resultMap.put( row.getUUID("uuid").toString(),row.getString("keyspace_name")); } - if (resultMap.isEmpty()) - resultMap.put("ERROR", "Application is not onboarded. Please contact admin."); + if (resultMap.isEmpty()) { + if(uuid != null) + resultMap.put("Exception", "Please make sure Aid is correct and application is onboarded."); + else { + resultMap.put("Exception", + "Application is not onboarded. Please make sure all the information is correct."); + } + } return resultMap; } @@ -212,7 +218,7 @@ public class RestMusicAdminAPI { resultMap.put("Success", "Your application has been deleted successfully"); } else { resultMap.put("Exception", - "Oops. Spomething went wrong. Please make sure Aid is correct or Application is onboarded"); + "Oops. Something went wrong. Please make sure Aid is correct or Application is onboarded"); } return resultMap; } @@ -329,7 +335,7 @@ public class RestMusicAdminAPI { resultMap.put("Success", "Your application has been updated successfully"); } else { resultMap.put("Exception", - "Oops. Spomething went wrong. Please make sure Aid is correct and application is onboarded"); + "Oops. Something went wrong. Please make sure Aid is correct and application is onboarded"); } return resultMap; diff --git a/src/main/java/org/onap/music/rest/RestMusicDataAPI.java b/src/main/java/org/onap/music/rest/RestMusicDataAPI.java index ed586d06..e7af8f9f 100755 --- a/src/main/java/org/onap/music/rest/RestMusicDataAPI.java +++ b/src/main/java/org/onap/music/rest/RestMusicDataAPI.java @@ -181,7 +181,12 @@ public class RestMusicDataAPI { boolean result = false; long start = System.currentTimeMillis(); Map replicationInfo = kspObject.getReplicationInfo(); - String repString = "{" + MusicUtil.jsonMaptoSqlString(replicationInfo, ",") + "}"; + String repString = null; + try { + repString = "{" + MusicUtil.jsonMaptoSqlString(replicationInfo, ",") + "}"; + } catch (Exception e) { + logger.error(EELFLoggerDelegate.errorLogger, e.getMessage()); + } queryObject.appendQueryString( "CREATE KEYSPACE " + keyspaceName + " WITH replication = " + repString); if (kspObject.getDurabilityOfWrites() != null) { diff --git a/src/test/java/org/onap/music/unittests/MusicUtilTest.java b/src/test/java/org/onap/music/unittests/MusicUtilTest.java index f8cab32a..47edc1e3 100644 --- a/src/test/java/org/onap/music/unittests/MusicUtilTest.java +++ b/src/test/java/org/onap/music/unittests/MusicUtilTest.java @@ -169,7 +169,7 @@ public class MusicUtilTest { } @Test - public void testConvertToCQLDataType() { + public void testConvertToCQLDataType() throws Exception { Map myMap = new HashMap(); myMap.put("name","tom"); assertEquals(MusicUtil.convertToCQLDataType(DataType.varchar(),"Happy People"),"'Happy People'"); @@ -195,7 +195,7 @@ public class MusicUtilTest { } @Test - public void testJsonMaptoSqlString() { + public void testJsonMaptoSqlString() throws Exception { Map myMap = new HashMap<>(); myMap.put("name","tom"); myMap.put("value",5); diff --git a/version.properties b/version.properties index ba681f30..632fc91b 100644 --- a/version.properties +++ b/version.properties @@ -4,7 +4,7 @@ major=2 minor=4 -patch=14 +patch=15 base_version=${major}.${minor}.${patch} -- cgit 1.2.3-korg