Unit Tests for Sonar and Functional Test Docker 35/34335/1
authorThomas Nelson Jr (arthurdent3) tn1381@att.com <tn1381@att.com>
Tue, 6 Mar 2018 19:27:17 +0000 (14:27 -0500)
committerThomas Nelson Jr (arthurdent3) tn1381@att.com <tn1381@att.com>
Tue, 6 Mar 2018 19:27:17 +0000 (14:27 -0500)
Change-Id: Ib8156f44cf08f220de2a74ef8237b30deaf4df7a
Issue-ID: MUSIC-40, MUSIC-32
Signed-off-by: Thomas Nelson Jr (arthurdent3) tn1381@att.com <tn1381@att.com>
14 files changed:
distribution/README.md [new file with mode: 0644]
distribution/cassandra/Dockerfile [new file with mode: 0644]
distribution/cassandra/cassandra.yaml [new file with mode: 0644]
distribution/cassandra/docker-entrypoint.sh [new file with mode: 0644]
distribution/cassandra/music.cql [new file with mode: 0644]
distribution/cassandra/music_single.cql [new file with mode: 0644]
distribution/tomcat/Dockerfile [new file with mode: 0644]
distribution/zookeeper/Dockerfile [new file with mode: 0644]
pom.xml
src/test/java/org/onap/music/unittests/MusicDataStoreTest.java
src/test/java/org/onap/music/unittests/MusicUtilTest.java
src/test/java/org/onap/music/unittests/TestMusicCore.java
src/test/java/org/onap/music/unittests/TestMusicCoreIntegration.java
src/test/java/org/onap/music/unittests/TestRestMusicData.java

