#!/bin/bash

SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
. $SCRIPT_DIR/common.sh "$@"


echo "-- SETTING UP SPARK ------------------------------------------------------------"

export SPARK_VERSION=2.2.0

echo " - Creating spark user (if not exist)"
spark_user_id=`id -u spark > /tmp/es_install_log 2>&1`
if [[ $? != 0 ]]; then
    sudo useradd spark    

    echo " - Adding spark to the 'mes' group so spark history server can access mes jobs"
    sudo usermod -G mes,spark spark
fi

echo " - Simlinking spark config to /usr/local/etc/spark"
sudo ln -s /usr/local/lib/spark-$SPARK_VERSION/conf /usr/local/etc/spark

echo " - Simlinking spark binaries to /usr/local/bin"
for i in `ls -1 /usr/local/lib/spark-$SPARK_VERSION/bin`; do 
	sudo ln -s /usr/local/lib/spark-$SPARK_VERSION/bin/$i /usr/local/bin/$i
done

echo " - Simlinking spark system binaries to /usr/local/sbin"
sudo ln -s /usr/local/lib/spark-$SPARK_VERSION/sbin/slaves.sh /usr/local/sbin/slaves.sh
for i in `ls -1 /usr/local/lib/spark-$SPARK_VERSION/sbin/spark*`; do 
	sudo ln -s $i /usr/local/sbin/`basename $i`
done
for i in `ls -1 /usr/local/lib/spark-$SPARK_VERSION/sbin/start*`; do 
	sudo ln -s $i /usr/local/sbin/spark-`basename $i`
done
for i in `ls -1 /usr/local/lib/spark-$SPARK_VERSION/sbin/stop*`; do 
	sudo ln -s $i /usr/local/sbin/spark-`basename $i`
done

echo " - Creating spark event log directory in /var/lib/spark/eventlog"
sudo mkdir -p /var/lib/spark/eventlog
sudo chown -R spark /var/lib/spark/eventlog
sudo chmod -R 777 /var/lib/spark/eventlog

echo " - Opening rights to logs folder to user spark"
sudo mkdir -p /usr/local/lib/spark-$SPARK_VERSION/logs
sudo chmod -R 777 /usr/local/lib/spark-$SPARK_VERSION/logs

echo " - Simlinking spark logs to /var/log/"
sudo ln -s /usr/local/lib/spark-$SPARK_VERSION/logs /var/log/spark

if [[ $IS_MASTER == 1 ]]; then

    echo " - Copying spark-mesos-dispatcher systemd file"
    sudo cp $SCRIPT_DIR/utils/spark-mesos-dispatcher.service /lib/systemd/system/
    sudo chmod 644 /lib/systemd/system/spark-mesos-dispatcher.service

    echo " - Checking Systemd file"
    if [[ `systemctl status spark-mesos-dispatcher | grep 'could not be found'` != "" ]]; then
        echo "spark-mesos-dispatcher systemd file installation failed"
        exit -12
    fi
    sudo systemctl status spark-mesos-dispatcher > /tmp/spark_install_log 2>&1
    if [[ $? != 0 && $? != 3 ]]; then
        echo "spark-mesos-dispatcher systemd file doesn't work as expected"
        exit -12
    fi  

    echo " - Copying spark-history-server systemd file"
    sudo cp $SCRIPT_DIR/utils/spark-history-server.service /lib/systemd/system/
    sudo chmod 644 /lib/systemd/system/spark-history-server.service

    echo " - Checking Systemd file"
    if [[ `systemctl status spark-history-server | grep 'could not be found'` != "" ]]; then
        echo "spark-history-server systemd file installation failed"
        exit -12
    fi
    sudo systemctl status spark-history-server > /tmp/spark_install_log 2>&1
    if [[ $? != 0 && $? != 3 ]]; then
        echo "spark-history-server systemd file doesn't work as expected"
        exit -12
    fi  

fi

echo " - Defining SPARK_HOME variable"
sudo bash -c "echo -e \"\n# Environment variables required for spark\" >> /etc/profile"
sudo bash -c "echo -e \"\nexport SPARK_HOME=/usr/local/lib/spark-$SPARK_VERSION/\" >> /etc/profile"

echo " - Creating spark environment file"
sudo rm -Rf /usr/local/lib/spark-$SPARK_VERSION/conf/spark-env.sh
sudo bash -c "echo -e \"\n#point to your libmesos.so if you use Mesos \"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-env.sh"
sudo bash -c "echo -e \"export MESOS_NATIVE_JAVA_LIBRARY=/usr/local/lib/mesos-1.3.0/lib/libmesos.so\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-env.sh"
sudo bash -c "echo -e \"\n#Important configuration directories \"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-env.sh"
sudo bash -c "echo -e \"export SPARK_CONF_DIR=/usr/local/lib/spark-$SPARK_VERSION/conf\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-env.sh"
sudo bash -c "echo -e \"export SPARK_LOG_DIR=/usr/local/lib/spark-$SPARK_VERSION/logs\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-env.sh"

echo " - Creating spark default configuration file"
sudo rm -Rf /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf
sudo bash -c "echo -e \"\n#Finding the mesos master through zookeeper\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"spark.master=mesos://zk://$MASTER_IP:2181/mesos\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"

sudo bash -c "echo -e \"\n#Activating EventLog stuff\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"spark.eventLog.enabled=true\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"spark.eventLog.dir=/var/lib/spark/eventlog\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"

sudo bash -c "echo -e \"\n#Default serializer\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"spark.serializer=org.apache.spark.serializer.KryoSerializer\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"

