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

[15/35] 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/common.sh
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/test/bootstrap/aws/common.sh b/modules/cassandra/store/src/test/bootstrap/aws/common.sh
new file mode 100644
index 0000000..6469e95
--- /dev/null
+++ b/modules/cassandra/store/src/test/bootstrap/aws/common.sh
@@ -0,0 +1,1481 @@
+#!/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.
+#
+
+# -----------------------------------------------------------------------------------------------
+# Common purpose functions used by bootstrap scripts
+# -----------------------------------------------------------------------------------------------
+
+# Validates values of the main environment variables specified in env.sh
+validate()
+{
+    if [ -n "$TESTS_TYPE" ] && [ "$TESTS_TYPE" != "ignite" ] && [ "$TESTS_TYPE" != "cassandra" ]; then
+        terminate "Incorrect tests type specified: $TESTS_TYPE"
+    fi
+
+    if [ -z "$S3_TESTS_NODES_DISCOVERY" ]; then
+        terminate "Tests discovery URL doesn't specified"
+    fi
+
+    if [[ "$S3_TESTS_NODES_DISCOVERY" != */ ]]; then
+        S3_TESTS_NODES_DISCOVERY=${S3_TESTS_NODES_DISCOVERY}/
+    fi
+
+    if [ -z "$S3_TESTS_SUCCESS" ]; then
+        terminate "Tests success URL doesn't specified"
+    fi
+
+    if [[ "$S3_TESTS_SUCCESS" != */ ]]; then
+        S3_TESTS_SUCCESS=${S3_TESTS_SUCCESS}/
+    fi
+
+    if [ -z "$S3_TESTS_FAILURE" ]; then
+        terminate "Tests failure URL doesn't specified"
+    fi
+
+    if [[ "$S3_TESTS_FAILURE" != */ ]]; then
+        S3_TESTS_FAILURE=${S3_TESTS_FAILURE}/
+    fi
+
+    if [ -z "$S3_TESTS_IDLE" ]; then
+        terminate "Tests idle URL doesn't specified"
+    fi
+
+    if [[ "$S3_TESTS_IDLE" != */ ]]; then
+        S3_TESTS_IDLE=${S3_TESTS_IDLE}/
+    fi
+
+    if [ -z "$S3_TESTS_PREPARING" ]; then
+        terminate "Tests preparing URL doesn't specified"
+    fi
+
+    if [[ "$S3_TESTS_PREPARING" != */ ]]; then
+        S3_TESTS_PREPARING=${S3_TESTS_PREPARING}/
+    fi
+
+    if [ -z "$S3_TESTS_RUNNING" ]; then
+        terminate "Tests running URL doesn't specified"
+    fi
+
+    if [[ "$S3_TESTS_RUNNING" != */ ]]; then
+        S3_TESTS_RUNNING=${S3_TESTS_RUNNING}/
+    fi
+
+    if [ -z "$S3_TESTS_WAITING" ]; then
+        terminate "Tests waiting URL doesn't specified"
+    fi
+
+    if [[ "$S3_TESTS_WAITING" != */ ]]; then
+        S3_TESTS_WAITING=${S3_TESTS_WAITING}/
+    fi
+
+    if [ -z "$S3_IGNITE_NODES_DISCOVERY" ]; then
+        terminate "Ignite discovery URL doesn't specified"
+    fi
+
+    if [[ "$S3_IGNITE_NODES_DISCOVERY" != */ ]]; then
+        S3_IGNITE_NODES_DISCOVERY=${S3_IGNITE_NODES_DISCOVERY}/
+    fi
+
+    if [ -z "$S3_IGNITE_BOOTSTRAP_SUCCESS" ]; then
+        terminate "Ignite success URL doesn't specified"
+    fi
+
+    if [[ "$S3_IGNITE_BOOTSTRAP_SUCCESS" != */ ]]; then
+        S3_IGNITE_BOOTSTRAP_SUCCESS=${S3_IGNITE_BOOTSTRAP_SUCCESS}/
+    fi
+
+    if [ -z "$S3_IGNITE_BOOTSTRAP_FAILURE" ]; then
+        terminate "Ignite failure URL doesn't specified"
+    fi
+
+    if [[ "$S3_IGNITE_BOOTSTRAP_FAILURE" != */ ]]; then
+        S3_IGNITE_BOOTSTRAP_FAILURE=${S3_IGNITE_BOOTSTRAP_FAILURE}/
+    fi
+
+    if [ -z "$S3_CASSANDRA_NODES_DISCOVERY" ]; then
+        terminate "Cassandra discovery URL doesn't specified"
+    fi
+
+    if [[ "$S3_CASSANDRA_NODES_DISCOVERY" != */ ]]; then
+        S3_CASSANDRA_NODES_DISCOVERY=${S3_CASSANDRA_NODES_DISCOVERY}/
+    fi
+
+    if [ -z "$S3_CASSANDRA_BOOTSTRAP_SUCCESS" ]; then
+        terminate "Cassandra success URL doesn't specified"
+    fi
+
+    if [[ "$S3_CASSANDRA_BOOTSTRAP_SUCCESS" != */ ]]; then
+        S3_CASSANDRA_BOOTSTRAP_SUCCESS=${S3_CASSANDRA_BOOTSTRAP_SUCCESS}/
+    fi
+
+    if [ -z "$S3_CASSANDRA_BOOTSTRAP_FAILURE" ]; then
+        terminate "Cassandra failure URL doesn't specified"
+    fi
+
+    if [[ "$S3_CASSANDRA_BOOTSTRAP_FAILURE" != */ ]]; then
+        S3_CASSANDRA_BOOTSTRAP_FAILURE=${S3_CASSANDRA_BOOTSTRAP_FAILURE}/
+    fi
+
+    if [ -z "$S3_GANGLIA_MASTER_DISCOVERY" ]; then
+        terminate "Ganglia master discovery URL doesn't specified"
+    fi
+
+    if [[ "$S3_GANGLIA_MASTER_DISCOVERY" != */ ]]; then
+        S3_GANGLIA_MASTER_DISCOVERY=${S3_GANGLIA_MASTER_DISCOVERY}/
+    fi
+
+    if [ -z "$S3_GANGLIA_BOOTSTRAP_SUCCESS" ]; then
+        terminate "Ganglia master success URL doesn't specified"
+    fi
+
+    if [[ "$S3_GANGLIA_BOOTSTRAP_SUCCESS" != */ ]]; then
+        S3_GANGLIA_BOOTSTRAP_SUCCESS=${S3_GANGLIA_BOOTSTRAP_SUCCESS}/
+    fi
+
+    if [ -z "$S3_GANGLIA_BOOTSTRAP_FAILURE" ]; then
+        terminate "Ganglia master failure URL doesn't specified"
+    fi
+
+    if [[ "$S3_GANGLIA_BOOTSTRAP_FAILURE" != */ ]]; then
+        S3_GANGLIA_BOOTSTRAP_FAILURE=${S3_GANGLIA_BOOTSTRAP_FAILURE}/
+    fi
+}
+
+# Prints EC2 instance info
+printInstanceInfo()
+{
+    if [ "$NODE_TYPE" == "cassandra" ]; then
+        echo "[INFO] Cassandra download URL: $CASSANDRA_DOWNLOAD_URL"
+        echo "[INFO] Tests package download URL: $TESTS_PACKAGE_DONLOAD_URL"
+        echo "[INFO] Ganglia Core download URL: $GANGLIA_CORE_DOWNLOAD_URL"
+        echo "[INFO] Ganglia Web download URL: $GANGLIA_WEB_DOWNLOAD_URL"
+        echo "[INFO] RRD download URL: $RRD_DOWNLOAD_URL"
+        echo "[INFO] Logs URL: $S3_CASSANDRA_LOGS"
+        echo "[INFO] Logs trigger URL: $S3_LOGS_TRIGGER"
+        echo "[INFO] Cassandra nodes discovery URL: $S3_CASSANDRA_NODES_DISCOVERY"
+        echo "[INFO] Ganglia master discovery URL: $S3_GANGLIA_MASTER_DISCOVERY"
+        echo "[INFO] Cassandra first node lock URL: $S3_CASSANDRA_FIRST_NODE_LOCK"
+        echo "[INFO] Cassandra nodes join lock URL: $S3_CASSANDRA_NODES_JOIN_LOCK"
+        echo "[INFO] Cassandra success URL: $S3_CASSANDRA_BOOTSTRAP_SUCCESS"
+        echo "[INFO] Cassandra failure URL: $S3_CASSANDRA_BOOTSTRAP_FAILURE"
+    fi
+
+    if [ "$NODE_TYPE" == "ignite" ]; then
+        echo "[INFO] Ignite download URL: $IGNITE_DOWNLOAD_URL"
+        echo "[INFO] Tests package download URL: $TESTS_PACKAGE_DONLOAD_URL"
+        echo "[INFO] Ganglia Core download URL: $GANGLIA_CORE_DOWNLOAD_URL"
+        echo "[INFO] Ganglia Web download URL: $GANGLIA_WEB_DOWNLOAD_URL"
+        echo "[INFO] RRD download URL: $RRD_DOWNLOAD_URL"
+        echo "[INFO] Logs URL: $S3_IGNITE_LOGS"
+        echo "[INFO] Logs trigger URL: $S3_LOGS_TRIGGER"
+        echo "[INFO] Ignite node discovery URL: $S3_IGNITE_NODES_DISCOVERY"
+        echo "[INFO] Cassandra node discovery URL: $S3_CASSANDRA_NODES_DISCOVERY"
+        echo "[INFO] Ganglia master discovery URL: $S3_GANGLIA_MASTER_DISCOVERY"
+        echo "[INFO] Ignite first node lock URL: $S3_IGNITE_FIRST_NODE_LOCK"
+        echo "[INFO] Ignite nodes join lock URL: $S3_IGNITE_NODES_JOIN_LOCK"
+        echo "[INFO] Ignite success URL: $S3_IGNITE_BOOTSTRAP_SUCCESS"
+        echo "[INFO] Ignite failure URL: $S3_IGNITE_BOOTSTRAP_FAILURE"
+    fi
+
+    if [ "$NODE_TYPE" == "test" ]; then
+        echo "[INFO] Tests type: $TESTS_TYPE"
+        echo "[INFO] Test nodes count: $TEST_NODES_COUNT"
+        echo "[INFO] Ignite nodes count: $IGNITE_NODES_COUNT"
+        echo "[INFO] Cassandra nodes count: $CASSANDRA_NODES_COUNT"
+        echo "[INFO] Tests summary URL: $S3_TESTS_SUMMARY"
+        echo "[INFO] ----------------------------------------------------"
+        echo "[INFO] Tests package download URL: $TESTS_PACKAGE_DONLOAD_URL"
+        echo "[INFO] Ganglia Core download URL: $GANGLIA_CORE_DOWNLOAD_URL"
+        echo "[INFO] Ganglia Web download URL: $GANGLIA_WEB_DOWNLOAD_URL"
+        echo "[INFO] RRD download URL: $RRD_DOWNLOAD_URL"
+        echo "[INFO] Logs URL: $S3_TESTS_LOGS"
+        echo "[INFO] Logs trigger URL: $S3_LOGS_TRIGGER"
+        echo "[INFO] Test node discovery URL: $S3_TESTS_NODES_DISCOVERY"
+        echo "[INFO] Ignite node discovery URL: $S3_IGNITE_NODES_DISCOVERY"
+        echo "[INFO] Cassandra node discovery URL: $S3_CASSANDRA_NODES_DISCOVERY"
+        echo "[INFO] Ganglia master discovery URL: $S3_GANGLIA_MASTER_DISCOVERY"
+        echo "[INFO] Tests trigger URL: $S3_TESTS_TRIGGER"
+        echo "[INFO] Tests idle URL: $S3_TESTS_IDLE"
+        echo "[INFO] Tests preparing URL: $S3_TESTS_PREPARING"
+        echo "[INFO] Tests waiting URL: $S3_TESTS_WAITING"
+        echo "[INFO] Tests running URL: $S3_TESTS_RUNNING"
+        echo "[INFO] Tests success URL: $S3_TESTS_SUCCESS"
+        echo "[INFO] Tests failure URL: $S3_TESTS_FAILURE"
+        echo "[INFO] Ignite success URL: $S3_IGNITE_BOOTSTRAP_SUCCESS"
+        echo "[INFO] Ignite failure URL: $S3_IGNITE_BOOTSTRAP_FAILURE"
+        echo "[INFO] Cassandra success URL: $S3_CASSANDRA_BOOTSTRAP_SUCCESS"
+        echo "[INFO] Cassandra failure URL: $S3_CASSANDRA_BOOTSTRAP_FAILURE"
+    fi
+
+    if [ "$NODE_TYPE" == "ganglia" ]; then
+        echo "[INFO] Ganglia Core download URL: $GANGLIA_CORE_DOWNLOAD_URL"
+        echo "[INFO] Ganglia Web download URL: $GANGLIA_WEB_DOWNLOAD_URL"
+        echo "[INFO] RRD download URL: $RRD_DOWNLOAD_URL"
+        echo "[INFO] Tests package download URL: $TESTS_PACKAGE_DONLOAD_URL"
+        echo "[INFO] Logs URL: $S3_GANGLIA_LOGS"
+        echo "[INFO] Logs trigger URL: $S3_LOGS_TRIGGER"
+        echo "[INFO] Ganglia master discovery URL: $S3_GANGLIA_MASTER_DISCOVERY"
+        echo "[INFO] Ganglia success URL: $S3_GANGLIA_BOOTSTRAP_SUCCESS"
+        echo "[INFO] Ganglia failure URL: $S3_GANGLIA_BOOTSTRAP_FAILURE"
+    fi
+}
+
+# Clone git repository
+gitClone()
+{
+    echo "[INFO] Cloning git repository $1 to $2"
+
+    rm -Rf $2
+
+    for i in 0 9;
+    do
+        git clone $1 $2
+
+        if [ $code -eq 0 ]; then
+            echo "[INFO] Git repository $1 was successfully cloned to $2"
+            return 0
+        fi
+
+        echo "[WARN] Failed to clone git repository $1 from $i attempt, sleeping extra 5sec"
+        rm -Rf $2
+        sleep 5s
+    done
+
+    terminate "All 10 attempts to clone git repository $1 are failed"
+}
+
+# Applies specified tag to EC2 instance
+createTag()
+{
+    if [ -z "$EC2_INSTANCE_REGION" ]; then
+        EC2_AVAIL_ZONE=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone`
+        EC2_INSTANCE_REGION="`echo \"$EC2_AVAIL_ZONE\" | sed -e 's:\([0-9][0-9]*\)[a-z]*\$:\\1:'`"
+        export EC2_INSTANCE_REGION
+        echo "[INFO] EC2 instance region: $EC2_INSTANCE_REGION"
+    fi
+
+    for i in 0 9;
+    do
+        aws ec2 create-tags --resources $1 --tags Key=$2,Value=$3 --region $EC2_INSTANCE_REGION
+        if [ $? -eq 0 ]; then
+            return 0
+        fi
+
+        echo "[WARN] $i attempt to tag EC2 instance $1 with $2=$3 is failed, sleeping extra 5sec"
+        sleep 5s
+    done
+
+    terminate "All 10 attempts to tag EC2 instance $1 with $2=$3 are failed"
+}
+
+# Applies 'owner', 'project' and 'Name' tags to EC2 instance
+tagInstance()
+{
+    export EC2_HOME=/opt/aws/apitools/ec2
+    export JAVA_HOME=/opt/java
+    export PATH=$JAVA_HOME/bin:$EC2_HOME/bin:$PATH
+
+    INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
+    if [ $? -ne 0 ]; then
+        echo "[ERROR] Failed to get instance metadata to tag it"
+        exit 1
+    fi
+
+    INSTANCE_NAME=
+
+    if [ "$NODE_TYPE" == "cassandra" ]; then
+        INSTANCE_NAME=$EC2_CASSANDRA_TAG
+    elif [ "$NODE_TYPE" == "ignite" ]; then
+        INSTANCE_NAME=$EC2_IGNITE_TAG
+    elif [ "$NODE_TYPE" == "test" ]; then
+        INSTANCE_NAME=$EC2_TEST_TAG
+    elif [ "$NODE_TYPE" == "ganglia" ]; then
+        INSTANCE_NAME=$EC2_GANGLIA_TAG
+    fi
+
+    if [ -n "$INSTANCE_NAME" ]; then
+        createTag "$INSTANCE_ID" "Name" "${INSTANCE_NAME}"
+    fi
+
+    if [ -n "$EC2_OWNER_TAG" ]; then
+        createTag "$INSTANCE_ID" "owner" "${EC2_OWNER_TAG}"
+    fi
+
+    if [ -n "$EC2_PROJECT_TAG" ]; then
+        createTag "$INSTANCE_ID" "project" "${EC2_PROJECT_TAG}"
+    fi
+}
+
+# Sets NODE_TYPE env variable
+setNodeType()
+{
+    if [ -n "$1" ]; then
+        NEW_NODE_TYPE=$NODE_TYPE
+        NODE_TYPE=$1
+    else
+        NEW_NODE_TYPE=
+    fi
+}
+
+# Reverts NODE_TYPE env variable to previous value
+revertNodeType()
+{
+    if [ -n "$NEW_NODE_TYPE" ]; then
+        NODE_TYPE=$NEW_NODE_TYPE
+        NEW_NODE_TYPE=
+    fi
+}
+
+# Returns logs folder for the node (Cassandra, Ignite, Tests)
+getLocalLogsFolder()
+{
+    setNodeType $1
+
+    if [ "$NODE_TYPE" == "cassandra" ]; then
+        echo "/opt/cassandra/logs"
+    elif [ "$NODE_TYPE" == "ignite" ]; then
+        echo "/opt/ignite/work/log"
+    elif [ "$NODE_TYPE" == "test" ]; then
+        echo "/opt/ignite-cassandra-tests/logs"
+    elif [ "$NODE_TYPE" == "ganglia" ]; then
+        echo ""
+    fi
+
+    revertNodeType
+}
+
+# Returns S3 URL to discover this node
+getDiscoveryUrl()
+{
+    setNodeType $1
+
+    if [ "$NODE_TYPE" == "cassandra" ]; then
+        echo "$S3_CASSANDRA_NODES_DISCOVERY"
+    elif [ "$NODE_TYPE" == "ignite" ]; then
+        echo "$S3_IGNITE_NODES_DISCOVERY"
+    elif [ "$NODE_TYPE" == "test" ]; then
+        echo "$S3_TESTS_NODES_DISCOVERY"
+    elif [ "$NODE_TYPE" == "ganglia" ]; then
+        echo "$S3_GANGLIA_MASTER_DISCOVERY"
+    fi
+
+    revertNodeType
+}
+
+# Returns S3 URL used as a join lock, used by nodes to join cluster sequentially
+getJoinLockUrl()
+{
+    setNodeType $1
+
+    if [ "$NODE_TYPE" == "cassandra" ]; then
+        echo "$S3_CASSANDRA_NODES_JOIN_LOCK"
+    elif [ "$NODE_TYPE" == "ignite" ]; then
+        echo "$S3_IGNITE_NODES_JOIN_LOCK"
+    fi
+
+    revertNodeType
+}
+
+# Returns S3 URL used to select first node for the cluster. The first node is responsible
+# for doing all routine work (clean S3 logs/test results from previous execution) on cluster startup
+getFirstNodeLockUrl()
+{
+    setNodeType $1
+
+    if [ "$NODE_TYPE" == "cassandra" ]; then
+        echo "$S3_CASSANDRA_FIRST_NODE_LOCK"
+    elif [ "$NODE_TYPE" == "ignite" ]; then
+        echo "$S3_IGNITE_FIRST_NODE_LOCK"
+    elif [ "$NODE_TYPE" == "test" ]; then
+        echo "$S3_TESTS_FIRST_NODE_LOCK"
+    fi
+
+    revertNodeType
+}
+
+# Returns S3 success URL for the node - folder created in S3 in case node successfully started and containing node logs
+getSucessUrl()
+{
+    setNodeType $1
+
+    if [ "$NODE_TYPE" == "cassandra" ]; then
+        echo "$S3_CASSANDRA_BOOTSTRAP_SUCCESS"
+    elif [ "$NODE_TYPE" == "ignite" ]; then
+        echo "$S3_IGNITE_BOOTSTRAP_SUCCESS"
+    elif [ "$NODE_TYPE" == "test" ]; then
+        echo "$S3_TESTS_SUCCESS"
+    elif [ "$NODE_TYPE" == "ganglia" ]; then
+        echo "$S3_GANGLIA_BOOTSTRAP_SUCCESS"
+    fi
+
+    revertNodeType
+}
+
+# Returns S3 failure URL for the node - folder created in S3 in case node failed to start and containing node logs
+getFailureUrl()
+{
+    setNodeType $1
+
+    if [ "$NODE_TYPE" == "cassandra" ]; then
+        echo "$S3_CASSANDRA_BOOTSTRAP_FAILURE"
+    elif [ "$NODE_TYPE" == "ignite" ]; then
+        echo "$S3_IGNITE_BOOTSTRAP_FAILURE"
+    elif [ "$NODE_TYPE" == "test" ]; then
+        echo "$S3_TESTS_FAILURE"
+    elif [ "$NODE_TYPE" == "ganglia" ]; then
+        echo "$S3_GANGLIA_BOOTSTRAP_FAILURE"
+    fi
+
+    revertNodeType
+}
+
+# Terminates script execution, unregisters node and removes all the locks (join lock, first node lock) created by it
+terminate()
+{
+    SUCCESS_URL=$(getSucessUrl)
+    FAILURE_URL=$(getFailureUrl)
+
+    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] Failed to start $NODE_TYPE node"
+        echo "[ERROR]-----------------------------------------------------"
+        msg=$1
+        reportFolder=${FAILURE_URL}${HOST_NAME}
+        reportFile=$reportFolder/__error__
+    else
+        echo "[INFO]-----------------------------------------------------"
+        echo "[INFO] $NODE_TYPE node successfully started"
+        echo "[INFO]-----------------------------------------------------"
+        reportFolder=${SUCCESS_URL}${HOST_NAME}
+        reportFile=$reportFolder/__success__
+    fi
+
+    echo $msg > /opt/ignite-cassandra-tests/bootstrap/start_result
+
+    aws s3 rm --recursive $reportFolder
+    if [ $? -ne 0 ]; then
+        echo "[ERROR] Failed to drop report folder: $reportFolder"
+    fi
+
+    localLogs=$(getLocalLogsFolder)
+
+    if [ -d "$localLogs" ]; then
+        aws s3 sync --sse AES256 $localLogs $reportFolder
+        if [ $? -ne 0 ]; then
+            echo "[ERROR] Failed to export $NODE_TYPE logs to: $reportFolder"
+        fi
+    fi
+
+    aws s3 cp --sse AES256 /opt/ignite-cassandra-tests/bootstrap/start_result $reportFile
+    if [ $? -ne 0 ]; then
+        echo "[ERROR] Failed to export node start result to: $reportFile"
+    fi
+
+    rm -f /opt/ignite-cassandra-tests/bootstrap/start_result /opt/ignite-cassandra-tests/bootstrap/join-lock /opt/ignite-cassandra-tests/bootstrap/first-node-lock
+
+    removeClusterJoinLock
+
+    if [ "$NODE_TYPE" == "test" ]; then
+        aws s3 rm ${S3_TESTS_RUNNING}${HOST_NAME}
+        aws s3 rm ${S3_TESTS_WAITING}${HOST_NAME}
+        aws s3 rm ${S3_TESTS_IDLE}${HOST_NAME}
+        aws s3 rm ${S3_TESTS_PREPARING}${HOST_NAME}
+        unregisterNode
+    fi
+
+    if [ -n "$1" ]; then
+        removeFirstNodeLock
+        unregisterNode
+        exit 1
+    fi
+
+    exit 0
+}
+
+# Registers node by creating a file having node hostname inside specific folder in S3
+registerNode()
+{
+    DISCOVERY_URL=$(getDiscoveryUrl)
+    HOST_NAME=$(hostname -f | tr '[:upper:]' '[:lower:]')
+
+    echo "[INFO] Registering $NODE_TYPE node: ${DISCOVERY_URL}${HOST_NAME}"
+
+    aws s3 cp --sse AES256 /etc/hosts ${DISCOVERY_URL}${HOST_NAME}
+    if [ $? -ne 0 ]; then
+        terminate "Failed to register $NODE_TYPE node info in: ${DISCOVERY_URL}${HOST_NAME}"
+    fi
+
+    echo "[INFO] $NODE_TYPE node successfully registered"
+}
+
+# Unregisters node by removing a file having node hostname inside specific folder in S3
+unregisterNode()
+{
+    DISCOVERY_URL=$(getDiscoveryUrl)
+    HOST_NAME=$(hostname -f | tr '[:upper:]' '[:lower:]')
+
+    echo "[INFO] Removing $NODE_TYPE node registration from: ${DISCOVERY_URL}${HOST_NAME}"
+
+    exists=$(aws s3 ls ${DISCOVERY_URL}${HOST_NAME})
+
+    if [ -n "$exists" ]; then
+        aws s3 rm ${DISCOVERY_URL}${HOST_NAME}
+
+        if [ $? -ne 0 ]; then
+            echo "[ERROR] Failed to remove $NODE_TYPE node registration"
+        else
+            echo "[INFO] $NODE_TYPE node registration removed"
+        fi
+    else
+        echo "[INFO] Node registration actually haven't been previously created"
+    fi
+}
+
+# Cleans up all nodes metadata for particular cluster (Cassandra, Ignite, Tests). Performed only by the node acquired
+# first node lock.
+cleanupMetadata()
+{
+    DISCOVERY_URL=$(getDiscoveryUrl)
+    JOIN_LOCK_URL=$(getJoinLockUrl)
+    SUCCESS_URL=$(getSucessUrl)
+    FAILURE_URL=$(getFailureUrl)
+
+    echo "[INFO] Running metadata cleanup"
+
+    aws s3 rm $JOIN_LOCK_URL
+    aws s3 rm --recursive $DISCOVERY_URL
+    aws s3 rm --recursive $SUCCESS_URL
+    aws s3 rm --recursive $FAILURE_URL
+
+    echo "[INFO] Metadata cleanup completed"
+}
+
+# Tries to get first node lock for the node. Only one (first) node can have such lock and it will be responsible for
+# cleanup process when starting cluster
+tryToGetFirstNodeLock()
+{
+    if [ "$FIRST_NODE_LOCK" == "true" ]; then
+        return 0
+    fi
+
+    FIRST_NODE_LOCK_URL=$(getFirstNodeLockUrl)
+    HOST_NAME=$(hostname -f | tr '[:upper:]' '[:lower:]')
+
+    echo "[INFO] Trying to get first node lock: $FIRST_NODE_LOCK_URL"
+
+    checkFirstNodeLockExist $FIRST_NODE_LOCK_URL
+    if [ $? -ne 0 ]; then
+        return 1
+    fi
+
+    echo "$HOST_NAME" > /opt/ignite-cassandra-tests/bootstrap/first-node-lock
+
+    createFirstNodeLock $FIRST_NODE_LOCK_URL
+
+    sleep 5s
+
+    rm -Rf /opt/ignite-cassandra-tests/bootstrap/first-node-lock
+
+    aws s3 cp $FIRST_NODE_LOCK_URL /opt/ignite-cassandra-tests/bootstrap/first-node-lock
+    if [ $? -ne 0 ]; then
+        echo "[WARN] Failed to check just created first node lock"
+        return 1
+    fi
+
+    first_host=$(cat /opt/ignite-cassandra-tests/bootstrap/first-node-lock)
+
+    rm -f /opt/ignite-cassandra-tests/bootstrap/first-node-lock
+
+    if [ "$first_host" != "$HOST_NAME" ]; then
+        echo "[INFO] Node $first_host has discarded previously created first node lock"
+        return 1
+    fi
+
+    echo "[INFO] Congratulations, got first node lock"
+
+    FIRST_NODE_LOCK="true"
+
+    return 0
+}
+
+# Checks if first node lock already exists in S3
+checkFirstNodeLockExist()
+{
+    echo "[INFO] Checking for the first node lock: $1"
+
+    lockExists=$(aws s3 ls $1)
+    if [ -n "$lockExists" ]; then
+        echo "[INFO] First node lock already exists"
+        return 1
+    fi
+
+    echo "[INFO] First node lock doesn't exist"
+
+    return 0
+}
+
+# Creates first node lock in S3
+createFirstNodeLock()
+{
+    aws s3 cp --sse AES256 /opt/ignite-cassandra-tests/bootstrap/first-node-lock $1
+
+    if [ $? -ne 0 ]; then
+        terminate "Failed to create first node lock: $1"
+    fi
+
+    echo "[INFO] Created first node lock: $1"
+}
+
+# Removes first node lock from S3
+removeFirstNodeLock()
+{
+    if [ "$FIRST_NODE_LOCK" != "true" ]; then
+        return 0
+    fi
+
+    FIRST_NODE_LOCK_URL=$(getFirstNodeLockUrl)
+
+    echo "[INFO] Removing first node lock: $FIRST_NODE_LOCK_URL"
+
+    aws s3 rm $FIRST_NODE_LOCK_URL
+
+    if [ $? -ne 0 ]; then
+        terminate "Failed to remove first node lock: $FIRST_NODE_LOCK_URL"
+    fi
+
+    echo "[INFO] Removed first node lock: $FIRST_NODE_LOCK_URL"
+
+    FIRST_NODE_LOCK="false"
+}
+
+# Tries to get cluster join lock. Nodes use this lock to join a cluster sequentially.
+tryToGetClusterJoinLock()
+{
+    if [ "$JOIN_LOCK" == "true" ]; then
+        return 0
+    fi
+
+    JOIN_LOCK_URL=$(getJoinLockUrl)
+    HOST_NAME=$(hostname -f | tr '[:upper:]' '[:lower:]')
+
+    echo "[INFO] Trying to get cluster join lock"
+
+    checkClusterJoinLockExist $JOIN_LOCK_URL
+    if [ $? -ne 0 ]; then
+        return 1
+    fi
+
+    echo "$HOST_NAME" > /opt/ignite-cassandra-tests/bootstrap/join-lock
+
+    createClusterJoinLock $JOIN_LOCK_URL
+
+    sleep 5s
+
+    rm -Rf /opt/ignite-cassandra-tests/bootstrap/join-lock
+
+    aws s3 cp $JOIN_LOCK_URL /opt/ignite-cassandra-tests/bootstrap/join-lock
+    if [ $? -ne 0 ]; then
+        echo "[WARN] Failed to check just created cluster join lock"
+        return 1
+    fi
+
+    join_host=$(cat /opt/ignite-cassandra-tests/bootstrap/join-lock)
+
+    if [ "$join_host" != "$HOST_NAME" ]; then
+        echo "[INFO] Node $first_host has discarded previously created cluster join lock"
+        return 1
+    fi
+
+    echo "[INFO] Congratulations, got cluster join lock"
+
+    JOIN_LOCK="true"
+
+    return 0
+}
+
+# Checks if join lock already exists in S3
+checkClusterJoinLockExist()
+{
+    echo "[INFO] Checking for the cluster join lock: $1"
+
+    lockExists=$(aws s3 ls $1)
+    if [ -n "$lockExists" ]; then
+        echo "[INFO] Cluster join lock already exists"
+        return 1
+    fi
+
+    if [ "$NODE_TYPE" == "cassandra" ]; then
+        status=$(/opt/cassandra/bin/nodetool -h $CASSANDRA_SEED status)
+        leaving=$(echo $status | grep UL)
+        moving=$(echo $status | grep UM)
+        joining=$(echo $status | grep UJ)
+
+        if [ -n "$leaving" ] || [ -n "$moving" ] || [ -n "$joining" ]; then
+            echo "[INFO] Cluster join lock doesn't exist in S3, but some node still trying to join Cassandra cluster"
+            return 1
+        fi
+    fi
+
+    echo "[INFO] Cluster join lock doesn't exist"
+}
+
+# Creates join lock in S3
+createClusterJoinLock()
+{
+    aws s3 cp --sse AES256 /opt/ignite-cassandra-tests/bootstrap/join-lock $1
+
+    if [ $? -ne 0 ]; then
+        terminate "Failed to create cluster join lock: $1"
+    fi
+
+    echo "[INFO] Created cluster join lock: $1"
+}
+
+# Removes join lock
+removeClusterJoinLock()
+{
+    if [ "$JOIN_LOCK" != "true" ]; then
+        return 0
+    fi
+
+    JOIN_LOCK_URL=$(getJoinLockUrl)
+
+    echo "[INFO] Removing cluster join lock: $JOIN_LOCK_URL"
+
+    aws s3 rm $JOIN_LOCK_URL
+
+    if [ $? -ne 0 ]; then
+        terminate "Failed to remove cluster join lock: $JOIN_LOCK_URL"
+    fi
+
+    JOIN_LOCK="false"
+
+    echo "[INFO] Removed cluster join lock: $JOIN_LOCK_URL"
+}
+
+# Waits for the node to join cluster, periodically trying to acquire cluster join lock and exiting only when node
+# successfully acquired the lock. Such mechanism used by nodes to join cluster sequentially (limitation of Cassandra).
+waitToJoinCluster()
+{
+    echo "[INFO] Waiting to join $NODE_TYPE cluster"
+
+    while true; do
+        tryToGetClusterJoinLock
+
+        if [ $? -ne 0 ]; then
+            echo "[INFO] Another node is trying to join cluster. Waiting for extra 30sec."
+            sleep 30s
+        else
+            echo "[INFO]-------------------------------------------------------------"
+            echo "[INFO] Congratulations, got lock to join $NODE_TYPE cluster"
+            echo "[INFO]-------------------------------------------------------------"
+            break
+        fi
+    done
+}
+
+# Wait for the cluster to register at least one node in S3, so that all other nodes will use already existing nodes
+# to send them info about them and join the cluster
+setupClusterSeeds()
+{
+    if [ "$1" != "cassandra" ] && [ "$1" != "ignite" ] && [ "$1" != "test" ]; then
+        terminate "Incorrect cluster type specified '$1' to setup seeds"
+    fi
+
+    DISCOVERY_URL=$(getDiscoveryUrl $1)
+
+    echo "[INFO] Setting up $1 seeds"
+
+    echo "[INFO] Looking for $1 seeds in: $DISCOVERY_URL"
+
+    startTime=$(date +%s)
+
+    while true; do
+        seeds=$(aws s3 ls $DISCOVERY_URL | grep -v PRE | sed -r "s/^.* //g")
+        if [ -n "$seeds" ]; then
+            seeds=($seeds)
+            length=${#seeds[@]}
+
+            if [ $length -lt 4 ]; then
+                seed1=${seeds[0]}
+                seed2=${seeds[1]}
+                seed3=${seeds[2]}
+            else
+                pos1=$(($RANDOM%$length))
+                pos2=$(($RANDOM%$length))
+                pos3=$(($RANDOM%$length))
+                seed1=${seeds[${pos1}]}
+                seed2=${seeds[${pos2}]}
+                seed3=${seeds[${pos3}]}
+            fi
+
+            CLUSTER_SEEDS=$seed1
+
+            if [ "$seed2" != "$seed1" ] && [ -n "$seed2" ]; then
+                CLUSTER_SEEDS="$CLUSTER_SEEDS $seed2"
+            fi
+
+            if [ "$seed3" != "$seed2" ] && [ "$seed3" != "$seed1" ] && [ -n "$seed3" ]; then
+                CLUSTER_SEEDS="$CLUSTER_SEEDS $seed3"
+            fi
+
+            echo "[INFO] Using $1 seeds: $CLUSTER_SEEDS"
+
+            return 0
+        fi
+
+        currentTime=$(date +%s)
+        duration=$(( $currentTime-$startTime ))
+        duration=$(( $duration/60 ))
+
+        if [ "$2" == "true" ]; then
+            if [ $duration -gt $SERVICE_STARTUP_TIME ]; then
+                terminate "${SERVICE_STARTUP_TIME}min timeout expired, but first $1 node is still not up and running"
+            fi
+        fi
+
+        echo "[INFO] Waiting for the first $1 node to start and publish its seed, time passed ${duration}min"
+
+        sleep 30s
+    done
+}
+
+# Wait until first cluster node registered in S3
+waitFirstClusterNodeRegistered()
+{
+    DISCOVERY_URL=$(getDiscoveryUrl)
+
+    echo "[INFO] Waiting for the first $NODE_TYPE node to register in: $DISCOVERY_URL"
+
+    startTime=$(date +%s)
+
+    while true; do
+        exists=$(aws s3 ls $DISCOVERY_URL)
+        if [ -n "$exists" ]; then
+            break
+        fi
+
+        if [ "$1" == "true" ]; then
+            currentTime=$(date +%s)
+            duration=$(( $currentTime-$startTime ))
+            duration=$(( $duration/60 ))
+
+            if [ $duration -gt $SERVICE_STARTUP_TIME ]; then
+                terminate "${SERVICE_STARTUP_TIME}min timeout expired, but first $type node is still not up and running"
+            fi
+        fi
+
+        echo "[INFO] Waiting extra 30sec"
+
+        sleep 30s
+    done
+
+    echo "[INFO] First $type node registered"
+}
+
+# Waits until all cluster nodes successfully bootstrapped. In case of Tests cluster also waits until all nodes
+# switch to waiting state
+waitAllClusterNodesReady()
+{
+    if [ "$1" == "cassandra" ]; then
+        NODES_COUNT=$CASSANDRA_NODES_COUNT
+    elif [ "$1" == "ignite" ]; then
+        NODES_COUNT=$IGNITE_NODES_COUNT
+    elif [ "$1" == "test" ]; then
+        NODES_COUNT=$TEST_NODES_COUNT
+    else
+        terminate "Incorrect cluster type specified '$1' to wait for all nodes up and running"
+    fi
+
+    SUCCESS_URL=$(getSucessUrl $1)
+
+    if [ $NODES_COUNT -eq 0 ]; then
+        return 0
+    fi
+
+    echo "[INFO] Waiting for all $NODES_COUNT $1 nodes ready"
+
+    while true; do
+        if [ "$1" == "test" ]; then
+            count1=$(aws s3 ls $S3_TESTS_WAITING | wc -l)
+            count2=$(aws s3 ls $S3_TESTS_RUNNING | wc -l)
+            count=$(( $count1+$count2 ))
+        else
+            count=$(aws s3 ls $SUCCESS_URL | wc -l)
+        fi
+
+        if [ $count -ge $NODES_COUNT ]; then
+            break
+        fi
+
+        echo "[INFO] Waiting extra 30sec"
+
+        sleep 30s
+    done
+
+    sleep 30s
+
+    echo "[INFO] Congratulation, all $NODES_COUNT $1 nodes are ready"
+}
+
+# Wait untill all Tests cluster nodes completed their tests execution
+waitAllTestNodesCompletedTests()
+{
+    HOST_NAME=$(hostname -f | tr '[:upper:]' '[:lower:]')
+
+    echo "[INFO] Waiting for all $TEST_NODES_COUNT test nodes to complete their tests"
+
+    while true; do
+
+        count=$(aws s3 ls $S3_TESTS_RUNNING | grep -v $HOST_NAME | wc -l)
+
+        if [ $count -eq 0 ]; then
+            break
+        fi
+
+        echo "[INFO] Waiting extra 30sec"
+
+        sleep 30s
+    done
+
+    echo "[INFO] Congratulation, all $TEST_NODES_COUNT test nodes have completed their tests"
+}
+
+# Installs all required Ganglia packages
+installGangliaPackages()
+{
+    if [ "$1" == "master" ]; then
+        echo "[INFO] Installing Ganglia master required packages"
+    else
+        echo "[INFO] Installing Ganglia agent required packages"
+    fi
+
+    isAmazonLinux=$(cat "/etc/issue" | grep "Amazon Linux")
+
+    if [ -z "$isAmazonLinux" ]; then
+        setenforce 0
+
+        if [ $? -ne 0 ]; then
+            terminate "Failed to turn off SELinux"
+        fi
+
+        downloadPackage "$EPEL_DOWNLOAD_URL" "/opt/epel.rpm" "EPEL"
+
+        rpm -Uvh /opt/epel.rpm
+        if [ $? -ne 0 ]; then
+            terminate "Failed to setup EPEL repository"
+        fi
+
+        rm -f /opt/epel.rpm
+    fi
+
+    yum -y install apr-devel apr-util check-devel cairo-devel pango-devel pango \
+    libxml2-devel glib2-devel dbus-devel freetype-devel freetype \
+    libpng-devel libart_lgpl-devel fontconfig-devel gcc-c++ expat-devel \
+    python-devel libXrender-devel perl-devel perl-CPAN gettext git sysstat \
+    automake autoconf ltmain.sh pkg-config gperf libtool pcre-devel libconfuse-devel
+
+    if [ $? -ne 0 ]; then
+        terminate "Failed to install all Ganglia required packages"
+    fi
+
+    if [ "$1" == "master" ]; then
+        yum -y install httpd php php-devel php-pear
+
+        if [ $? -ne 0 ]; then
+            terminate "Failed to install all Ganglia required packages"
+        fi
+
+        if [ -z "$isAmazonLinux" ]; then
+            yum -y install liberation-sans-fonts
+
+            if [ $? -ne 0 ]; then
+                terminate "Failed to install liberation-sans-fonts package"
+            fi
+        fi
+    fi
+
+    if [ -z "$isAmazonLinux" ]; then
+        downloadPackage "$GPERF_DOWNLOAD_URL" "/opt/gperf.tar.gz" "gperf"
+
+        tar -xvzf /opt/gperf.tar.gz -C /opt
+        if [ $? -ne 0 ]; then
+            terminate "Failed to untar gperf tarball"
+        fi
+
+        rm -Rf /opt/gperf.tar.gz
+
+        unzipDir=$(ls /opt | grep "gperf")
+
+        if [ $? -ne 0 ]; then
+            terminate "Failed to update creation date to current for all files inside: /opt/$unzipDir"
+        fi
+
+        pushd /opt/$unzipDir
+
+        cat ./configure | sed -r "s/test \"\\\$2\" = conftest.file/test 1 = 1/g" > ./configure1
+        rm ./configure
+        mv ./configure1 ./configure
+        chmod a+x ./configure
+
+        ./configure
+        if [ $? -ne 0 ]; then
+            terminate "Failed to configure gperf"
+        fi
+
+        make
+        if [ $? -ne 0 ]; then
+            terminate "Failed to make gperf"
+        fi
+
+        make install
+        if [ $? -ne 0 ]; then
+            terminate "Failed to install gperf"
+        fi
+
+        echo "[INFO] gperf tool successfully installed"
+
+        popd
+    fi
+
+    echo "[INFO] Installing rrdtool"
+
+    downloadPackage "$RRD_DOWNLOAD_URL" "/opt/rrdtool.tar.gz" "rrdtool"
+
+    tar -xvzf /opt/rrdtool.tar.gz -C /opt
+    if [ $? -ne 0 ]; then
+        terminate "Failed to untar rrdtool tarball"
+    fi
+
+    rm -Rf /opt/rrdtool.tar.gz
+
+    unzipDir=$(ls /opt | grep "rrdtool")
+    if [ "$unzipDir" != "rrdtool" ]; then
+        mv /opt/$unzipDir /opt/rrdtool
+    fi
+
+    if [ $? -ne 0 ]; then
+        terminate "Failed to update creation date to current for all files inside: /opt/rrdtool"
+    fi
+
+    export PKG_CONFIG_PATH=/usr/lib/pkgconfig/
+
+    pushd /opt/rrdtool
+
+    cat ./configure | sed -r "s/test \"\\\$2\" = conftest.file/test 1 = 1/g" > ./configure1
+    rm ./configure
+    mv ./configure1 ./configure
+    chmod a+x ./configure
+
+    ./configure --prefix=/usr/local/rrdtool
+    if [ $? -ne 0 ]; then
+        terminate "Failed to configure rrdtool"
+    fi
+
+    make
+    if [ $? -ne 0 ]; then
+        terminate "Failed to make rrdtool"
+    fi
+
+    make install
+    if [ $? -ne 0 ]; then
+        terminate "Failed to install rrdtool"
+    fi
+
+    ln -s /usr/local/rrdtool/bin/rrdtool /usr/bin/rrdtool
+    mkdir -p /var/lib/ganglia/rrds
+
+    chown -R nobody:nobody /usr/local/rrdtool /var/lib/ganglia/rrds /usr/bin/rrdtool
+
+    rm -Rf /opt/rrdtool
+
+    popd
+
+    echo "[INFO] rrdtool successfully installed"
+
+    echo "[INFO] Installig ganglia-core"
+
+    gitClone $GANGLIA_CORE_DOWNLOAD_URL /opt/monitor-core
+
+    if [ $? -ne 0 ]; then
+        terminate "Failed to update creation date to current for all files inside: /opt/monitor-core"
+    fi
+
+    pushd /opt/monitor-core
+
+    git checkout efe9b5e5712ea74c04e3b15a06eb21900e18db40
+
+    ./bootstrap
+
+    if [ $? -ne 0 ]; then
+        terminate "Failed to prepare ganglia-core for compilation"
+    fi
+
+    cat ./configure | sed -r "s/test \"\\\$2\" = conftest.file/test 1 = 1/g" > ./configure1
+    rm ./configure
+    mv ./configure1 ./configure
+    chmod a+x ./configure
+
+    ./configure --with-gmetad --with-librrd=/usr/local/rrdtool
+
+    if [ $? -ne 0 ]; then
+        terminate "Failed to configure ganglia-core"
+    fi
+
+    make
+    if [ $? -ne 0 ]; then
+        terminate "Failed to make ganglia-core"
+    fi
+
+    make install
+    if [ $? -ne 0 ]; then
+        terminate "Failed to install ganglia-core"
+    fi
+
+    rm -Rf /opt/monitor-core
+
+    popd
+
+    echo "[INFO] ganglia-core successfully installed"
+
+    if [ "$1" != "master" ]; then
+        return 0
+    fi
+
+    echo "[INFO] Installing ganglia-web"
+
+    gitClone $GANGLIA_WEB_DOWNLOAD_URL /opt/web
+
+    if [ $? -ne 0 ]; then
+        terminate "Failed to update creation date to current for all files inside: /opt/web"
+    fi
+
+    cat /opt/web/Makefile | sed -r "s/GDESTDIR = \/usr\/share\/ganglia-webfrontend/GDESTDIR = \/opt\/ganglia-web/g" > /opt/web/Makefile1
+    cat /opt/web/Makefile1 | sed -r "s/GCONFDIR = \/etc\/ganglia-web/GCONFDIR = \/opt\/ganglia-web/g" > /opt/web/Makefile2
+    cat /opt/web/Makefile2 | sed -r "s/GWEB_STATEDIR = \/var\/lib\/ganglia-web/GWEB_STATEDIR = \/opt\/ganglia-web/g" > /opt/web/Makefile3
+    cat /opt/web/Makefile3 | sed -r "s/APACHE_USER = www-data/APACHE_USER = apache/g" > /opt/web/Makefile4
+
+    rm -f /opt/web/Makefile
+    cp /opt/web/Makefile4 /opt/web/Makefile
+    rm -f /opt/web/Makefile1 /opt/web/Makefile2 /opt/web/Makefile3 /opt/web/Makefile4
+
+    pushd /opt/web
+
+    git checkout f2b19c7cacfc8c51921be801b92f8ed0bd4901ae
+
+    make
+
+    if [ $? -ne 0 ]; then
+        terminate "Failed to make ganglia-web"
+    fi
+
+    make install
+
+    if [ $? -ne 0 ]; then
+        terminate "Failed to install ganglia-web"
+    fi
+
+    rm -Rf /opt/web
+
+    popd
+
+    echo "" >> /etc/httpd/conf/httpd.conf
+    echo "Alias /ganglia /opt/ganglia-web" >> /etc/httpd/conf/httpd.conf
+    echo "<Directory \"/opt/ganglia-web\">" >> /etc/httpd/conf/httpd.conf
+    echo "       AllowOverride All" >> /etc/httpd/conf/httpd.conf
+    echo "       Order allow,deny" >> /etc/httpd/conf/httpd.conf
+
+    if [ -z "$isAmazonLinux" ]; then
+        echo "       Require all granted" >> /etc/httpd/conf/httpd.conf
+    fi
+
+    echo "       Allow from all" >> /etc/httpd/conf/httpd.conf
+    echo "       Deny from none" >> /etc/httpd/conf/httpd.conf
+    echo "</Directory>" >> /etc/httpd/conf/httpd.conf
+
+    echo "[INFO] ganglia-web successfully installed"
+}
+
+# Setup ntpd service
+setupNTP()
+{
+    echo "[INFO] Installing ntp package"
+
+    yum -y install ntp
+
+    if [ $? -ne 0 ]; then
+        terminate "Failed to install ntp package"
+    fi
+
+    echo "[INFO] Starting ntpd service"
+
+    service ntpd restart
+
+    if [ $? -ne 0 ]; then
+        terminate "Failed to restart ntpd service"
+    fi
+}
+
+# Installs and run Ganglia agent ('gmond' daemon)
+bootstrapGangliaAgent()
+{
+    echo "[INFO]-----------------------------------------------------------------"
+    echo "[INFO] Bootstrapping Ganglia agent"
+    echo "[INFO]-----------------------------------------------------------------"
+
+    installGangliaPackages
+
+    echo "[INFO] Running ganglia agent daemon to discover Ganglia master"
+
+    /opt/ignite-cassandra-tests/bootstrap/aws/ganglia/agent-start.sh $1 $2 > /opt/ganglia-agent.log &
+
+    echo "[INFO] Ganglia daemon job id: $!"
+}
+
+# Partitioning, formatting to ext4 and mounting all unpartitioned drives.
+# As a result env array MOUNT_POINTS provides all newly created mount points.
+mountUnpartitionedDrives()
+{
+    MOUNT_POINTS=
+
+    echo "[INFO] Mounting unpartitioned drives"
+
+    lsblk -V &> /dev/null
+
+    if [ $? -ne 0 ]; then
+        echo "[WARN] lsblk utility doesn't exist"
+        echo "[INFO] Installing util-linux-ng package"
+
+        yum -y install util-linux-ng
+
+        if [ $? -ne 0 ]; then
+            terminate "Failed to install util-linux-ng package"
+        fi
+    fi
+
+    parted -v &> /dev/null
+
+    if [ $? -ne 0 ]; then
+        echo "[WARN] parted utility doesn't exist"
+        echo "[INFO] Installing parted package"
+
+        yum -y install parted
+
+        if [ $? -ne 0 ]; then
+            terminate "Failed to install parted package"
+        fi
+    fi
+
+    drives=$(lsblk -io KNAME,TYPE | grep disk | sed -r "s/disk//g" | xargs)
+
+    echo "[INFO] Found HDDs: $drives"
+
+    unpartDrives=
+    partDrives=$(lsblk -io KNAME,TYPE | grep part | sed -r "s/[0-9]*//g" | sed -r "s/part//g" | xargs)
+
+    drives=($drives)
+	count=${#drives[@]}
+	iter=1
+
+	for (( i=0; i<=$(( $count -1 )); i++ ))
+	do
+		drive=${drives[$i]}
+
+        if [ -z "$drive" ]; then
+            continue
+        fi
+
+        isPartitioned=$(echo $partDrives | grep "$drive")
+
+        if [ -n "$isPartitioned" ]; then
+            continue
+        fi
+
+        echo "[INFO] Creating partition for the drive: $drive"
+
+        parted -s -a opt /dev/$drive mklabel gpt mkpart primary 0% 100%
+
+        if [ $? -ne 0 ]; then
+            terminate "Failed to create partition for the drive: $drive"
+        fi
+
+        partition=$(lsblk -io KNAME,TYPE | grep part | grep $drive | sed -r "s/part//g" | xargs)
+
+        echo "[INFO] Successfully created partition $partition for the drive: $drive"
+
+        echo "[INFO] Formatting partition /dev/$partition to ext4"
+
+        mkfs.ext4 -F -q /dev/$partition
+
+        if [ $? -ne 0 ]; then
+            terminate "Failed to format partition: /dev/$partition"
+        fi
+
+        echo "[INFO] Partition /dev/$partition was successfully formatted to ext4"
+
+        echo "[INFO] Mounting partition /dev/$partition to /storage$iter"
+
+        mkdir -p /storage$iter
+
+        if [ $? -ne 0 ]; then
+            terminate "Failed to create mount point directory: /storage$iter"
+        fi
+
+        echo "/dev/$partition               /storage$iter               ext4    defaults        1 1" >> /etc/fstab
+
+        mount /storage$iter
+
+        if [ $? -ne 0 ]; then
+            terminate "Failed to mount /storage$iter mount point for partition /dev/$partition"
+        fi
+
+        echo "[INFO] Partition /dev/$partition was successfully mounted to /storage$iter"
+
+        if [ -n "$MOUNT_POINTS" ]; then
+            MOUNT_POINTS="$MOUNT_POINTS "
+        fi
+
+        MOUNT_POINTS="${MOUNT_POINTS}/storage${iter}"
+
+        iter=$(($iter+1))
+    done
+
+    if [ -z "$MOUNT_POINTS" ]; then
+        echo "[INFO] All drives already have partitions created"
+    fi
+
+    MOUNT_POINTS=($MOUNT_POINTS)
+}
+
+# Creates storage directories for Cassandra: data files, commit log, saved caches.
+# As a result CASSANDRA_DATA_DIR, CASSANDRA_COMMITLOG_DIR, CASSANDRA_CACHES_DIR will point to appropriate directories.
+createCassandraStorageLayout()
+{
+    CASSANDRA_DATA_DIR=
+    CASSANDRA_COMMITLOG_DIR=
+    CASSANDRA_CACHES_DIR=
+
+    mountUnpartitionedDrives
+
+    echo "[INFO] Creating Cassandra storage layout"
+
+	count=${#MOUNT_POINTS[@]}
+
+	for (( i=0; i<=$(( $count -1 )); i++ ))
+    do
+        mountPoint=${MOUNT_POINTS[$i]}
+
+        if [ -z "$CASSANDRA_DATA_DIR" ]; then
+            CASSANDRA_DATA_DIR=$mountPoint
+        elif [ -z "$CASSANDRA_COMMITLOG_DIR" ]; then
+            CASSANDRA_COMMITLOG_DIR=$mountPoint
+        elif [ -z "$CASSANDRA_CACHES_DIR" ]; then
+            CASSANDRA_CACHES_DIR=$mountPoint
+        else
+            CASSANDRA_DATA_DIR="$CASSANDRA_DATA_DIR $mountPoint"
+        fi
+    done
+
+    if [ -z "$CASSANDRA_DATA_DIR" ]; then
+        CASSANDRA_DATA_DIR="/storage/cassandra/data"
+    else
+        CASSANDRA_DATA_DIR="$CASSANDRA_DATA_DIR/cassandra_data"
+    fi
+
+    if [ -z "$CASSANDRA_COMMITLOG_DIR" ]; then
+        CASSANDRA_COMMITLOG_DIR="/storage/cassandra/commitlog"
+    else
+        CASSANDRA_COMMITLOG_DIR="$CASSANDRA_COMMITLOG_DIR/cassandra_commitlog"
+    fi
+
+    if [ -z "$CASSANDRA_CACHES_DIR" ]; then
+        CASSANDRA_CACHES_DIR="/storage/cassandra/saved_caches"
+    else
+        CASSANDRA_CACHES_DIR="$CASSANDRA_CACHES_DIR/cassandra_caches"
+    fi
+
+    echo "[INFO] Cassandra data dir: $CASSANDRA_DATA_DIR"
+    echo "[INFO] Cassandra commit log dir: $CASSANDRA_COMMITLOG_DIR"
+    echo "[INFO] Cassandra saved caches dir: $CASSANDRA_CACHES_DIR"
+
+    dirs=("$CASSANDRA_DATA_DIR $CASSANDRA_COMMITLOG_DIR $CASSANDRA_CACHES_DIR")
+
+	count=${#dirs[@]}
+
+	for (( i=0; i<=$(( $count -1 )); i++ ))
+    do
+        directory=${dirs[$i]}
+
+        mkdir -p $directory
+
+        if [ $? -ne 0 ]; then
+            terminate "Failed to create directory: $directory"
+        fi
+
+        chown -R cassandra:cassandra $directory
+
+        if [ $? -ne 0 ]; then
+            terminate "Failed to assign cassandra:cassandra as an owner of directory $directory"
+        fi
+    done
+
+    DATA_DIR_SPEC="\n"
+
+    dirs=($CASSANDRA_DATA_DIR)
+
+	count=${#dirs[@]}
+
+	for (( i=0; i<=$(( $count -1 )); i++ ))
+    do
+        dataDir=${dirs[$i]}
+        DATA_DIR_SPEC="${DATA_DIR_SPEC}     - ${dataDir}\n"
+    done
+
+    CASSANDRA_DATA_DIR=$(echo $DATA_DIR_SPEC | sed -r "s/\//\\\\\//g")
+    CASSANDRA_COMMITLOG_DIR=$(echo $CASSANDRA_COMMITLOG_DIR | sed -r "s/\//\\\\\//g")
+    CASSANDRA_CACHES_DIR=$(echo $CASSANDRA_CACHES_DIR | sed -r "s/\//\\\\\//g")
+}
+
+# Attaches environment configuration settings
+. $( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/env.sh
+
+# Validates environment settings
+validate
+
+# Validates node type of EC2 instance
+if [ "$1" != "cassandra" ] && [ "$1" != "ignite" ] && [ "$1" != "test" ] && [ "$1" != "ganglia" ]; then
+    echo "[ERROR] Unsupported node type specified: $1"
+    exit 1
+fi
+
+# Sets node type of EC2 instance
+export NODE_TYPE=$1

http://git-wip-us.apache.org/repos/asf/ignite/blob/231ead01/modules/cassandra/store/src/test/bootstrap/aws/env.sh
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/test/bootstrap/aws/env.sh b/modules/cassandra/store/src/test/bootstrap/aws/env.sh
new file mode 100644
index 0000000..031c5c3
--- /dev/null
+++ b/modules/cassandra/store/src/test/bootstrap/aws/env.sh
@@ -0,0 +1,113 @@
+#!/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.
+#
+
+# -----------------------------------------------------------------------------------------------
+# This file specifies environment specific settings to bootstrap required infrastructure for:
+# -----------------------------------------------------------------------------------------------
+#
+#   1) Cassandra cluster
+#   2) Ignite cluster
+#   3) Tests cluster
+#   4) Ganglia agents to be installed on each clusters machine
+#   5) Ganglia master to collect metrics from agent and show graphs on Ganglia Web dashboard
+#
+# -----------------------------------------------------------------------------------------------
+
+# EC2 tagging related settings
+export EC2_OWNER_TAG=ignite@apache.org
+export EC2_PROJECT_TAG=ignite
+export EC2_CASSANDRA_TAG=CASSANDRA
+export EC2_IGNITE_TAG=IGNITE
+export EC2_TEST_TAG=TEST
+export EC2_GANGLIA_TAG=GANGLIA
+
+# Tests summary settings
+export CASSANDRA_NODES_COUNT=3
+export IGNITE_NODES_COUNT=3
+export TEST_NODES_COUNT=2
+export TESTS_TYPE="ignite"
+
+# Time (in minutes) to wait for Cassandra/Ignite node up and running and register it in S3
+export SERVICE_STARTUP_TIME=10
+
+# Number of attempts to start Cassandra/Ignite daemon
+export SERVICE_START_ATTEMPTS=3
+
+# Root S3 folder
+export S3_ROOT=s3://<bucket>/<folder>
+
+# S3 folder for downloads. You should put here ignite load tests jar archive
+# (you can also download here other required artifacts like Cassandra, Ignite and etc)
+export S3_DOWNLOADS=$S3_ROOT/test
+
+# S3 root system folders where to store all infrastructure info
+export S3_SYSTEM=$S3_ROOT/test1
+
+# S3 system folders to store cluster specific info
+export S3_CASSANDRA_SYSTEM=$S3_SYSTEM/cassandra
+export S3_IGNITE_SYSTEM=$S3_SYSTEM/ignite
+export S3_TESTS_SYSTEM=$S3_SYSTEM/tests
+export S3_GANGLIA_SYSTEM=$S3_SYSTEM/ganglia
+
+# Logs related settings
+export S3_LOGS_TRIGGER=$S3_SYSTEM/logs-trigger
+export S3_LOGS_ROOT=$S3_SYSTEM/logs
+export S3_CASSANDRA_LOGS=$S3_LOGS_ROOT/cassandra
+export S3_IGNITE_LOGS=$S3_LOGS_ROOT/ignite
+export S3_TESTS_LOGS=$S3_LOGS_ROOT/tests
+export S3_GANGLIA_LOGS=$S3_LOGS_ROOT/ganglia
+
+# Cassandra related settings
+export CASSANDRA_DOWNLOAD_URL=http://archive.apache.org/dist/cassandra/3.5/apache-cassandra-3.5-bin.tar.gz
+export S3_CASSANDRA_BOOTSTRAP_SUCCESS=$S3_CASSANDRA_SYSTEM/success
+export S3_CASSANDRA_BOOTSTRAP_FAILURE=$S3_CASSANDRA_SYSTEM/failure
+export S3_CASSANDRA_NODES_DISCOVERY=$S3_CASSANDRA_SYSTEM/discovery
+export S3_CASSANDRA_FIRST_NODE_LOCK=$S3_CASSANDRA_SYSTEM/first-node-lock
+export S3_CASSANDRA_NODES_JOIN_LOCK=$S3_CASSANDRA_SYSTEM/join-lock
+
+# Ignite related settings
+export IGNITE_DOWNLOAD_URL=$S3_DOWNLOADS/apache-ignite-fabric-1.8.0-SNAPSHOT-bin.zip
+export S3_IGNITE_BOOTSTRAP_SUCCESS=$S3_IGNITE_SYSTEM/success
+export S3_IGNITE_BOOTSTRAP_FAILURE=$S3_IGNITE_SYSTEM/failure
+export S3_IGNITE_NODES_DISCOVERY=$S3_IGNITE_SYSTEM/discovery
+export S3_IGNITE_FIRST_NODE_LOCK=$S3_IGNITE_SYSTEM/first-node-lock
+export S3_IGNITE_NODES_JOIN_LOCK=$S3_IGNITE_SYSTEM/i-join-lock
+
+# Tests related settings
+export TESTS_PACKAGE_DONLOAD_URL=$S3_DOWNLOADS/ignite-cassandra-tests-1.8.0-SNAPSHOT.zip
+export S3_TESTS_TRIGGER=$S3_SYSTEM/tests-trigger
+export S3_TESTS_NODES_DISCOVERY=$S3_TESTS_SYSTEM/discovery
+export S3_TESTS_SUCCESS=$S3_TESTS_SYSTEM/success
+export S3_TESTS_FAILURE=$S3_TESTS_SYSTEM/failure
+export S3_TESTS_IDLE=$S3_TESTS_SYSTEM/idle
+export S3_TESTS_PREPARING=$S3_TESTS_SYSTEM/preparing
+export S3_TESTS_WAITING=$S3_TESTS_SYSTEM/waiting
+export S3_TESTS_RUNNING=$S3_TESTS_SYSTEM/running
+export S3_TESTS_FIRST_NODE_LOCK=$S3_TESTS_SYSTEM/first-node-lock
+export S3_TESTS_SUMMARY=$S3_SYSTEM/t-summary.zip
+
+# Ganglia related settings
+export GANGLIA_CORE_DOWNLOAD_URL=https://github.com/ganglia/monitor-core.git
+export GANGLIA_WEB_DOWNLOAD_URL=https://github.com/ganglia/ganglia-web.git
+export RRD_DOWNLOAD_URL=http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.3.1.tar.gz
+export GPERF_DOWNLOAD_URL=http://ftp.gnu.org/gnu/gperf/gperf-3.0.3.tar.gz
+export EPEL_DOWNLOAD_URL=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
+export S3_GANGLIA_BOOTSTRAP_SUCCESS=$S3_GANGLIA_SYSTEM/success
+export S3_GANGLIA_BOOTSTRAP_FAILURE=$S3_GANGLIA_SYSTEM/failure
+export S3_GANGLIA_MASTER_DISCOVERY=$S3_GANGLIA_SYSTEM/discovery
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/231ead01/modules/cassandra/store/src/test/bootstrap/aws/ganglia/agent-start.sh
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/test/bootstrap/aws/ganglia/agent-start.sh b/modules/cassandra/store/src/test/bootstrap/aws/ganglia/agent-start.sh
new file mode 100644
index 0000000..8e49c18
--- /dev/null
+++ b/modules/cassandra/store/src/test/bootstrap/aws/ganglia/agent-start.sh
@@ -0,0 +1,75 @@
+#!/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 Ganglia agent on EC2 node (used by agent-bootstrap.sh)
+# -----------------------------------------------------------------------------------------------
+
+. /opt/ignite-cassandra-tests/bootstrap/aws/common.sh "ganglia"
+
+echo "[INFO] Running Ganglia agent discovery daemon for '$1' cluster using $2 port"
+
+# Waiting for the Ganglia master node up and running
+waitFirstClusterNodeRegistered
+
+DISCOVERY_URL=$(getDiscoveryUrl)
+
+masterNode=$(aws s3 ls $DISCOVERY_URL | head -1)
+masterNode=($masterNode)
+masterNode=${masterNode[3]}
+masterNode=$(echo $masterNode | xargs)
+
+if [ $? -ne 0 ] || [ -z "$masterNode" ]; then
+    echo "[ERROR] Failed to get Ganglia master node from: $DISCOVERY_URL"
+fi
+
+echo "[INFO] Got Ganglia master node: $masterNode"
+
+echo "[INFO] Creating gmond config file"
+
+/usr/local/sbin/gmond --default_config > /opt/gmond-default.conf
+
+cat /opt/gmond-default.conf | sed -r "s/deaf = no/deaf = yes/g" | \
+sed -r "s/name = \"unspecified\"/name = \"$1\"/g" | \
+sed -r "s/#bind_hostname/bind_hostname/g" | \
+sed "0,/mcast_join = 239.2.11.71/s/mcast_join = 239.2.11.71/host = $masterNode/g" | \
+sed -r "s/mcast_join = 239.2.11.71//g" | sed -r "s/bind = 239.2.11.71//g" | \
+sed -r "s/port = 8649/port = $2/g" | sed -r "s/retry_bind = true//g" > /opt/gmond.conf
+
+echo "[INFO] Running gmond daemon to report to gmetad on $masterNode"
+
+/usr/local/sbin/gmond --conf=/opt/gmond.conf -p /opt/gmond.pid
+
+sleep 2s
+
+if [ ! -f "/opt/gmond.pid" ]; then
+    echo "[ERROR] Failed to start gmond daemon, pid file doesn't exist"
+    exit 1
+fi
+
+pid=$(cat /opt/gmond.pid)
+
+echo "[INFO] gmond daemon started, pid=$pid"
+
+exists=$(ps $pid | grep gmond)
+
+if [ -z "$exists" ]; then
+    echo "[ERROR] gmond daemon abnormally terminated"
+    exit 1
+fi
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/231ead01/modules/cassandra/store/src/test/bootstrap/aws/ganglia/ganglia-bootstrap.sh
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/test/bootstrap/aws/ganglia/ganglia-bootstrap.sh b/modules/cassandra/store/src/test/bootstrap/aws/ganglia/ganglia-bootstrap.sh
new file mode 100644
index 0000000..15fa044
--- /dev/null
+++ b/modules/cassandra/store/src/test/bootstrap/aws/ganglia/ganglia-bootstrap.sh
@@ -0,0 +1,417 @@
+#!/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 Ganglia master
+# -----------------------------------------------------------------------------------------------
+
+# 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_GANGLIA_BOOTSTRAP_SUCCESS
+    FAILURE_URL=$S3_GANGLIA_BOOTSTRAP_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] Ganglia master 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] Ganglia master 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 "ganglia"
+
+    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_GANGLIA_LOGS/$HOST_NAME" "/var/log/httpd" > /opt/logs-collector.log &
+
+    echo "[INFO] Logs collector daemon started: $!"
+
+    echo "----------------------------------------------------------------------------------------"
+    printInstanceInfo
+    echo "----------------------------------------------------------------------------------------"
+    tagInstance
+}
+
+# Creates config file for 'gmond' damon working in receiver mode
+createGmondReceiverConfig()
+{
+    /usr/local/sbin/gmond --default_config > /opt/gmond-default.conf
+    if [ $? -ne 0 ]; then
+        terminate "Failed to create gmond default config in: /opt/gmond-default.txt"
+    fi
+
+    HOST_NAME=$(hostname -f | tr '[:upper:]' '[:lower:]')
+
+    cat /opt/gmond-default.conf | sed -r "s/mute = no/mute = yes/g" | \
+    sed -r "s/name = \"unspecified\"/name = \"$1\"/g" | \
+    sed -r "s/#bind_hostname/bind_hostname/g" | \
+    sed "0,/mcast_join = 239.2.11.71/s/mcast_join = 239.2.11.71/host = $HOST_NAME/g" | \
+    sed -r "s/mcast_join = 239.2.11.71//g" | sed -r "s/bind = 239.2.11.71//g" | \
+    sed -r "s/port = 8649/port = $2/g" | sed -r "s/retry_bind = true//g" > /opt/gmond-${1}.conf
+
+    chmod a+r /opt/gmond-${1}.conf
+
+    rm -f /opt/gmond-default.conf
+}
+
+# Creates config file for 'gmond' damon working in sender-receiver mode
+createGmondSenderReceiverConfig()
+{
+    /usr/local/sbin/gmond --default_config > /opt/gmond-default.conf
+    if [ $? -ne 0 ]; then
+        terminate "Failed to create gmond default config in: /opt/gmond-default.txt"
+    fi
+
+    HOST_NAME=$(hostname -f | tr '[:upper:]' '[:lower:]')
+
+    cat /opt/gmond-default.conf | sed -r "s/name = \"unspecified\"/name = \"$1\"/g" | \
+    sed -r "s/#bind_hostname/bind_hostname/g" | \
+    sed "0,/mcast_join = 239.2.11.71/s/mcast_join = 239.2.11.71/host = $HOST_NAME/g" | \
+    sed -r "s/mcast_join = 239.2.11.71//g" | sed -r "s/bind = 239.2.11.71//g" | \
+    sed -r "s/port = 8649/port = $2/g" | sed -r "s/retry_bind = true//g" > /opt/gmond-${1}.conf
+
+    chmod a+r /opt/gmond-${1}.conf
+
+    rm -f /opt/gmond-default.conf
+}
+
+# Downloads and setup Ganglia (and dependency) packages
+setupGangliaPackages()
+{
+    installGangliaPackages "master"
+
+    HOST_NAME=$(hostname -f | tr '[:upper:]' '[:lower:]')
+
+    echo "data_source \"cassandra\" ${HOST_NAME}:8641" > /opt/gmetad.conf
+    echo "data_source \"ignite\" ${HOST_NAME}:8642" >> /opt/gmetad.conf
+    echo "data_source \"test\" ${HOST_NAME}:8643" >> /opt/gmetad.conf
+    #echo "data_source \"ganglia\" ${HOST_NAME}:8644" >> /opt/gmetad.conf
+    echo "setuid_username \"nobody\"" >> /opt/gmetad.conf
+    echo "case_sensitive_hostnames 0" >> /opt/gmetad.conf
+
+    chmod a+r /opt/gmetad.conf
+
+    createGmondReceiverConfig cassandra 8641
+    createGmondReceiverConfig ignite 8642
+    createGmondReceiverConfig test 8643
+    #createGmondSenderReceiverConfig ganglia 8644
+}
+
+# Starts 'gmond' receiver damon
+startGmondReceiver()
+{
+    configFile=/opt/gmond-${1}.conf
+    pidFile=/opt/gmond-${1}.pid
+
+    echo "[INFO] Starting gmond receiver daemon for $1 cluster using config file: $configFile"
+
+    rm -f $pidFile
+
+    /usr/local/sbin/gmond --conf=$configFile --pid-file=$pidFile
+
+    sleep 2s
+
+    if [ ! -f "$pidFile" ]; then
+        terminate "Failed to start gmond daemon for $1 cluster, pid file doesn't exist"
+    fi
+
+    pid=$(cat $pidFile)
+
+    echo "[INFO] gmond daemon for $1 cluster started, pid=$pid"
+
+    exists=$(ps $pid | grep gmond)
+
+    if [ -z "$exists" ]; then
+        terminate "gmond daemon for $1 cluster abnormally terminated"
+    fi
+}
+
+# Starts 'gmetad' daemon
+startGmetadCollector()
+{
+    echo "[INFO] Starting gmetad daemon"
+
+    rm -f /opt/gmetad.pid
+
+    /usr/local/sbin/gmetad --conf=/opt/gmetad.conf --pid-file=/opt/gmetad.pid
+
+    sleep 2s
+
+    if [ ! -f "/opt/gmetad.pid" ]; then
+        terminate "Failed to start gmetad daemon, pid file doesn't exist"
+    fi
+
+    pid=$(cat /opt/gmetad.pid)
+
+    echo "[INFO] gmetad daemon started, pid=$pid"
+
+    exists=$(ps $pid | grep gmetad)
+
+    if [ -z "$exists" ]; then
+        terminate "gmetad daemon abnormally terminated"
+    fi
+}
+
+# Starts Apache 'httpd' service
+startHttpdService()
+{
+    echo "[INFO] Starting httpd service"
+
+    service httpd start
+
+    if [ $? -ne 0 ]; then
+        terminate "Failed to start httpd service"
+    fi
+
+    sleep 5s
+
+    exists=$(service httpd status | grep running)
+    if [ -z "$exists" ]; then
+        terminate "httpd service process terminated"
+    fi
+
+    echo "[INFO] httpd service successfully started"
+}
+
+###################################################################################################################
+
+echo "[INFO]-----------------------------------------------------------------"
+echo "[INFO] Bootstrapping Ganglia master server"
+echo "[INFO]-----------------------------------------------------------------"
+
+setupPreRequisites
+setupJava
+setupAWSCLI
+setupTestsPackage
+setupGangliaPackages
+
+registerNode
+
+startGmondReceiver cassandra
+startGmondReceiver ignite
+startGmondReceiver test
+#startGmondReceiver ganglia
+startGmetadCollector
+startHttpdService
+
+terminate

http://git-wip-us.apache.org/repos/asf/ignite/blob/231ead01/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-bootstrap.sh
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-bootstrap.sh b/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-bootstrap.sh
new file mode 100644
index 0000000..7f97ea1
--- /dev/null
+++ b/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-bootstrap.sh
@@ -0,0 +1,336 @@
+#!/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 Ignite 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_IGNITE_BOOTSTRAP_SUCCESS
+    FAILURE_URL=$S3_IGNITE_BOOTSTRAP_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] Ignite 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] Ignite 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 "ignite"
+
+    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_IGNITE_LOGS/$HOST_NAME" "/opt/ignite/work/log" "/opt/ignite/ignite-start.log" > /opt/logs-collector.log &
+
+    echo "[INFO] Logs collector daemon started: $!"
+
+    echo "----------------------------------------------------------------------------------------"
+    printInstanceInfo
+    echo "----------------------------------------------------------------------------------------"
+    tagInstance
+    bootstrapGangliaAgent "ignite" 8642
+}
+
+# Downloads Ignite package
+downloadIgnite()
+{
+    downloadPackage "$IGNITE_DOWNLOAD_URL" "/opt/ignite.zip" "Ignite"
+
+    rm -Rf /opt/ignite
+
+    echo "[INFO] Unzipping Ignite package"
+    unzip /opt/ignite.zip -d /opt
+    if [ $? -ne 0 ]; then
+        terminate "Failed to unzip Ignite package"
+    fi
+
+    rm -f /opt/ignite.zip
+
+    unzipDir=$(ls /opt | grep "ignite" | grep "apache")
+    if [ "$unzipDir" != "ignite" ]; then
+        mv /opt/$unzipDir /opt/ignite
+    fi
+}
+
+# Setups Ignite
+setupIgnite()
+{
+    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
+
+    testsJar=$(find /opt/ignite-cassandra-tests -type f -name "*.jar" | grep ignite-cassandra- | grep tests.jar)
+    if [ -n "$testsJar" ]; then
+        echo "[INFO] Coping tests jar $testsJar into /opt/ignite/libs/optional/ignite-cassandra"
+        cp $testsJar /opt/ignite/libs/optional/ignite-cassandra
+        if [ $? -ne 0 ]; then
+            terminate "Failed copy $testsJar into /opt/ignite/libs/optional/ignite-cassandra"
+        fi
+    fi
+
+    rm -f /opt/ignite/config/ignite-cassandra-server-template.xml
+    mv -f /opt/ignite-cassandra-tests/bootstrap/aws/ignite/ignite-cassandra-server-template.xml /opt/ignite/config
+
+    chown -R ignite:ignite /opt/ignite /opt/ignite-cassandra-tests
+
+    echo "export JAVA_HOME=/opt/java" >> $1
+    echo "export IGNITE_HOME=/opt/ignite" >> $1
+    echo "export USER_LIBS=\$IGNITE_HOME/libs/optional/ignite-cassandra/*:\$IGNITE_HOME/libs/optional/ignite-slf4j/*" >> $1
+    echo "export PATH=\$JAVA_HOME/bin:\$IGNITE_HOME/bin:\$PATH" >> $1
+}
+
+###################################################################################################################
+
+echo "[INFO]-----------------------------------------------------------------"
+echo "[INFO] Bootstrapping Ignite node"
+echo "[INFO]-----------------------------------------------------------------"
+
+setupPreRequisites
+setupJava
+setupAWSCLI
+setupTestsPackage
+
+downloadIgnite
+setupIgnite "/root/.bash_profile"
+
+cmd="/opt/ignite-cassandra-tests/bootstrap/aws/ignite/ignite-start.sh"
+
+#sudo -u ignite -g ignite sh -c "$cmd | tee /opt/ignite/ignite-start.log"
+
+$cmd | tee /opt/ignite/ignite-start.log
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/231ead01/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-cassandra-server-template.xml
----------------------------------------------------------------------
diff --git a/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-cassandra-server-template.xml b/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-cassandra-server-template.xml
new file mode 100644
index 0000000..03b3346
--- /dev/null
+++ b/modules/cassandra/store/src/test/bootstrap/aws/ignite/ignite-cassandra-server-template.xml
@@ -0,0 +1,190 @@
+<?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">
+
+    <!-- Cassandra connection settings -->
+    <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">
+
+        <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>
+
+        <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>