#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          strigger --set (job options)
############################################################################
# Copyright (C) 2007 The Regents of the University of California.
# Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
# Written by Morris Jette <jette1@llnl.gov>
# CODE-OCEC-09-009. All rights reserved.
#
# This file is part of Slurm, a resource management program.
# For details, see <https://slurm.schedmd.com/>.
# Please also read the included file: DISCLAIMER.
#
# Slurm is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option)
# any later version.
#
# Slurm is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along
# with Slurm; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.
############################################################################
source ./globals

set file_in       "$test_dir/input"
set file_in_fini  "$test_dir/fini_input"
set file_in_time  "$test_dir/time_input"
set file_out_fini "$test_dir/fini_output"
set file_out_time "$test_dir/time_output"
set job_id        0

proc cleanup {} {
	global job_id

	cancel_job $job_id
}

#
# get my uid and clear any vestigial triggers
#
set uid [get_my_uid]
if {$uid == 0} {
	skip "This test can't be run as user root"
}
exec $strigger --clear --quiet --user=$uid

#
# Build input script file and submit a job
#
make_bash_script $file_in "$srun sleep 60"

spawn $sbatch --output=/dev/null -t2 $file_in
expect {
	-re "Submitted batch job ($number)" {
		set job_id $expect_out(1,string)
		exp_continue
	}
	timeout {
		kill_srun
		fail "srun not responding"
	}
	eof {
		wait
	}
}
if {$job_id == 0} {
	fail "Batch submit failure"
}

#
# Now add a couple of triggers for that job
#
make_bash_script $file_in_time "
	$squeue -j $job_id >$file_out_time"
make_bash_script $file_in_fini "
	$bin_sleep 5
	$squeue -j $job_id -tall >$file_out_fini 2>&1"

set disabled 0
set matches  0
spawn $strigger --set -v --time --jobid=$job_id --offset=-90 --program=$file_in_time
expect {
	-re "permission denied" {
		set disabled 1
		exp_continue
	}
	-re "trigger set" {
		incr matches
		exp_continue
	}
	timeout {
		fail "strigger not responding"
	}
	eof {
		wait
	}
}
if {$disabled == 1} {
	skip "Current configuration prevents setting triggers. Need to run as SlurmUser or make SlurmUser=root"
}
if {$matches == 0} {
	fail "Trigger creation failure"
}

set matches 0
spawn $strigger --set -v --fini --jobid=$job_id --program=$file_in_fini
expect {
	-re "trigger set" {
		incr matches
		exp_continue
	}
	timeout {
		fail "strigger not responding"
	}
	eof {
		wait
	}
}
if {$matches == 0} {
	fail "Trigger creation failure"
}

set matches 0
spawn $strigger --get -v --jobid=$job_id
expect {
	-re "$job_id" {
		incr matches
		exp_continue
	}
	timeout {
		fail "strigger not responding"
	}
	eof {
		wait
	}
}
if {$matches < 2} {
	fail "Trigger get failure"
}

wait_for_job -fail $job_id RUNNING
sleep 60
wait_for_job -fail $job_id DONE
wait_for_file -fail $file_out_time
set run_time 0
spawn $bin_cat $file_out_time
expect {
	-re "R *0:($number)" {
		set run_time $expect_out(1,string)
		exp_continue
	}
	-re "CG *0:($number)" {
		fail "Job unexpected found in completing state. This may be a sign of node failure and job requeue. Check for job state transitions through RUNNING,COMPLETING, PENDING and RUNNING again"
	}
	eof {
		wait
	}
}
#	Trigger events happen on a periodic basis, so there is likely to
#	be a delay up to 20 seconds
if {$run_time < 30 || $run_time > 59} {
	fail "File ($file_out_time) contents are bad, run time"
}
wait_for_file -fail $file_out_fini
#	Check that job run time was one minute. If Slurm is configured to
#	power down idle nodes, this could possibly take a bit more time.
set job_fini 0
set job_purge 0
spawn $bin_cat $file_out_fini
expect {
	-re "Invalid job id specified" {
		set job_purge 1
		exp_continue
	}
	-re "CD *1:($number)" {
		set job_fini 1
		exp_continue
	}
	eof {
		wait
	}
}
if {$job_fini == 0} {
	if {$job_purge == 1} {
		regexp "($number)" [get_config_param "MinJobAge"] {} min_job_age
	}
	if {$job_purge == 1 && $min_job_age < 60} {
		log_warn "MinJobAge ($min_job_age) configured too low to capture job state after completion"
	} elseif [regexp {^(?:NONE|0 sec)$} [get_config_param "SuspendTime"]] {
		fail "Power save mode is enabled. File ($file_out_fini) contents are bad, CD run time"
	} else {
		log_warn "Job timeout bad, possibly due to power save mode"
	}
}
