You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ak...@apache.org on 2016/09/14 01:37:50 UTC

[04/20] ignite git commit: IGNITE-3172 Refactoring Ignite-Cassandra serializers. - Fixes #956.

http://git-wip-us.apache.org/repos/asf/ignite/blob/231ead01/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-env.sh
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-env.sh b/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-env.sh
new file mode 100644
index 0000000..bfe3371
--- /dev/null
+++ b/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-env.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+#
+
+# -----------------------------------------------------------------------------------------------
+# Environment setup script from Ignite
+# -----------------------------------------------------------------------------------------------
+
+JVM_OPTS="-Xms10g -Xmx10g -server -XX:+AggressiveOpts -XX:MaxMetaspaceSize=256m"
+JVM_OPTS="$JVM_OPTS -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseTLAB -XX:NewSize=128m -XX:MaxNewSize=768m"
+#JVM_OPTS="$JVM_OPTS -XX:MaxTenuringThreshold=0 -XX:SurvivorRatio=1024 -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60"
+JVM_OPTS="$JVM_OPTS -Xss16m"
+
+export JVM_OPTS

http://git-wip-us.apache.org/repos/asf/ignite/blob/231ead01/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-start.sh
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-start.sh b/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-start.sh
new file mode 100644
index 0000000..f2c1557
--- /dev/null
+++ b/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-start.sh
@@ -0,0 +1,266 @@
+#!/bin/sh
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+#
+
+# -----------------------------------------------------------------------------------------------
+# Script to start Ignite daemon (used by ignite-bootstrap.sh)
+# -----------------------------------------------------------------------------------------------
+
+#profile=/home/ignite/.bash_profile
+profile=/root/.bash_profile
+
+. $profile
+. /opt/ignite-cassandra-tests/bootstrap/aws/common.sh "ignite"
+
+# Setups Cassandra seeds for this Ignite node being able to connect to Cassandra.
+# Looks for the information in S3 about already up and running Cassandra cluster nodes.
+setupCassandraSeeds()
+{
+    setupClusterSeeds "cassandra" "true"
+
+    CLUSTER_SEEDS=($CLUSTER_SEEDS)
+	count=${#CLUSTER_SEEDS[@]}
+
+    CASSANDRA_SEEDS=
+
+	for (( i=0; i<=$(( $count -1 )); i++ ))
+	do
+		seed=${CLUSTER_SEEDS[$i]}
+        CASSANDRA_SEEDS="${CASSANDRA_SEEDS}<value>$seed<\/value>"
+	done
+
+    cat /opt/ignite/config/ignite-cassandra-server-template.xml | sed -r "s/\\\$\{CASSANDRA_SEEDS\}/$CASSANDRA_SEEDS/g" > /opt/ignite/config/ignite-cassandra-server.xml
+}
+
+# Setups Ignite nodes which this EC2 Ignite node will use to send its metadata and join Ignite cluster
+setupIgniteSeeds()
+{
+    if [ "$FIRST_NODE_LOCK" == "true" ]; then
+        echo "[INFO] Setting up Ignite seeds"
+
+        CLUSTER_SEEDS="127.0.0.1:47500..47509"
+
+        echo "[INFO] Using localhost address as a seed for the first Ignite node: $CLUSTER_SEEDS"
+
+        aws s3 rm --recursive ${S3_IGNITE_NODES_DISCOVERY::-1}
+        if [ $? -ne 0 ]; then
+            terminate "Failed to clean Ignite node discovery URL: $S3_IGNITE_NODES_DISCOVERY"
+        fi
+    else
+        setupClusterSeeds "ignite" "true"
+    fi
+
+    CLUSTER_SEEDS=($CLUSTER_SEEDS)
+	count=${#CLUSTER_SEEDS[@]}
+
+    IGNITE_SEEDS=
+
+	for (( i=0; i<=$(( $count -1 )); i++ ))
+	do
+		seed=${CLUSTER_SEEDS[$i]}
+        IGNITE_SEEDS="${IGNITE_SEEDS}<value>$seed<\/value>"
+	done
+
+    cat /opt/ignite/config/ignite-cassandra-server.xml | sed -r "s/\\\$\{IGNITE_SEEDS\}/$IGNITE_SEEDS/g" > /opt/ignite/config/ignite-cassandra-server1.xml
+    mv -f /opt/ignite/config/ignite-cassandra-server1.xml /opt/ignite/config/ignite-cassandra-server.xml
+}
+
+# Checks status of Ignite daemon
+checkIgniteStatus()
+{
+    proc=$(ps -ef | grep java | grep "org.apache.ignite.startup.cmdline.CommandLineStartup")
+
+    nodeId=
+    nodeAddrs=
+    nodePorts=
+    topology=
+    metrics=
+
+    logFile=$(ls /opt/ignite/work/log/ | grep "\.log$")
+    if [ -n "$logFile" ]; then
+        logFile=/opt/ignite/work/log/$logFile
+        nodeId=$(cat $logFile | grep "Local node \[ID")
+        nodeAddrs=$(cat $logFile | grep "Local node addresses:")
+        nodePorts=$(cat $logFile | grep "Local ports:")
+        topology=$(cat $logFile | grep "Topology snapshot")
+        metrics=$(cat $logFile | grep "Metrics for local node" | head -n 1)
+    fi
+
+    if [ -n "$nodeId" ] && [ -n "$nodeAddrs" ] && [ -n "$nodePorts" ] && [ -n "$topology" ] && [ -n "$metrics" ] && [ -n "$proc" ]; then
+        sleep 30s
+        return 0
+    fi
+
+    return 1
+}
+
+# Gracefully starts Ignite daemon and waits until it joins Ignite cluster
+startIgnite()
+{
+    echo "[INFO]-------------------------------------------------------------"
+    echo "[INFO] Trying attempt $START_ATTEMPT to start Ignite daemon"
+    echo "[INFO]-------------------------------------------------------------"
+    echo ""
+
+    setupCassandraSeeds
+    setupIgniteSeeds
+
+    waitToJoinCluster
+
+    if [ "$FIRST_NODE_LOCK" == "true" ]; then
+        aws s3 rm --recursive ${S3_IGNITE_NODES_DISCOVERY::-1}
+        if [ $? -ne 0 ]; then
+            terminate "Failed to clean Ignite node discovery URL: $S3_IGNITE_NODES_DISCOVERY"
+        fi
+    fi
+
+    proc=$(ps -ef | grep java | grep "org.apache.ignite.startup.cmdline.CommandLineStartup")
+    proc=($proc)
+
+    if [ -n "${proc[1]}" ]; then
+        echo "[INFO] Terminating existing Ignite process ${proc[1]}"
+        kill -9 ${proc[1]}
+    fi
+
+    echo "[INFO] Starting Ignite"
+    rm -Rf /opt/ignite/work/*
+    /opt/ignite/bin/ignite.sh /opt/ignite/config/ignite-cassandra-server.xml &
+
+    echo "[INFO] Ignite job id: $!"
+
+    sleep 1m
+
+    START_ATTEMPT=$(( $START_ATTEMPT+1 ))
+}
+
+#######################################################################################################
+
+START_ATTEMPT=0
+
+# Cleans all the previous metadata about this EC2 node
+unregisterNode
+
+# Tries to get first-node lock
+tryToGetFirstNodeLock
+
+echo "[INFO]-----------------------------------------------------------------"
+
+if [ "$FIRST_NODE_LOCK" == "true" ]; then
+    echo "[INFO] Starting first Ignite node"
+else
+    echo "[INFO] Starting Ignite node"
+fi
+
+echo "[INFO]-----------------------------------------------------------------"
+printInstanceInfo
+echo "[INFO]-----------------------------------------------------------------"
+
+if [ "$FIRST_NODE_LOCK" != "true" ]; then
+    waitFirstClusterNodeRegistered "true"
+else
+    cleanupMetadata
+fi
+
+# Applies Ignite environment settings from ignite-env.sh
+envScript=$(readlink -m $( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/ignite-env.sh)
+if [ -f "$envScript" ]; then
+    . $envScript
+fi
+
+# Start Ignite daemon
+startIgnite
+
+startTime=$(date +%s)
+
+# Trying multiple attempts to start Ignite daemon
+while true; do
+    proc=$(ps -ef | grep java | grep "org.apache.ignite.startup.cmdline.CommandLineStartup")
+
+    checkIgniteStatus
+
+    if [ $? -eq 0 ]; then
+        sleep 1m
+        echo "[INFO]-----------------------------------------------------"
+        echo "[INFO] Ignite daemon successfully started"
+        echo "[INFO]-----------------------------------------------------"
+        echo $proc
+        echo "[INFO]-----------------------------------------------------"
+
+        # Once node joined the cluster we need to remove cluster-join lock
+        # to allow other EC2 nodes to acquire it and join cluster sequentially
+        removeClusterJoinLock
+
+        break
+    fi
+
+    currentTime=$(date +%s)
+    duration=$(( $currentTime-$startTime ))
+    duration=$(( $duration/60 ))
+
+    if [ $duration -gt $SERVICE_STARTUP_TIME ]; then
+        if [ "$FIRST_NODE_LOCK" == "true" ]; then
+            # If the first node of Ignite cluster failed to start Ignite daemon in SERVICE_STARTUP_TIME min,
+            # we will not try any other attempts and just terminate with error. Terminate function itself, will
+            # take care about removing all the locks holding by this node.
+            terminate "${SERVICE_STARTUP_TIME}min timeout expired, but first Ignite daemon is still not up and running"
+        else
+            # If node isn't the first node of Ignite cluster and it failed to start we need to
+            # remove cluster-join lock to allow other EC2 nodes to acquire it
+            removeClusterJoinLock
+
+            # If node failed all SERVICE_START_ATTEMPTS attempts to start Ignite daemon we will not
+            # try anymore and terminate with error
+            if [ $START_ATTEMPT -gt $SERVICE_START_ATTEMPTS ]; then
+                terminate "${SERVICE_START_ATTEMPTS} attempts exceed, but Ignite daemon is still not up and running"
+            fi
+
+            # New attempt to start Ignite daemon
+            startIgnite
+        fi
+
+        continue
+    fi
+
+    # Handling situation when Ignite daemon process abnormally terminated
+    if [ -z "$proc" ]; then
+        # If this is the first node of Ignite cluster just terminating with error
+        if [ "$FIRST_NODE_LOCK" == "true" ]; then
+            terminate "Failed to start Ignite daemon"
+        fi
+
+        # Remove cluster-join lock to allow other EC2 nodes to acquire it
+        removeClusterJoinLock
+
+        echo "[WARN] Failed to start Ignite daemon. Sleeping for extra 30sec"
+        sleep 30s
+
+        # New attempt to start Ignite daemon
+        startIgnite
+
+        continue
+    fi
+
+    echo "[INFO] Waiting for Ignite daemon to start, time passed ${duration}min"
+    sleep 30s
+done
+
+# Once Ignite daemon successfully started we registering new Ignite node in S3
+registerNode
+
+# Terminating script with zero exit code
+terminate
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/231ead01/modules/cassandra/store/src/test/bootstrap/aws/logs-collector.sh
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/test/bootstrap/aws/logs-collector.sh b/modules/cassandra/store/src/test/bootstrap/aws/logs-collector.sh
new file mode 100644
index 0000000..1634b89
--- /dev/null
+++ b/modules/cassandra/store/src/test/bootstrap/aws/logs-collector.sh
@@ -0,0 +1,173 @@
+#!/bin/sh
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+#
+
+# -----------------------------------------------------------------------------------------------
+# Logs collector daemon
+# -----------------------------------------------------------------------------------------------
+# Script is launched in background by all EC2 nodes of all clusters (Cassandra, Ignite, Tests) and
+# periodically (each 30 seconds) checks if specific S3 trigger file (specified by $S3_LOGS_TRIGGER_URL)
+# was created or its timestamp was changed. Such an event serve as a trigger for the script
+# to collect EC2 instance logs (from folder specified by $1) and upload them into specific
+# S3 folder (specified by $S3_LOGS_FOLDER).
+# -----------------------------------------------------------------------------------------------
+
+uploadLogs()
+{
+    if [ ! -d "$1" ]; then
+        echo "[INFO] Logs directory doesn't exist: $1"
+        return 0
+    fi
+
+    echo "[INFO] Uploading logs from directory: $1"
+
+    dirList=$(ls $1 | head -1)
+
+    if [ -z "$dirList" ]; then
+        echo "[INFO] Directory is empty: $1"
+    fi
+
+    for i in 0 9;
+    do
+        aws s3 sync --sse AES256 --delete "$1" "$S3_LOGS_FOLDER"
+        code=$?
+
+        if [ $code -eq 0 ]; then
+            echo "[INFO] Successfully uploaded logs from directory: $1"
+            return 0
+        fi
+
+        echo "[WARN] Failed to upload logs from $i attempt, sleeping extra 30sec"
+        sleep 30s
+    done
+
+    echo "[ERROR] All 10 attempts to upload logs are failed for the directory: $1"
+}
+
+createNewLogsSnapshot()
+{
+    rm -f ~/logs-collector.snapshot.new
+
+    for log_src in "$@"
+    do
+        if [ -d "$log_src" ] || [ -f "$log_src" ]; then
+            ls -alR $log_src >> ~/logs-collector.snapshot.new
+
+        fi
+    done
+}
+
+checkLogsChanged()
+{
+    createNewLogsSnapshot $@
+
+    if [ ! -f "~/logs-collector.snapshot" ]; then
+        return 1
+    fi
+
+    diff "~/logs-collector.snapshot" "~/logs-collector.snapshot.new" > /dev/null
+
+    return $?
+}
+
+updateLogsSnapshot()
+{
+    if [ ! -f "~/logs-collector.snapshot.new" ]; then
+        return 0
+    fi
+
+    rm -f "~/logs-collector.snapshot"
+    mv "~/logs-collector.snapshot.new" "~/logs-collector.snapshot"
+}
+
+collectLogs()
+{
+    createNewLogsSnapshot
+
+    rm -Rf ~/logs-collector-logs
+    mkdir -p ~/logs-collector-logs
+
+    for log_src in "$@"
+    do
+        if [ -f "$log_src" ]; then
+            echo "[INFO] Collecting log file: $log_src"
+            cp -f $log_src ~/logs-collector-logs
+        elif [ -d "$log_src" ]; then
+            echo "[INFO] Collecting logs from folder: $log_src"
+            cp -Rf $log_src ~/logs-collector-logs
+        fi
+    done
+
+    uploadLogs ~/logs-collector-logs
+
+    rm -Rf ~/logs-collector-logs
+
+    updateLogsSnapshot
+}
+
+echo "[INFO] Running Logs collector service"
+
+if [ -z "$1" ]; then
+    echo "[ERROR] Logs collection S3 trigger URL doesn't specified"
+    exit 1
+fi
+
+S3_LOGS_TRIGGER_URL=$1
+
+echo "[INFO] Logs collection S3 trigger URL: $S3_LOGS_TRIGGER_URL"
+
+if [ -z "$2" ]; then
+    echo "[ERROR] S3 folder where to upload logs doesn't specified"
+    exit 1
+fi
+
+S3_LOGS_FOLDER=$2
+
+echo "[INFO] S3 logs upload folder: $S3_LOGS_FOLDER"
+
+shift 2
+
+if [ -z "$1" ]; then
+    echo "[WARN] Local logs sources don't specified"
+else
+    echo "[INFO] Local logs sources: $@"
+fi
+
+echo "--------------------------------------------------------------------"
+
+TRIGGER_STATE=
+
+while true; do
+    sleep 30s
+
+    STATE=$(aws s3 ls $S3_LOGS_TRIGGER_URL)
+
+    if [ -z "$STATE" ] || [ "$STATE" == "$TRIGGER_STATE" ]; then
+        checkLogsChanged
+
+        if [ $? -eq 0 ]; then
+            continue
+        fi
+    fi
+
+    TRIGGER_STATE=$STATE
+
+    collectLogs $@ /var/log/cloud-init.log /var/log/cloud-init-output.log
+
+    echo "--------------------------------------------------------------------"
+done

http://git-wip-us.apache.org/repos/asf/ignite/blob/231ead01/modules/cassandra/store/src/test/bootstrap/aws/tests/ignite-cassandra-client-template.xml
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/test/bootstrap/aws/tests/ignite-cassandra-client-template.xml b/modules/cassandra/store/src/test/bootstrap/aws/tests/ignite-cassandra-client-template.xml
new file mode 100644
index 0000000..77ffb9e
--- /dev/null
+++ b/modules/cassandra/store/src/test/bootstrap/aws/tests/ignite-cassandra-client-template.xml
@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You 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.
+-->
+
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+        http://www.springframework.org/schema/beans/spring-beans.xsd
+        http://www.springframework.org/schema/util
+        http://www.springframework.org/schema/util/spring-util.xsd">
+
+    <bean id="loadBalancingPolicy" class="com.datastax.driver.core.policies.TokenAwarePolicy">
+        <constructor-arg type="com.datastax.driver.core.policies.LoadBalancingPolicy">
+            <bean class="com.datastax.driver.core.policies.RoundRobinPolicy"/>
+        </constructor-arg>
+    </bean>
+
+    <util:list id="contactPoints" value-type="java.lang.String">
+        ${CASSANDRA_SEEDS}
+    </util:list>
+
+    <bean id="cassandraAdminDataSource" class="org.apache.ignite.cache.store.cassandra.datasource.DataSource">
+        <property name="user" value="cassandra"/>
+        <property name="password" value="cassandra"/>
+        <property name="contactPoints" ref="contactPoints"/>
+        <property name="readConsistency" value="ONE"/>
+        <property name="writeConsistency" value="ONE"/>
+        <property name="loadBalancingPolicy" ref="loadBalancingPolicy"/>
+    </bean>
+
+    <!-- Persistence settings for 'cache1' -->
+    <bean id="cache1_settings" class="org.apache.ignite.cache.store.cassandra.persistence.KeyValuePersistenceSettings">
+        <constructor-arg type="java.lang.String">
+            <value><![CDATA[
+<persistence keyspace="test1" table="primitive_test1">
+    <keyPersistence class="java.lang.Long" strategy="PRIMITIVE" column="key"/>
+    <valuePersistence class="java.lang.Long" strategy="PRIMITIVE" column="value"/>
+</persistence>]]>
+            </value>
+        </constructor-arg>
+    </bean>
+
+    <!-- Persistence settings for 'cache2' -->
+    <bean id="cache2_settings" class="org.apache.ignite.cache.store.cassandra.persistence.KeyValuePersistenceSettings">
+        <constructor-arg type="java.lang.String">
+            <value><![CDATA[
+<persistence keyspace="test1" table="blob_test1">
+    <keyPersistence class="java.lang.Long" strategy="PRIMITIVE" />
+    <valuePersistence strategy="BLOB"/>
+</persistence>]]>
+            </value>
+        </constructor-arg>
+    </bean>
+
+    <!-- Persistence settings for 'cache3' -->
+    <bean id="cache3_settings" class="org.apache.ignite.cache.store.cassandra.persistence.KeyValuePersistenceSettings">
+        <constructor-arg type="java.lang.String">
+            <value><![CDATA[
+<persistence keyspace="test1" table="pojo_test3" ttl="86400">
+    <keyspaceOptions>
+        REPLICATION = {'class' : 'SimpleStrategy', 'replication_factor' : 3}
+        AND DURABLE_WRITES = true
+    </keyspaceOptions>
+    <tableOptions>
+        comment = 'A most excellent and useful table'
+        AND read_repair_chance = 0.2
+    </tableOptions>
+    <keyPersistence class="org.apache.ignite.tests.pojos.PersonId" strategy="POJO">
+        <partitionKey>
+            <field name="companyCode" column="company" />
+            <field name="departmentCode" column="department" />
+        </partitionKey>
+        <clusterKey>
+            <field name="personNumber" column="number" sort="desc"/>
+        </clusterKey>
+    </keyPersistence>
+    <valuePersistence class="org.apache.ignite.tests.pojos.Person"
+                      strategy="POJO"
+                      serializer="org.apache.ignite.cache.store.cassandra.serializer.KryoSerializer">
+        <field name="firstName" column="first_name" />
+        <field name="lastName" column="last_name" />
+        <field name="age" />
+        <field name="married" index="true"/>
+        <field name="height" />
+        <field name="weight" />
+        <field name="birthDate" column="birth_date" />
+        <field name="phones" />
+    </valuePersistence>
+</persistence>]]>
+            </value>
+        </constructor-arg>
+    </bean>
+
+    <!-- Ignite configuration -->
+    <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
+        <!-- Turn on client mode -->
+        <property name="clientMode" value="true"/>
+
+        <property name="metricsLogFrequency" value="0"/>
+
+        <property name="cacheConfiguration">
+            <list>
+                <!-- Configuring persistence for "cache1" cache -->
+                <bean class="org.apache.ignite.configuration.CacheConfiguration">
+                    <property name="name" value="cache1"/>
+                    <property name="startSize" value="1000000"/>
+                    <property name="cacheMode" value="PARTITIONED"/>
+                    <property name="backups" value="0"/>
+                    <property name="offHeapMaxMemory" value="0"/>
+                    <property name="swapEnabled" value="false"/>
+                    <property name="readThrough" value="true"/>
+                    <property name="writeThrough" value="true"/>
+                    <property name="writeBehindEnabled" value="true"/>
+                    <property name="cacheStoreFactory">
+                        <bean class="org.apache.ignite.cache.store.cassandra.CassandraCacheStoreFactory">
+                            <property name="dataSourceBean" value="cassandraAdminDataSource"/>
+                            <property name="persistenceSettingsBean" value="cache1_settings"/>
+                        </bean>
+                    </property>
+                </bean>
+
+                <!-- Configuring persistence for "cache2" cache -->
+                <bean class="org.apache.ignite.configuration.CacheConfiguration">
+                    <property name="name" value="cache2"/>
+                    <property name="startSize" value="1000000"/>
+                    <property name="cacheMode" value="PARTITIONED"/>
+                    <property name="backups" value="0"/>
+                    <property name="offHeapMaxMemory" value="0"/>
+                    <property name="swapEnabled" value="false"/>
+                    <property name="readThrough" value="true"/>
+                    <property name="writeThrough" value="true"/>
+                    <property name="writeBehindEnabled" value="true"/>
+                    <property name="cacheStoreFactory">
+                        <bean class="org.apache.ignite.cache.store.cassandra.CassandraCacheStoreFactory">
+                            <property name="dataSourceBean" value="cassandraAdminDataSource"/>
+                            <property name="persistenceSettingsBean" value="cache2_settings"/>
+                        </bean>
+                    </property>
+                </bean>
+
+                <!-- Configuring persistence for "cache3" cache -->
+                <bean class="org.apache.ignite.configuration.CacheConfiguration">
+                    <property name="name" value="cache3"/>
+                    <property name="startSize" value="1000000"/>
+                    <property name="cacheMode" value="PARTITIONED"/>
+                    <property name="backups" value="0"/>
+                    <property name="offHeapMaxMemory" value="0"/>
+                    <property name="swapEnabled" value="false"/>
+                    <property name="readThrough" value="true"/>
+                    <property name="writeThrough" value="true"/>
+                    <property name="writeBehindEnabled" value="true"/>
+                    <property name="cacheStoreFactory">
+                        <bean class="org.apache.ignite.cache.store.cassandra.CassandraCacheStoreFactory">
+                            <property name="dataSourceBean" value="cassandraAdminDataSource"/>
+                            <property name="persistenceSettingsBean" value="cache3_settings"/>
+                        </bean>
+                    </property>
+                </bean>
+            </list>
+        </property>
+
+        <!-- Configuring remote ignite cluster connections -->
+        <property name="discoverySpi">
+            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
+                <property name="ipFinder">
+                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
+                        <property name="addresses">
+                            <list>
+                                ${IGNITE_SEEDS}
+                            </list>
+                        </property>
+                    </bean>
+                </property>
+            </bean>
+        </property>
+    </bean>
+</beans>

http://git-wip-us.apache.org/repos/asf/ignite/blob/231ead01/modules/cassandra/store/src/test/bootstrap/aws/tests/tests-bootstrap.sh
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/test/bootstrap/aws/tests/tests-bootstrap.sh b/modules/cassandra/store/src/test/bootstrap/aws/tests/tests-bootstrap.sh
new file mode 100644
index 0000000..8e6faff
--- /dev/null
+++ b/modules/cassandra/store/src/test/bootstrap/aws/tests/tests-bootstrap.sh
@@ -0,0 +1,317 @@
+#!/bin/sh
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+#
+
+# -----------------------------------------------------------------------------------------------
+# Bootstrap script to spin up Tests cluster
+# -----------------------------------------------------------------------------------------------
+
+# URL to download AWS CLI tools
+AWS_CLI_DOWNLOAD_URL=https://s3.amazonaws.com/aws-cli/awscli-bundle.zip
+
+# URL to download JDK
+JDK_DOWNLOAD_URL=http://download.oracle.com/otn-pub/java/jdk/8u77-b03/jdk-8u77-linux-x64.tar.gz
+
+# URL to download Ignite-Cassandra tests package - you should previously package and upload it to this place
+TESTS_PACKAGE_DONLOAD_URL=s3://<bucket>/<folder>/ignite-cassandra-tests-<version>.zip
+
+# Terminates script execution and upload logs to S3
+terminate()
+{
+    SUCCESS_URL=$S3_TESTS_SUCCESS
+    FAILURE_URL=$S3_TESTS_FAILURE
+
+    if [ -n "$SUCCESS_URL" ] && [[ "$SUCCESS_URL" != */ ]]; then
+        SUCCESS_URL=${SUCCESS_URL}/
+    fi
+
+    if [ -n "$FAILURE_URL" ] && [[ "$FAILURE_URL" != */ ]]; then
+        FAILURE_URL=${FAILURE_URL}/
+    fi
+
+    host_name=$(hostname -f | tr '[:upper:]' '[:lower:]')
+    msg=$host_name
+
+    if [ -n "$1" ]; then
+        echo "[ERROR] $1"
+        echo "[ERROR]-----------------------------------------------------"
+        echo "[ERROR] Test node bootstrap failed"
+        echo "[ERROR]-----------------------------------------------------"
+        msg=$1
+
+        if [ -z "$FAILURE_URL" ]; then
+            exit 1
+        fi
+
+        reportFolder=${FAILURE_URL}${host_name}
+        reportFile=$reportFolder/__error__
+    else
+        echo "[INFO]-----------------------------------------------------"
+        echo "[INFO] Test node bootstrap successfully completed"
+        echo "[INFO]-----------------------------------------------------"
+
+        if [ -z "$SUCCESS_URL" ]; then
+            exit 0
+        fi
+
+        reportFolder=${SUCCESS_URL}${host_name}
+        reportFile=$reportFolder/__success__
+    fi
+
+    echo $msg > /opt/bootstrap-result
+
+    aws s3 rm --recursive $reportFolder
+    if [ $? -ne 0 ]; then
+        echo "[ERROR] Failed to drop report folder: $reportFolder"
+    fi
+
+    aws s3 cp --sse AES256 /opt/bootstrap-result $reportFile
+    if [ $? -ne 0 ]; then
+        echo "[ERROR] Failed to report bootstrap result to: $reportFile"
+    fi
+
+    rm -f /opt/bootstrap-result
+
+    if [ -n "$1" ]; then
+        exit 1
+    fi
+
+    exit 0
+}
+
+# Downloads specified package
+downloadPackage()
+{
+    echo "[INFO] Downloading $3 package from $1 into $2"
+
+    for i in 0 9;
+    do
+        if [[ "$1" == s3* ]]; then
+            aws s3 cp $1 $2
+            code=$?
+        else
+            curl "$1" -o "$2"
+            code=$?
+        fi
+
+        if [ $code -eq 0 ]; then
+            echo "[INFO] $3 package successfully downloaded from $1 into $2"
+            return 0
+        fi
+
+        echo "[WARN] Failed to download $3 package from $i attempt, sleeping extra 5sec"
+        sleep 5s
+    done
+
+    terminate "All 10 attempts to download $3 package from $1 are failed"
+}
+
+# Downloads and setup JDK
+setupJava()
+{
+    rm -Rf /opt/java /opt/jdk.tar.gz
+
+    echo "[INFO] Downloading 'jdk'"
+    wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "$JDK_DOWNLOAD_URL" -O /opt/jdk.tar.gz
+    if [ $? -ne 0 ]; then
+        terminate "Failed to download 'jdk'"
+    fi
+
+    echo "[INFO] Untaring 'jdk'"
+    tar -xvzf /opt/jdk.tar.gz -C /opt
+    if [ $? -ne 0 ]; then
+        terminate "Failed to untar 'jdk'"
+    fi
+
+    rm -Rf /opt/jdk.tar.gz
+
+    unzipDir=$(ls /opt | grep "jdk")
+    if [ "$unzipDir" != "java" ]; then
+        mv /opt/$unzipDir /opt/java
+    fi
+}
+
+# Downloads and setup AWS CLI
+setupAWSCLI()
+{
+    echo "[INFO] Installing 'awscli'"
+    pip install --upgrade awscli
+    if [ $? -eq 0 ]; then
+        return 0
+    fi
+
+    echo "[ERROR] Failed to install 'awscli' using pip"
+    echo "[INFO] Trying to install awscli using zip archive"
+    echo "[INFO] Downloading awscli zip"
+
+    downloadPackage "$AWS_CLI_DOWNLOAD_URL" "/opt/awscli-bundle.zip" "awscli"
+
+    echo "[INFO] Unzipping awscli zip"
+    unzip /opt/awscli-bundle.zip -d /opt
+    if [ $? -ne 0 ]; then
+        terminate "Failed to unzip awscli zip"
+    fi
+
+    rm -Rf /opt/awscli-bundle.zip
+
+    echo "[INFO] Installing awscli"
+    /opt/awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
+    if [ $? -ne 0 ]; then
+        terminate "Failed to install awscli"
+    fi
+
+    echo "[INFO] Successfully installed awscli from zip archive"
+}
+
+# Setup all the pre-requisites (packages, settings and etc.)
+setupPreRequisites()
+{
+    echo "[INFO] Installing 'wget' package"
+    yum -y install wget
+    if [ $? -ne 0 ]; then
+        terminate "Failed to install 'wget' package"
+    fi
+
+    echo "[INFO] Installing 'net-tools' package"
+    yum -y install net-tools
+    if [ $? -ne 0 ]; then
+        terminate "Failed to install 'net-tools' package"
+    fi
+
+    echo "[INFO] Installing 'python' package"
+    yum -y install python
+    if [ $? -ne 0 ]; then
+        terminate "Failed to install 'python' package"
+    fi
+
+    echo "[INFO] Installing 'unzip' package"
+    yum -y install unzip
+    if [ $? -ne 0 ]; then
+        terminate "Failed to install 'unzip' package"
+    fi
+
+    downloadPackage "https://bootstrap.pypa.io/get-pip.py" "/opt/get-pip.py" "get-pip.py"
+
+    echo "[INFO] Installing 'pip'"
+    python /opt/get-pip.py
+    if [ $? -ne 0 ]; then
+        terminate "Failed to install 'pip'"
+    fi
+}
+
+# Downloads and setup tests package
+setupTestsPackage()
+{
+    downloadPackage "$TESTS_PACKAGE_DONLOAD_URL" "/opt/ignite-cassandra-tests.zip" "Tests"
+
+    rm -Rf /opt/ignite-cassandra-tests
+
+    unzip /opt/ignite-cassandra-tests.zip -d /opt
+    if [ $? -ne 0 ]; then
+        terminate "Failed to unzip tests package"
+    fi
+
+    rm -f /opt/ignite-cassandra-tests.zip
+
+    unzipDir=$(ls /opt | grep "ignite-cassandra")
+    if [ "$unzipDir" != "ignite-cassandra-tests" ]; then
+        mv /opt/$unzipDir /opt/ignite-cassandra-tests
+    fi
+
+    find /opt/ignite-cassandra-tests -type f -name "*.sh" -exec chmod ug+x {} \;
+
+    . /opt/ignite-cassandra-tests/bootstrap/aws/common.sh "test"
+
+    setupNTP
+
+    echo "[INFO] Starting logs collector daemon"
+
+    HOST_NAME=$(hostname -f | tr '[:upper:]' '[:lower:]')
+    /opt/ignite-cassandra-tests/bootstrap/aws/logs-collector.sh "$S3_LOGS_TRIGGER" "$S3_TESTS_LOGS/$HOST_NAME" "/opt/ignite-cassandra-tests/logs" > /opt/logs-collector.log &
+
+    echo "[INFO] Logs collector daemon started: $!"
+
+    echo "----------------------------------------------------------------------------------------"
+    printInstanceInfo
+    echo "----------------------------------------------------------------------------------------"
+    tagInstance
+    bootstrapGangliaAgent "test" 8643
+
+    ###################################################
+    # Extra configuration specific only for test node #
+    ###################################################
+
+    echo "[INFO] Installing bc package"
+
+    yum -y install bc
+
+    if [ $? -ne 0 ]; then
+        terminate "Failed to install bc package"
+    fi
+
+    echo "[INFO] Installing zip package"
+
+    yum -y install zip
+
+    if [ $? -ne 0 ]; then
+        terminate "Failed to install zip package"
+    fi
+
+    echo "[INFO] Creating 'ignite' group"
+    exists=$(cat /etc/group | grep ignite)
+    if [ -z "$exists" ]; then
+        groupadd ignite
+        if [ $? -ne 0 ]; then
+            terminate "Failed to create 'ignite' group"
+        fi
+    fi
+
+    echo "[INFO] Creating 'ignite' user"
+    exists=$(cat /etc/passwd | grep ignite)
+    if [ -z "$exists" ]; then
+        useradd -g ignite ignite
+        if [ $? -ne 0 ]; then
+            terminate "Failed to create 'ignite' user"
+        fi
+    fi
+
+    mkdir -p /opt/ignite-cassandra-tests/logs
+    chown -R ignite:ignite /opt/ignite-cassandra-tests
+
+    echo "export JAVA_HOME=/opt/java" >> $1
+    echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> $1
+}
+
+###################################################################################################################
+
+echo "[INFO]-----------------------------------------------------------------"
+echo "[INFO] Bootstrapping Tests node"
+echo "[INFO]-----------------------------------------------------------------"
+
+setupPreRequisites
+setupJava
+setupAWSCLI
+setupTestsPackage "/root/.bash_profile"
+
+cmd="/opt/ignite-cassandra-tests/bootstrap/aws/tests/tests-manager.sh"
+
+#sudo -u ignite -g ignite sh -c "$cmd > /opt/ignite-cassandra-tests/tests-manager" &
+
+$cmd > /opt/ignite-cassandra-tests/logs/tests-manager.log &
+
+terminate
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/231ead01/modules/cassandra/store/src/test/bootstrap/aws/tests/tests-manager.sh
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/test/bootstrap/aws/tests/tests-manager.sh b/modules/cassandra/store/src/test/bootstrap/aws/tests/tests-manager.sh
new file mode 100644
index 0000000..c0f5d6b
--- /dev/null
+++ b/modules/cassandra/store/src/test/bootstrap/aws/tests/tests-manager.sh
@@ -0,0 +1,458 @@
+#!/bin/sh
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+#
+
+# -----------------------------------------------------------------------------------------------
+# Tests manager daemon
+# -----------------------------------------------------------------------------------------------
+# Script is launched in background by all nodes of Tests cluster and
+# periodically (each 30 seconds) checks if specific S3 trigger file was created or
+# its timestamp was changed. Such an event serve as a trigger for the script to start
+# preparing to run load tests.
+# -----------------------------------------------------------------------------------------------
+
+#profile=/home/ignite/.bash_profile
+profile=/root/.bash_profile
+
+. $profile
+. /opt/ignite-cassandra-tests/bootstrap/aws/common.sh "test"
+
+# Switch test node to IDLE state
+switchToIdleState()
+{
+    if [ "$NODE_STATE" != "IDLE" ]; then
+        echo "[INFO] Switching node to IDLE state"
+        dropStateFlag "$S3_TESTS_WAITING" "$S3_TESTS_PREPARING" "$S3_TESTS_RUNNING"
+        createStateFlag "$S3_TESTS_IDLE"
+        NODE_STATE="IDLE"
+        echo "[INFO] Node was switched to IDLE state"
+    fi
+}
+
+# Switch test node to PREPARING state
+switchToPreparingState()
+{
+    if [ "$NODE_STATE" != "PREPARING" ]; then
+        echo "[INFO] Switching node to PREPARING state"
+        dropStateFlag "$S3_TESTS_WAITING" "$S3_TESTS_IDLE" "$S3_TESTS_RUNNING"
+        createStateFlag "$S3_TESTS_PREPARING"
+        NODE_STATE="PREPARING"
+        echo "[INFO] Node was switched to PREPARING state"
+    fi
+}
+
+# Switch test node to WAITING state
+switchToWaitingState()
+{
+    if [ "$NODE_STATE" != "WAITING" ]; then
+        echo "[INFO] Switching node to WAITING state"
+        dropStateFlag "$S3_TESTS_IDLE" "$S3_TESTS_PREPARING" "$S3_TESTS_RUNNING"
+        createStateFlag "$S3_TESTS_WAITING"
+        NODE_STATE="WAITING"
+        echo "[INFO] Node was switched to WAITING state"
+    fi
+}
+
+# Switch test node to RUNNING state
+switchToRunningState()
+{
+    if [ "$NODE_STATE" != "RUNNING" ]; then
+        echo "[INFO] Switching node to RUNNING state"
+        dropStateFlag "$S3_TESTS_IDLE" "$S3_TESTS_PREPARING" "$S3_TESTS_WAITING"
+        createStateFlag "$S3_TESTS_RUNNING"
+        NODE_STATE="RUNNING"
+        echo "[INFO] Node was switched to RUNNING state"
+    fi
+}
+
+# Creates appropriate state flag for the node in S3
+createStateFlag()
+{
+    HOST_NAME=$(hostname -f | tr '[:upper:]' '[:lower:]')
+
+    aws s3 cp --sse AES256 /etc/hosts ${1}${HOST_NAME}
+    if [ $? -ne 0 ]; then
+        terminate "Failed to create state flag: ${1}${HOST_NAME}"
+    fi
+}
+
+# Drops appropriate state flag for the node in S3
+dropStateFlag()
+{
+    HOST_NAME=$(hostname -f | tr '[:upper:]' '[:lower:]')
+
+    for flagUrl in "$@"
+    do
+        exists=$(aws s3 ls ${flagUrl}${HOST_NAME})
+        if [ -n "$exists" ]; then
+            aws s3 rm ${flagUrl}${HOST_NAME}
+            if [ $? -ne 0 ]; then
+                terminate "Failed to drop state flag: ${flagUrl}${HOST_NAME}"
+            fi
+        fi
+    done
+}
+
+# Removes tests summary report from S3
+dropTestsSummary()
+{
+    exists=$(aws s3 ls $S3_TESTS_SUMMARY)
+    if [ -z "$exists" ]; then
+        return 0
+    fi
+
+    aws s3 rm $S3_TESTS_SUMMARY
+    if [ $? -ne 0 ]; then
+        terminate "Failed to drop tests summary info: $S3_TESTS_SUMMARY"
+    fi
+}
+
+# Recreate all the necessary Cassandra artifacts before running Load tests
+recreateCassandraArtifacts()
+{
+    /opt/ignite-cassandra-tests/recreate-cassandra-artifacts.sh
+    if [ $? -ne 0 ]; then
+        terminate "Failed to recreate Cassandra artifacts"
+    fi
+}
+
+# Setups Cassandra seeds for this Tests node being able to connect to Cassandra.
+# Looks for the information in S3 about already up and running Cassandra cluster nodes.
+setupCassandraSeeds()
+{
+    if [ $CASSANDRA_NODES_COUNT -eq 0 ]; then
+        return 0
+    fi
+
+    setupClusterSeeds "cassandra"
+
+    CASSANDRA_SEEDS1=$(echo $CLUSTER_SEEDS | sed -r "s/ /,/g")
+    CASSANDRA_SEEDS2=
+
+    CLUSTER_SEEDS=($CLUSTER_SEEDS)
+	count=${#CLUSTER_SEEDS[@]}
+
+	for (( i=0; i<=$(( $count -1 )); i++ ))
+	do
+		seed=${CLUSTER_SEEDS[$i]}
+        CASSANDRA_SEEDS2="${CASSANDRA_SEEDS2}<value>$seed<\/value>"
+	done
+
+    echo "[INFO] Using Cassandra seeds: $CASSANDRA_SEEDS1"
+
+    echo "contact.points=$CASSANDRA_SEEDS1" > /opt/ignite-cassandra-tests/settings/org/apache/ignite/tests/cassandra/connection.properties
+
+    cat /opt/ignite-cassandra-tests/bootstrap/aws/tests/ignite-cassandra-client-template.xml | sed -r "s/\\\$\{CASSANDRA_SEEDS\}/$CASSANDRA_SEEDS2/g" > /opt/ignite-cassandra-tests/bootstrap/aws/tests/ignite-cassandra-client-template1.xml
+}
+
+# Setups Ignite nodes for this Tests node being able to connect to Ignite.
+# Looks for the information in S3 about already up and running Cassandra cluster nodes.
+setupIgniteSeeds()
+{
+    if [ $IGNITE_NODES_COUNT -eq 0 ]; then
+        return 0
+    fi
+
+    setupClusterSeeds "ignite"
+
+    CLUSTER_SEEDS=($CLUSTER_SEEDS)
+	count=${#CLUSTER_SEEDS[@]}
+
+    IGNITE_SEEDS=
+
+	for (( i=0; i<=$(( $count -1 )); i++ ))
+	do
+		seed=${CLUSTER_SEEDS[$i]}
+        IGNITE_SEEDS="${IGNITE_SEEDS}<value>$seed<\/value>"
+	done
+
+    echo "[INFO] Using Ignite seeds: $IGNITE_SEEDS"
+
+    cat /opt/ignite-cassandra-tests/bootstrap/aws/tests/ignite-cassandra-client-template1.xml | sed -r "s/\\\$\{IGNITE_SEEDS\}/$IGNITE_SEEDS/g" > /opt/ignite-cassandra-tests/settings/org/apache/ignite/tests/persistence/primitive/ignite-remote-client-config.xml
+    rm -f /opt/ignite-cassandra-tests/bootstrap/aws/tests/ignite-cassandra-client-template1.xml
+}
+
+# Setups Cassandra credentials to connect to Cassandra cluster
+setupCassandraCredentials()
+{
+    echo "admin.user=cassandra" > /opt/ignite-cassandra-tests/settings/org/apache/ignite/tests/cassandra/credentials.properties
+    echo "admin.password=cassandra" >> /opt/ignite-cassandra-tests/settings/org/apache/ignite/tests/cassandra/credentials.properties
+    echo "regular.user=cassandra" >> /opt/ignite-cassandra-tests/settings/org/apache/ignite/tests/cassandra/credentials.properties
+    echo "regular.password=cassandra" >> /opt/ignite-cassandra-tests/settings/org/apache/ignite/tests/cassandra/credentials.properties
+}
+
+# Triggering first time tests execution for all nodes in the Tests cluster
+triggerFirstTimeTestsExecution()
+{
+    if [ -z "$TESTS_TYPE" ]; then
+        return 0
+    fi
+
+    tryToGetFirstNodeLock
+    if [ $? -ne 0 ]; then
+        return 0
+    fi
+
+    sleep 30s
+
+    echo "[INFO] Triggering first time tests execution"
+
+    echo "TESTS_TYPE=$TESTS_TYPE" > /opt/ignite-cassandra-tests/tests-trigger
+    echo "#--------------------------------------------------" >> /opt/ignite-cassandra-tests/tests-trigger
+    echo "" >> /opt/ignite-cassandra-tests/tests-trigger
+    cat /opt/ignite-cassandra-tests/settings/tests.properties >> /opt/ignite-cassandra-tests/tests-trigger
+
+    aws s3 cp --sse AES256 /opt/ignite-cassandra-tests/tests-trigger $S3_TESTS_TRIGGER
+    code=$?
+
+    rm -f /opt/ignite-cassandra-tests/tests-trigger
+
+    if [ $code -ne 0 ]; then
+        terminate "Failed to create tests trigger: $S3_TESTS_TRIGGER"
+    fi
+}
+
+# Cleans previously created logs from S3
+cleanPreviousLogs()
+{
+	for logFile in /opt/ignite-cassandra-tests/logs/*
+	do
+	    managerLog=$(echo $logFile | grep "tests-manager")
+	    if [ -z "$managerLog" ]; then
+	        rm -Rf $logFile
+	    fi
+	done
+
+    HOST_NAME=$(hostname -f | tr '[:upper:]' '[:lower:]')
+
+	aws s3 rm --recursive ${S3_TESTS_FAILURE}${HOST_NAME}
+	aws s3 rm --recursive ${S3_TESTS_SUCCESS}${HOST_NAME}
+}
+
+# Uploads tests logs to S3
+uploadTestsLogs()
+{
+    HOST_NAME=$(hostname -f | tr '[:upper:]' '[:lower:]')
+
+    if [ -f "/opt/ignite-cassandra-tests/logs/__success__" ]; then
+        logsFolder=${S3_TESTS_SUCCESS}${HOST_NAME}
+    else
+        logsFolder=${S3_TESTS_FAILURE}${HOST_NAME}
+    fi
+
+    aws s3 rm --recursive $logsFolder
+    if [ $? -ne 0 ]; then
+        echo "[ERROR] Failed to drop logs folder: $logsFolder"
+    fi
+
+    if [ -d "/opt/ignite-cassandra-tests/logs" ]; then
+        aws s3 sync --sse AES256 /opt/ignite-cassandra-tests/logs $logsFolder
+        if [ $? -ne 0 ]; then
+            echo "[ERROR] Failed to export tests logs to: $logsFolder"
+        fi
+    fi
+}
+
+# Runs tests-report.sh to prepare tests summary report
+buildTestsSummaryReport()
+{
+    reportScript=$(readlink -m $( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/tests-report.sh)
+    $reportScript
+
+    if [ -n "$S3_LOGS_TRIGGER" ]; then
+        aws s3 cp --sse AES256 /etc/hosts $S3_LOGS_TRIGGER
+        if [ $? -ne 0 ]; then
+            echo "[ERROR] Failed to trigger logs collection"
+        fi
+    fi
+}
+
+# Running load tests
+runLoadTests()
+{
+    cd /opt/ignite-cassandra-tests
+
+    if [ "$TESTS_TYPE" == "ignite" ]; then
+        echo "[INFO] Running Ignite load tests"
+        ./ignite-load-tests.sh &
+    else
+        echo "[INFO] Running Cassandra load tests"
+        ./cassandra-load-tests.sh &
+    fi
+
+    testsJobId=$!
+
+    echo "[INFO] Tests job id: $testsJobId"
+
+    sleep 1m
+
+    LOGS_SNAPSHOT=$(ls -al /opt/ignite-cassandra-tests/logs)
+    LOGS_SNAPSHOT_TIME=$(date +%s)
+
+    TERMINATED=
+
+    # tests monitoring
+    while true; do
+        proc=$(ps -ef | grep java | grep "org.apache.ignite.tests")
+        if [ -z "$proc" ]; then
+            break
+        fi
+
+        NEW_LOGS_SNAPSHOT=$(ls -al /opt/ignite-cassandra-tests/logs)
+        NEW_LOGS_SNAPSHOT_TIME=$(date +%s)
+
+        # if logs state updated it means that tests are running and not stuck
+        if [ "$LOGS_SNAPSHOT" != "$NEW_LOGS_SNAPSHOT" ]; then
+            LOGS_SNAPSHOT=$NEW_LOGS_SNAPSHOT
+            LOGS_SNAPSHOT_TIME=$NEW_LOGS_SNAPSHOT_TIME
+            continue
+        fi
+
+        duration=$(( $NEW_LOGS_SNAPSHOT_TIME-$LOGS_SNAPSHOT_TIME ))
+        duration=$(( $duration/60 ))
+
+        # if logs wasn't updated during 5min it means that load tests stuck
+        if [ $duration -gt 5 ]; then
+            proc=($proc)
+            kill -9 ${proc[1]}
+            TERMINATED="true"
+            break
+        fi
+
+        echo "[INFO] Waiting extra 30sec for load tests to complete"
+
+        sleep 30s
+    done
+
+    rm -f /opt/ignite-cassandra-tests/logs/tests.properties
+    cp /opt/ignite-cassandra-tests/settings/tests.properties /opt/ignite-cassandra-tests/logs
+
+    if [ "$TERMINATED" == "true" ]; then
+        echo "[ERROR] Load tests stuck, tests process terminated"
+        echo "Load tests stuck, tests process terminated" > /opt/ignite-cassandra-tests/logs/__error__
+        return 0
+    fi
+
+    failed=
+    if [ "$TESTS_TYPE" == "cassandra" ]; then
+        failed=$(cat /opt/ignite-cassandra-tests/cassandra-load-tests.log | grep "load tests execution failed")
+    else
+        failed=$(cat /opt/ignite-cassandra-tests/ignite-load-tests.log | grep "load tests execution failed")
+    fi
+
+    if [ -n "$failed" ]; then
+        echo "[ERROR] Load tests execution failed"
+        echo "Load tests execution failed" > /opt/ignite-cassandra-tests/logs/__error__
+    else
+        echo "[INFO] Load tests execution successfully completed"
+        echo "Load tests execution successfully completed" > /opt/ignite-cassandra-tests/logs/__success__
+    fi
+}
+
+#######################################################################################################
+
+sleep 1m
+
+NODE_STATE=
+TRIGGER_STATE=
+
+printInstanceInfo
+setupCassandraCredentials
+switchToIdleState
+
+triggerFirstTimeTestsExecution
+
+registerNode
+
+while true; do
+    # switching state to IDLE
+    switchToIdleState
+
+    sleep 30s
+
+    NEW_TRIGGER_STATE=$(aws s3 ls $S3_TESTS_TRIGGER | xargs)
+    if [ -z "$NEW_TRIGGER_STATE" ] || [ "$NEW_TRIGGER_STATE" == "$TRIGGER_STATE" ]; then
+        continue
+    fi
+
+    echo "----------------------------------------------------------------------"
+    echo "[INFO] Tests trigger changed"
+    echo "----------------------------------------------------------------------"
+    echo "[INFO] Old trigger: $TRIGGER_STATE"
+    echo "----------------------------------------------------------------------"
+    echo "[INFO] New trigger: $NEW_TRIGGER_STATE"
+    echo "----------------------------------------------------------------------"
+
+    TRIGGER_STATE=$NEW_TRIGGER_STATE
+
+    aws s3 cp $S3_TESTS_TRIGGER /opt/ignite-cassandra-tests/tests-trigger
+    if [ $? -ne 0 ]; then
+        echo "[ERROR] Failed to download tests trigger info from: $S3_TESTS_TRIGGER"
+        continue
+    fi
+
+    TESTS_TYPE=$(cat /opt/ignite-cassandra-tests/tests-trigger | grep TESTS_TYPE | xargs | sed -r "s/TESTS_TYPE=//g")
+    if [ "$TESTS_TYPE" != "ignite" ] && [ "$TESTS_TYPE" != "cassandra" ]; then
+        rm -f /opt/ignite-cassandra-tests/tests-trigger
+        echo "[ERROR] Incorrect tests type specified in the trigger info: $S3_TESTS_TRIGGER"
+        continue
+    fi
+
+    rm -f /opt/ignite-cassandra-tests/settings/tests.properties
+    mv -f /opt/ignite-cassandra-tests/tests-trigger /opt/ignite-cassandra-tests/settings/tests.properties
+	
+	waitAllTestNodesCompletedTests
+	
+    # switching state to PREPARING
+    switchToPreparingState
+
+    waitAllClusterNodesReady "cassandra"
+    waitAllClusterNodesReady "ignite"
+    setupCassandraSeeds
+    setupIgniteSeeds
+	
+	cleanPreviousLogs
+
+    tryToGetFirstNodeLock
+    if [ $? -eq 0 ]; then
+        dropTestsSummary
+        recreateCassandraArtifacts
+    fi
+
+    # switching state to WAITING
+    switchToWaitingState
+
+    waitAllClusterNodesReady "test"
+
+    if [ "$FIRST_NODE_LOCK" == "true" ]; then
+        aws s3 rm $S3_TESTS_TRIGGER
+    fi
+
+    # switching state to RUNNING
+    switchToRunningState
+
+    runLoadTests
+    uploadTestsLogs
+
+    tryToGetFirstNodeLock
+    if [ $? -eq 0 ]; then
+        waitAllTestNodesCompletedTests
+        buildTestsSummaryReport
+        removeFirstNodeLock
+    fi
+done
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/231ead01/modules/cassandra/store/src/test/bootstrap/aws/tests/tests-report.sh
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/test/bootstrap/aws/tests/tests-report.sh b/modules/cassandra/store/src/test/bootstrap/aws/tests/tests-report.sh
new file mode 100644
index 0000000..1576d57
--- /dev/null
+++ b/modules/cassandra/store/src/test/bootstrap/aws/tests/tests-report.sh
@@ -0,0 +1,499 @@
+#!/bin/sh
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+#
+
+# -----------------------------------------------------------------------------------------------
+# Tests report builder
+# -----------------------------------------------------------------------------------------------
+# Script is used to analyze load tests logs collected from all 'Tests' cluster nodes and build
+# summary report
+# -----------------------------------------------------------------------------------------------
+
+#profile=/home/ignite/.bash_profile
+profile=/root/.bash_profile
+
+. $profile
+. /opt/ignite-cassandra-tests/bootstrap/aws/common.sh "test"
+
+# Building tests summary report
+reportTestsSummary()
+{
+    echo "[INFO] Preparing tests results summary"
+
+    TESTS_SUMMARY_DIR=/opt/ignite-cassandra-tests/tests-summary
+    SUCCEED_NODES_FILE=$TESTS_SUMMARY_DIR/succeed-nodes
+    SUCCEED_NODES_DIR=$TESTS_SUMMARY_DIR/succeed
+    FAILED_NODES_FILE=$TESTS_SUMMARY_DIR/failed-nodes
+    FAILED_NODES_DIR=$TESTS_SUMMARY_DIR/failed
+    REPORT_FILE=$TESTS_SUMMARY_DIR/report.txt
+
+    rm -Rf $TESTS_SUMMARY_DIR
+    mkdir -p $TESTS_SUMMARY_DIR
+    mkdir -p $SUCCEED_NODES_DIR
+    mkdir -p $FAILED_NODES_DIR
+
+    aws s3 ls $S3_TESTS_SUCCESS | sed -r "s/PRE //g" | sed -r "s/ //g" | sed -r "s/\///g" > $SUCCEED_NODES_FILE
+    aws s3 ls $S3_TESTS_FAILURE | sed -r "s/PRE //g" | sed -r "s/ //g" | sed -r "s/\///g" > $FAILED_NODES_FILE
+
+    succeedCount=$(cat $SUCCEED_NODES_FILE | wc -l)
+    failedCount=$(cat $FAILED_NODES_FILE | wc -l)
+    count=$(( $succeedCount+$failedCount ))
+
+    echo "Test type         : $TESTS_TYPE" > $REPORT_FILE
+    echo "Test nodes count  : $count" >> $REPORT_FILE
+    echo "Test nodes succeed: $succeedCount" >> $REPORT_FILE
+    echo "Test nodes failed : $failedCount" >> $REPORT_FILE
+    echo "----------------------------------------------------------------------------------------------" >> $REPORT_FILE
+
+    if [ $succeedCount -gt 0 ]; then
+        echo "Succeed test nodes |" >> $REPORT_FILE
+        echo "-------------------" >> $REPORT_FILE
+        cat $SUCCEED_NODES_FILE >> $REPORT_FILE
+        echo "----------------------------------------------------------------------------------------------" >> $REPORT_FILE
+
+        aws s3 sync --delete $S3_TESTS_SUCCESS $SUCCEED_NODES_DIR
+        if [ $? -ne 0 ]; then
+            echo "[ERROR] Failed to get succeed tests details"
+        else
+            reportSucceedTestsStatistics "$REPORT_FILE" "$SUCCEED_NODES_DIR"
+        fi
+    fi
+
+    if [ $failedCount -gt 0 ]; then
+        echo "Failed test nodes |" >> $REPORT_FILE
+        echo "------------------" >> $REPORT_FILE
+        cat $FAILED_NODES_FILE >> $REPORT_FILE
+        echo "----------------------------------------------------------------------------------------------" >> $REPORT_FILE
+
+        aws sync --delete $S3_TESTS_FAILURE $FAILED_NODES_DIR
+        if [ $? -ne 0 ]; then
+            echo "[ERROR] Failed to get failed tests details"
+        else
+            reportFailedTestsDetailes "$REPORT_FILE" "$FAILED_NODES_DIR"
+        fi
+    fi
+
+    rm -f $HOME/tests-summary.zip
+
+    pushd $TESTS_SUMMARY_DIR
+
+    zip -r -9 $HOME/tests-summary.zip .
+    code=$?
+
+    rm -Rf $TESTS_SUMMARY_DIR
+
+    popd
+
+    if [ $code -ne 0 ]; then
+        echo "-------------------------------------------------------------------------------------"
+        echo "[ERROR] Failed to create tests summary zip archive $HOME/tests-summary.zip for $TESTS_SUMMARY_DIR"
+        echo "-------------------------------------------------------------------------------------"
+        return 1
+    fi
+
+    aws s3 cp --sse AES256 $HOME/tests-summary.zip $S3_TESTS_SUMMARY
+    if [ $? -ne 0 ]; then
+        echo "-------------------------------------------------------------------------------------"
+        echo "[ERROR] Failed to uploat tests summary archive to: $S3_TESTS_SUMMARY"
+        echo "-------------------------------------------------------------------------------------"
+    else
+        echo "-------------------------------------------------------------------------------------"
+        echo "[INFO] Tests results summary uploaded to: $S3_TESTS_SUMMARY"
+        echo "-------------------------------------------------------------------------------------"
+    fi
+
+    rm -f $HOME/tests-summary.zip
+}
+
+# Creates report for succeed tests
+reportSucceedTestsStatistics()
+{
+    writeMsg="0"
+    writeErrors="0"
+    writeSpeed="0"
+    blkWriteMsg="0"
+    blkWriteErrors="0"
+    blkWriteSpeed="0"
+    readMsg="0"
+    readErrors="0"
+    readSpeed="0"
+    blkReadMsg="0"
+    blkReadErrors="0"
+    blkReadSpeed="0"
+
+    writeErrNodes=
+    blkWriteErrNodes=
+    readErrNodes=
+    blkReadErrNodes=
+
+	tmpFile=`mktemp`
+
+    for dir in $2/*
+    do
+        node=$(echo $dir | sed -r "s/^.*\///g")
+        echo "-------------------------------------------------------------------------------------"
+        echo "[INFO] Gathering statistics from $node test node"
+        echo "-------------------------------------------------------------------------------------"
+
+        logFile=$(ls $dir | grep "${TESTS_TYPE}-load-tests.log" | head -1)
+        if [ -z "$logFile" ]; then
+            echo "[WARN] Node $node marked as succeeded, but it doesn't have \"${TESTS_TYPE}-load-tests.log\" tests results summary file"
+            echo "WARNING |" >> $tmpFile
+            echo "--------" >> $tmpFile
+            echo "Node $node marked as succeeded," >> $tmpFile
+            echo "but it doesn't have \"${TESTS_TYPE}-load-tests.log\" tests results summary file" >> $tmpFile
+            echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+            continue
+        fi
+
+        logFile=$dir/$logFile
+        if [ ! -f "$logFile" ]; then
+            echo "[WARN] Node $node marked as succeeded, but it doesn't have \"${TESTS_TYPE}-load-tests.log\" tests results summary file"
+            echo "WARNING |" >> $tmpFile
+            echo "--------" >> $tmpFile
+            echo "Node $node marked as succeeded," >> $tmpFile
+            echo "but it doesn't have \"${TESTS_TYPE}-load-tests.log\" tests results summary file" >> $tmpFile
+            echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+            continue
+        fi
+
+        cnt=$(cat $logFile | grep "^WRITE messages" | sed -r "s/WRITE messages: //g" | xargs)
+        if [ -n "$cnt" ]; then
+            writeMsg=$(bc <<< "$writeMsg + $cnt")
+            if [ $cnt -ne 0 ]; then
+                echo "[INFO] WRITE messages: $cnt"
+            else
+                echo "[WARN] WRITE messages count is zero for $node node. This test probably failed."
+                echo "WARNING |" >> $tmpFile
+                echo "--------" >> $tmpFile
+                echo "WRITE messages count is zero for $node node. This test probably failed." >> $tmpFile
+                echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+            fi
+        else
+            echo "[WARN] Failed to detect WRITE messages count for $node node. This test probably failed."
+            echo "WARNING |" >> $tmpFile
+            echo "--------" >> $tmpFile
+            echo "Failed to detect WRITE messages count for $node node. This test probably failed." >> $tmpFile
+            echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+        fi
+
+        cnt=$(cat $logFile | grep "^WRITE errors" | sed -r "s/WRITE errors: //g" | sed -r "s/,.*//g" | xargs)
+        if [ -n "$cnt" ]; then
+            echo "[INFO] WRITE errors: $cnt"
+            writeErrors=$(bc <<< "$writeErrors + $cnt")
+            if [ $cnt -ne 0 ]; then
+                if [ -n "$writeErrNodes" ]; then
+                    writeErrNodes="${writeErrNodes}, "
+                fi
+                writeErrNodes="${writeErrNodes}${node}"
+            fi
+        else
+            echo "[WARN] Failed to detect WRITE errors count for $node node. This test probably failed."
+            echo "WARNING |" >> $tmpFile
+            echo "--------" >> $tmpFile
+            echo "Failed to detect WRITE errors count for $node node. This test probably failed." >> $tmpFile
+            echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+        fi
+
+        cnt=$(cat $logFile | grep "^WRITE speed" | sed -r "s/WRITE speed: //g" | sed -r "s/ msg\/sec//g" | xargs)
+        if [ -n "$cnt" ]; then
+            writeSpeed=$(bc <<< "$writeSpeed + $cnt")
+            if [ $cnt -ne 0 ]; then
+                echo "[INFO] WRITE speed: $cnt msg/sec"
+            else
+                echo "[WARN] WRITE speed is zero for $node node. This test probably failed."
+                echo "WARNING |" >> $tmpFile
+                echo "--------" >> $tmpFile
+                echo "WRITE speed is zero for $node node. This test probably failed." >> $tmpFile
+                echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+            fi
+        else
+            echo "[WARN] Failed to detect WRITE speed for $node node. This test probably failed."
+            echo "WARNING |" >> $tmpFile
+            echo "--------" >> $tmpFile
+            echo "Failed to detect WRITE speed for $node node. This test probably failed." >> $tmpFile
+            echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+        fi
+
+        cnt=$(cat $logFile | grep "^BULK_WRITE messages" | sed -r "s/BULK_WRITE messages: //g" | xargs)
+        if [ -n "$cnt" ]; then
+            blkWriteMsg=$(bc <<< "$blkWriteMsg + $cnt")
+            if [ $cnt -ne 0 ]; then
+                echo "[INFO] BULK_WRITE messages: $cnt"
+            else
+                echo "[WARN] BULK_WRITE messages count is zero for $node node. This test probably failed."
+                echo "WARNING |" >> $tmpFile
+                echo "--------" >> $tmpFile
+                echo "BULK_WRITE messages count is zero for $node node. This test probably failed." >> $tmpFile
+                echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+            fi
+        else
+            echo "[WARN] Failed to detect BULK_WRITE messages count for $node node. This test probably failed."
+            echo "WARNING |" >> $tmpFile
+            echo "--------" >> $tmpFile
+            echo "Failed to detect BULK_WRITE messages count for $node node. This test probably failed." >> $tmpFile
+            echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+        fi
+
+        cnt=$(cat $logFile | grep "^BULK_WRITE errors" | sed -r "s/BULK_WRITE errors: //g" | sed -r "s/,.*//g" | xargs)
+        if [ -n "$cnt" ]; then
+            blkWriteErrors=$(bc <<< "$blkWriteErrors + $cnt")
+            echo "[INFO] BULK_WRITE errors: $cnt"
+            if [ $cnt -ne 0 ]; then
+                if [ -n "$blkWriteErrNodes" ]; then
+                    blkWriteErrNodes="${blkWriteErrNodes}, "
+                fi
+                blkWriteErrNodes="${blkWriteErrNodes}${node}"
+            fi
+        else
+            echo "[WARN] Failed to detect BULK_WRITE errors count for $node node. This test probably failed."
+            echo "WARNING |" >> $tmpFile
+            echo "--------" >> $tmpFile
+            echo "Failed to detect BULK_WRITE errors count for $node node. This test probably failed." >> $tmpFile
+            echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+        fi
+
+        cnt=$(cat $logFile | grep "^BULK_WRITE speed" | sed -r "s/BULK_WRITE speed: //g" | sed -r "s/ msg\/sec//g" | xargs)
+        if [ -n "$cnt" ]; then
+            blkWriteSpeed=$(bc <<< "$blkWriteSpeed + $cnt")
+            if [ $cnt -ne 0 ]; then
+                echo "[INFO] BULK_WRITE speed: $cnt msg/sec"
+            else
+                echo "[WARN] BULK_WRITE speed is zero for $node node. This test probably failed."
+                echo "WARNING |" >> $tmpFile
+                echo "--------" >> $tmpFile
+                echo "BULK_WRITE speed is zero for $node node. This test probably failed." >> $tmpFile
+                echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+            fi
+        else
+            echo "[WARN] Failed to detect BULK_WRITE speed for $node node. This test probably failed."
+            echo "WARNING |" >> $tmpFile
+            echo "--------" >> $tmpFile
+            echo "Failed to detect BULK_WRITE speed for $node node. This test probably failed." >> $tmpFile
+            echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+        fi
+
+        cnt=$(cat $logFile | grep "^READ messages" | sed -r "s/READ messages: //g" | xargs)
+        if [ -n "$cnt" ]; then
+            readMsg=$(bc <<< "$readMsg + $cnt")
+            if [ $cnt -ne 0 ]; then
+                echo "[INFO] READ messages: $cnt"
+            else
+                echo "[WARN] READ messages count is zero for $node node. This test probably failed."
+                echo "WARNING |" >> $tmpFile
+                echo "--------" >> $tmpFile
+                echo "READ messages count is zero for $node node. This test probably failed." >> $tmpFile
+                echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+            fi
+        else
+            echo "[WARN] Failed to detect READ messages count for $node node. This test probably failed."
+            echo "WARNING |" >> $tmpFile
+            echo "--------" >> $tmpFile
+            echo "Failed to detect READ messages count for $node node. This test probably failed." >> $tmpFile
+            echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+        fi
+
+        cnt=$(cat $logFile | grep "^READ errors" | sed -r "s/READ errors: //g" | sed -r "s/,.*//g" | xargs)
+        if [ -n "$cnt" ]; then
+            readErrors=$(bc <<< "$readErrors + $cnt")
+            echo "[INFO] READ errors: $cnt"
+            if [ $cnt -ne 0 ]; then
+                if [ -n "$readErrNodes" ]; then
+                    blkWriteErrNodes="${readErrNodes}, "
+                fi
+                readErrNodes="${readErrNodes}${node}"
+            fi
+        else
+            echo "[WARN] Failed to detect READ errors count for $node node. This test probably failed."
+            echo "WARNING |" >> $tmpFile
+            echo "--------" >> $tmpFile
+            echo "Failed to detect READ errors count for $node node. This test probably failed." >> $tmpFile
+            echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+        fi
+
+        cnt=$(cat $logFile | grep "^READ speed" | sed -r "s/READ speed: //g" | sed -r "s/ msg\/sec//g" | xargs)
+        if [ -n "$cnt" ]; then
+            readSpeed=$(bc <<< "$readSpeed + $cnt")
+            if [ $cnt -ne 0 ]; then
+                echo "[INFO] READ speed: $cnt msg/sec"
+            else
+                echo "[WARN] READ speed is zero for $node node. This test probably failed."
+                echo "WARNING |" >> $tmpFile
+                echo "--------" >> $tmpFile
+                echo "READ speed is zero for $node node. This test probably failed." >> $tmpFile
+                echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+            fi
+        else
+            echo "[WARN] Failed to detect READ speed for $node node. This test probably failed."
+            echo "WARNING |" >> $tmpFile
+            echo "--------" >> $tmpFile
+            echo "Failed to detect READ speed for $node node. This test probably failed." >> $tmpFile
+            echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+        fi
+
+        cnt=$(cat $logFile | grep "^BULK_READ messages" | sed -r "s/BULK_READ messages: //g" | xargs)
+        if [ -n "$cnt" ]; then
+            blkReadMsg=$(bc <<< "$blkReadMsg + $cnt")
+            if [ $cnt -ne 0 ]; then
+                echo "[INFO] BULK_READ messages: $cnt"
+            else
+                echo "[WARN] BULK_READ messages count is zero for $node node. This test probably failed."
+                echo "WARNING |" >> $tmpFile
+                echo "--------" >> $tmpFile
+                echo "BULK_READ messages count is zero for $node node. This test probably failed." >> $tmpFile
+                echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+            fi
+        else
+            echo "[WARN] Failed to detect BULK_READ messages count for $node node. This test probably failed."
+            echo "WARNING |" >> $tmpFile
+            echo "--------" >> $tmpFile
+            echo "Failed to detect BULK_READ messages count for $node node. This test probably failed." >> $tmpFile
+            echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+        fi
+
+        cnt=$(cat $logFile | grep "^BULK_READ errors" | sed -r "s/BULK_READ errors: //g" | sed -r "s/,.*//g" | xargs)
+        if [ -n "$cnt" ]; then
+            blkReadErrors=$(bc <<< "$blkReadErrors + $cnt")
+            echo "[INFO] BULK_READ errors: $cnt"
+            if [ $cnt -ne 0 ]; then
+                if [ -n "$blkReadErrNodes" ]; then
+                    blkReadErrNodes="${blkReadErrNodes}, "
+                fi
+                blkReadErrNodes="${blkReadErrNodes}${node}"
+            fi
+        else
+            echo "[WARN] Failed to detect BULK_READ errors count for $node node. This test probably failed."
+            echo "WARNING |" >> $tmpFile
+            echo "--------" >> $tmpFile
+            echo "Failed to detect BULK_READ errors count for $node node. This test probably failed." >> $tmpFile
+            echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+        fi
+
+        cnt=$(cat $logFile | grep "^BULK_READ speed" | sed -r "s/BULK_READ speed: //g" | sed -r "s/ msg\/sec//g" | xargs)
+        if [ -n "$cnt" ]; then
+            blkReadSpeed=$(bc <<< "$blkReadSpeed + $cnt")
+            if [ $cnt -ne 0 ]; then
+                echo "[INFO] BULK_READ speed: $cnt msg/sec"
+            else
+                echo "[WARN] BULK_READ speed is zero for $node node. This test probably failed."
+                echo "WARNING |" >> $tmpFile
+                echo "--------" >> $tmpFile
+                echo "BULK_READ speed is zero for $node node. This test probably failed." >> $tmpFile
+                echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+            fi
+        else
+            echo "[WARN] Failed to detect BULK_READ speed for $node node. This test probably failed."
+            echo "WARNING |" >> $tmpFile
+            echo "--------" >> $tmpFile
+            echo "Failed to detect BULK_READ speed for $node node. This test probably failed." >> $tmpFile
+            echo "----------------------------------------------------------------------------------------------" >> $tmpFile
+        fi
+    done
+
+    echo "-------------------------------------------------------------------------------------"
+
+    echo "WRITE test metrics |" >> $1
+    echo "-------------------" >> $1
+    echo "Messages: $writeMsg" >> $1
+    echo "Speed   : $writeSpeed msg/sec" >> $1
+    echo "Errors  : $writeErrors" >> $1
+    echo "----------------------------------------------------------------------------------------------" >> $1
+
+    echo "BULK_WRITE test metrics |" >> $1
+    echo "------------------------" >> $1
+    echo "Messages: $blkWriteMsg" >> $1
+    echo "Speed   : $blkWriteSpeed msg/sec" >> $1
+    echo "Errors  : $blkWriteErrors" >> $1
+    echo "----------------------------------------------------------------------------------------------" >> $1
+
+    echo "READ test metrics |" >> $1
+    echo "------------------" >> $1
+    echo "Messages: $readMsg" >> $1
+    echo "Speed   : $readSpeed msg/sec" >> $1
+    echo "Errors  : $readErrors" >> $1
+    echo "----------------------------------------------------------------------------------------------" >> $1
+
+    echo "BULK_READ test metrics |" >> $1
+    echo "-----------------------" >> $1
+    echo "Messages: $blkReadMsg" >> $1
+    echo "Speed   : $blkReadSpeed msg/sec" >> $1
+    echo "Errors  : $blkReadErrors" >> $1
+    echo "----------------------------------------------------------------------------------------------" >> $1
+
+    if [ -n "$writeErrNodes" ]; then
+        echo "Nodes having WRITE errors |" >> $1
+        echo "-------------------------------" >> $1
+        echo "$writeErrNodes" >> $1
+        echo "----------------------------------------------------------------------------------------------" >> $1
+    fi
+
+    if [ -n "$blkWriteErrNodes" ]; then
+        echo "Nodes having BULK_WRITE errors |" >> $1
+        echo "-------------------------------" >> $1
+        echo "$blkWriteErrNodes" >> $1
+        echo "----------------------------------------------------------------------------------------------" >> $1
+    fi
+
+    if [ -n "$readErrNodes" ]; then
+        echo "Nodes having READ errors |" >> $1
+        echo "-------------------------------" >> $1
+        echo "$readErrNodes" >> $1
+        echo "----------------------------------------------------------------------------------------------" >> $1
+    fi
+
+    if [ -n "$blkReadErrNodes" ]; then
+        echo "Nodes having BULK_READ errors |" >> $1
+        echo "-------------------------------" >> $1
+        echo "$blkReadErrNodes" >> $1
+        echo "----------------------------------------------------------------------------------------------" >> $1
+    fi
+
+    cat $tmpFile >> $1
+
+    rm -f $tmpFile
+}
+
+# Creates report for failed tests
+reportFailedTestsDetailes()
+{
+    for dir in $2/*
+    do
+        node=$(echo $dir | sed -r "s/^.*\///g")
+        if [ -z "$node" ]; then
+            continue
+        fi
+
+        echo "----------------------------------------------------------------------------------------------" >> $1
+        echo "Error details for node: $node" >> $1
+        echo "----------------------------------------------------------------------------------------------" >> $1
+
+        if [ -f "$dir/__error__" ]; then
+            cat $dir/__error__ >> $1
+        else
+            echo "N/A" >> $1
+        fi
+    done
+}
+
+#######################################################################################################
+
+if [ "$TESTS_TYPE" != "ignite" ] && [ "$TESTS_TYPE" != "cassandra" ]; then
+    terminate "Incorrect tests type specified: $TESTS_TYPE"
+fi
+
+reportTestsSummary
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/231ead01/modules/cassandra/store/src/test/java/org/apache/ignite/tests/CassandraDirectPersistenceLoadTest.java
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/test/java/org/apache/ignite/tests/CassandraDirectPersistenceLoadTest.java b/modules/cassandra/store/src/test/java/org/apache/ignite/tests/CassandraDirectPersistenceLoadTest.java
new file mode 100644
index 0000000..c031bfb
--- /dev/null
+++ b/modules/cassandra/store/src/test/java/org/apache/ignite/tests/CassandraDirectPersistenceLoadTest.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.ignite.tests;
+
+import org.apache.ignite.tests.load.LoadTestDriver;
+import org.apache.ignite.tests.load.cassandra.BulkReadWorker;
+import org.apache.ignite.tests.load.cassandra.BulkWriteWorker;
+import org.apache.ignite.tests.load.cassandra.ReadWorker;
+import org.apache.ignite.tests.load.cassandra.WriteWorker;
+import org.apache.ignite.tests.utils.CacheStoreHelper;
+import org.apache.ignite.tests.utils.CassandraHelper;
+import org.apache.ignite.tests.utils.TestsHelper;
+import org.apache.log4j.Logger;
+
+/**
+ * Load tests for {@link org.apache.ignite.cache.store.cassandra.CassandraCacheStore} implementation of
+ * {@link org.apache.ignite.cache.store.CacheStore} which allows to store Ignite cache data into Cassandra tables.
+ */
+public class CassandraDirectPersistenceLoadTest extends LoadTestDriver {
+    /** */
+    private static final Logger LOGGER = Logger.getLogger("CassandraLoadTests");
+
+    /**
+     *
+     * @param args Test arguments.
+     */
+    public static void main(String[] args) {
+        try {
+            LOGGER.info("Cassandra load tests execution started");
+
+            LoadTestDriver driver = new CassandraDirectPersistenceLoadTest();
+
+            /**
+             * Load test scripts could be executed from several machines. Current implementation can correctly,
+             * handle situation when Cassandra keyspace/table was dropped - for example by the same load test
+             * started a bit later on another machine. Moreover there is a warm up period for each load test.
+             * Thus all the delays related to keyspaces/tables recreation actions will not affect performance metrics,
+             * but it will be produced lots of "trash" output in the logs (related to correct handling of such
+             * exceptional situation and keyspace/table recreation).
+             *
+             * Thus dropping test keyspaces at the beginning of the tests makes sense only for Unit tests,
+             * but not for Load tests.
+            **/
+
+            //CassandraHelper.dropTestKeyspaces();
+
+            driver.runTest("WRITE", WriteWorker.class, WriteWorker.LOGGER_NAME);
+
+            driver.runTest("BULK_WRITE", BulkWriteWorker.class, BulkWriteWorker.LOGGER_NAME);
+
+            driver.runTest("READ", ReadWorker.class, ReadWorker.LOGGER_NAME);
+
+            driver.runTest("BULK_READ", BulkReadWorker.class, BulkReadWorker.LOGGER_NAME);
+
+            /**
+             * Load test script executed on one machine could complete earlier that the same load test executed from
+             * another machine. Current implementation can correctly handle situation when Cassandra keyspace/table
+             * was dropped (simply recreate it). But dropping keyspace/table during load tests execution and subsequent
+             * recreation of such objects can have SIGNIFICANT EFFECT on final performance metrics.
+             *
+             * Thus dropping test keyspaces at the end of the tests makes sense only for Unit tests,
+             * but not for Load tests.
+             */
+
+            //CassandraHelper.dropTestKeyspaces(); // REVIEW This line is commented by purpose?
+
+            LOGGER.info("Cassandra load tests execution completed");
+        }
+        catch (Throwable e) {
+            LOGGER.error("Cassandra load tests execution failed", e);
+            throw new RuntimeException("Cassandra load tests execution failed", e);
+        }
+        finally {
+            CassandraHelper.releaseCassandraResources();
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override protected Logger logger() {
+        return LOGGER;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected Object setup(String logName) {
+        return CacheStoreHelper.createCacheStore(
+            TestsHelper.getLoadTestsCacheName(),
+            TestsHelper.getLoadTestsPersistenceSettings(),
+            CassandraHelper.getAdminDataSrc(),
+            Logger.getLogger(logName));
+    }
+
+}