#!/bin/bash
# set -x
#
#  Input: path to grami file (same as Globus).
#  This script creates a temporary job script and runs it.

echo "----- starting submit_fork_job -----" 1>&2
joboption_lrms="fork"

# ARC1 passes first the config file.
if [ "$1" = "--config" ]; then shift; ARC_CONFIG=$1; shift; fi
GRAMI_FILE=$1

# define paths and config parser
basedir=`dirname $0`
basedir=`cd $basedir > /dev/null && pwd` || exit $?
. "${basedir}/lrms_common.sh"

# include common submit functions
. "${pkgdatadir}/submit_common.sh" || exit $?

# run common init 
#  * parse grami
#  * parse config
#  * load LRMS-specific env
#  * set common variables
common_init

# always local
RUNTIME_NODE_SEES_FRONTEND=yes

##############################################################
# Zero stage of runtime environments
##############################################################
RTE_stage0

##############################################################
# create job script
##############################################################
mktempscript
chmod u+x ${LRMS_JOB_SCRIPT}


##############################################################
# Start job script
##############################################################
echo '#!/bin/sh' > $LRMS_JOB_SCRIPT
echo "# Fork job script built by arex" >> $LRMS_JOB_SCRIPT
echo "" >> $LRMS_JOB_SCRIPT

##############################################################
# non-parallel jobs
##############################################################
set_count

##############################################################
# Execution times (obtained in seconds)
##############################################################
if [ ! -z "$joboption_walltime" ] ; then
  if [ $joboption_walltime -lt 0 ] ; then
    echo 'WARNING: Less than 0 wall time requested: $joboption_walltime' 1>&2
    joboption_walltime=0
    echo 'WARNING: wall time set to 0' 1>&2
  fi
  maxwalltime="$joboption_walltime"
elif [ ! -z "$joboption_cputime" ] ; then
  if [ $joboption_cputime -lt 0 ] ; then
    echo 'WARNING: Less than 0 cpu time requested: $joboption_cputime' 1>&2
    joboption_cputime=0
    echo 'WARNING: cpu time set to 0' 1>&2
  fi
  maxwalltime="$joboption_cputime"
fi
if [ ! -z "$maxwalltime" ] ; then
  echo "ulimit -t $maxwalltime" >> $LRMS_JOB_SCRIPT
fi

sourcewithargs_jobscript

##############################################################
# Override umask
##############################################################
echo "" >> $LRMS_JOB_SCRIPT
echo "# Overide umask of execution node (sometime values are really strange)" >> $LRMS_JOB_SCRIPT
echo "umask 077" >> $LRMS_JOB_SCRIPT


##############################################################
# Init accounting
##############################################################
accounting_init

##############################################################
# Add environment variables
##############################################################
add_user_env

##############################################################
# Check for existance of executable,
##############################################################
if [ -z "${joboption_arg_0}" ] ; then
  echo 'Executable is not specified' 1>&2
  exit 1
fi

setup_runtime_env

##############################################################
# Add std... to job arguments
##############################################################
include_std_streams

##############################################################
#  Move files to local working directory (job is done on node only)
#  RUNTIME_JOB_DIR -> RUNTIME_LOCAL_SCRATCH_DIR/job_id
##############################################################
move_files_to_node 

echo "" >> $LRMS_JOB_SCRIPT
echo "RESULT=0" >> $LRMS_JOB_SCRIPT
echo "" >> $LRMS_JOB_SCRIPT

echo "" >> $LRMS_JOB_SCRIPT
echo "if [ \"\$RESULT\" = '0' ] ; then" >> $LRMS_JOB_SCRIPT

##############################################################
#  Runtime configuration
##############################################################
RTE_stage1 
echo "echo \"runtimeenvironments=\$runtimeenvironments\" >> \"\$RUNTIME_JOB_DIAG\"" >> $LRMS_JOB_SCRIPT

#####################################################
# Accounting (WN OS Detection)
#####################################################
detect_wn_systemsoftware

#####################################################
#  Go to working dir and start job
#####################################################
# Set the nice value (20 to -20) based on priority (1 to 100)
# Note negative values are normally only settable by superusers 
priority=$joboption_priority
if [ ! -z $priority ]; then
    if [ `id -u` = '0' ]; then
        nicevalue=$[ 20 - ($priority * 2 / 5) ]
    else
        nicevalue=$[ 20 - ($priority / 5) ]
    fi
    joboption_args="nice -n $nicevalue $joboption_args"
fi

cd_and_run
echo "fi" >> $LRMS_JOB_SCRIPT

echo "" >> $LRMS_JOB_SCRIPT

##############################################################
#  Runtime (post)configuration at computing node
##############################################################
RTE_stage2

##############################################################
#  Move files back to session directory (job is done on node only)
#  RUNTIME_JOB_DIR -> RUNTIME_LOCAL_SCRATCH_DIR/job_id
##############################################################
move_files_to_frontend

##############################################################
# Finish accounting and exit job
##############################################################
accounting_end

#######################################
# watcher process
#######################################

JOB_ID=

cleanup() {
    [ -n "$JOB_ID" ] && kill -9 $JOB_ID 2>/dev/null
    # remove temp files
    rm -f "$LRMS_JOB_SCRIPT" "$LRMS_JOB_OUT"
}

watcher() {
    "$1" > "$2" 2>&1 &
    rc=$?
    JOB_ID=$!
    export JOB_ID
    trap cleanup 0 1 2 3 4 5 6 7 8 10 12 15
    if [ $rc -ne 0 ]; then
        echo "FAIL" > "$3"
        exit 1
    else
        echo "OK" > "$3"
        wait $JOB_ID
    fi
}

#######################################
#  Submit the job
#######################################
echo "job script ${LRMS_JOB_SCRIPT} built:" 1>&2
echo "-------------------------------------------------------------------" 1>&2
cat "$LRMS_JOB_SCRIPT" 1>&2
echo "-------------------------------------------------------------------" 1>&2
echo "" 1>&2

# simple queuing system: make hard reference to the queue
cd "$joboption_directory" 1>&2 || { echo "Could not cd to $joboption_directory, aborting" && exit 1; }
# Bash (but not dash) needs the parantheses, otherwise 'trap' has no effect!
( watcher "$LRMS_JOB_SCRIPT" "${joboption_directory}.comment" "$LRMS_JOB_ERR"; ) &
job_id=$!
result=
while [ -z "$result" ]; do
    sleep 1
    result=`cat $LRMS_JOB_ERR`
done

case "$result" in
    OK)
        echo "job submitted successfully!" 1>&2
        echo "local job id: $job_id" 1>&2
        echo "joboption_jobid=$job_id" >> $GRAMI_FILE
        rc=0
        ;;
    *)
        echo "job *NOT* submitted successfully!" 1>&2
        echo "" 1>&2
        echo "Output is:" 1>&2
        cat $LRMS_JOB_OUT 1>&2
        rm -f $LRMS_JOB_SCRIPT $LRMS_JOB_OUT $LRMS_JOB_ERR
        rc=1
        ;;
esac
rm "$LRMS_JOB_ERR"

echo "----- exiting submit_fork_job -----" 1>&2
echo "" 1>&2
exit $rc