diff --git a/distribution/README.md b/distribution/README.md
new file mode 100644 (file)
index 0000000..cced66d
--- /dev/null
@@ -0,0 +1,12 @@
+# Docker Setup
+---------------
+
+```bash
+# Start the Container
+docker run -d --name cassandra_music -v $PWD/data:/var/lib/cassandra cassandra_music:3.0
+# Load cql script into DB
+docker run -it --link cassandra1:cassandra -v $PWD/music.cql:/music.cql cassandra_music1:3.0 cqlsh -u cassandra -p cassandra cassandra1 -f music.cql
+# Start cqlsh
+docker run -it --link cassandra_music:cassandra cassandra_music:3.0 cqlsh -u cassandra -p cassandra cassandra1
+
+```
diff --git a/distribution/cassandra/Dockerfile b/distribution/cassandra/Dockerfile
new file mode 100644 (file)
index 0000000..0e851f4
--- /dev/null
@@ -0,0 +1,8 @@
+#registry.hub.docker.com/
+FROM library/cassandra:3.0
+RUN mkdir -p /docker-entrypoint-initdb.d && mkdir -p /home/cassandra/.cassandra && chown -R cassandra /home/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
+ENTRYPOINT ["docker-entrypoint.sh"]
diff --git a/distribution/cassandra/cassandra.yaml b/distribution/cassandra/cassandra.yaml
new file mode 100644 (file)
index 0000000..d4af64a
--- /dev/null
@@ -0,0 +1,1001 @@
+# Cassandra storage config YAML
+
+# NOTE:
+#   See http://wiki.apache.org/cassandra/StorageConfiguration for
+#   full explanations of configuration directives
+# /NOTE
+
+# The name of the cluster. This is mainly used to prevent machines in
+# one logical cluster from joining another.
+cluster_name: 'Test Cluster'
+
+# This defines the number of tokens randomly assigned to this node on the ring
+# The more tokens, relative to other nodes, the larger the proportion of data
+# that this node will store. You probably want all nodes to have the same number
+# of tokens assuming they have equal hardware capability.
+#
+# If you leave this unspecified, Cassandra will use the default of 1 token for legacy compatibility,
+# and will use the initial_token as described below.
+#
+# Specifying initial_token will override this setting on the node's initial start,
+# on subsequent starts, this setting will apply even if initial token is set.
+#
+# If you already have a cluster with 1 token per node, and wish to migrate to
+# multiple tokens per node, see http://wiki.apache.org/cassandra/Operations
+num_tokens: 256
+
+# Triggers automatic allocation of num_tokens tokens for this node. The allocation
+# algorithm attempts to choose tokens in a way that optimizes replicated load over
+# the nodes in the datacenter for the replication strategy used by the specified
+# keyspace.
+#
+# The load assigned to each node will be close to proportional to its number of
+# vnodes.
+#
+# Only supported with the Murmur3Partitioner.
+# allocate_tokens_for_keyspace: KEYSPACE
+
+# initial_token allows you to specify tokens manually.  While you can use # it with
+# vnodes (num_tokens > 1, above) -- in which case you should provide a
+# comma-separated list -- it's primarily used when adding nodes # to legacy clusters
+# that do not have vnodes enabled.
+# initial_token:
+
+# See http://wiki.apache.org/cassandra/HintedHandoff
+# May either be "true" or "false" to enable globally
+hinted_handoff_enabled: true
+# When hinted_handoff_enabled is true, a black list of data centers that will not
+# perform hinted handoff
+#hinted_handoff_disabled_datacenters:
+#    - DC1
+#    - DC2
+# this defines the maximum amount of time a dead host will have hints
+# generated.  After it has been dead this long, new hints for it will not be
+# created until it has been seen alive and gone down again.
+max_hint_window_in_ms: 10800000 # 3 hours
+
+# Maximum throttle in KBs per second, per delivery thread.  This will be
+# reduced proportionally to the number of nodes in the cluster.  (If there
+# are two nodes in the cluster, each delivery thread will use the maximum
+# rate; if there are three, each will throttle to half of the maximum,
+# since we expect two nodes to be delivering hints simultaneously.)
+hinted_handoff_throttle_in_kb: 1024
+
+# Number of threads with which to deliver hints;
+# Consider increasing this number when you have multi-dc deployments, since
+# cross-dc handoff tends to be slower
+max_hints_delivery_threads: 2
+
+# Directory where Cassandra should store hints.
+# If not set, the default directory is $CASSANDRA_HOME/data/hints.
+# hints_directory: /var/lib/cassandra/hints
+
+# How often hints should be flushed from the internal buffers to disk.
+# Will *not* trigger fsync.
+hints_flush_period_in_ms: 10000
+
+# Maximum size for a single hints file, in megabytes.
+max_hints_file_size_in_mb: 128
+
+# Compression to apply to the hint files. If omitted, hints files
+# will be written uncompressed. LZ4, Snappy, and Deflate compressors
+# are supported.
+#hints_compression:
+#   - class_name: LZ4Compressor
+#     parameters:
+#         -
+
+# Maximum throttle in KBs per second, total. This will be
+# reduced proportionally to the number of nodes in the cluster.
+batchlog_replay_throttle_in_kb: 1024
+
+# Authentication backend, implementing IAuthenticator; used to identify users
+# Out of the box, Cassandra provides org.apache.cassandra.auth.{AllowAllAuthenticator,
+# PasswordAuthenticator}.
+#
+# - AllowAllAuthenticator performs no checks - set it to disable authentication.
+# - PasswordAuthenticator relies on username/password pairs to authenticate
+#   users. It keeps usernames and hashed passwords in system_auth.roles table.
+#   Please increase system_auth keyspace replication factor if you use this authenticator.
+#   If using PasswordAuthenticator, CassandraRoleManager must also be used (see below)
+authenticator: PasswordAuthenticator
+
+# Authorization backend, implementing IAuthorizer; used to limit access/provide permissions
+# Out of the box, Cassandra provides org.apache.cassandra.auth.{AllowAllAuthorizer,
+# CassandraAuthorizer}.
+#
+# - AllowAllAuthorizer allows any action to any user - set it to disable authorization.
+# - CassandraAuthorizer stores permissions in system_auth.role_permissions table. Please
+#   increase system_auth keyspace replication factor if you use this authorizer.
+authorizer: CassandraAuthorizer
+
+# Part of the Authentication & Authorization backend, implementing IRoleManager; used
+# to maintain grants and memberships between roles.
+# Out of the box, Cassandra provides org.apache.cassandra.auth.CassandraRoleManager,
+# which stores role information in the system_auth keyspace. Most functions of the
+# IRoleManager require an authenticated login, so unless the configured IAuthenticator
+# actually implements authentication, most of this functionality will be unavailable.
+#
+# - CassandraRoleManager stores role data in the system_auth keyspace. Please
+#   increase system_auth keyspace replication factor if you use this role manager.
+role_manager: CassandraRoleManager
+
+# Validity period for roles cache (fetching permissions can be an
+# expensive operation depending on the authorizer). Granted roles are cached for
+# authenticated sessions in AuthenticatedUser and after the period specified
+# here, become eligible for (async) reload.
+# Defaults to 2000, set to 0 to disable.
+# Will be disabled automatically for AllowAllAuthenticator.
+roles_validity_in_ms: 2000
+
+# Refresh interval for roles cache (if enabled).
+# After this interval, cache entries become eligible for refresh. Upon next
+# access, an async reload is scheduled and the old value returned until it
+# completes. If roles_validity_in_ms is non-zero, then this must be
+# also.
+# Defaults to the same value as roles_validity_in_ms.
+# roles_update_interval_in_ms: 1000
+
+# Validity period for permissions cache (fetching permissions can be an
+# expensive operation depending on the authorizer, CassandraAuthorizer is
+# one example). Defaults to 2000, set to 0 to disable.
+# Will be disabled automatically for AllowAllAuthorizer.
+permissions_validity_in_ms: 2000
+
+# Refresh interval for permissions cache (if enabled).
+# After this interval, cache entries become eligible for refresh. Upon next
+# access, an async reload is scheduled and the old value returned until it
+# completes. If permissions_validity_in_ms is non-zero, then this must be
+# also.
+# Defaults to the same value as permissions_validity_in_ms.
+# permissions_update_interval_in_ms: 1000
+
+# The partitioner is responsible for distributing groups of rows (by
+# partition key) across nodes in the cluster.  You should leave this
+# alone for new clusters.  The partitioner can NOT be changed without
+# reloading all data, so when upgrading you should set this to the
+# same partitioner you were already using.
+#
+# Besides Murmur3Partitioner, partitioners included for backwards
+# compatibility include RandomPartitioner, ByteOrderedPartitioner, and
+# OrderPreservingPartitioner.
+#
+partitioner: org.apache.cassandra.dht.Murmur3Partitioner
+
+# Directories where Cassandra should store data on disk.  Cassandra
+# will spread data evenly across them, subject to the granularity of
+# the configured compaction strategy.
+# If not set, the default directory is $CASSANDRA_HOME/data/data.
+data_file_directories:
+    - /var/lib/cassandra/data
+
+# commit log.  when running on magnetic HDD, this should be a
+# separate spindle than the data directories.
+# If not set, the default directory is $CASSANDRA_HOME/data/commitlog.
+commitlog_directory: /var/lib/cassandra/commitlog
+
+# policy for data disk failures:
+# die: shut down gossip and client transports and kill the JVM for any fs errors or
+#      single-sstable errors, so the node can be replaced.
+# stop_paranoid: shut down gossip and client transports even for single-sstable errors,
+#                kill the JVM for errors during startup.
+# stop: shut down gossip and client transports, leaving the node effectively dead, but
+#       can still be inspected via JMX, kill the JVM for errors during startup.
+# best_effort: stop using the failed disk and respond to requests based on
+#              remaining available sstables.  This means you WILL see obsolete
+#              data at CL.ONE!
+# ignore: ignore fatal errors and let requests fail, as in pre-1.2 Cassandra
+disk_failure_policy: stop
+
+# policy for commit disk failures:
+# die: shut down gossip and Thrift and kill the JVM, so the node can be replaced.
+# stop: shut down gossip and Thrift, leaving the node effectively dead, but
+#       can still be inspected via JMX.
+# stop_commit: shutdown the commit log, letting writes collect but
+#              continuing to service reads, as in pre-2.0.5 Cassandra
+# ignore: ignore fatal errors and let the batches fail
+commit_failure_policy: stop
+
+# Maximum size of the key cache in memory.
+#
+# Each key cache hit saves 1 seek and each row cache hit saves 2 seeks at the
+# minimum, sometimes more. The key cache is fairly tiny for the amount of
+# time it saves, so it's worthwhile to use it at large numbers.
+# The row cache saves even more time, but must contain the entire row,
+# so it is extremely space-intensive. It's best to only use the
+# row cache if you have hot rows or static rows.
+#
+# NOTE: if you reduce the size, you may not get you hottest keys loaded on startup.
+#
+# Default value is empty to make it "auto" (min(5% of Heap (in MB), 100MB)). Set to 0 to disable key cache.
+key_cache_size_in_mb:
+
+# Duration in seconds after which Cassandra should
+# save the key cache. Caches are saved to saved_caches_directory as
+# specified in this configuration file.
+#
+# Saved caches greatly improve cold-start speeds, and is relatively cheap in
+# terms of I/O for the key cache. Row cache saving is much more expensive and
+# has limited use.
+#
+# Default is 14400 or 4 hours.
+key_cache_save_period: 14400
+
+# Number of keys from the key cache to save
+# Disabled by default, meaning all keys are going to be saved
+# key_cache_keys_to_save: 100
+
+# Row cache implementation class name.
+# Available implementations:
+#   org.apache.cassandra.cache.OHCProvider                Fully off-heap row cache implementation (default).
+#   org.apache.cassandra.cache.SerializingCacheProvider   This is the row cache implementation availabile
+#                                                         in previous releases of Cassandra.
+# row_cache_class_name: org.apache.cassandra.cache.OHCProvider
+
+# Maximum size of the row cache in memory.
+# Please note that OHC cache implementation requires some additional off-heap memory to manage
+# the map structures and some in-flight memory during operations before/after cache entries can be
+# accounted against the cache capacity. This overhead is usually small compared to the whole capacity.
+# Do not specify more memory that the system can afford in the worst usual situation and leave some
+# headroom for OS block level cache. Do never allow your system to swap.
+#
+# Default value is 0, to disable row caching.
+row_cache_size_in_mb: 0
+
+# Duration in seconds after which Cassandra should save the row cache.
+# Caches are saved to saved_caches_directory as specified in this configuration file.
+#
+# Saved caches greatly improve cold-start speeds, and is relatively cheap in
+# terms of I/O for the key cache. Row cache saving is much more expensive and
+# has limited use.
+#
+# Default is 0 to disable saving the row cache.
+row_cache_save_period: 0
+
+# Number of keys from the row cache to save.
+# Specify 0 (which is the default), meaning all keys are going to be saved
+# row_cache_keys_to_save: 100
+
+# Maximum size of the counter cache in memory.
+#
+# Counter cache helps to reduce counter locks' contention for hot counter cells.
+# In case of RF = 1 a counter cache hit will cause Cassandra to skip the read before
+# write entirely. With RF > 1 a counter cache hit will still help to reduce the duration
+# of the lock hold, helping with hot counter cell updates, but will not allow skipping
+# the read entirely. Only the local (clock, count) tuple of a counter cell is kept
+# in memory, not the whole counter, so it's relatively cheap.
+#
+# NOTE: if you reduce the size, you may not get you hottest keys loaded on startup.
+#
+# Default value is empty to make it "auto" (min(2.5% of Heap (in MB), 50MB)). Set to 0 to disable counter cache.
+# NOTE: if you perform counter deletes and rely on low gcgs, you should disable the counter cache.
+counter_cache_size_in_mb:
+
+# Duration in seconds after which Cassandra should
+# save the counter cache (keys only). Caches are saved to saved_caches_directory as
+# specified in this configuration file.
+#
+# Default is 7200 or 2 hours.
+counter_cache_save_period: 7200
+
+# Number of keys from the counter cache to save
+# Disabled by default, meaning all keys are going to be saved
+# counter_cache_keys_to_save: 100
+
+# saved caches
+# If not set, the default directory is $CASSANDRA_HOME/data/saved_caches.
+saved_caches_directory: /var/lib/cassandra/saved_caches
+
+# commitlog_sync may be either "periodic" or "batch."
+#
+# When in batch mode, Cassandra won't ack writes until the commit log
+# has been fsynced to disk.  It will wait
+# commitlog_sync_batch_window_in_ms milliseconds between fsyncs.
+# This window should be kept short because the writer threads will
+# be unable to do extra work while waiting.  (You may need to increase
+# concurrent_writes for the same reason.)
+#
+# commitlog_sync: batch
+# commitlog_sync_batch_window_in_ms: 2
+#
+# the other option is "periodic" where writes may be acked immediately
+# and the CommitLog is simply synced every commitlog_sync_period_in_ms
+# milliseconds.
+commitlog_sync: periodic
+commitlog_sync_period_in_ms: 10000
+
+# The size of the individual commitlog file segments.  A commitlog
+# segment may be archived, deleted, or recycled once all the data
+# in it (potentially from each columnfamily in the system) has been
+# flushed to sstables.
+#
+# The default size is 32, which is almost always fine, but if you are
+# archiving commitlog segments (see commitlog_archiving.properties),
+# then you probably want a finer granularity of archiving; 8 or 16 MB
+# is reasonable.
+# Max mutation size is also configurable via max_mutation_size_in_kb setting in
+# cassandra.yaml. The default is half the size commitlog_segment_size_in_mb * 1024.
+# This should be positive and less than 2048.
+#
+# NOTE: If max_mutation_size_in_kb is set explicitly then commitlog_segment_size_in_mb must
+# be set to at least twice the size of max_mutation_size_in_kb / 1024
+#
+commitlog_segment_size_in_mb: 32
+
+# Compression to apply to the commit log. If omitted, the commit log
+# will be written uncompressed.  LZ4, Snappy, and Deflate compressors
+# are supported.
+#commitlog_compression:
+#   - class_name: LZ4Compressor
+#     parameters:
+#         -
+
+# any class that implements the SeedProvider interface and has a
+# constructor that takes a Map<String, String> of parameters will do.
+seed_provider:
+    # Addresses of hosts that are deemed contact points.
+    # Cassandra nodes use this list of hosts to find each other and learn
+    # the topology of the ring.  You must change this if you are running
+    # multiple nodes!
+    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
+      parameters:
+          # seeds is actually a comma-delimited list of addresses.
+          # Ex: "<ip1>,<ip2>,<ip3>"
+          - seeds: "127.0.0.1"
+
+# For workloads with more data than can fit in memory, Cassandra's
+# bottleneck will be reads that need to fetch data from
+# disk. "concurrent_reads" should be set to (16 * number_of_drives) in
+# order to allow the operations to enqueue low enough in the stack
+# that the OS and drives can reorder them. Same applies to
+# "concurrent_counter_writes", since counter writes read the current
+# values before incrementing and writing them back.
+#
+# On the other hand, since writes are almost never IO bound, the ideal
+# number of "concurrent_writes" is dependent on the number of cores in
+# your system; (8 * number_of_cores) is a good rule of thumb.
+concurrent_reads: 32
+concurrent_writes: 32
+concurrent_counter_writes: 32
+
+# For materialized view writes, as there is a read involved, so this should
+# be limited by the less of concurrent reads or concurrent writes.
+concurrent_materialized_view_writes: 32
+
+# Maximum memory to use for pooling sstable buffers. Defaults to the smaller
+# of 1/4 of heap or 512MB. This pool is allocated off-heap, so is in addition
+# to the memory allocated for heap. Memory is only allocated as needed.
+# file_cache_size_in_mb: 512
+
+# Flag indicating whether to allocate on or off heap when the sstable buffer
+# pool is exhausted, that is when it has exceeded the maximum memory
+# file_cache_size_in_mb, beyond which it will not cache buffers but allocate on request.
+
+# buffer_pool_use_heap_if_exhausted: true
+
+# The strategy for optimizing disk read
+# Possible values are:
+# ssd (for solid state disks, the default)
+# spinning (for spinning disks)
+# disk_optimization_strategy: ssd
+
+# Total permitted memory to use for memtables. Cassandra will stop
+# accepting writes when the limit is exceeded until a flush completes,
+# and will trigger a flush based on memtable_cleanup_threshold
+# If omitted, Cassandra will set both to 1/4 the size of the heap.
+# memtable_heap_space_in_mb: 2048
+# memtable_offheap_space_in_mb: 2048
+
+# Ratio of occupied non-flushing memtable size to total permitted size
+# that will trigger a flush of the largest memtable. Larger mct will
+# mean larger flushes and hence less compaction, but also less concurrent
+# flush activity which can make it difficult to keep your disks fed
+# under heavy write load.
+#
+# memtable_cleanup_threshold defaults to 1 / (memtable_flush_writers + 1)
+# memtable_cleanup_threshold: 0.11
+
+# Specify the way Cassandra allocates and manages memtable memory.
+# Options are:
+#   heap_buffers:    on heap nio buffers
+#
+# Note: offheap_buffers are not supported in Cassandra 3.0 - 3.3.
+# They have been re-introduced in Cassandra 3.4. For details see
+# https://issues.apache.org/jira/browse/CASSANDRA-9472 and
+# https://issues.apache.org/jira/browse/CASSANDRA-11039
+memtable_allocation_type: heap_buffers
+
+# Total space to use for commit logs on disk.
+#
+# If space gets above this value, Cassandra will flush every dirty CF
+# in the oldest segment and remove it.  So a small total commitlog space
+# will tend to cause more flush activity on less-active columnfamilies.
+#
+# The default value is the smaller of 8192, and 1/4 of the total space
+# of the commitlog volume.
+#
+# commitlog_total_space_in_mb: 8192
+
+# This sets the amount of memtable flush writer threads.  These will
+# be blocked by disk io, and each one will hold a memtable in memory
+# while blocked.
+#
+# memtable_flush_writers defaults to the smaller of (number of disks,
+# number of cores), with a minimum of 2 and a maximum of 8.
+#
+# If your data directories are backed by SSD, you should increase this
+# to the number of cores.
+#memtable_flush_writers: 8
+
+# A fixed memory pool size in MB for for SSTable index summaries. If left
+# empty, this will default to 5% of the heap size. If the memory usage of
+# all index summaries exceeds this limit, SSTables with low read rates will
+# shrink their index summaries in order to meet this limit.  However, this
+# is a best-effort process. In extreme conditions Cassandra may need to use
+# more than this amount of memory.
+index_summary_capacity_in_mb:
+
+# How frequently index summaries should be resampled.  This is done
+# periodically to redistribute memory from the fixed-size pool to sstables
+# proportional their recent read rates.  Setting to -1 will disable this
+# process, leaving existing index summaries at their current sampling level.
+index_summary_resize_interval_in_minutes: 60
+
+# Whether to, when doing sequential writing, fsync() at intervals in
+# order to force the operating system to flush the dirty
+# buffers. Enable this to avoid sudden dirty buffer flushing from
+# impacting read latencies. Almost always a good idea on SSDs; not
+# necessarily on platters.
+trickle_fsync: false
+trickle_fsync_interval_in_kb: 10240
+
+# TCP port, for commands and data
+# For security reasons, you should not expose this port to the internet.  Firewall it if needed.
+storage_port: 7000
+
+# SSL port, for encrypted communication.  Unused unless enabled in
+# encryption_options
+# For security reasons, you should not expose this port to the internet.  Firewall it if needed.
+ssl_storage_port: 7001
+
+# Address or interface to bind to and tell other Cassandra nodes to connect to.
+# You _must_ change this if you want multiple nodes to be able to communicate!
+#
+# Set listen_address OR listen_interface, not both. Interfaces must correspond
+# to a single address, IP aliasing is not supported.
+#
+# Leaving it blank leaves it up to InetAddress.getLocalHost(). This
+# will always do the Right Thing _if_ the node is properly configured
+# (hostname, name resolution, etc), and the Right Thing is to use the
+# address associated with the hostname (it might not be).
+#
+# Setting listen_address to 0.0.0.0 is always wrong.
+#
+# If you choose to specify the interface by name and the interface has an ipv4 and an ipv6 address
+# you can specify which should be chosen using listen_interface_prefer_ipv6. If false the first ipv4
+# address will be used. If true the first ipv6 address will be used. Defaults to false preferring
+# ipv4. If there is only one address it will be selected regardless of ipv4/ipv6.
+listen_address: localhost
+# listen_interface: eth0
+# listen_interface_prefer_ipv6: false
+
+# Address to broadcast to other Cassandra nodes
+# Leaving this blank will set it to the same value as listen_address
+# broadcast_address: 1.2.3.4
+
+# When using multiple physical network interfaces, set this
+# to true to listen on broadcast_address in addition to
+# the listen_address, allowing nodes to communicate in both
+# interfaces.
+# Ignore this property if the network configuration automatically
+# routes  between the public and private networks such as EC2.
+# listen_on_broadcast_address: false
+
+# Internode authentication backend, implementing IInternodeAuthenticator;
+# used to allow/disallow connections from peer nodes.
+# internode_authenticator: org.apache.cassandra.auth.AllowAllInternodeAuthenticator
+
+# Whether to start the native transport server.
+# Please note that the address on which the native transport is bound is the
+# same as the rpc_address. The port however is different and specified below.
+start_native_transport: true
+# port for the CQL native transport to listen for clients on
+# For security reasons, you should not expose this port to the internet.  Firewall it if needed.
+native_transport_port: 9042
+# Enabling native transport encryption in client_encryption_options allows you to either use
+# encryption for the standard port or to use a dedicated, additional port along with the unencrypted
+# standard native_transport_port.
+# Enabling client encryption and keeping native_transport_port_ssl disabled will use encryption
+# for native_transport_port. Setting native_transport_port_ssl to a different value
+# from native_transport_port will use encryption for native_transport_port_ssl while
+# keeping native_transport_port unencrypted.
+# native_transport_port_ssl: 9142
+# The maximum threads for handling requests when the native transport is used.
+# This is similar to rpc_max_threads though the default differs slightly (and
+# there is no native_transport_min_threads, idle threads will always be stopped
+# after 30 seconds).
+# native_transport_max_threads: 128
+#
+# The maximum size of allowed frame. Frame (requests) larger than this will
+# be rejected as invalid. The default is 256MB. If you're changing this parameter,
+# you may want to adjust max_value_size_in_mb accordingly. This should be positive and less than 2048.
+# native_transport_max_frame_size_in_mb: 256
+
+# The maximum number of concurrent client connections.
+# The default is -1, which means unlimited.
+# native_transport_max_concurrent_connections: -1
+
+# The maximum number of concurrent client connections per source ip.
+# The default is -1, which means unlimited.
+# native_transport_max_concurrent_connections_per_ip: -1
+
+# Whether to start the thrift rpc server.
+start_rpc: false
+
+# The address or interface to bind the Thrift RPC service and native transport
+# server to.
+#
+# Set rpc_address OR rpc_interface, not both. Interfaces must correspond
+# to a single address, IP aliasing is not supported.
+#
+# Leaving rpc_address blank has the same effect as on listen_address
+# (i.e. it will be based on the configured hostname of the node).
+#
+# Note that unlike listen_address, you can specify 0.0.0.0, but you must also
+# set broadcast_rpc_address to a value other than 0.0.0.0.
+#
+# For security reasons, you should not expose this port to the internet.  Firewall it if needed.
+#
+# If you choose to specify the interface by name and the interface has an ipv4 and an ipv6 address
+# you can specify which should be chosen using rpc_interface_prefer_ipv6. If false the first ipv4
+# address will be used. If true the first ipv6 address will be used. Defaults to false preferring
+# ipv4. If there is only one address it will be selected regardless of ipv4/ipv6.
+rpc_address: localhost
+# rpc_interface: eth1
+# rpc_interface_prefer_ipv6: false
+
+# port for Thrift to listen for clients on
+rpc_port: 9160
+
+# RPC address to broadcast to drivers and other Cassandra nodes. This cannot
+# be set to 0.0.0.0. If left blank, this will be set to the value of
+# rpc_address. If rpc_address is set to 0.0.0.0, broadcast_rpc_address must
+# be set.
+# broadcast_rpc_address: 1.2.3.4
+
+# enable or disable keepalive on rpc/native connections
+rpc_keepalive: true
+
+# Cassandra provides two out-of-the-box options for the RPC Server:
+#
+# sync  -> One thread per thrift connection. For a very large number of clients, memory
+#          will be your limiting factor. On a 64 bit JVM, 180KB is the minimum stack size
+#          per thread, and that will correspond to your use of virtual memory (but physical memory
+#          may be limited depending on use of stack space).
+#
+# hsha  -> Stands for "half synchronous, half asynchronous." All thrift clients are handled
+#          asynchronously using a small number of threads that does not vary with the amount
+#          of thrift clients (and thus scales well to many clients). The rpc requests are still
+#          synchronous (one thread per active request). If hsha is selected then it is essential
+#          that rpc_max_threads is changed from the default value of unlimited.
+#
+# The default is sync because on Windows hsha is about 30% slower.  On Linux,
+# sync/hsha performance is about the same, with hsha of course using less memory.
+#
+# Alternatively,  can provide your own RPC server by providing the fully-qualified class name
+# of an o.a.c.t.TServerFactory that can create an instance of it.
+rpc_server_type: sync
+
+# Uncomment rpc_min|max_thread to set request pool size limits.
+#
+# Regardless of your choice of RPC server (see above), the number of maximum requests in the
+# RPC thread pool dictates how many concurrent requests are possible (but if you are using the sync
+# RPC server, it also dictates the number of clients that can be connected at all).
+#
+# The default is unlimited and thus provides no protection against clients overwhelming the server. You are
+# encouraged to set a maximum that makes sense for you in production, but do keep in mind that
+# rpc_max_threads represents the maximum number of client requests this server may execute concurrently.
+#
+# rpc_min_threads: 16
+# rpc_max_threads: 2048
+
+# uncomment to set socket buffer sizes on rpc connections
+# rpc_send_buff_size_in_bytes:
+# rpc_recv_buff_size_in_bytes:
+
+# Uncomment to set socket buffer size for internode communication
+# Note that when setting this, the buffer size is limited by net.core.wmem_max
+# and when not setting it it is defined by net.ipv4.tcp_wmem
+# See:
+# /proc/sys/net/core/wmem_max
+# /proc/sys/net/core/rmem_max
+# /proc/sys/net/ipv4/tcp_wmem
+# /proc/sys/net/ipv4/tcp_wmem
+# and: man tcp
+# internode_send_buff_size_in_bytes:
+# internode_recv_buff_size_in_bytes:
+
+# Frame size for thrift (maximum message length).
+thrift_framed_transport_size_in_mb: 15
+
+# Set to true to have Cassandra create a hard link to each sstable
+# flushed or streamed locally in a backups/ subdirectory of the
+# keyspace data.  Removing these links is the operator's
+# responsibility.
+incremental_backups: false
+
+# Whether or not to take a snapshot before each compaction.  Be
+# careful using this option, since Cassandra won't clean up the
+# snapshots for you.  Mostly useful if you're paranoid when there
+# is a data format change.
+snapshot_before_compaction: false
+
+# Whether or not a snapshot is taken of the data before keyspace truncation
+# or dropping of column families. The STRONGLY advised default of true
+# should be used to provide data safety. If you set this flag to false, you will
+# lose data on truncation or drop.
+auto_snapshot: true
+
+# When executing a scan, within or across a partition, we need to keep the
+# tombstones seen in memory so we can return them to the coordinator, which
+# will use them to make sure other replicas also know about the deleted rows.
+# With workloads that generate a lot of tombstones, this can cause performance
+# problems and even exaust the server heap.
+# (http://www.datastax.com/dev/blog/cassandra-anti-patterns-queues-and-queue-like-datasets)
+# Adjust the thresholds here if you understand the dangers and want to
+# scan more tombstones anyway.  These thresholds may also be adjusted at runtime
+# using the StorageService mbean.
+tombstone_warn_threshold: 1000
+tombstone_failure_threshold: 100000
+
+# Granularity of the collation index of rows within a partition.
+# Increase if your rows are large, or if you have a very large
+# number of rows per partition.  The competing goals are these:
+#   1) a smaller granularity means more index entries are generated
+#      and looking up rows withing the partition by collation column
+#      is faster
+#   2) but, Cassandra will keep the collation index in memory for hot
+#      rows (as part of the key cache), so a larger granularity means
+#      you can cache more hot rows
+column_index_size_in_kb: 64
+
+
+# Log WARN on any batch size exceeding this value. 5kb per batch by default.
+# Caution should be taken on increasing the size of this threshold as it can lead to node instability.
+batch_size_warn_threshold_in_kb: 5
+
+# Fail any batch exceeding this value. 50kb (10x warn threshold) by default.
+batch_size_fail_threshold_in_kb: 50
+
+# Log WARN on any batches not of type LOGGED than span across more partitions than this limit
+unlogged_batch_across_partitions_warn_threshold: 10
+
+# Number of simultaneous compactions to allow, NOT including
+# validation "compactions" for anti-entropy repair.  Simultaneous
+# compactions can help preserve read performance in a mixed read/write
+# workload, by mitigating the tendency of small sstables to accumulate
+# during a single long running compactions. The default is usually
+# fine and if you experience problems with compaction running too
+# slowly or too fast, you should look at
+# compaction_throughput_mb_per_sec first.
+#
+# concurrent_compactors defaults to the smaller of (number of disks,
+# number of cores), with a minimum of 2 and a maximum of 8.
+#
+# If your data directories are backed by SSD, you should increase this
+# to the number of cores.
+#concurrent_compactors: 1
+
+# Throttles compaction to the given total throughput across the entire
+# system. The faster you insert data, the faster you need to compact in
+# order to keep the sstable count down, but in general, setting this to
+# 16 to 32 times the rate you are inserting data is more than sufficient.
+# Setting this to 0 disables throttling. Note that this account for all types
+# of compaction, including validation compaction.
+compaction_throughput_mb_per_sec: 16
+
+# Log a warning when compacting partitions larger than this value
+compaction_large_partition_warning_threshold_mb: 100
+
+# When compacting, the replacement sstable(s) can be opened before they
+# are completely written, and used in place of the prior sstables for
+# any range that has been written. This helps to smoothly transfer reads
+# between the sstables, reducing page cache churn and keeping hot rows hot
+sstable_preemptive_open_interval_in_mb: 50
+
+# Throttles all outbound streaming file transfers on this node to the
+# given total throughput in Mbps. This is necessary because Cassandra does
+# mostly sequential IO when streaming data during bootstrap or repair, which
+# can lead to saturating the network connection and degrading rpc performance.
+# When unset, the default is 200 Mbps or 25 MB/s.
+# stream_throughput_outbound_megabits_per_sec: 200
+
+# Throttles all streaming file transfer between the datacenters,
+# this setting allows users to throttle inter dc stream throughput in addition
+# to throttling all network stream traffic as configured with
+# stream_throughput_outbound_megabits_per_sec
+# When unset, the default is 200 Mbps or 25 MB/s
+# inter_dc_stream_throughput_outbound_megabits_per_sec: 200
+
+# How long the coordinator should wait for read operations to complete
+read_request_timeout_in_ms: 5000
+# How long the coordinator should wait for seq or index scans to complete
+range_request_timeout_in_ms: 10000
+# How long the coordinator should wait for writes to complete
+write_request_timeout_in_ms: 2000
+# How long the coordinator should wait for counter writes to complete
+counter_write_request_timeout_in_ms: 5000
+# How long a coordinator should continue to retry a CAS operation
+# that contends with other proposals for the same row
+cas_contention_timeout_in_ms: 1000
+# How long the coordinator should wait for truncates to complete
+# (This can be much longer, because unless auto_snapshot is disabled
+# we need to flush first so we can snapshot before removing the data.)
+truncate_request_timeout_in_ms: 60000
+# The default timeout for other, miscellaneous operations
+request_timeout_in_ms: 10000
+
+# Enable operation timeout information exchange between nodes to accurately
+# measure request timeouts.  If disabled, replicas will assume that requests
+# were forwarded to them instantly by the coordinator, which means that
+# under overload conditions we will waste that much extra time processing
+# already-timed-out requests.
+#
+# Warning: before enabling this property make sure to ntp is installed
+# and the times are synchronized between the nodes.
+cross_node_timeout: false
+
+# Set socket timeout for streaming operation.
+# The stream session is failed if no data/ack is received by any of the participants
+# within that period, which means this should also be sufficient to stream a large
+# sstable or rebuild table indexes.
+# Default value is 86400000ms, which means stale streams timeout after 24 hours.
+# A value of zero means stream sockets should never time out.
+# streaming_socket_timeout_in_ms: 86400000
+
+# phi value that must be reached for a host to be marked down.
+# most users should never need to adjust this.
+# phi_convict_threshold: 8
+
+# endpoint_snitch -- Set this to a class that implements
+# IEndpointSnitch.  The snitch has two functions:
+# - it teaches Cassandra enough about your network topology to route
+#   requests efficiently
+# - it allows Cassandra to spread replicas around your cluster to avoid
+#   correlated failures. It does this by grouping machines into
+#   "datacenters" and "racks."  Cassandra will do its best not to have
+#   more than one replica on the same "rack" (which may not actually
+#   be a physical location)
+#
+# CASSANDRA WILL NOT ALLOW YOU TO SWITCH TO AN INCOMPATIBLE SNITCH
+# ONCE DATA IS INSERTED INTO THE CLUSTER.  This would cause data loss.
+# This means that if you start with the default SimpleSnitch, which
+# locates every node on "rack1" in "datacenter1", your only options
+# if you need to add another datacenter are GossipingPropertyFileSnitch
+# (and the older PFS).  From there, if you want to migrate to an
+# incompatible snitch like Ec2Snitch you can do it by adding new nodes
+# under Ec2Snitch (which will locate them in a new "datacenter") and
+# decommissioning the old ones.
+#
+# Out of the box, Cassandra provides
+#  - SimpleSnitch:
+#    Treats Strategy order as proximity. This can improve cache
+#    locality when disabling read repair.  Only appropriate for
+#    single-datacenter deployments.
+#  - GossipingPropertyFileSnitch
+#    This should be your go-to snitch for production use.  The rack
+#    and datacenter for the local node are defined in
+#    cassandra-rackdc.properties and propagated to other nodes via
+#    gossip.  If cassandra-topology.properties exists, it is used as a
+#    fallback, allowing migration from the PropertyFileSnitch.
+#  - PropertyFileSnitch:
+#    Proximity is determined by rack and data center, which are
+#    explicitly configured in cassandra-topology.properties.
+#  - Ec2Snitch:
+#    Appropriate for EC2 deployments in a single Region. Loads Region
+#    and Availability Zone information from the EC2 API. The Region is
+#    treated as the datacenter, and the Availability Zone as the rack.
+#    Only private IPs are used, so this will not work across multiple
+#    Regions.
+#  - Ec2MultiRegionSnitch:
+#    Uses public IPs as broadcast_address to allow cross-region
+#    connectivity.  (Thus, you should set seed addresses to the public
+#    IP as well.) You will need to open the storage_port or
+#    ssl_storage_port on the public IP firewall.  (For intra-Region
+#    traffic, Cassandra will switch to the private IP after
+#    establishing a connection.)
+#  - RackInferringSnitch:
+#    Proximity is determined by rack and data center, which are
+#    assumed to correspond to the 3rd and 2nd octet of each node's IP
+#    address, respectively.  Unless this happens to match your
+#    deployment conventions, this is best used as an example of
+#    writing a custom Snitch class and is provided in that spirit.
+#
+# You can use a custom Snitch by setting this to the full class name
+# of the snitch, which will be assumed to be on your classpath.
+endpoint_snitch: SimpleSnitch
+
+# controls how often to perform the more expensive part of host score
+# calculation
+dynamic_snitch_update_interval_in_ms: 100
+# controls how often to reset all host scores, allowing a bad host to
+# possibly recover
+dynamic_snitch_reset_interval_in_ms: 600000
+# if set greater than zero and read_repair_chance is < 1.0, this will allow
+# 'pinning' of replicas to hosts in order to increase cache capacity.
+# The badness threshold will control how much worse the pinned host has to be
+# before the dynamic snitch will prefer other replicas over it.  This is
+# expressed as a double which represents a percentage.  Thus, a value of
+# 0.2 means Cassandra would continue to prefer the static snitch values
+# until the pinned host was 20% worse than the fastest.
+dynamic_snitch_badness_threshold: 0.1
+
+# request_scheduler -- Set this to a class that implements
+# RequestScheduler, which will schedule incoming client requests
+# according to the specific policy. This is useful for multi-tenancy
+# with a single Cassandra cluster.
+# NOTE: This is specifically for requests from the client and does
+# not affect inter node communication.
+# org.apache.cassandra.scheduler.NoScheduler - No scheduling takes place
+# org.apache.cassandra.scheduler.RoundRobinScheduler - Round robin of
+# client requests to a node with a separate queue for each
+# request_scheduler_id. The scheduler is further customized by
+# request_scheduler_options as described below.
+request_scheduler: org.apache.cassandra.scheduler.NoScheduler
+
+# Scheduler Options vary based on the type of scheduler
+# NoScheduler - Has no options
+# RoundRobin
+#  - throttle_limit -- The throttle_limit is the number of in-flight
+#                      requests per client.  Requests beyond
+#                      that limit are queued up until
+#                      running requests can complete.
+#                      The value of 80 here is twice the number of
+#                      concurrent_reads + concurrent_writes.
+#  - default_weight -- default_weight is optional and allows for
+#                      overriding the default which is 1.
+#  - weights -- Weights are optional and will default to 1 or the
+#               overridden default_weight. The weight translates into how
+#               many requests are handled during each turn of the
+#               RoundRobin, based on the scheduler id.
+#
+# request_scheduler_options:
+#    throttle_limit: 80
+#    default_weight: 5
+#    weights:
+#      Keyspace1: 1
+#      Keyspace2: 5
+
+# request_scheduler_id -- An identifier based on which to perform
+# the request scheduling. Currently the only valid option is keyspace.
+# request_scheduler_id: keyspace
+
+# Enable or disable inter-node encryption
+# Default settings are TLS v1, RSA 1024-bit keys (it is imperative that
+# users generate their own keys) TLS_RSA_WITH_AES_128_CBC_SHA as the cipher
+# suite for authentication, key exchange and encryption of the actual data transfers.
+# Use the DHE/ECDHE ciphers if running in FIPS 140 compliant mode.
+# NOTE: No custom encryption options are enabled at the moment
+# The available internode options are : all, none, dc, rack
+#
+# If set to dc cassandra will encrypt the traffic between the DCs
+# If set to rack cassandra will encrypt the traffic between the racks
+#
+# The passwords used in these options must match the passwords used when generating
+# the keystore and truststore.  For instructions on generating these files, see:
+# http://download.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CreateKeystore
+#
+server_encryption_options:
+    internode_encryption: none
+    keystore: conf/.keystore
+    keystore_password: cassandra
+    truststore: conf/.truststore
+    truststore_password: cassandra
+    # More advanced defaults below:
+    # protocol: TLS
+    # algorithm: SunX509
+    # store_type: JKS
+    # cipher_suites: [TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA]
+    # require_client_auth: false
+
+# enable or disable client/server encryption.
+client_encryption_options:
+    enabled: false
+    # If enabled and optional is set to true encrypted and unencrypted connections are handled.
+    optional: false
+    keystore: conf/.keystore
+    keystore_password: cassandra
+    # require_client_auth: false
+    # Set trustore and truststore_password if require_client_auth is true
+    # truststore: conf/.truststore
+    # truststore_password: cassandra
+    # More advanced defaults below:
+    # protocol: TLS
+    # algorithm: SunX509
+    # store_type: JKS
+    # cipher_suites: [TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA]
+
+# internode_compression controls whether traffic between nodes is
+# compressed.
+# can be:  all  - all traffic is compressed
+#          dc   - traffic between different datacenters is compressed
+#          none - nothing is compressed.
+internode_compression: all
+
+# Enable or disable tcp_nodelay for inter-dc communication.
+# Disabling it will result in larger (but fewer) network packets being sent,
+# reducing overhead from the TCP protocol itself, at the cost of increasing
+# latency if you block for cross-datacenter responses.
+inter_dc_tcp_nodelay: false
+
+# TTL for different trace types used during logging of the repair process.
+tracetype_query_ttl: 86400
+tracetype_repair_ttl: 604800
+
+# By default, Cassandra logs GC Pauses greater than 200 ms at INFO level
+# This threshold can be adjusted to minimize logging if necessary
+# gc_log_threshold_in_ms: 200
+
+# GC Pauses greater than gc_warn_threshold_in_ms will be logged at WARN level
+# If unset, all GC Pauses greater than gc_log_threshold_in_ms will log at
+# INFO level
+# Adjust the threshold based on your application throughput requirement
+gc_warn_threshold_in_ms: 1000
+
+# UDFs (user defined functions) are disabled by default.
+# As of Cassandra 3.0 there is a sandbox in place that should prevent execution of evil code.
+enable_user_defined_functions: false
+
+# Enables scripted UDFs (JavaScript UDFs).
+# Java UDFs are always enabled, if enable_user_defined_functions is true.
+# Enable this option to be able to use UDFs with "language javascript" or any custom JSR-223 provider.
+# This option has no effect, if enable_user_defined_functions is false.
+enable_scripted_user_defined_functions: false
+
+# The default Windows kernel timer and scheduling resolution is 15.6ms for power conservation.
+# Lowering this value on Windows can provide much tighter latency and better throughput, however
+# some virtualized environments may see a negative performance impact from changing this setting
+# below their system default. The sysinternals 'clockres' tool can confirm your system's default
+# setting.
+windows_timer_interval: 1
+
+# Maximum size of any value in SSTables. Safety measure to detect SSTable corruption
+# early. Any value size larger than this threshold will result into marking an SSTable
+# as corrupted. This should be positive and less than 2048.
+# max_value_size_in_mb: 256
+
+# Coalescing Strategies #
+# Coalescing multiples messages turns out to significantly boost message processing throughput (think doubling or more).
+# On bare metal, the floor for packet processing throughput is high enough that many applications won't notice, but in
+# virtualized environments, the point at which an application can be bound by network packet processing can be
+# surprisingly low compared to the throughput of task processing that is possible inside a VM. It's not that bare metal
+# doesn't benefit from coalescing messages, it's that the number of packets a bare metal network interface can process
+# is sufficient for many applications such that no load starvation is experienced even without coalescing.
+# There are other benefits to coalescing network messages that are harder to isolate with a simple metric like messages
+# per second. By coalescing multiple tasks together, a network thread can process multiple messages for the cost of one
+# trip to read from a socket, and all the task submission work can be done at the same time reducing context switching
+# and increasing cache friendliness of network message processing.
+# See CASSANDRA-8692 for details.
+
+# Strategy to use for coalescing messages in OutboundTcpConnection.
+# Can be fixed, movingaverage, timehorizon (default), disabled.
+# You can also specify a subclass of CoalescingStrategies.CoalescingStrategy by name.
+# otc_coalescing_strategy: TIMEHORIZON
+
+# How many microseconds to wait for coalescing. For fixed strategy this is the amount of time after the first
+# message is received before it will be sent with any accompanying messages. For moving average this is the
+# maximum amount of time that will be waited as well as the interval at which messages must arrive on average
+# for coalescing to be enabled.
+# otc_coalescing_window_us: 200
+
+# Do not try to coalesce messages if we already got that many messages. This should be more than 2 and less than 128.
+# otc_coalescing_enough_coalesced_messages: 8
+
+# How many milliseconds to wait between two expiration runs on the backlog (queue) of the OutboundTcpConnection.
+# Expiration is done if messages are piling up in the backlog. Droppable messages are expired to free the memory
+# taken by expired messages. The interval should be between 0 and 1000, and in most installations the default value
+# will be appropriate. A smaller value could potentially expire messages slightly sooner at the expense of more CPU
+# time and queue contention while iterating the backlog of messages.
+# An interval of 0 disables any wait time, which is the behavior of former Cassandra versions.
+#
+# otc_backlog_expiration_interval_ms: 200
diff --git a/distribution/cassandra/docker-entrypoint.sh b/distribution/cassandra/docker-entrypoint.sh
new file mode 100644 (file)
index 0000000..e46dea9
--- /dev/null
@@ -0,0 +1,73 @@
+#!/bin/bash
+set -e
+
+# first arg is `-f` or `--some-option`
+# or there are no args
+if [ "$#" -eq 0 ] || [ "${1#-}" != "$1" ]; then
+       set -- cassandra -f "$@"
+fi
+
+# allow the container to be started with `--user`
+if [ "$1" = 'cassandra' -a "$(id -u)" = '0' ]; then
+       chown -R cassandra /var/lib/cassandra /var/log/cassandra "$CASSANDRA_CONFIG"
+       exec gosu cassandra "$BASH_SOURCE" "$@"
+fi
+
+if [ "$1" = 'cassandra' ]; then
+       : ${CASSANDRA_RPC_ADDRESS='0.0.0.0'}
+
+       : ${CASSANDRA_LISTEN_ADDRESS='auto'}
+       if [ "$CASSANDRA_LISTEN_ADDRESS" = 'auto' ]; then
+               CASSANDRA_LISTEN_ADDRESS="$(hostname --ip-address)"
+       fi
+
+       : ${CASSANDRA_BROADCAST_ADDRESS="$CASSANDRA_LISTEN_ADDRESS"}
+
+       if [ "$CASSANDRA_BROADCAST_ADDRESS" = 'auto' ]; then
+               CASSANDRA_BROADCAST_ADDRESS="$(hostname --ip-address)"
+       fi
+       : ${CASSANDRA_BROADCAST_RPC_ADDRESS:=$CASSANDRA_BROADCAST_ADDRESS}
+
+       if [ -n "${CASSANDRA_NAME:+1}" ]; then
+               : ${CASSANDRA_SEEDS:="cassandra"}
+       fi
+       : ${CASSANDRA_SEEDS:="$CASSANDRA_BROADCAST_ADDRESS"}
+       
+       sed -ri 's/(- seeds:).*/\1 "'"$CASSANDRA_SEEDS"'"/' "$CASSANDRA_CONFIG/cassandra.yaml"
+
+       for yaml in \
+               broadcast_address \
+               broadcast_rpc_address \
+               cluster_name \
+               endpoint_snitch \
+               listen_address \
+               num_tokens \
+               rpc_address \
+               start_rpc \
+       ; do
+               var="CASSANDRA_${yaml^^}"
+               val="${!var}"
+               if [ "$val" ]; then
+                       sed -ri 's/^(# )?('"$yaml"':).*/\2 '"$val"'/' "$CASSANDRA_CONFIG/cassandra.yaml"
+               fi
+       done
+
+       for rackdc in dc rack; do
+               var="CASSANDRA_${rackdc^^}"
+               val="${!var}"
+               if [ "$val" ]; then
+                       sed -ri 's/^('"$rackdc"'=).*/\1 '"$val"'/' "$CASSANDRA_CONFIG/cassandra-rackdc.properties"
+               fi
+       done
+fi
+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 & ;;
+        *)        echo "$0: ignoring $f" ;;
+    esac
+    echo
+done
+echo "################################ Let run Scripts End ##############################"
+
+exec "$@"
diff --git a/distribution/cassandra/music.cql b/distribution/cassandra/music.cql
new file mode 100644 (file)
index 0000000..d991a51
--- /dev/null
@@ -0,0 +1,20 @@
+CREATE KEYSPACE admin
+    WITH REPLICATION = {
+        'class' : 'SimpleStrategy',
+        'replication_factor': 1
+    }
+    AND DURABLE_WRITES = true;
+CREATE TABLE admin.keyspace_master (
+    uuid uuid,
+    keyspace_name text,
+    application_name text,
+    is_api boolean,
+    password text,
+    username text,
+    is_aaf boolean,
+    PRIMARY KEY (uuid)
+);
+
+CREATE USER nelson24 WITH PASSWORD â€˜winman123’ SUPERUSER;
+ALTER USER cassandra WITH PASSWORD â€˜SomeLongRandomStringNoonewillthinkof’;
diff --git a/distribution/cassandra/music_single.cql b/distribution/cassandra/music_single.cql
new file mode 100644 (file)
index 0000000..11eb2df
--- /dev/null
@@ -0,0 +1,20 @@
+CREATE KEYSPACE IF NOT EXISTS admin
+    WITH REPLICATION = {
+        'class' : 'SimpleStrategy',
+        'replication_factor': 1
+    }
+    AND DURABLE_WRITES = true;
+CREATE TABLE IF NOT EXISTS admin.keyspace_master (
+    uuid uuid,
+    keyspace_name text,
+    application_name text,
+    is_api boolean,
+    password text,
+    username text,
+    is_aaf boolean,
+    PRIMARY KEY (uuid)
+);
+
+CREATE ROLE IF NOT EXISTS nelson24 WITH PASSWORD = 'winman123' AND SUPERUSER = True AND LOGIN = True;
+ALTER ROLE cassandra WITH PASSWORD = 'SomeLongRandomStringNoonewillthinkof';
diff --git a/distribution/tomcat/Dockerfile b/distribution/tomcat/Dockerfile
new file mode 100644 (file)
index 0000000..7d4f2ad
--- /dev/null
@@ -0,0 +1,3 @@
+FROM library/tomcat:8.5
+LABEL purpose="Tomcat for MUSIC"
+
diff --git a/distribution/zookeeper/Dockerfile b/distribution/zookeeper/Dockerfile
new file mode 100644 (file)
index 0000000..fdc89dc
--- /dev/null
@@ -0,0 +1,3 @@
+FROM library/zookeeper:3.4
+LABEL purpose="For MUSIC"
+
diff --git a/pom.xml b/pom.xml
index b87ca3b..dbc24ba 100755 (executable)
--- a/pom.xml
+++ b/pom.xml
@@ -1,24 +1,14 @@
-<!-- 
- ============LICENSE_START==========================================
- org.onap.music
- ===================================================================
-  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.
- ============LICENSE_END=============================================
- ====================================================================
--->
+<!-- ============LICENSE_START========================================== 
+    org.onap.music =================================================================== 
+    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. ============LICENSE_END============================================= 
+    ==================================================================== -->
 <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>
     </build>
 
     <dependencies>
