aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Daugherty <rd472p@att.com>2018-12-04 12:22:49 -0500
committerRob Daugherty <rd472p@att.com>2018-12-04 12:23:57 -0500
commitc873e7629db2741ab675f2df88ecbc4d53b5215c (patch)
tree335b19857123db9a90bcfb12484951a1c7df3ce7
parentc913f4200caf3d2b0721bc3537112eb4d055b291 (diff)
MUSIC-224 Dockerize MdbcServer
This is a single site installation, with a cassandra container, a mariadb container, and an mdbc-server container. To build the docker images, first build mdbc software normally, then use the 'docker' maven profile: mvn -P docker To bring up the environment: cd mdbc-packages/mdbc-docker/compose/one-site docker-compose up Change-Id: Ie48487fc6c7853b80017dfa45aff52801da52cf0 Issue-ID: MUSIC-224 Signed-off-by: Rob Daugherty <rd472p@att.com>
-rw-r--r--mdbc-packages/mdbc-docker/compose/one-site/.env2
-rw-r--r--mdbc-packages/mdbc-docker/compose/one-site/docker-compose.yml72
-rw-r--r--mdbc-packages/mdbc-docker/compose/one-site/volumes/cassandra/docker-entrypoint-initdb.d/01-create-music-internal-keyspace.cql1
-rw-r--r--mdbc-packages/mdbc-docker/compose/one-site/volumes/mariadb/conf.d/mariadb1.cnf193
-rw-r--r--mdbc-packages/mdbc-docker/compose/one-site/volumes/mariadb/docker-entrypoint-initdb.d/01-create-test-database.sh28
-rw-r--r--mdbc-packages/mdbc-docker/compose/one-site/volumes/mdbc-server/config/music.properties4
-rw-r--r--mdbc-packages/mdbc-docker/compose/one-site/volumes/mdbc-server/config/tableConfiguration.json23
-rw-r--r--mdbc-packages/mdbc-docker/pom.xml171
-rw-r--r--mdbc-packages/mdbc-docker/src/main/docker/docker-files/Dockerfile.mdbc-cassandra9
-rw-r--r--mdbc-packages/mdbc-docker/src/main/docker/docker-files/Dockerfile.mdbc-server30
-rw-r--r--mdbc-packages/mdbc-docker/src/main/docker/docker-files/scripts/start-cassandra.sh148
-rw-r--r--mdbc-packages/mdbc-docker/src/main/docker/docker-files/scripts/start-mdbc-server.sh82
-rwxr-xr-xmdbc-packages/mdbc-docker/src/main/docker/docker-files/scripts/wait-for.sh103
-rw-r--r--mdbc-packages/pom.xml33
-rwxr-xr-xpom.xml1
15 files changed, 900 insertions, 0 deletions
diff --git a/mdbc-packages/mdbc-docker/compose/one-site/.env b/mdbc-packages/mdbc-docker/compose/one-site/.env
new file mode 100644
index 0000000..1c22d2b
--- /dev/null
+++ b/mdbc-packages/mdbc-docker/compose/one-site/.env
@@ -0,0 +1,2 @@
+# Default values used by docker-compose if not defined as environment variables.
+MTU=1500
diff --git a/mdbc-packages/mdbc-docker/compose/one-site/docker-compose.yml b/mdbc-packages/mdbc-docker/compose/one-site/docker-compose.yml
new file mode 100644
index 0000000..d30d3e2
--- /dev/null
+++ b/mdbc-packages/mdbc-docker/compose/one-site/docker-compose.yml
@@ -0,0 +1,72 @@
+version: '3'
+networks:
+ default:
+ driver: bridge
+ driver_opts:
+ com.docker.network.driver.mtu: ${MTU}
+services:
+################################################################################
+ cassandra-1:
+ image:
+ onap/music/mdbc-cassandra
+ container_name:
+ cassandra-1
+ hostname:
+ cassandra-1.music.testlab.onap.org
+ expose:
+ - 9042
+ - 9160
+ - 7199
+ environment:
+ - CASSANDRA_CLUSTER_NAME=testcluster
+ - CASSANDRA_SEEDS=cassandra-1
+ - CASSANDRA_START_RPC=true
+ volumes:
+ - ./volumes/cassandra/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
+# - ./cache/cassandra-1:/var/lib/cassandra
+ command:
+ - -s0
+################################################################################
+ mariadb-1:
+ image: mariadb:10.1.11
+ container_name:
+ mariadb-1
+ hostname:
+ mariadb-1.music.testlab.onap.org
+ expose:
+ - 3306
+ environment:
+ - MYSQL_ROOT_PASSWORD=password
+ volumes:
+ - ./volumes/mariadb/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
+ - ./volumes/mariadb/conf.d:/etc/mysql/conf.d
+################################################################################
+ mdbc-server-1:
+ image: onap/music/mdbc-server
+ container_name:
+ mdbc-server-1
+ ports:
+ - "30001:30001"
+ volumes:
+ - ./volumes/mdbc-server/config:/app/config
+ environment:
+ - JVM_ARGS=-Xms64m -Xmx512m
+ - AVATICA_PORT=30001
+ - JDBC_URL=jdbc:mysql://mariadb-1:3306
+ - JDBC_USER=test
+ - JDBC_PASSWORD=password
+ - EXIT_DELAY=900
+ hostname:
+ mdbc-server-1.music.testlab.onap.org
+ depends_on:
+ - cassandra-1
+ - mariadb-1
+ command:
+ - /app/wait-for.sh
+ - -q
+ - -t
+ - "300"
+ - cassandra-1:9042
+ - mariadb-1:3306
+ - --
+ - "/app/start-mdbc-server.sh"
diff --git a/mdbc-packages/mdbc-docker/compose/one-site/volumes/cassandra/docker-entrypoint-initdb.d/01-create-music-internal-keyspace.cql b/mdbc-packages/mdbc-docker/compose/one-site/volumes/cassandra/docker-entrypoint-initdb.d/01-create-music-internal-keyspace.cql
new file mode 100644
index 0000000..7884dd5
--- /dev/null
+++ b/mdbc-packages/mdbc-docker/compose/one-site/volumes/cassandra/docker-entrypoint-initdb.d/01-create-music-internal-keyspace.cql
@@ -0,0 +1 @@
+CREATE KEYSPACE IF NOT EXISTS music_internal WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true;
diff --git a/mdbc-packages/mdbc-docker/compose/one-site/volumes/mariadb/conf.d/mariadb1.cnf b/mdbc-packages/mdbc-docker/compose/one-site/volumes/mariadb/conf.d/mariadb1.cnf
new file mode 100644
index 0000000..39ed022
--- /dev/null
+++ b/mdbc-packages/mdbc-docker/compose/one-site/volumes/mariadb/conf.d/mariadb1.cnf
@@ -0,0 +1,193 @@
+# Example MySQL config file for medium systems.
+#
+# This is for a system with memory 8G where MySQL plays
+# an important part, or systems up to 128M where MySQL is used together with
+# other programs (such as a web server)
+#
+# In this file, you can use all long options that a program supports.
+# If you want to know which options a program supports, run the program
+# with the "--help" option.
+
+# The following options will be passed to all MySQL clients
+##[client]
+##user = root
+##port = 3306
+##socket = //opt/app/mysql/mysql.sock
+
+# Here follows entries for some specific programs
+
+# The MySQL server
+[mysqld]
+##performance_schema
+
+slow_query_log =ON
+long_query_time =2
+slow_query_log_file =//var/lib/mysql/slow_query.log
+
+skip-external-locking
+explicit_defaults_for_timestamp = true
+skip-symbolic-links
+local-infile = 0
+key_buffer_size = 16M
+max_allowed_packet = 4M
+table_open_cache = 100
+sort_buffer_size = 512K
+net_buffer_length = 8K
+read_buffer_size = 256K
+read_rnd_buffer_size = 512K
+myisam_sort_buffer_size = 8M
+max_connections = 500
+lower_case_table_names = 1
+thread_stack = 256K
+thread_cache_size = 25
+query_cache_size = 8M
+query_cache_type = 0
+query_prealloc_size = 512K
+query_cache_limit = 1M
+
+# Password validation
+##plugin-load-add=simple_password_check.so
+##simple_password_check_other_characters=0
+
+# Audit Log settings
+plugin-load-add=server_audit.so
+server_audit=FORCE_PLUS_PERMANENT
+server_audit_file_path=//var/lib/mysql/audit.log
+server_audit_file_rotate_size=50M
+server_audit_events=CONNECT,QUERY,TABLE
+server_audit_logging=on
+
+# Don't listen on a TCP/IP port at all. This can be a security enhancement,
+# if all processes that need to connect to mysqld run on the same host.
+# All interaction with mysqld must be made via Unix sockets or named pipes.
+# Note that using this option without enabling named pipes on Windows
+# (via the "enable-named-pipe" option) will render mysqld useless!
+#
+#skip-networking
+
+# Replication Master Server (default)
+# binary logging is required for replication
+##log-bin=//var/lib/mysql/mysql-bin
+
+# binary logging format - mixed recommended
+binlog_format=row
+
+# required unique id between 1 and 2^32 - 1
+# defaults to 1 if master-host is not set
+# but will not function as a master if omitted
+
+# Replication Slave (comment out master section to use this)
+#
+# To configure this host as a replication slave, you can choose between
+# two methods :
+#
+# 1) Use the CHANGE MASTER TO command (fully described in our manual) -
+# the syntax is:
+#
+# CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>,
+# MASTER_USER=<user>, MASTER_PASSWORD=<password> ;
+#
+# where you replace <host>, <user>, <password> by quoted strings and
+# <port> by the master's port number (3306 by default).
+#
+# Example:
+#
+# CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,
+# MASTER_USER='joe', MASTER_PASSWORD='secret';
+#
+# OR
+#
+# 2) Set the variables below. However, in case you choose this method, then
+# start replication for the first time (even unsuccessfully, for example
+# if you mistyped the password in master-password and the slave fails to
+# connect), the slave will create a master.info file, and any later
+# change in this file to the variables' values below will be ignored and
+# overridden by the content of the master.info file, unless you shutdown
+# the slave server, delete master.info and restart the slaver server.
+# For that reason, you may want to leave the lines below untouched
+# (commented) and instead use CHANGE MASTER TO (see above)
+#
+# required unique id between 2 and 2^32 - 1
+# (and different from the master)
+# defaults to 2 if master-host is set
+# but will not function as a slave if omitted
+#server-id = 2
+#
+# The replication master for this slave - required
+#master-host = <hostname>
+#
+# The username the slave will use for authentication when connecting
+# to the master - required
+#master-user = <username>
+#
+# The password the slave will authenticate with when connecting to
+# the master - required
+#master-password = <password>
+#
+# The port the master is listening on.
+# optional - defaults to 3306
+#master-port = <port>
+#
+# binary logging - not required for slaves, but recommended
+#log-bin=mysql-bin
+
+# Uncomment the following if you are using InnoDB tables
+##innodb_data_home_dir = //opt/app/mysql/data
+##innodb_data_file_path = ibdata1:20M:autoextend:max:32G
+##innodb_log_group_home_dir = //opt/app/mysql/iblogs
+# You can set .._buffer_pool_size up to 50 - 80 %
+# of RAM but beware of setting memory usage too high
+#innodb_buffer_pool_size = 6380M
+#innodb_additional_mem_pool_size = 2M
+# Set .._log_file_size to 25 % of buffer pool size
+innodb_log_file_size = 150M
+innodb_log_files_in_group = 3
+innodb_log_buffer_size = 8M
+#innodb_flush_log_at_trx_commit = 1
+innodb_lock_wait_timeout = 50
+innodb_autoextend_increment = 100
+expire_logs_days = 8
+open_files_limit = 2000
+transaction-isolation=READ-COMMITTED
+####### Galera parameters #######
+## Galera Provider configuration
+wsrep_provider=/usr/lib/galera/libgalera_smm.so
+wsrep_provider_options="gcache.size=2G; gcache.page_size=1G"
+## Galera Cluster configuration
+wsrep_cluster_name="MSO-automated-tests-cluster"
+wsrep_cluster_address="gcomm://"
+#wsrep_cluster_address="gcomm://mariadb1,mariadb2,mariadb3"
+##wsrep_cluster_address="gcomm://192.169.3.184,192.169.3.185,192.169.3.186"
+## Galera Synchronization configuration
+wsrep_sst_method=rsync
+#wsrep_sst_method=xtrabackup-v2
+#wsrep_sst_auth="sstuser:Mon#2o!6"
+## Galera Node configuration
+wsrep_node_name="mariadb1"
+##wsrep_node_address="192.169.3.184"
+wsrep_on=ON
+## Status notification
+#wsrep_notify_cmd=/opt/app/mysql/bin/wsrep_notify
+#######
+
+
+[mysqldump]
+quick
+max_allowed_packet = 16M
+
+[mysql]
+no-auto-rehash
+# Remove the next comment character if you are not familiar with SQL
+#safe-updates
+
+[myisamchk]
+key_buffer_size = 20971520
+
+##[mysqlhotcopy]
+##interactive-timeout
+##[mysqld_safe]
+##malloc-lib=//opt/app/mysql/local/lib/libjemalloc.so.1
+##log-error=//opt/app/mysql/log/mysqld.log
+
+general_log_file = /var/log/mysql/mysql.log
+general_log = 1
diff --git a/mdbc-packages/mdbc-docker/compose/one-site/volumes/mariadb/docker-entrypoint-initdb.d/01-create-test-database.sh b/mdbc-packages/mdbc-docker/compose/one-site/volumes/mariadb/docker-entrypoint-initdb.d/01-create-test-database.sh
new file mode 100644
index 0000000..3316153
--- /dev/null
+++ b/mdbc-packages/mdbc-docker/compose/one-site/volumes/mariadb/docker-entrypoint-initdb.d/01-create-test-database.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+#
+# ============LICENSE_START=====================================================
+# Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+# ==============================================================================
+# 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.
+# ============LICENSE_END=======================================================
+#
+
+echo "Creating test database and user . . ."
+mysql -uroot -p$MYSQL_ROOT_PASSWORD << 'EOF' || exit 1
+DROP DATABASE IF EXISTS `test`;
+CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET latin1 */;
+DELETE FROM mysql.user WHERE User='test';
+CREATE USER 'test';
+GRANT ALL ON test.* TO 'test' identified by 'password' with GRANT OPTION;
+FLUSH PRIVILEGES;
+EOF
diff --git a/mdbc-packages/mdbc-docker/compose/one-site/volumes/mdbc-server/config/music.properties b/mdbc-packages/mdbc-docker/compose/one-site/volumes/mdbc-server/config/music.properties
new file mode 100644
index 0000000..b030b62
--- /dev/null
+++ b/mdbc-packages/mdbc-docker/compose/one-site/volumes/mdbc-server/config/music.properties
@@ -0,0 +1,4 @@
+cassandra.host = cassandra-1
+cassandra.user = cassandra
+cassandra.password = cassandra
+zookeeper.host = cassandra-1
diff --git a/mdbc-packages/mdbc-docker/compose/one-site/volumes/mdbc-server/config/tableConfiguration.json b/mdbc-packages/mdbc-docker/compose/one-site/volumes/mdbc-server/config/tableConfiguration.json
new file mode 100644
index 0000000..383593a
--- /dev/null
+++ b/mdbc-packages/mdbc-docker/compose/one-site/volumes/mdbc-server/config/tableConfiguration.json
@@ -0,0 +1,23 @@
+{
+ "partitions": [
+ {
+ "tables": [
+ {
+ "table": "table11"
+ }
+ ],
+ "owner": "",
+ "mriTableName": "musicrangeinformation",
+ "mtxdTableName": "musictxdigest",
+ "partitionId": "",
+ "replicationFactor": 1
+ }
+ ],
+ "musicNamespace": "namespace",
+ "tableToPartitionName": "tabletopartition",
+ "partitionInformationTableName": "partitioninfo",
+ "redoHistoryTableName": "redohistory",
+ "sqlDatabaseName": "test",
+ "internalNamespace": "music_internal",
+ "internalReplicationFactor": 1
+}
diff --git a/mdbc-packages/mdbc-docker/pom.xml b/mdbc-packages/mdbc-docker/pom.xml
new file mode 100644
index 0000000..f2e73f7
--- /dev/null
+++ b/mdbc-packages/mdbc-docker/pom.xml
@@ -0,0 +1,171 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.onap.music.mdbc</groupId>
+ <artifactId>mdbc-packages</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+
+ <packaging>pom</packaging>
+ <artifactId>mdbc-docker</artifactId>
+ <name>mdbc-docker</name>
+ <description>MDBC Docker Images</description>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ <mdbc.project.version>${project.version}</mdbc.project.version>
+ <docker.skip>false</docker.skip>
+ <docker.skip.build>false</docker.skip.build>
+ <docker.skip.push>false</docker.skip.push>
+ <docker.pull.registry>nexus3.onap.org:10001</docker.pull.registry>
+ <docker.push.registry>nexus3.onap.org:10003</docker.push.registry>
+ </properties>
+
+ <build>
+ <finalName>${project.artifactId}-${project.version}</finalName>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.groovy.maven</groupId>
+ <artifactId>gmaven-plugin</artifactId>
+ <version>1.0</version>
+ <executions>
+ <execution>
+ <phase>validate</phase>
+ <goals>
+ <goal>execute</goal>
+ </goals>
+ <configuration>
+ <source>
+ println 'Project version: ' + project.properties['mdbc.project.version'];
+ def versionArray;
+ if ( project.properties['mdbc.project.version'] != null ) {
+ versionArray = project.properties['mdbc.project.version'].split('-');
+ }
+
+ if ( project.properties['mdbc.project.version'].endsWith("-SNAPSHOT") ) {
+ project.properties['project.docker.latesttag.version']=versionArray[0] + "-SNAPSHOT-latest";
+ } else {
+ project.properties['project.docker.latesttag.version']=versionArray[0] + "-STAGING-latest";
+ }
+
+ println 'New tag for docker: ' + project.properties['project.docker.latesttag.version'];
+ </source>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <groupId>io.fabric8</groupId>
+ <artifactId>docker-maven-plugin</artifactId>
+ <version>0.19.1</version>
+
+ <configuration>
+ <verbose>true</verbose>
+ <apiVersion>1.23</apiVersion>
+ <pullRegistry>${docker.pull.registry}</pullRegistry>
+ <pushRegistry>${docker.push.registry}</pushRegistry>
+
+ <images>
+ <image>
+ <name>onap/music/mdbc-server</name>
+ <build>
+ <cleanup>try</cleanup>
+ <dockerFileDir>docker-files</dockerFileDir>
+ <dockerFile>Dockerfile.mdbc-server</dockerFile>
+ <tags>
+ <tag>${project.version}</tag>
+ <tag>${project.version}-${maven.build.timestamp}</tag>
+ <tag>${project.docker.latesttag.version}</tag>
+ </tags>
+ <assembly>
+ <inline>
+ <dependencySets>
+ <dependencySet>
+ <includes>
+ <include>org.onap.music.mdbc:mdbc-server:jar:jar-with-dependencies</include>
+ </includes>
+ <outputFileNameMapping>mdbc-server.jar</outputFileNameMapping>
+ </dependencySet>
+ </dependencySets>
+ </inline>
+ </assembly>
+ </build>
+ </image>
+ <image>
+ <!-- The standard cassandra image doesn't give us
+ any way to load a schema before exposing the
+ service ports -->
+ <name>onap/music/mdbc-cassandra</name>
+ <build>
+ <cleanup>try</cleanup>
+ <dockerFileDir>docker-files</dockerFileDir>
+ <dockerFile>Dockerfile.mdbc-cassandra</dockerFile>
+ <tags>
+ <tag>${project.version}</tag>
+ <tag>${project.version}-${maven.build.timestamp}</tag>
+ <tag>${project.docker.latesttag.version}</tag>
+ </tags>
+ </build>
+ </image>
+ </images>
+ </configuration>
+
+ <executions>
+ <execution>
+ <id>clean-images</id>
+ <phase>pre-clean</phase>
+ <goals>
+ <goal>remove</goal>
+ </goals>
+ <configuration>
+ <removeAll>true</removeAll>
+ </configuration>
+ </execution>
+
+ <execution>
+ <id>generate-images</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>build</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>push-images</id>
+ <phase>deploy</phase>
+ <goals>
+ <goal>build</goal>
+ <goal>push</goal>
+ </goals>
+ <configuration>
+ <image>onap/music/mdbc-server,onap/music/mdbc-cassandra</image>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-deploy-plugin</artifactId>
+ <version>2.8</version>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.onap.music.mdbc</groupId>
+ <artifactId>mdbc-server</artifactId>
+ <classifier>jar-with-dependencies</classifier>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/mdbc-packages/mdbc-docker/src/main/docker/docker-files/Dockerfile.mdbc-cassandra b/mdbc-packages/mdbc-docker/src/main/docker/docker-files/Dockerfile.mdbc-cassandra
new file mode 100644
index 0000000..2583234
--- /dev/null
+++ b/mdbc-packages/mdbc-docker/src/main/docker/docker-files/Dockerfile.mdbc-cassandra
@@ -0,0 +1,9 @@
+FROM cassandra:3.11.1
+
+VOLUME /docker-entrypoint-initdb.d
+
+COPY scripts/start-cassandra.sh /
+RUN chmod 755 /start-cassandra.sh
+
+CMD []
+ENTRYPOINT ["/start-cassandra.sh"]
diff --git a/mdbc-packages/mdbc-docker/src/main/docker/docker-files/Dockerfile.mdbc-server b/mdbc-packages/mdbc-docker/src/main/docker/docker-files/Dockerfile.mdbc-server
new file mode 100644
index 0000000..0de50aa
--- /dev/null
+++ b/mdbc-packages/mdbc-docker/src/main/docker/docker-files/Dockerfile.mdbc-server
@@ -0,0 +1,30 @@
+FROM openjdk:8-jdk-alpine
+
+ARG http_proxy
+ARG https_proxy
+ENV HTTP_PROXY=$http_proxy
+ENV HTTPS_PROXY=$https_proxy
+ENV http_proxy=$HTTP_PROXY
+ENV https_proxy=$HTTPS_PROXY
+
+# Update the package list and upgrade installed packages
+RUN apk update && apk upgrade
+
+# Install commonly needed tools
+RUN apk --no-cache add curl netcat-openbsd sudo
+
+# Create 'mdbc' user
+RUN addgroup -g 1000 mdbc && adduser -S -u 1000 -G mdbc -s /bin/sh mdbc
+
+RUN mkdir /app && mkdir /app/config
+
+COPY maven/mdbc-server.jar /app
+COPY scripts/start-mdbc-server.sh /app
+COPY scripts/wait-for.sh /app
+
+RUN chown -R mdbc:mdbc /app && chmod 700 /app/*.sh
+
+VOLUME /app/config
+
+WORKDIR /app
+CMD ["/app/start-mdbc-server.sh"]
diff --git a/mdbc-packages/mdbc-docker/src/main/docker/docker-files/scripts/start-cassandra.sh b/mdbc-packages/mdbc-docker/src/main/docker/docker-files/scripts/start-cassandra.sh
new file mode 100644
index 0000000..362c9e9
--- /dev/null
+++ b/mdbc-packages/mdbc-docker/src/main/docker/docker-files/scripts/start-cassandra.sh
@@ -0,0 +1,148 @@
+#!/bin/bash
+
+# This enhances the standard docker entrypoint script by running cql scripts
+# and shell scripts present in /docker-entrypoint-initdb.d. The public native
+# transport port is not exposed until all the scripts have been completed.
+
+if [[ $PRIVATE_PORT == "" ]]
+then
+ PRIVATE_PORT=19042
+fi
+
+if [[ $START_TIMEOUT_SECS == "" ]]
+then
+ START_TIMEOUT_SECS=300
+fi
+
+function getPort
+{
+ grep "^native_transport_port:" /etc/cassandra/cassandra.yaml | cut -d: -f2 | tr -d '\t '
+}
+
+function setPort
+{
+ local port=$1
+ sed -i "s/^native_transport_port:.*/native_transport_port: $port/" /etc/cassandra/cassandra.yaml
+}
+
+function usage
+{
+ echo "usage: $(basename $0) [-sX]"
+}
+
+sleep=0
+args=
+
+while [[ $# != 0 ]]
+do
+ case "$1" in
+ -s*)
+ sleep=${1:2}
+ shift 1
+ ;;
+ *)
+ usage && exit 1
+ ;;
+ esac
+done
+
+if [[ $# != 0 ]]
+then
+ usage && exit 1
+fi
+
+if [[ $sleep != 0 ]]
+then
+ echo "Delaying startup by $sleep seconds"
+ sleep $sleep
+fi
+
+# Note: this does not start up cassandra
+echo "Running docker-entrypoint.sh to configure cassandra"
+/docker-entrypoint.sh true || exit 1
+
+echo "Enabling password authentication"
+sed -i 's/^authenticator: AllowAllAuthenticator/authenticator: PasswordAuthenticator/g' /etc/cassandra/cassandra.yaml || exit 1
+
+if [[ $(/bin/ls -1 /docker-entrypoint-initdb.d 2>/dev/null | wc -l) == 0 ]]
+then
+ echo "Starting cassandra"
+else
+ # Get the public native transport port from cassandra.yaml
+
+ public_port=$(getPort)
+
+ if [[ $public_port == "" ]]
+ then
+ echo "ERROR: No native_transport_port in /etc/cassandra/cassandra.yaml"
+ exit 1
+ fi
+
+ echo "Starting cassandra on port $PRIVATE_PORT"
+ setPort $PRIVATE_PORT || exit 1
+
+ /docker-entrypoint.sh cassandra
+
+ if [[ $? != 0 ]]
+ then
+ setPort $public_port
+ exit 1
+ fi
+
+ tries=$START_TIMEOUT_SECS
+
+ while true
+ do
+ if echo "describe keyspaces;" | cqlsh -u cassandra -p cassandra 127.0.0.1 $PRIVATE_PORT >/dev/null 2>&1
+ then
+ break
+ fi
+
+ tries=$((tries-1))
+
+ if [[ $tries == 0 ]]
+ then
+ setPort $public_port
+ echo "Timed out waiting for cassandra to start on port $PRIVATE_PORT"
+ exit 1
+ fi
+
+ sleep 1
+ done
+
+ echo "Cassandra is started on port $PRIVATE_PORT"
+
+ for file in $(/bin/ls -1 /docker-entrypoint-initdb.d 2>/dev/null)
+ do
+ case "$file" in
+ *.sh)
+ echo "Running $file"
+ source "/docker-entrypoint-initdb.d/$file"
+ ;;
+ *.cql)
+ echo "Running $file"
+ cqlsh -u cassandra -p cassandra -f "/docker-entrypoint-initdb.d/$file" 127.0.0.1 $PRIVATE_PORT
+ ;;
+ *)
+ echo "Ignoring $file"
+ esac
+ done
+
+ sleep 5
+
+ echo "Restarting cassandra on port $public_port"
+
+ setPort $public_port
+ pkill java
+
+ if [[ $? != 0 ]]
+ then
+ echo "Failed to restart cassandra (kill failed)"
+ exit 1
+ fi
+
+ sleep 5
+fi
+
+# NOTE: this starts cassandra in the foreground
+/docker-entrypoint.sh cassandra -f
diff --git a/mdbc-packages/mdbc-docker/src/main/docker/docker-files/scripts/start-mdbc-server.sh b/mdbc-packages/mdbc-docker/src/main/docker/docker-files/scripts/start-mdbc-server.sh
new file mode 100644
index 0000000..bb74415
--- /dev/null
+++ b/mdbc-packages/mdbc-docker/src/main/docker/docker-files/scripts/start-mdbc-server.sh
@@ -0,0 +1,82 @@
+#!/bin/sh
+
+if [ `id -u` = 0 ]
+then
+ # Perform tasks that need to be run as root
+
+ # Re-exec this script as the application user.
+ this=`readlink -f $0`
+ exec su mdbc -c "$this"
+fi
+
+if [ -z "${TABLE_CONFIG_PATH}" ]
+then
+ export TABLE_CONFIG_PATH=$PWD/config/tableConfiguration.json
+fi
+
+if [ -z "${CONFIG_BASE}" ]
+then
+ export CONFIG_BASE=config
+fi
+
+if [ -z "$AVATICA_PORT" ]
+then
+ AVATICA_PORT=30000
+fi
+
+if [ -z "$JDBC_URL" ]
+then
+ echo "JDBC_URL environment variable is not set" 1>&2
+ exit 1
+fi
+
+if [ -z "$JDBC_USER" ]
+then
+ echo "JDBC_USER environment variable is not set" 1>&2
+ exit 1
+fi
+
+if [ -z "$JDBC_PASSWORD" ]
+then
+ echo "JDBC_PASSWORD environment variable is not set" 1>&2
+ exit 1
+fi
+
+jvmargs="${JVM_ARGS}"
+
+echo "JVM Arguments: ${jvmargs}"
+
+if [ ! -s ${CONFIG_BASE}-0.json ]
+then
+ echo "Running CreateNodeConfigurations"
+
+ java ${jvmargs} -cp config:mdbc-server.jar org.onap.music.mdbc.tools.CreateNodeConfigurations -t ${TABLE_CONFIG_PATH} -b ${CONFIG_BASE} -o $PWD
+
+ if [[ $? != 0 ]]
+ then
+ echo "CreateNodeConfigurations failed"
+ exit 1
+ fi
+
+ if [ ! -s ${CONFIG_BASE}-0.json ]
+ then
+ echo "Configuration not created correctlly: ${CONFIG_BASE}-0.json"
+ exit 1
+ fi
+
+ echo "CreateNodeConfigurations created ${CONFIG_BASE}-0.json"
+fi
+
+echo "Running MdbcServer"
+
+java ${jvmargs} -cp config:mdbc-server.jar org.onap.music.mdbc.MdbcServer -c ${CONFIG_BASE}-0.json -p ${AVATICA_PORT} -u ${JDBC_URL} -s ${JDBC_USER} -a ${JDBC_PASSWORD}
+rc=$?
+
+echo "Application exiting with status code $rc"
+
+if [ ! -z "${EXIT_DELAY}" -a "${EXIT_DELAY}" != 0 ]; then
+ echo "Delaying exit for $EXIT_DELAY seconds"
+ sleep $EXIT_DELAY
+fi
+
+exit $rc
diff --git a/mdbc-packages/mdbc-docker/src/main/docker/docker-files/scripts/wait-for.sh b/mdbc-packages/mdbc-docker/src/main/docker/docker-files/scripts/wait-for.sh
new file mode 100755
index 0000000..cee1cfe
--- /dev/null
+++ b/mdbc-packages/mdbc-docker/src/main/docker/docker-files/scripts/wait-for.sh
@@ -0,0 +1,103 @@
+#!/bin/sh
+# https://github.com/Eficode/wait-for.git
+# MIT License
+# Modified to wait for multiple ports to open
+
+TIMEOUT=15
+QUIET=0
+ADDRESSES=
+
+echoerr() {
+ if [ "$QUIET" -ne 1 ]; then printf "%s\n" "$*" 1>&2; fi
+}
+
+usage() {
+ exitcode="$1"
+ cat << USAGE >&2
+Usage:
+ wait-for host:port [host:port ... ] [-t timeout] [-- command args]
+ -q | --quiet Do not output any status messages
+ -t TIMEOUT | --timeout=timeout Timeout in seconds, zero for no timeout
+ -- COMMAND ARGS Execute command with args after the test finishes
+USAGE
+ exit "$exitcode"
+}
+
+wait_for() {
+ command="$*"
+ if [ "$QUIET" -ne 1 ]; then echo "$0: probing host $HOST port $PORT"; fi
+ for i in `seq $TIMEOUT` ; do
+ ready=TRUE
+ set DUMMY $ADDRESSES; shift 1
+ while [ $# -gt 0 ] ; do
+ host=$1
+ port=$2
+ shift 2
+ if ! nc -z "$host" "$port" > /dev/null 2>&1 ; then
+ ready=FALSE
+ break
+ fi
+ done
+ if [ $ready = TRUE ] ; then
+ if [ "$QUIET" -ne 1 ] ; then
+ echo "$0: operation succeeded on try $i"
+ fi
+ if [ -n "$command" ] ; then
+ if [ "$QUIET" -ne 1 ] ;
+ then echo "$0: exec-ing command $command" ;
+ fi
+ exec $command
+ fi
+ exit 0
+ fi
+ if [ "$QUIET" -ne 1 ] ; then
+ echo "$0: sleeping after try $i" ;
+ fi
+ sleep 1
+ done
+ echo "$0: Operation timed out" >&2
+ exit 1
+}
+
+while [ $# -gt 0 ]
+do
+ case "$1" in
+ *:* )
+ host=$(printf "%s\n" "$1"| cut -d : -f 1)
+ port=$(printf "%s\n" "$1"| cut -d : -f 2)
+ ADDRESSES="$ADDRESSES $host $port"
+ shift 1
+ ;;
+ -q | --quiet)
+ QUIET=1
+ shift 1
+ ;;
+ -t)
+ TIMEOUT="$2"
+ if [ "$TIMEOUT" = "" ]; then break; fi
+ shift 2
+ ;;
+ --timeout=*)
+ TIMEOUT="${1#*=}"
+ shift 1
+ ;;
+ --)
+ shift
+ break
+ ;;
+ --help)
+ usage 0
+ ;;
+ *)
+ echoerr "Unknown argument: $1"
+ usage 1
+ ;;
+ esac
+done
+
+if [ "$ADDRESSES" = "" ] ; then
+ echoerr "Error: you need to provide at least one host and port to test."
+ usage 2
+fi
+
+wait_for "$@"
diff --git a/mdbc-packages/pom.xml b/mdbc-packages/pom.xml
new file mode 100644
index 0000000..a694471
--- /dev/null
+++ b/mdbc-packages/pom.xml
@@ -0,0 +1,33 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.onap.music.mdbc</groupId>
+ <artifactId>mdbc</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>mdbc-packages</artifactId>
+ <packaging>pom</packaging>
+ <name>mdbc-packages</name>
+
+ <profiles>
+ <profile>
+ <id>default</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ </profile>
+
+ <profile>
+ <id>docker</id>
+ <modules>
+ <module>mdbc-docker</module>
+ </modules>
+ <properties>
+ <!-- For this profile we probably don't want to skip the docker push (if deploy goal is specified) -->
+ <docker.skip.push>false</docker.skip.push>
+ </properties>
+ </profile>
+ </profiles>
+</project>
diff --git a/pom.xml b/pom.xml
index d999ad1..778dda3 100755
--- a/pom.xml
+++ b/pom.xml
@@ -97,6 +97,7 @@
<modules>
<module>mdbc-server</module>
+ <module>mdbc-packages</module>
</modules>
<dependencies>