sudo bash -c "echo -e \"\n#Limiting the driver (client) memory\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"spark.driver.memory=800m\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"

sudo bash -c "echo -e \"\n#Settings required for Spark driver distribution over mesos cluster (Cluster Mode through Mesos Dispatcher)\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"spark.mesos.executor.home=/usr/local/lib/spark-$SPARK_VERSION/\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"

sudo bash -c "echo -e \"\n#If set to true, runs over Mesos clusters in coarse-grained sharing mode, \"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"#where Spark acquires one long-lived Mesos task on each machine. \"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"#If set to false, runs over Mesos cluster in fine-grained sharing mode,\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"#where one Mesos task is created per Spark task.\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"#(Fine grained mode is deprecated and one should consider dynamic allocation instead)\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"spark.mesos.coarse=true\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"

sudo bash -c "echo -e \"\n#ElasticSearch setting (first node to be reached => can use localhost eerywhere)\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"spark.es.nodes=localhost\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"spark.es.port=9200\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"es.nodes.data.only=false\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"

sudo bash -c "echo -e \"\n#The scheduling mode between jobs submitted to the same SparkContext.\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"#Can be FIFO or FAIR. FAIR Seem not to work well with mesos\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"#(FIFO is the default BTW ...)\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"spark.scheduler.mode=FIFO\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"

sudo bash -c "echo -e \"\n#How long to wait to launch a data-local task before giving up and launching it on a less-local node.\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
sudo bash -c "echo -e \"spark.locality.wait=20s\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"


if [[ $IS_MASTER == 1 ]]; then

    echo " - Defining history server configuration properties"
    sudo bash -c "echo -e \"\n#For the filesystem history provider, the directory containing application event logs to load.\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
    sudo bash -c "echo -e \"spark.history.fs.logDirectory=file:///var/lib/spark/eventlog\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"

    sudo bash -c "echo -e \"\n#The period at which to check for new or updated logs in the log directory.\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"
    sudo bash -c "echo -e \"spark.history.fs.update.interval=5s\"  >> /usr/local/lib/spark-$SPARK_VERSION/conf/spark-defaults.conf"

fi


echo " - Copying log4j.properties from template"
sudo cp /usr/local/lib/spark-$SPARK_VERSION/conf/log4j.properties.template /usr/local/lib/spark-$SPARK_VERSION/conf/log4j.properties

if [[ $IS_MASTER == 1 ]]; then

    echo " - Creating start-spark-mesos-dispatcher-wrapper.sh wrapper (changing name to start-mesos-dispatcher-wrapper.sh)"
    sudo cp $SCRIPT_DIR/utils/start-spark-mesos-dispatcher-wrapper.sh /usr/local/lib/spark-$SPARK_VERSION/sbin/start-mesos-dispatcher-wrapper.sh
    sudo sed -i s/"XXX.XXX.XXX.XXX"/"$MASTER_IP"/g /usr/local/lib/spark-$SPARK_VERSION/sbin/start-mesos-dispatcher-wrapper.sh
    sudo chmod 755 /usr/local/lib/spark-$SPARK_VERSION/sbin/start-mesos-dispatcher-wrapper.sh

    echo " - Testing systemd startup - starting spark-mesos-dispatcher"
    sudo systemctl start spark-mesos-dispatcher > /tmp/spark_install_log 2>&1
    fail_if_error $? "/tmp/spark_install_log" -1

    echo " - Testing systemd startup - Checking spark-mesos-dispatcher startup"
    sleep 8
    sudo systemctl status spark-mesos-dispatcher > /tmp/spark_install_log 2>&1
    fail_if_error $? "/tmp/spark_install_log" -1

    echo " - Testing systemd startup - stopping spark-mesos-dispatcher"
    sudo systemctl stop spark-mesos-dispatcher > /tmp/spark_install_log 2>&1
    fail_if_error $? "/tmp/spark_install_log" -1

    echo " - Enabling spark-mesos-dispatcher on startup"
    sudo systemctl enable spark-mesos-dispatcher > /tmp/spark_install_log 2>&1
    fail_if_error $? "/tmp/spark_install_log" -1

    echo " - Creating start-spark-history-server-wrapper.sh wrapper (changing name to start-history-server-wrapper.sh)"
    sudo cp $SCRIPT_DIR/utils/start-spark-history-server-wrapper.sh /usr/local/lib/spark-$SPARK_VERSION/sbin/start-history-server-wrapper.sh
    sudo sed -i s/"XXX.XXX.XXX.XXX"/"$MASTER_IP"/g /usr/local/lib/spark-$SPARK_VERSION/sbin/start-history-server-wrapper.sh
    sudo chmod 755 /usr/local/lib/spark-$SPARK_VERSION/sbin/start-history-server-wrapper.sh

    echo " - Testing systemd startup - starting spark-history-server"
    sudo systemctl start spark-history-server > /tmp/spark_install_log 2>&1
    fail_if_error $? "/tmp/spark_install_log" -1

    echo " - Testing systemd startup - Checking spark-history-server startup"
    sleep 8
    sudo systemctl status spark-history-server > /tmp/spark_install_log 2>&1
    fail_if_error $? "/tmp/spark_install_log" -1

    echo " - Testing systemd startup - stopping spark-history-server"
    sudo systemctl stop spark-history-server > /tmp/spark_install_log 2>&1
    fail_if_error $? "/tmp/spark_install_log" -1

    echo " - Enabling spark-history-server on startup"
    sudo systemctl enable spark-history-server > /tmp/spark_install_log 2>&1
    fail_if_error $? "/tmp/spark_install_log" -1

fi


