Docker Updates for CSIT 89/34689/1
authorThomas Nelson Jr (arthurdent3) tn1381@att.com <tn1381@att.com>
Thu, 8 Mar 2018 06:55:21 +0000 (01:55 -0500)
committerThomas Nelson Jr (arthurdent3) tn1381@att.com <tn1381@att.com>
Thu, 8 Mar 2018 06:55:21 +0000 (01:55 -0500)
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 <tn1381@att.com>
14 files changed:
distribution/cassandra/Dockerfile
distribution/cassandra/docker-entrypoint.sh
distribution/cassandra/music_single.cql
distribution/dockermusic/README.md [new file with mode: 0644]
distribution/dockermusic/properties/music.properties [new file with mode: 0644]
distribution/dockermusic/start.sh [new file with mode: 0644]
pom.xml
src/main/java/org/onap/music/main/CachingUtil.java
src/main/java/org/onap/music/main/MusicCore.java
src/main/java/org/onap/music/main/MusicUtil.java
src/main/java/org/onap/music/rest/RestMusicAdminAPI.java
src/main/java/org/onap/music/rest/RestMusicDataAPI.java
src/test/java/org/onap/music/unittests/MusicUtilTest.java
version.properties

index 0e851f4..9405fcb 100644 (file)
@@ -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"]
index e46dea9..cec4587 100644 (file)
@@ -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
index 11eb2df..b8a60cd 100644 (file)
@@ -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 (file)
index 0000000..436921b
--- /dev/null
@@ -0,0 +1,17 @@
+### Docker Setup for Single instance of MUSIC
+
+<p>Please update the <b>properties/music.properties</b> file to fit your env.<br/>
+Update the start.sh file.<br/>
+The beginning of the <b>start.sh</b> file contains various variables.<br/></p>
+
+CASS_IMG - Cassandra Image<br/>
+TOMCAT_IMG - Tomcat Image<br/>
+ZK_IMG - Zookeeper Image<br/>
+MUSIC_IMG - Music Image containing the MUSIC war file.<br/>
+WORK_DIR -  Default to PWD.<br/>
+CASS_USERNAME - Username for Cassandra - should match cassandra.user in music.properties 
+file<br/>
+CASS_PASSWORD - Password for Cassandra - should match cassandra.password in music.properties.<br/>
+
+MUSIC Logs will be saved in logs/MUSIC after start of tomcat.<br/> 
+
diff --git a/distribution/dockermusic/properties/music.properties b/distribution/dockermusic/properties/music.properties
new file mode 100644 (file)
index 0000000..02ba435
--- /dev/null
@@ -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 (file)
index 0000000..57b0589
--- /dev/null
@@ -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 dbc24ba..891c3a2 100755 (executable)
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,7 @@
     <groupId>org.onap.music</groupId>
     <artifactId>MUSIC</artifactId>
     <packaging>war</packaging>
-    <version>2.4.14</version>
+    <version>2.4.15</version>
     <description>
             This is the MUSIC REST interface, packaged as a war file.
           </description>
index 40dffa2..aee3abb 100755 (executable)
@@ -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.");
index fdf43a4..73a6ee5 100644 (file)
@@ -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."
index 5bc9f94..0f77614 100755 (executable)
@@ -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<String, Object> jMap, String lineDelimiter) {
+    public static String jsonMaptoSqlString(Map<String, Object> jMap, String lineDelimiter) throws Exception{
         StringBuilder sqlString = new StringBuilder();
         int counter = 0;
         for (Map.Entry<String, Object> entry : jMap.entrySet()) {
index 849c3a9..cbe9ec9 100755 (executable)
@@ -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;
index ed586d0..e7af8f9 100755 (executable)
@@ -181,7 +181,12 @@ public class RestMusicDataAPI {
         boolean result = false;
         long start = System.currentTimeMillis();
         Map<String, Object> 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) {
index f8cab32..47edc1e 100644 (file)
@@ -169,7 +169,7 @@ public class MusicUtilTest {
     }
 
     @Test
-    public void testConvertToCQLDataType() {
+    public void testConvertToCQLDataType() throws Exception {
         Map<String,Object> myMap = new HashMap<String,Object>();
         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<String,Object> myMap = new HashMap<>();
         myMap.put("name","tom");
         myMap.put("value",5);
index ba681f3..632fc91 100644 (file)
@@ -4,7 +4,7 @@
 
 major=2
 minor=4
-patch=14
+patch=15
 
 base_version=${major}.${minor}.${patch}