-
+        <!-- Logging -->
         <dependency>
             <groupId>ch.qos.logback</groupId>
             <artifactId>logback-core</artifactId>
             <version>1.2.3</version>
-
             <exclusions>
                 <exclusion>
                     <groupId>org.slf4j</groupId>
                 </exclusion>
             </exclusions>
         </dependency>
-
         <dependency>
             <groupId>ch.qos.logback</groupId>
             <artifactId>logback-classic</artifactId>
                 </exclusion>
             </exclusions>
         </dependency>
+        <dependency>
+            <groupId>com.att.eelf</groupId>
+            <artifactId>eelf-core</artifactId>
+            <version>1.0.1-oss</version>
+        </dependency>
+        <!-- End Logging -->
 
         <dependency>
             <groupId>com.datastax.cassandra</groupId>
             <artifactId>cassandra-driver-core</artifactId>
             <version>${cassandra.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.cassandraunit</groupId>
-            <artifactId>cassandra-unit</artifactId>
-            <version>3.3.0.2</version>
-        </dependency>
+
         <dependency>
             <groupId>org.apache.zookeeper</groupId>
             <artifactId>zookeeper</artifactId>
                 </exclusion>
             </exclusions>
         </dependency>
+
         <dependency>
             <groupId>com.sun.jersey</groupId>
             <artifactId>jersey-client</artifactId>
             <artifactId>jersey-json</artifactId>
             <version>${jersey1.version}</version>
         </dependency>
+
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>servlet-api</artifactId>
             <version>2.4</version>
             <scope>provided</scope>
         </dependency>
-        <!-- 
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-model</artifactId>
-            <version>3.3.9</version>
-        </dependency>
-         -->
+        <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> 
+            <version>3.0.1</version> <scope>provided</scope> </dependency>
+        <!-- <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> 
+            <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> 
+            <groupId>org.apache.maven</groupId> <artifactId>maven-model</artifactId> 
+            <version>3.3.9</version> </dependency> -->
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-jcs-core</artifactId>
             <version>2.2</version>
         </dependency>
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-            <version>3.0.1</version>
-            <scope>provided</scope>
-        </dependency>
         <dependency>
             <groupId>commons-codec</groupId>
             <artifactId>commons-codec</artifactId>
             <version>1.11</version>
         </dependency>
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-jersey-jaxrs</artifactId>
+            <version>1.5.8</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>19.0</version>
+        </dependency>
+        <!-- Testing -->
+        <dependency>
+            <groupId>org.cassandraunit</groupId>
+            <artifactId>cassandra-unit</artifactId>
+            <version>3.3.0.2</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-all</artifactId>
+            <version>1.9.0</version>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>4.12</version>
             <scope>test</scope>
         </dependency>
-
         <dependency>
             <groupId>org.apache.curator</groupId>
             <artifactId>curator-test</artifactId>
             </exclusions>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-all</artifactId>
-            <version>1.9.0</version>
-        </dependency>
-        <dependency>
-            <groupId>io.swagger</groupId>
-            <artifactId>swagger-jersey-jaxrs</artifactId>
-            <version>1.5.18</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-            <version>19.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.att.eelf</groupId>
-            <artifactId>eelf-core</artifactId>
-            <version>1.0.1-oss</version>
-        </dependency>
+        <!-- Added to force update dependency jars that are not secure Cassandra-Unit 
+            depends on older version that is not secure -->
         <dependency>
             <groupId>org.apache.httpcomponents</groupId>
             <artifactId>httpclient</artifactId>
             <version>4.5.3</version>
-        </dependency>        
+        </dependency>
     </dependencies>
 
     <reporting>
                             <images>
                                 <!-- MUSIC War -->
                                 <image>
-                                    <name>music</name>
+                                    <name>onap/music/music</name>
                                     <alias>docker_music</alias>
                                     <build>
                                         <cleanup>true</cleanup>
                                         </assembly>
                                     </build>
                                 </image>
+                                <!-- Cassandra -->
+                                <image>
+                                    <name>onap/music/cassandra_music</name>
+                                    <alias>docker_cassandra</alias>
+                                    <build>
+                                        <cleanup>true</cleanup>
+                                        <tags>
+                                            <tag>3.0-${timestamp}</tag>
+                                            <tag>3.0-latest</tag>
+                                        </tags>
+                                        <dockerFileDir>${project.basedir}/distribution/cassandra</dockerFileDir>
+                                    </build>
+                                </image>
+                                <!-- Zookeeper -->
+                                <!-- 
+                                <image>
+                                    <name>onap/music/zookeeper_music</name>
+                                    <alias>docker_zookeeper</alias>
+                                    <build>
+                                        <cleanup>true</cleanup>
+                                        <tags>
+                                            <tag>3.4-${timestamp}</tag>
+                                            <tag>3.4-latest</tag>
+                                        </tags>
+                                        <dockerFileDir>${project.basedir}/distribution/zookeeper</dockerFileDir>
+                                    </build>
+                                </image>
+                                -->
+                                <!-- tomcat 8.5 -->
+                                <!--
+                                <image>
+                                    <name>onap/music/tomcat_music</name>
+                                    <alias>docker_tomcat</alias>
+                                    <build>
+                                        <cleanup>true</cleanup>
+                                        <tags>
+                                            <tag>8.5-${timestamp}</tag>
+                                            <tag>8.5-latest</tag>
+                                        </tags>
+                                        <dockerFileDir>${project.basedir}/distribution/tomcat</dockerFileDir>
+                                    </build>
+                                </image>\
+                                -->
                             </images>
                         </configuration>
                         <executions>
                                     <goal>push</goal>
                                 </goals>
                                 <configuration>
-                                    <image>music</image>
+                                    <image>onap/music/music</image>
                                 </configuration>
                             </execution>
                         </executions>
                     </plugin>
-                </plugins>    
+                </plugins>
             </build>
         </profile>
     </profiles>
index 87b9794..16d2af0 100644 (file)
@@ -44,119 +44,119 @@ import com.datastax.driver.core.TableMetadata;
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
 public class MusicDataStoreTest {
 
-       static MusicDataStore dataStore;
-       static PreparedQueryObject testObject;
+    static MusicDataStore dataStore;
+    static PreparedQueryObject testObject;
 
-       @BeforeClass
-       public static void init() {
-               dataStore = CassandraCQL.connectToEmbeddedCassandra();
+    @BeforeClass
+    public static void init() {
+        dataStore = CassandraCQL.connectToEmbeddedCassandra();
 
-       }
+    }
 
-       @AfterClass
-       public static void close() throws MusicServiceException, MusicQueryException {
+    @AfterClass
+    public static void close() throws MusicServiceException, MusicQueryException {
  
-               testObject = new PreparedQueryObject();
-               testObject.appendQueryString(CassandraCQL.dropKeyspace);
-               dataStore.executePut(testObject, "eventual");
-               dataStore.close();
-
-       }
-
-       @Test
-       public void Test1_SetUp() throws MusicServiceException, MusicQueryException {
-               boolean result = false;
-               testObject = new PreparedQueryObject();
-               testObject.appendQueryString(CassandraCQL.createKeySpace);
-               result = dataStore.executePut(testObject, "eventual");;
-               testObject = new PreparedQueryObject();
-               testObject.appendQueryString(CassandraCQL.createTableEmployees);
-               result = dataStore.executePut(testObject, "eventual");
-               assertEquals(true, result);
-
-       }
-
-       @Test
-       public void Test2_ExecutePut_eventual_insert() throws MusicServiceException, MusicQueryException {
-               testObject = CassandraCQL.setPreparedInsertQueryObject1();
-               boolean result = dataStore.executePut(testObject, "eventual");
-               assertEquals(true, result);
-       }
-
-       @Test
-       public void Test3_ExecutePut_critical_insert() throws MusicServiceException, MusicQueryException {
-               testObject = CassandraCQL.setPreparedInsertQueryObject2();
-               boolean result = dataStore.executePut(testObject, "Critical");
-               assertEquals(true, result);
-       }
-
-       @Test
-       public void Test4_ExecutePut_eventual_update() throws MusicServiceException, MusicQueryException {
-               testObject = CassandraCQL.setPreparedUpdateQueryObject();
-               boolean result = false;
-               result = dataStore.executePut(testObject, "eventual");
-               assertEquals(true, result);
-       }
-
-       @Test
-       public void Test5_ExecuteEventualGet() throws MusicServiceException, MusicQueryException {
-               testObject = new PreparedQueryObject();
-               testObject.appendQueryString(CassandraCQL.selectALL);
-               boolean result = false;
-               int count = 0;
-               ResultSet output = null;
-               output = dataStore.executeEventualGet(testObject);
-               System.out.println(output);
-               ;
-               for (Row row : output) {
-                       count++;
-                       System.out.println(row.toString());
-               }
-               if (count == 2) {
-                       result = true;
-               }
-               assertEquals(true, result);
-       }
-
-       @Test
-       public void Test6_ExecuteCriticalGet() throws MusicServiceException, MusicQueryException {
-               testObject = CassandraCQL.setPreparedGetQuery();
-               boolean result = false;
-               int count = 0;
-               ResultSet output = null;
-               output = dataStore.executeCriticalGet(testObject);
-               System.out.println(output);
-               ;
-               for (Row row : output) {
-                       count++;
-                       System.out.println(row.toString());
-               }
-               if (count == 1) {
-                       result = true;
-               }
-               assertEquals(true, result);
-       }
-
-       @Test(expected = NullPointerException.class)
-       public void Test7_exception() {
-               PreparedQueryObject queryObject = null;
-               try {
-                       dataStore.executePut(queryObject, "critical");
-               } catch (MusicQueryException | MusicServiceException e) {
-                       System.out.println(e.getMessage());
-               }
-       }
-       
-       @Test
-       public void Test8_columnDataType() {
-               DataType data = dataStore.returnColumnDataType("testCassa", "employees", "empName");
-               String datatype = data.toString();
-               assertEquals("text",datatype);
-       }
-       
-       @Test
-       public void Test8_columnMetdaData() {
-               TableMetadata data = dataStore.returnColumnMetadata("testCassa", "employees");
-               assertNotNull(data);
-       }
+        testObject = new PreparedQueryObject();
+        testObject.appendQueryString(CassandraCQL.dropKeyspace);
+        dataStore.executePut(testObject, "eventual");
+        dataStore.close();
+
+    }
+
+    @Test
+    public void Test1_SetUp() throws MusicServiceException, MusicQueryException {
+        boolean result = false;
+        testObject = new PreparedQueryObject();
+        testObject.appendQueryString(CassandraCQL.createKeySpace);
+        result = dataStore.executePut(testObject, "eventual");;
+        testObject = new PreparedQueryObject();
+        testObject.appendQueryString(CassandraCQL.createTableEmployees);
+        result = dataStore.executePut(testObject, "eventual");
+        assertEquals(true, result);
+
+    }
+
+    @Test
+    public void Test2_ExecutePut_eventual_insert() throws MusicServiceException, MusicQueryException {
+        testObject = CassandraCQL.setPreparedInsertQueryObject1();
+        boolean result = dataStore.executePut(testObject, "eventual");
+        assertEquals(true, result);
+    }
+
+    @Test
+    public void Test3_ExecutePut_critical_insert() throws MusicServiceException, MusicQueryException {
+        testObject = CassandraCQL.setPreparedInsertQueryObject2();
+        boolean result = dataStore.executePut(testObject, "Critical");
+        assertEquals(true, result);
+    }
+
+    @Test
+    public void Test4_ExecutePut_eventual_update() throws MusicServiceException, MusicQueryException {
+        testObject = CassandraCQL.setPreparedUpdateQueryObject();
+        boolean result = false;
+        result = dataStore.executePut(testObject, "eventual");
+        assertEquals(true, result);
+    }
+
+    @Test
+    public void Test5_ExecuteEventualGet() throws MusicServiceException, MusicQueryException {
+        testObject = new PreparedQueryObject();
+        testObject.appendQueryString(CassandraCQL.selectALL);
+        boolean result = false;
+        int count = 0;
+        ResultSet output = null;
+        output = dataStore.executeEventualGet(testObject);
+        System.out.println(output);
+        ;
+        for (Row row : output) {
+            count++;
+            System.out.println(row.toString());
+        }
+        if (count == 2) {
+            result = true;
+        }
+        assertEquals(true, result);
+    }
+
+    @Test
+    public void Test6_ExecuteCriticalGet() throws MusicServiceException, MusicQueryException {
+        testObject = CassandraCQL.setPreparedGetQuery();
+        boolean result = false;
+        int count = 0;
+        ResultSet output = null;
+        output = dataStore.executeCriticalGet(testObject);
+        System.out.println(output);
+        ;
+        for (Row row : output) {
+            count++;
+            System.out.println(row.toString());
+        }
+        if (count == 1) {
+            result = true;
+        }
+        assertEquals(true, result);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void Test7_exception() {
+        PreparedQueryObject queryObject = null;
+        try {
+            dataStore.executePut(queryObject, "critical");
+        } catch (MusicQueryException | MusicServiceException e) {
+            System.out.println(e.getMessage());
+        }
+    }
+    
+    @Test
+    public void Test8_columnDataType() {
+        DataType data = dataStore.returnColumnDataType("testCassa", "employees", "empName");
+        String datatype = data.toString();
+        assertEquals("text",datatype);
+    }
+    
+    @Test
+    public void Test8_columnMetdaData() {
+        TableMetadata data = dataStore.returnColumnMetadata("testCassa", "employees");
+        assertNotNull(data);
+    }
 }
index 9f245e8..f8cab32 100644 (file)
@@ -73,11 +73,11 @@ public class MusicUtilTest {
         assertEquals(MusicUtil.getAllIds().get(0),"1");
     }
 
-    @Test
-    public void testGetPublicIp() {
-        MusicUtil.setPublicIp("10.0.0.1");
-        assertEquals(MusicUtil.getPublicIp(),"10.0.0.1");
-    }
+//    @Test
+//    public void testGetPublicIp() {
+//        MusicUtil.setPublicIp("10.0.0.1");
+//        assertEquals(MusicUtil.getPublicIp(),"10.0.0.1");
+//    }
 
     @Test
     public void testGetAllPublicIps() {
index 5b5665a..c571085 100644 (file)
@@ -213,14 +213,14 @@ public class TestMusicCore {
 
     @Test
     public void testQuorumGet() throws MusicServiceException, MusicQueryException {
-       preparedQueryObject = Mockito.mock(PreparedQueryObject.class);
-       mDstoreHandle = Mockito.mock(MusicDataStore.class);
-       rs = Mockito.mock(ResultSet.class);
-       session = Mockito.mock(Session.class);
+        preparedQueryObject = Mockito.mock(PreparedQueryObject.class);
+        mDstoreHandle = Mockito.mock(MusicDataStore.class);
+        rs = Mockito.mock(ResultSet.class);
+        session = Mockito.mock(Session.class);
         Mockito.when(mDstoreHandle.getSession()).thenReturn(session);
-       Mockito.when(mDstoreHandle.executeCriticalGet(preparedQueryObject)).thenReturn(rs);
-       ResultSet rs1 = MusicCore.quorumGet(preparedQueryObject);
-       assertNotNull(rs1);
+        Mockito.when(mDstoreHandle.executeCriticalGet(preparedQueryObject)).thenReturn(rs);
+        ResultSet rs1 = MusicCore.quorumGet(preparedQueryObject);
+        assertNotNull(rs1);
     }
 
     @Test
index ca9bbb6..823bada 100644 (file)
@@ -1,20 +1,16 @@
 /*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- *  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
+ * ============LICENSE_START========================================== org.onap.music
+ * =================================================================== 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
+ * 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.
+ * 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=============================================
  * ====================================================================
@@ -24,10 +20,8 @@ package org.onap.music.unittests;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
-
 import java.io.File;
 import java.util.List;
-
 import org.apache.curator.test.TestingServer;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -44,137 +38,139 @@ import org.onap.music.main.MusicCore;
 import org.onap.music.main.MusicUtil;
 import org.onap.music.main.ResultType;
 import org.onap.music.main.ReturnType;
-
 import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.Row;
 
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
 public class TestMusicCoreIntegration {
 
-       static TestingServer zkServer;
-       static PreparedQueryObject testObject;
-       static String lockId = null;
-       static String lockName = "ks1.tb1.pk1";
-
-       @BeforeClass
-       public static void init() throws Exception {
-               try {
-                       MusicCore.mDstoreHandle = CassandraCQL.connectToEmbeddedCassandra();
-                       zkServer = new TestingServer(2181, new File("/tmp/zk"));
-                       MusicCore.mLockHandle = new MusicLockingService();
-               } catch (Exception e) {
-                       e.printStackTrace();
-               }
-               System.out.println("####Port:" + zkServer.getPort());
-       }
-
-       @AfterClass
-       public static void tearDownAfterClass() throws Exception {
-               System.out.println("After class");
-               testObject = new PreparedQueryObject();
-               testObject.appendQueryString(CassandraCQL.dropKeyspace);
-               MusicCore.eventualPut(testObject);
-               MusicCore.deleteLock(lockName);
-               MusicCore.mDstoreHandle.close();
-               MusicCore.mLockHandle.getzkLockHandle().close();
-               MusicCore.mLockHandle.close();
-               zkServer.stop();
-
-       }
-
-       @Test
-       public void Test1_SetUp() throws MusicServiceException, MusicQueryException {
-               MusicCore.mLockHandle = new MusicLockingService();
-               boolean result = false;
-               testObject = new PreparedQueryObject();
-               testObject.appendQueryString(CassandraCQL.createKeySpace);
-               MusicCore.eventualPut(testObject);
-               testObject = new PreparedQueryObject();
-               testObject.appendQueryString(CassandraCQL.createTableEmployees);
-               result = MusicCore.nonKeyRelatedPut(testObject, MusicUtil.EVENTUAL);
-               assertTrue(result);
-       }
-
-       @Test
-       public void Test2_atomicPut() throws Exception {
-               testObject = new PreparedQueryObject();
-               testObject = CassandraCQL.setPreparedInsertQueryObject1();
-               ReturnType returnType = MusicCore.atomicPut("testCassa", "employees", "Mr Test one", testObject, null);
-               assertEquals(ResultType.SUCCESS, returnType.getResult());
-       }
-
-       @Test
-       public void Test3_atomicPutWithDeleteLock() throws Exception {
-               testObject = new PreparedQueryObject();
-               testObject = CassandraCQL.setPreparedInsertQueryObject2();
-               ReturnType returnType = MusicCore.atomicPutWithDeleteLock("testCassa", "employees", "Mr Test two", testObject,
-                               null);
-               assertEquals(ResultType.SUCCESS, returnType.getResult());
-       }
-
-       @Test
-       public void Test4_atomicGetWithDeleteLock() throws Exception {
-               testObject = new PreparedQueryObject();
-               testObject = CassandraCQL.setPreparedGetQuery();
-               ResultSet resultSet = MusicCore.atomicGetWithDeleteLock("testCassa", "employees", "Mr Test one", testObject);
-               List<Row> rows = resultSet.all();
-               assertEquals(1, rows.size());
-       }
-
-       @Test
-       public void Test5_atomicGet() throws Exception {
-               testObject = new PreparedQueryObject();
-               testObject = CassandraCQL.setPreparedGetQuery();
-               ResultSet resultSet = MusicCore.atomicGet("testCassa", "employees", "Mr Test two", testObject);
-               List<Row> rows = resultSet.all();
-               assertEquals(1, rows.size());
-       }
-
-       @Test
-       public void Test6_createLockReference() throws Exception {
-               lockId = MusicCore.createLockReference(lockName);
-               assertNotNull(lockId);
-       }
-
-       @Test
-       public void Test7_acquireLockwithLease() throws Exception {
-               ReturnType lockLeaseStatus = MusicCore.acquireLockWithLease(lockName, lockId, 1000);
-               assertEquals(ResultType.SUCCESS, lockLeaseStatus.getResult());
-       }
-
-       @Test
-       public void Test8_acquireLock() throws Exception {
-               ReturnType lockStatus = MusicCore.acquireLock(lockName, lockId);
-               assertEquals(ResultType.SUCCESS, lockStatus.getResult());
-       }
-
-       @Test
-       public void Test9_release() throws Exception {
-               MusicLockState musicLockState = new MusicLockState(LockStatus.LOCKED, "id1");
-               MusicLockState musicLockState1 = new MusicLockState(LockStatus.UNLOCKED, "id1");
-               MusicCore.whoseTurnIsIt(lockName);
-               MusicLockState mls = MusicCore.getMusicLockState(lockName);
-               boolean voluntaryRelease = true;
-               MusicLockState mls1 = MusicCore.releaseLock(lockId, voluntaryRelease);
-               assertEquals(musicLockState.getLockStatus(), mls.getLockStatus());
-               assertEquals(musicLockState1.getLockStatus(), mls1.getLockStatus());
-       }
-
-       @Test
-       public void Test10_create() {
-               MusicCore.pureZkCreate("/nodeName");
-       }
-
-       @Test
-       public void Test11_write() {
-               MusicCore.pureZkWrite("nodeName", "I'm Test".getBytes());
-       }
-
-       @Test
-       public void Test12_read() {
-               byte[] data = MusicCore.pureZkRead("nodeName");
-               String data1 = new String(data);
-               assertEquals("I'm Test", data1);
-       }
-
-}
\ No newline at end of file
+    static TestingServer zkServer;
+    static PreparedQueryObject testObject;
+    static String lockId = null;
+    static String lockName = "ks1.tb1.pk1";
+
+    @BeforeClass
+    public static void init() throws Exception {
+        try {
+            MusicCore.mDstoreHandle = CassandraCQL.connectToEmbeddedCassandra();
+            zkServer = new TestingServer(2181, new File("/tmp/zk"));
+            MusicCore.mLockHandle = new MusicLockingService();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        System.out.println("####Port:" + zkServer.getPort());
+    }
+
+    @AfterClass
+    public static void tearDownAfterClass() throws Exception {
+        System.out.println("After class");
+        testObject = new PreparedQueryObject();
+        testObject.appendQueryString(CassandraCQL.dropKeyspace);
+        MusicCore.eventualPut(testObject);
+        MusicCore.deleteLock(lockName);
+        MusicCore.mDstoreHandle.close();
+        MusicCore.mLockHandle.getzkLockHandle().close();
+        MusicCore.mLockHandle.close();
+        zkServer.stop();
+
+    }
+
+    @Test
+    public void Test1_SetUp() throws MusicServiceException, MusicQueryException {
+        MusicCore.mLockHandle = new MusicLockingService();
+        boolean result = false;
+        testObject = new PreparedQueryObject();
+        testObject.appendQueryString(CassandraCQL.createKeySpace);
+        MusicCore.eventualPut(testObject);
+        testObject = new PreparedQueryObject();
+        testObject.appendQueryString(CassandraCQL.createTableEmployees);
+        result = MusicCore.nonKeyRelatedPut(testObject, MusicUtil.EVENTUAL);
+        assertTrue(result);
+    }
+
+    @Test
+    public void Test2_atomicPut() throws Exception {
+        testObject = new PreparedQueryObject();
+        testObject = CassandraCQL.setPreparedInsertQueryObject1();
+        ReturnType returnType = MusicCore.atomicPut("testCassa", "employees", "Mr Test one",
+                        testObject, null);
+        assertEquals(ResultType.SUCCESS, returnType.getResult());
+    }
+
+    @Test
+    public void Test3_atomicPutWithDeleteLock() throws Exception {
+        testObject = new PreparedQueryObject();
+        testObject = CassandraCQL.setPreparedInsertQueryObject2();
+        ReturnType returnType = MusicCore.atomicPutWithDeleteLock("testCassa", "employees",
+                        "Mr Test two", testObject, null);
+        assertEquals(ResultType.SUCCESS, returnType.getResult());
+    }
+
+    @Test
+    public void Test4_atomicGetWithDeleteLock() throws Exception {
+        testObject = new PreparedQueryObject();
+        testObject = CassandraCQL.setPreparedGetQuery();
+        ResultSet resultSet = MusicCore.atomicGetWithDeleteLock("testCassa", "employees",
+                        "Mr Test one", testObject);
+        List<Row> rows = resultSet.all();
+        assertEquals(1, rows.size());
+    }
+
+    @Test
+    public void Test5_atomicGet() throws Exception {
+        testObject = new PreparedQueryObject();
+        testObject = CassandraCQL.setPreparedGetQuery();
+        ResultSet resultSet =
+                        MusicCore.atomicGet("testCassa", "employees", "Mr Test two", testObject);
+        List<Row> rows = resultSet.all();
+        assertEquals(1, rows.size());
+    }
+
+    @Test
+    public void Test6_createLockReference() throws Exception {
+        lockId = MusicCore.createLockReference(lockName);
+        assertNotNull(lockId);
+    }
+
+    @Test
+    public void Test7_acquireLockwithLease() throws Exception {
+        ReturnType lockLeaseStatus = MusicCore.acquireLockWithLease(lockName, lockId, 1000);
+        assertEquals(ResultType.SUCCESS, lockLeaseStatus.getResult());
+    }
+
+    @Test
+    public void Test8_acquireLock() throws Exception {
+        ReturnType lockStatus = MusicCore.acquireLock(lockName, lockId);
+        assertEquals(ResultType.SUCCESS, lockStatus.getResult());
+    }
+
+    @Test
+    public void Test9_release() throws Exception {
+        MusicLockState musicLockState = new MusicLockState(LockStatus.LOCKED, "id1");
+        MusicLockState musicLockState1 = new MusicLockState(LockStatus.UNLOCKED, "id1");
+        MusicCore.whoseTurnIsIt(lockName);
+        MusicLockState mls = MusicCore.getMusicLockState(lockName);
+        boolean voluntaryRelease = true;
+        MusicLockState mls1 = MusicCore.releaseLock(lockId, voluntaryRelease);
+        assertEquals(musicLockState.getLockStatus(), mls.getLockStatus());
+        assertEquals(musicLockState1.getLockStatus(), mls1.getLockStatus());
+    }
+
+    @Test
+    public void Test10_create() {
+        MusicCore.pureZkCreate("/nodeName");
+    }
+
+    @Test
+    public void Test11_write() {
+        MusicCore.pureZkWrite("nodeName", "I'm Test".getBytes());
+    }
+
+    @Test
+    public void Test12_read() {
+        byte[] data = MusicCore.pureZkRead("nodeName");
+        String data1 = new String(data);
+        assertEquals("I'm Test", data1);
+    }
+
+}
index bc5e9fb..e4d06f7 100644 (file)
@@ -1,20 +1,16 @@
 /*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- *  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
+ * ============LICENSE_START========================================== org.onap.music
+ * =================================================================== 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
+ * 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.
+ * 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=============================================
  * ====================================================================
@@ -23,17 +19,14 @@ package org.onap.music.unittests;
 
 import static org.junit.Assert.assertEquals;
 import static org.onap.music.main.MusicCore.mLockHandle;
-
 import java.io.File;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
-
 import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.UriInfo;
-
 import org.apache.curator.test.TestingServer;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -48,6 +41,7 @@ import org.onap.music.datastore.PreparedQueryObject;
 import org.onap.music.datastore.jsonobjects.JsonDelete;
 import org.onap.music.datastore.jsonobjects.JsonInsert;
 import org.onap.music.datastore.jsonobjects.JsonKeySpace;
+import org.onap.music.datastore.jsonobjects.JsonOnboard;
 import org.onap.music.datastore.jsonobjects.JsonSelect;
 import org.onap.music.datastore.jsonobjects.JsonTable;
 import org.onap.music.datastore.jsonobjects.JsonUpdate;
@@ -55,8 +49,9 @@ import org.onap.music.lockingservice.MusicLockingService;
 import org.onap.music.main.CachingUtil;
 import org.onap.music.main.MusicCore;
 import org.onap.music.main.MusicUtil;
+import org.onap.music.rest.RestMusicAdminAPI;
 import org.onap.music.rest.RestMusicDataAPI;
-
+import org.onap.music.rest.RestMusicLocksAPI;
 import com.datastax.driver.core.DataType;
 import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.Row;
@@ -66,292 +61,390 @@ import com.sun.jersey.core.util.MultivaluedMapImpl;
 @RunWith(MockitoJUnitRunner.class)
 public class TestRestMusicData {
 
-       RestMusicDataAPI data = new RestMusicDataAPI();
-       static PreparedQueryObject testObject;
-       static TestingServer zkServer;
-
-       @Mock
-       HttpServletResponse http;
-
-       @Mock
-       UriInfo info;
-
-       static String appName = "TestApp";
-       static String userId = "TestUser";
-       static String password = "TestPassword";
-       static boolean isAAF = false;
-       static UUID uuid = UUID.fromString("abc66ccc-d857-4e90-b1e5-df98a3d40ce6");
-       static String keyspaceName = "testCassa";
-       static String tableName = "employees";
-       static String xLatestVersion = "X-latestVersion";
-
-       @BeforeClass
-       public static void init() throws Exception {
-               try {
-                       MusicCore.mDstoreHandle = CassandraCQL.connectToEmbeddedCassandra();
-                       zkServer = new TestingServer(2181, new File("/tmp/zk"));
-                       MusicCore.mLockHandle = new MusicLockingService();
-               } catch (Exception e) {
-                       e.printStackTrace();
-               }
-       }
-
-       @AfterClass
-       public static void tearDownAfterClass() throws Exception {
-               System.out.println("After class");
-               testObject = new PreparedQueryObject();
-               testObject.appendQueryString("DROP KEYSPACE IF EXISTS " + keyspaceName);
-               MusicCore.eventualPut(testObject);
-               testObject = new PreparedQueryObject();
-               testObject.appendQueryString("DROP KEYSPACE IF EXISTS admin");
-               MusicCore.eventualPut(testObject);
-               MusicCore.mDstoreHandle.close();
-               MusicCore.mLockHandle.getzkLockHandle().close();
-               MusicCore.mLockHandle.close();
-               zkServer.stop();
-       }
-
-       @Test
-       public void Test1_createKeyspace() throws Exception {
-               testObject = new PreparedQueryObject();
-               testObject.appendQueryString("CREATE KEYSPACE admin WITH REPLICATION = " + "{'class' : 'SimpleStrategy' , "
-                               + "'replication_factor': 1} AND DURABLE_WRITES = true");
-               MusicCore.eventualPut(testObject);
-               testObject = new PreparedQueryObject();
-               testObject.appendQueryString("CREATE TABLE admin.keyspace_master (" + "  uuid uuid, keyspace_name text,"
-                               + "  application_name text, is_api boolean," + "  password text, username text,"
-                               + "  is_aaf boolean, PRIMARY KEY (uuid)\n" + ");");
-               MusicCore.eventualPut(testObject);
-
-               testObject = new PreparedQueryObject();
-               testObject
-                               .appendQueryString("INSERT INTO admin.keyspace_master (uuid, keyspace_name, application_name, is_api, "
-                                               + "password, username, is_aaf) VALUES (?,?,?,?,?,?,?)");
-               testObject.addValue(MusicUtil.convertToActualDataType(DataType.uuid(), uuid));
-               testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), MusicUtil.DEFAULTKEYSPACENAME));
-               testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
-               testObject.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), "True"));
-               testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), password));
-               testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), userId));
-               testObject.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), isAAF));
-               MusicCore.eventualPut(testObject);
-
-               testObject = new PreparedQueryObject();
-               testObject
-                               .appendQueryString("INSERT INTO admin.keyspace_master (uuid, keyspace_name, application_name, is_api, "
-                                               + "password, username, is_aaf) VALUES (?,?,?,?,?,?,?)");
-               testObject.addValue(MusicUtil.convertToActualDataType(DataType.uuid(),
-                               UUID.fromString("bbc66ccc-d857-4e90-b1e5-df98a3d40de6")));
-               testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), MusicUtil.DEFAULTKEYSPACENAME));
-               testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), "TestApp1"));
-               testObject.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), "True"));
-               testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), password));
-               testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), "TestUser1"));
-               testObject.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), isAAF));
-               MusicCore.eventualPut(testObject);
-
-               testObject = new PreparedQueryObject();
-               testObject
-                               .appendQueryString("select uuid from admin.keyspace_master where application_name = ? allow filtering");
-               testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
-               ResultSet rs = MusicCore.get(testObject);
-               List<Row> rows = rs.all();
-               if (rows.size() > 0) {
-                       System.out.println("#######UUID is:" + rows.get(0).getUUID("uuid"));
-               }
-       }
-
-       @Test
-       public void Test2_createKeyspace() throws Exception {
-               JsonKeySpace jsonKeyspace = new JsonKeySpace();
-               Map<String, String> consistencyInfo = new HashMap<>();
-               Map<String, Object> replicationInfo = new HashMap<>();
-               consistencyInfo.put("type", "eventual");
-               replicationInfo.put("class", "SimpleStrategy");
-               replicationInfo.put("replication_factor", 1);
-               jsonKeyspace.setConsistencyInfo(consistencyInfo);
-               jsonKeyspace.setDurabilityOfWrites("true");
-               jsonKeyspace.setKeyspaceName(keyspaceName);
-               jsonKeyspace.setReplicationInfo(replicationInfo);
-               Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
-               Map<String, Object> resultMap = data.createKeySpace("1", "1", "1", null, appName, userId, password,
-                               jsonKeyspace, keyspaceName, http);
-               assertEquals(uuid.toString(), resultMap.get("aid"));
-       }
-
-       @Test
-       public void Test3_createKeyspace1() throws Exception {
-               JsonKeySpace jsonKeyspace = new JsonKeySpace();
-               Map<String, String> consistencyInfo = new HashMap<>();
-               Map<String, Object> replicationInfo = new HashMap<>();
-               consistencyInfo.put("type", "eventual");
-               replicationInfo.put("class", "SimpleStrategy");
-               replicationInfo.put("replication_factor", 1);
-               jsonKeyspace.setConsistencyInfo(consistencyInfo);
-               jsonKeyspace.setDurabilityOfWrites("true");
-               jsonKeyspace.setKeyspaceName("TestApp1");
-               jsonKeyspace.setReplicationInfo(replicationInfo);
-               Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
-               Map<String, Object> resultMap = data.createKeySpace("1", "1", "1", null, "TestApp1", "TestUser1", password,
-                               jsonKeyspace, keyspaceName, http);
-               System.out.println("#######status is " + resultMap.get("Exception"));
-               assertEquals("Couldn't create keyspace. Please make sure all the information is correct.",
-                               resultMap.get("Exception"));
-       }
-
-       @Test
-       public void Test3_createTable() throws Exception {
-               JsonTable jsonTable = new JsonTable();
-               Map<String, String> consistencyInfo = new HashMap<>();
-               Map<String, String> fields = new HashMap<>();
-               fields.put("uuid", "text");
-               fields.put("emp_name", "text");
-               fields.put("emp_salary", "varint");
-               fields.put("PRIMARY KEY", "(emp_name)");
-               consistencyInfo.put("type", "eventual");
-               jsonTable.setConsistencyInfo(consistencyInfo);
-               jsonTable.setKeyspaceName(keyspaceName);
-               jsonTable.setPrimaryKey("emp_name");
-               jsonTable.setTableName(tableName);
-               jsonTable.setFields(fields);
-               Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
-               Map<String, Object> resultMap = data.createTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
-                               userId, password, jsonTable, keyspaceName, tableName, http);
-               assertEquals("SUCCESS", resultMap.get("status"));
-       }
-
-       @Test
-       public void Test4_insertIntoTable() throws Exception {
-               JsonInsert jsonInsert = new JsonInsert();
-               Map<String, String> consistencyInfo = new HashMap<>();
-               Map<String, Object> values = new HashMap<>();
-               values.put("uuid", "cfd66ccc-d857-4e90-b1e5-df98a3d40cd6");
-               values.put("emp_name", "test");
-               values.put("emp_salary", 500);
-               consistencyInfo.put("type", "eventual");
-               jsonInsert.setConsistencyInfo(consistencyInfo);
-               jsonInsert.setKeyspaceName(keyspaceName);
-               jsonInsert.setTableName(tableName);
-               jsonInsert.setValues(values);
-               Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
-               Map<String, Object> resultMap = data.insertIntoTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6",
-                               appName, userId, password, jsonInsert, keyspaceName, tableName, http);
-               assertEquals("Success", resultMap.get("result"));
-       }
-
-       @Test
-       public void Test4_insertIntoTable2() throws Exception {
-               JsonInsert jsonInsert = new JsonInsert();
-               Map<String, String> consistencyInfo = new HashMap<>();
-               Map<String, Object> values = new HashMap<>();
-               values.put("uuid", "cfd66ccc-d857-4e90-b1e5-df98a3d40cd6");
-               values.put("emp_name", "test1");
-               values.put("emp_salary", 1500);
-               consistencyInfo.put("type", "eventual");
-               jsonInsert.setConsistencyInfo(consistencyInfo);
-               jsonInsert.setKeyspaceName(keyspaceName);
-               jsonInsert.setTableName(tableName);
-               jsonInsert.setValues(values);
-               Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
-               Map<String, Object> resultMap = data.insertIntoTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6",
-                               appName, userId, password, jsonInsert, keyspaceName, tableName, http);
-               assertEquals("Success", resultMap.get("result"));
-       }
-
-       @Test
-       public void Test5_updateTable() throws Exception {
-               JsonUpdate jsonUpdate = new JsonUpdate();
-               Map<String, String> consistencyInfo = new HashMap<>();
-               MultivaluedMap<String, String> row = new MultivaluedMapImpl();
-               Map<String, Object> values = new HashMap<>();
-               row.add("emp_name", "test");
-               values.put("emp_salary", 2500);
-               consistencyInfo.put("type", "atomic");
-               jsonUpdate.setConsistencyInfo(consistencyInfo);
-               jsonUpdate.setKeyspaceName(keyspaceName);
-               jsonUpdate.setTableName(tableName);
-               jsonUpdate.setValues(values);
-               Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
-               Mockito.when(info.getQueryParameters()).thenReturn(row);
-               Map<String, Object> resultMap = data.updateTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
-                               userId, password, jsonUpdate, keyspaceName, tableName, info, http);
-               assertEquals("Success", resultMap.get("result"));
-       }
-
-       @Test
-       public void Test6_select() throws Exception {
-               JsonSelect jsonSelect = new JsonSelect();
-               Map<String, String> consistencyInfo = new HashMap<>();
-               MultivaluedMap<String, String> row = new MultivaluedMapImpl();
-               row.add("emp_name", "test");
-               consistencyInfo.put("type", "atomic");
-               jsonSelect.setConsistencyInfo(consistencyInfo);
-               Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
-               Mockito.when(info.getQueryParameters()).thenReturn(row);
-               Map<String, HashMap<String, Object>> resultMap = data.select("1", "1", "1",
-                               "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName, userId, password, keyspaceName, tableName, info, http);
-               assertEquals("2500", resultMap.get("row 0").get("emp_salary").toString());
-       }
-
-       @Test
-       public void Test6_selectCritical() throws Exception {
-               JsonInsert jsonInsert = new JsonInsert();
-               Map<String, String> consistencyInfo = new HashMap<>();
-               MultivaluedMap<String, String> row = new MultivaluedMapImpl();
-               row.add("emp_name", "test");
-               consistencyInfo.put("type", "atomic");
-               jsonInsert.setConsistencyInfo(consistencyInfo);
-               Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
-               Mockito.when(info.getQueryParameters()).thenReturn(row);
-               Map<String, HashMap<String, Object>> resultMap = data.selectCritical("1", "1", "1",
-                               "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName, userId, password, jsonInsert, keyspaceName, tableName,
-                               info, http);
-               assertEquals("2500", resultMap.get("row 0").get("emp_salary").toString());
-       }
-
-       @Test
-       public void Test6_deleteFromTable() throws Exception {
-               JsonDelete jsonDelete = new JsonDelete();
-               Map<String, String> consistencyInfo = new HashMap<>();
-               MultivaluedMap<String, String> row = new MultivaluedMapImpl();
-               row.add("emp_name", "test1");
-               consistencyInfo.put("type", "atomic");
-               jsonDelete.setConsistencyInfo(consistencyInfo);
-               Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
-               Mockito.when(info.getQueryParameters()).thenReturn(row);
-               Map<String, Object> resultMap = data.deleteFromTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6",
-                               appName, userId, password, jsonDelete, keyspaceName, tableName, info, http);
-               assertEquals("Success", resultMap.get("result"));
-       }
-
-       @Test
-       public void Test7_dropTable() throws Exception {
-               JsonTable jsonTable = new JsonTable();
-               Map<String, String> consistencyInfo = new HashMap<>();
-               consistencyInfo.put("type", "atomic");
-               jsonTable.setConsistencyInfo(consistencyInfo);
-               Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
-               Map<String, Object> resultMap = data.dropTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
-                               userId, password, jsonTable, keyspaceName, tableName, http);
-               assertEquals("SUCCESS", resultMap.get("status"));
-       }
-
-       @Test
-       public void Test8_deleteKeyspace() throws Exception {
-               JsonKeySpace jsonKeyspace = new JsonKeySpace();
-               Map<String, String> consistencyInfo = new HashMap<>();
-               Map<String, Object> replicationInfo = new HashMap<>();
-               consistencyInfo.put("type", "eventual");
-               replicationInfo.put("class", "SimpleStrategy");
-               replicationInfo.put("replication_factor", 1);
-               jsonKeyspace.setConsistencyInfo(consistencyInfo);
-               jsonKeyspace.setDurabilityOfWrites("true");
-               jsonKeyspace.setKeyspaceName("TestApp1");
-               jsonKeyspace.setReplicationInfo(replicationInfo);
-               Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
-               Map<String, Object> resultMap = data.dropKeySpace("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6",
-                               appName, userId, password, jsonKeyspace, keyspaceName, http);
-               assertEquals("SUCCESS", resultMap.get("status"));
-       }
-
-}
+    RestMusicDataAPI data = new RestMusicDataAPI();
+    RestMusicAdminAPI admin = new RestMusicAdminAPI();
+    RestMusicLocksAPI lock = new RestMusicLocksAPI(); 
+    static PreparedQueryObject testObject;
+    static TestingServer zkServer;
+
+    @Mock
+    HttpServletResponse http;
+
+    @Mock
+    UriInfo info;
+
+    static String appName = "TestApp";
+    static String userId = "TestUser";
+    static String password = "TestPassword";
+    static boolean isAAF = false;
+    static UUID uuid = UUID.fromString("abc66ccc-d857-4e90-b1e5-df98a3d40ce6");
+    static String keyspaceName = "testCassa";
+    static String tableName = "employees";
+    static String xLatestVersion = "X-latestVersion";
+    static String onboardUUID = null;
+    static String lockId = null;
+    static String lockName = "testCassa.employees.sample3";
+
+    @BeforeClass
+    public static void init() throws Exception {
+        try {
+            MusicCore.mDstoreHandle = CassandraCQL.connectToEmbeddedCassandra();
+            zkServer = new TestingServer(2181, new File("    mp/zk"));
+            MusicCore.mLockHandle = new MusicLockingService();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @AfterClass
+    public static void tearDownAfterClass() throws Exception {
+        System.out.println("After class");
+        testObject = new PreparedQueryObject();
+        testObject.appendQueryString("DROP KEYSPACE IF EXISTS " + keyspaceName);
+        MusicCore.eventualPut(testObject);
+        testObject = new PreparedQueryObject();
+        testObject.appendQueryString("DROP KEYSPACE IF EXISTS admin");
+        MusicCore.eventualPut(testObject);
+        MusicCore.mDstoreHandle.close();
+        MusicCore.mLockHandle.getzkLockHandle().close();
+        MusicCore.mLockHandle.close();
+        zkServer.stop();
+    }
+
+    @Test
+    public void Test1_createKeyspace() throws Exception {
+        testObject = new PreparedQueryObject();
+        testObject.appendQueryString("CREATE KEYSPACE admin WITH REPLICATION = "
+                        + "{'class' : 'SimpleStrategy' , "
+                        + "'replication_factor': 1} AND DURABLE_WRITES = true");
+        MusicCore.eventualPut(testObject);
+        testObject = new PreparedQueryObject();
+        testObject.appendQueryString(
+                        "CREATE TABLE admin.keyspace_master (" + "  uuid uuid, keyspace_name text,"
+                                        + "  application_name text, is_api boolean,"
+                                        + "  password text, username text,"
+                                        + "  is_aaf boolean, PRIMARY KEY (uuid)\n" + ");");
+        MusicCore.eventualPut(testObject);
+
+        testObject = new PreparedQueryObject();
+        testObject.appendQueryString(
+                        "INSERT INTO admin.keyspace_master (uuid, keyspace_name, application_name, is_api, "
+                                        + "password, username, is_aaf) VALUES (?,?,?,?,?,?,?)");
+        testObject.addValue(MusicUtil.convertToActualDataType(DataType.uuid(), uuid));
+        testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(),
+                        MusicUtil.DEFAULTKEYSPACENAME));
+        testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
+        testObject.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), "True"));
+        testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), password));
+        testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), userId));
+        testObject.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), isAAF));
+        MusicCore.eventualPut(testObject);
+
+        testObject = new PreparedQueryObject();
+        testObject.appendQueryString(
+                        "INSERT INTO admin.keyspace_master (uuid, keyspace_name, application_name, is_api, "
+                                        + "password, username, is_aaf) VALUES (?,?,?,?,?,?,?)");
+        testObject.addValue(MusicUtil.convertToActualDataType(DataType.uuid(),
+                        UUID.fromString("bbc66ccc-d857-4e90-b1e5-df98a3d40de6")));
+        testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(),
+                        MusicUtil.DEFAULTKEYSPACENAME));
+        testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), "TestApp1"));
+        testObject.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), "True"));
+        testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), password));
+        testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), "TestUser1"));
+        testObject.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), isAAF));
+        MusicCore.eventualPut(testObject);
+
+        testObject = new PreparedQueryObject();
+        testObject.appendQueryString(
+                        "select uuid from admin.keyspace_master where application_name = ? allow filtering");
+        testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
+        ResultSet rs = MusicCore.get(testObject);
+        List<Row> rows = rs.all();
+        if (rows.size() > 0) {
+            System.out.println("#######UUID is:" + rows.get(0).getUUID("uuid"));
+        }
+    }
+
+    @Test
+    public void Test2_createKeyspace() throws Exception {
+        JsonKeySpace jsonKeyspace = new JsonKeySpace();
+        Map<String, String> consistencyInfo = new HashMap<>();
+        Map<String, Object> replicationInfo = new HashMap<>();
+        consistencyInfo.put("type", "eventual");
+        replicationInfo.put("class", "SimpleStrategy");
+        replicationInfo.put("replication_factor", 1);
+        jsonKeyspace.setConsistencyInfo(consistencyInfo);
+        jsonKeyspace.setDurabilityOfWrites("true");
+        jsonKeyspace.setKeyspaceName(keyspaceName);
+        jsonKeyspace.setReplicationInfo(replicationInfo);
+        Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+        Map<String, Object> resultMap = data.createKeySpace("1", "1", "1", null, appName, userId,
+                        password, jsonKeyspace, keyspaceName, http);
+        assertEquals(uuid.toString(), resultMap.get("aid"));
+    }
+
+    @Test
+    public void Test3_createKeyspace1() throws Exception {
+        JsonKeySpace jsonKeyspace = new JsonKeySpace();
+        Map<String, String> consistencyInfo = new HashMap<>();
+        Map<String, Object> replicationInfo = new HashMap<>();
+        consistencyInfo.put("type", "eventual");
+        replicationInfo.put("class", "SimpleStrategy");
+        replicationInfo.put("replication_factor", 1);
+        jsonKeyspace.setConsistencyInfo(consistencyInfo);
+        jsonKeyspace.setDurabilityOfWrites("true");
+        jsonKeyspace.setKeyspaceName("TestApp1");
+        jsonKeyspace.setReplicationInfo(replicationInfo);
+        Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+        Map<String, Object> resultMap = data.createKeySpace("1", "1", "1", null, "TestApp1",
+                        "TestUser1", password, jsonKeyspace, keyspaceName, http);
+        System.out.println("#######status is " + resultMap.get("Exception"));
+        assertEquals("Couldn't create keyspace. Please make sure all the information is correct.",
+                        resultMap.get("Exception"));
+    }
+
+    @Test
+    public void Test3_createTable() throws Exception {
+        JsonTable jsonTable = new JsonTable();
+        Map<String, String> consistencyInfo = new HashMap<>();
+        Map<String, String> fields = new HashMap<>();
+        fields.put("uuid", "text");
+        fields.put("emp_name", "text");
+        fields.put("emp_salary", "varint");
+        fields.put("PRIMARY KEY", "(emp_name)");
+        consistencyInfo.put("type", "eventual");
+        jsonTable.setConsistencyInfo(consistencyInfo);
+        jsonTable.setKeyspaceName(keyspaceName);
+        jsonTable.setPrimaryKey("emp_name");
+        jsonTable.setTableName(tableName);
+        jsonTable.setFields(fields);
+        Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+        Map<String, Object> resultMap = data.createTable("1", "1", "1",
+                        "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName, userId, password,
+                        jsonTable, keyspaceName, tableName, http);
+        assertEquals("SUCCESS", resultMap.get("status"));
+    }
+
+    @Test
+    public void Test4_insertIntoTable() throws Exception {
+        JsonInsert jsonInsert = new JsonInsert();
+        Map<String, String> consistencyInfo = new HashMap<>();
+        Map<String, Object> values = new HashMap<>();
+        values.put("uuid", "cfd66ccc-d857-4e90-b1e5-df98a3d40cd6");
+        values.put("emp_name", "testName");
+        values.put("emp_salary", 500);
+        consistencyInfo.put("type", "eventual");
+        jsonInsert.setConsistencyInfo(consistencyInfo);
+        jsonInsert.setKeyspaceName(keyspaceName);
+        jsonInsert.setTableName(tableName);
+        jsonInsert.setValues(values);
+        Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+        Map<String, Object> resultMap = data.insertIntoTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6",
+                appName, userId, password, jsonInsert, keyspaceName, tableName, http);
+        assertEquals("Success", resultMap.get("result"));
+    }
+
+    @Test
+    public void Test4_insertIntoTable2() throws Exception {
+        JsonInsert jsonInsert = new JsonInsert();
+        Map<String, String> consistencyInfo = new HashMap<>();
+        Map<String, Object> values = new HashMap<>();
+        values.put("uuid", "cfd66ccc-d857-4e90-b1e5-df98a3d40cd6");
+        values.put("emp_name", "test1");
+        values.put("emp_salary", 1500);
+        consistencyInfo.put("type", "eventual");
+        jsonInsert.setConsistencyInfo(consistencyInfo);
+        jsonInsert.setKeyspaceName(keyspaceName);
+        jsonInsert.setTableName(tableName);
+        jsonInsert.setValues(values);
+        Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+        Map<String, Object> resultMap = data.insertIntoTable("1", "1", "1",
+                        "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName, userId, password,
+                        jsonInsert, keyspaceName, tableName, http);
+        assertEquals("Success", resultMap.get("result"));
+    }
+
+    @Test
+    public void Test5_updateTable() throws Exception {
+        JsonUpdate jsonUpdate = new JsonUpdate();
+        Map<String, String> consistencyInfo = new HashMap<>();
+        MultivaluedMap<String, String> row = new MultivaluedMapImpl();
+        Map<String, Object> values = new HashMap<>();
+        row.add("emp_name", "testName");
+        values.put("emp_salary", 2500);
+        consistencyInfo.put("type", "atomic");
+        jsonUpdate.setConsistencyInfo(consistencyInfo);
+        jsonUpdate.setKeyspaceName(keyspaceName);
+        jsonUpdate.setTableName(tableName);
+        jsonUpdate.setValues(values);
+        Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+        Mockito.when(info.getQueryParameters()).thenReturn(row);
+        Map<String, Object> resultMap = data.updateTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
+                userId, password, jsonUpdate, keyspaceName, tableName, info, http);
+        assertEquals("Success", resultMap.get("result"));
+    }
+
+    @Test
+    public void Test6_select() throws Exception {
+        JsonSelect jsonSelect = new JsonSelect();
+        Map<String, String> consistencyInfo = new HashMap<>();
+        MultivaluedMap<String, String> row = new MultivaluedMapImpl();
+        row.add("emp_name", "testName");
+        consistencyInfo.put("type", "atomic");
+        jsonSelect.setConsistencyInfo(consistencyInfo);
+        Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+        Mockito.when(info.getQueryParameters()).thenReturn(row);
+        Map<String, HashMap<String, Object>> resultMap = data.select("1", "1", "1",
+                "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName, userId, password, keyspaceName, tableName, info, http);
+        assertEquals("2500", resultMap.get("row 0").get("emp_salary").toString());
+    }
+
+    @Test
+    public void Test6_selectCritical() throws Exception {
+        JsonInsert jsonInsert = new JsonInsert();
+        Map<String, String> consistencyInfo = new HashMap<>();
+        MultivaluedMap<String, String> row = new MultivaluedMapImpl();
+        row.add("emp_name", "testName");
+        consistencyInfo.put("type", "atomic");
+        jsonInsert.setConsistencyInfo(consistencyInfo);
+        Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+        Mockito.when(info.getQueryParameters()).thenReturn(row);
+        Map<String, HashMap<String, Object>> resultMap = data.selectCritical("1", "1", "1",
+                "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName, userId, password, jsonInsert, keyspaceName, tableName,
+                info, http);
+        assertEquals("2500", resultMap.get("row 0").get("emp_salary").toString());
+    }
+
+    @Test
+    public void Test6_deleteFromTable() throws Exception {
+        JsonDelete jsonDelete = new JsonDelete();
+        Map<String, String> consistencyInfo = new HashMap<>();
+        MultivaluedMap<String, String> row = new MultivaluedMapImpl();
+        row.add("emp_name", "test1");
+        consistencyInfo.put("type", "atomic");
+        jsonDelete.setConsistencyInfo(consistencyInfo);
+        Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+        Mockito.when(info.getQueryParameters()).thenReturn(row);
+        Map<String, Object> resultMap = data.deleteFromTable("1", "1", "1",
+                        "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName, userId, password,
+                        jsonDelete, keyspaceName, tableName, info, http);
+        assertEquals("Success", resultMap.get("result"));
+    }
+
+    @Test
+    public void Test7_dropTable() throws Exception {
+        JsonTable jsonTable = new JsonTable();
+        Map<String, String> consistencyInfo = new HashMap<>();
+        consistencyInfo.put("type", "atomic");
+        jsonTable.setConsistencyInfo(consistencyInfo);
+        Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+        Map<String, Object> resultMap = data.dropTable("1", "1", "1",
+                        "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName, userId, password,
+                        jsonTable, keyspaceName, tableName, http);
+        assertEquals("SUCCESS", resultMap.get("status"));
+    }
+
+    @Test
+    public void Test8_deleteKeyspace() throws Exception {
+        JsonKeySpace jsonKeyspace = new JsonKeySpace();
+        Map<String, String> consistencyInfo = new HashMap<>();
+        Map<String, Object> replicationInfo = new HashMap<>();
+        consistencyInfo.put("type", "eventual");
+        replicationInfo.put("class", "SimpleStrategy");
+        replicationInfo.put("replication_factor", 1);
+        jsonKeyspace.setConsistencyInfo(consistencyInfo);
+        jsonKeyspace.setDurabilityOfWrites("true");
+        jsonKeyspace.setKeyspaceName("TestApp1");
+        jsonKeyspace.setReplicationInfo(replicationInfo);
+        Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+        Map<String, Object> resultMap = data.dropKeySpace("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6",
+                appName, userId, password, jsonKeyspace, keyspaceName, http);
+        assertEquals("SUCCESS", resultMap.get("status"));
+    }
+    
+    @Test
+    public void Test6_onboard() throws Exception {
+        JsonOnboard jsonOnboard = new JsonOnboard();
+        jsonOnboard.setAppname("TestApp2");
+        jsonOnboard.setIsAAF("false");
+        jsonOnboard.setUserId("TestUser2");
+        jsonOnboard.setPassword("TestPassword2");
+        Map<String, Object> resultMap = admin.onboardAppWithMusic(jsonOnboard, http);
+        resultMap.containsKey("success");
+        onboardUUID = resultMap.get("Generated AID").toString();
+        assertEquals("Your application TestApp2 has been onboarded with MUSIC.", resultMap.get("Success"));
+    }
+
+    @Test
+    public void Test7_onboardSearch() throws Exception {
+        JsonOnboard jsonOnboard = new JsonOnboard();
+        jsonOnboard.setAppname("TestApp2");
+        jsonOnboard.setIsAAF("false");
+        jsonOnboard.setAid(onboardUUID);
+        Map<String, Object> resultMap = admin.getOnboardedInfoSearch(jsonOnboard, http);
+        resultMap.containsKey("success");
+        assertEquals(MusicUtil.DEFAULTKEYSPACENAME, resultMap.get(onboardUUID));
+
+    }
+
+    @Test
+    public void Test8_onboardUpdate() throws Exception {
+        JsonOnboard jsonOnboard = new JsonOnboard();
+        jsonOnboard.setIsAAF("false");
+        jsonOnboard.setUserId("TestUser3");
+        jsonOnboard.setPassword("TestPassword3");
+        jsonOnboard.setAid(onboardUUID);
+        Map<String, Object> resultMap = admin.updateOnboardApp(jsonOnboard, http);
+        resultMap.containsKey("success");
+        assertEquals("Your application has been updated successfully", resultMap.get("Success"));
+    }
+
+    @Test
+    public void Test9_onboardDelete() throws Exception {
+        JsonOnboard jsonOnboard = new JsonOnboard();
+        jsonOnboard.setAppname("TestApp2");
+        jsonOnboard.setAid(onboardUUID);
+        Map<String, Object> resultMap = admin.deleteOnboardApp(jsonOnboard, http);
+        resultMap.containsKey("success");
+        assertEquals("Your application has been deleted successfully", resultMap.get("Success"));
+    }
+
+    @Test
+    public void Test3_createLockReference() throws Exception {
+        Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+        Map<String, Object> resultMap = lock.createLockReference(lockName, uuid.toString(), appName, null, null, http);
+        @SuppressWarnings("unchecked")
+        Map<String, Object> resultMap1 = (Map<String, Object>) resultMap.get("lock");
+        lockId = (String) resultMap1.get("lock");
+        assertEquals("SUCCESS", resultMap.get("status").toString());
+    }
+
+    @Test
+    public void Test4_accquireLock() throws Exception {
+        Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+        Map<String, Object> resultMap = lock.accquireLock(lockId, uuid.toString(), appName, null, null, http);
+        assertEquals("SUCCESS", resultMap.get("status").toString());
+    }
+
+    @Test
+    public void Test5_currentLockHolder() throws Exception {
+        Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+        Map<String, Object> resultMap = lock.currentLockHolder(lockName, uuid.toString(), appName, null, null, http);
+        assertEquals("SUCCESS", resultMap.get("status").toString());
+    }
+
+    @Test
+    public void Test7_unLock() throws Exception {
+        Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+        Map<String, Object> resultMap = lock.unLock(lockId, uuid.toString(), appName, null, null, http);
+        assertEquals("SUCCESS", resultMap.get("status").toString());
+    }
+
+    @Test
+    public void Test8_delete() throws Exception {
+        Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+        Map<String, Object> resultMap = lock.deleteLock(lockName, uuid.toString(), appName, null, null, http);
+        assertEquals("SUCCESS", resultMap.get("status").toString());
+    }
+}
\ No newline at end of file