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>
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"]
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
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';
--- /dev/null
+### 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/>
+
--- /dev/null
+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=
+
+
--- /dev/null
+#
+# -------------------------------------------------------------------------
+# 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
<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>
}
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());
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.");
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."
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()) {
* @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()) {
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;
}
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;
}
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;
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) {
}
@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'");
}
@Test
- public void testJsonMaptoSqlString() {
+ public void testJsonMaptoSqlString() throws Exception {
Map<String,Object> myMap = new HashMap<>();
myMap.put("name","tom");
myMap.put("value",5);
major=2
minor=4
-patch=14
+patch=15
base_version=${major}.${minor}.${patch}