# 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.

TYPE="worker"
DAEMON="spark-${TYPE}"
DESC="Spark ${TYPE}"
EXEC_PATH="/usr/lib/spark/bin/spark-class"
SVC_USER="spark"
WORKING_DIR="/var/lib/spark"
DAEMON_FLAGS=""
CONF_DIR="/etc/spark/conf"
PIDFILE="/var/run/spark/${DAEMON}.pid"

generate_start() {

cat <<'__EOT__'
start() {
    [ -x $EXE_FILE ] || exit $ERROR_PROGRAM_NOT_INSTALLED
    log_success_msg "Starting $DESC (${DAEMON}): "

    checkstatusofproc
    status=$?
    if [ "$status" -eq "$STATUS_RUNNING" ]; then
        log_success_msg "${DESC} is running"
        exit 0
    fi

    LOG_FILE=/var/log/spark/${DAEMON}.out

    if [ -f $CONF_DIR/spark-env.sh ]; then
        . $CONF_DIR/spark-env.sh
    fi

    su -s /bin/bash $SVC_USER -c "nohup nice -n 0 \
        ${EXEC_PATH} org.apache.spark.deploy.worker.Worker $SPARK_MASTER_URL $DAEMON_FLAGS \
        > $LOG_FILE 2>&1 & "'echo $!' > "$PIDFILE"

    sleep 3

    checkstatusofproc
    RETVAL=$?
    [ $RETVAL -eq $STATUS_RUNNING ] && touch $LOCKFILE
    return $RETVAL
}
__EOT__

}

generate_stop() {

cat <<'__EOT__'
stop() {
    log_success_msg "Stopping $DESC (${DAEMON}): "
    killproc -p $PIDFILE java
    RETVAL=$?

    [ $RETVAL -eq $RETVAL_SUCCESS ] && rm -f $LOCKFILE $PIDFILE
    return $RETVAL
}
__EOT__

}

