MUSIC-224 Dockerize MdbcServer 98/74198/1
authorRob Daugherty <rd472p@att.com>
Tue, 4 Dec 2018 17:22:49 +0000 (12:22 -0500)
committerRob Daugherty <rd472p@att.com>
Tue, 4 Dec 2018 17:23:57 +0000 (12:23 -0500)
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>
15 files changed:
mdbc-packages/mdbc-docker/compose/one-site/.env [new file with mode: 0644]
mdbc-packages/mdbc-docker/compose/one-site/docker-compose.yml [new file with mode: 0644]
mdbc-packages/mdbc-docker/compose/one-site/volumes/cassandra/docker-entrypoint-initdb.d/01-create-music-internal-keyspace.cql [new file with mode: 0644]
mdbc-packages/mdbc-docker/compose/one-site/volumes/mariadb/conf.d/mariadb1.cnf [new file with mode: 0644]
mdbc-packages/mdbc-docker/compose/one-site/volumes/mariadb/docker-entrypoint-initdb.d/01-create-test-database.sh [new file with mode: 0644]
mdbc-packages/mdbc-docker/compose/one-site/volumes/mdbc-server/config/music.properties [new file with mode: 0644]
mdbc-packages/mdbc-docker/compose/one-site/volumes/mdbc-server/config/tableConfiguration.json [new file with mode: 0644]
mdbc-packages/mdbc-docker/pom.xml [new file with mode: 0644]
mdbc-packages/mdbc-docker/src/main/docker/docker-files/Dockerfile.mdbc-cassandra [new file with mode: 0644]
mdbc-packages/mdbc-docker/src/main/docker/docker-files/Dockerfile.mdbc-server [new file with mode: 0644]
mdbc-packages/mdbc-docker/src/main/docker/docker-files/scripts/start-cassandra.sh [new file with mode: 0644]
mdbc-packages/mdbc-docker/src/main/docker/docker-files/scripts/start-mdbc-server.sh [new file with mode: 0644]
mdbc-packages/mdbc-docker/src/main/docker/docker-files/scripts/wait-for.sh [new file with mode: 0755]
mdbc-packages/pom.xml [new file with mode: 0644]
pom.xml

diff --git a/mdbc-packages/mdbc-docker/compose/one-site/.env b/mdbc-packages/mdbc-docker/compose/one-site/.env
new file mode 100644 (file)
index 0000000..1c22d2b
--- /dev/null
@@ -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 (file)
index 0000000..d30d3e2
--- /dev/null
@@ -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 (file)
index 0000000..7884dd5
--- /dev/null
@@ -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 (file)
index 0000000..39ed022
--- /dev/null
@@ -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 (file)
index 0000000..3316153
--- /dev/null
@@ -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 (file)
index 0000000..b030b62
--- /dev/null
@@ -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 (file)
index 0000000..383593a
--- /dev/null
@@ -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 (file)
index 0000000..f2e73f7
--- /dev/null
@@ -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 (file)
index 0000000..2583234
--- /dev/null
@@ -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 (file)
index 0000000..0de50aa
--- /dev/null
@@ -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 (file)
index 0000000..362c9e9
--- /dev/null
@@ -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 (file)
index 0000000..bb74415
--- /dev/null
@@ -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 (executable)
index 0000000..cee1cfe
--- /dev/null
@@ -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 (file)
index 0000000..a694471
--- /dev/null
@@ -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 (executable)
--- a/pom.xml
+++ b/pom.xml
@@ -97,6 +97,7 @@
 
     <modules>
         <module>mdbc-server</module>
+        <module>mdbc-packages</module>
     </modules>
 
     <dependencies>