#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Validate scontrol requeuehold requeues job to held pending state.
############################################################################
# Copyright (C) SchedMD LLC.
#
# 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 script             "$test_dir/job_script"
set job_id             0

regexp "($number)" [get_config_param "MinJobAge"] {} min_age
if {$min_age < 10} {
	skip "MinJobAge too low for this test ($min_age < 10)"
}

proc cleanup {} {
	global job_id

	cancel_job $job_id
}

make_bash_script $script "$bin_sleep 20"

proc check_hold { job } {
	global scontrol

	set hold 0
	spawn $scontrol show job $job
	expect {
		-re "Priority=0" {
			set hold 1
			exp_continue
		}
		timeout {
			fail "scontrol is not responding"
		}
		eof {
			wait
		}
	}

	subtest {$hold == 1} "Job should be on hold after it was requeued"
}

proc check_release { job } {
	global scontrol number

	set priority 0
	spawn $scontrol show job $job
	expect {
		-re "Priority=($number)" {
			set priority $expect_out(1,string)
			exp_continue
		}
		timeout {
			fail "scontrol is not responding"
		}
		eof {
			wait
		}
	}

	subtest {$priority != 0} "Priority should be set to a non-zero value after it was released"
}

spawn $sbatch -N1 -t1 -o /dev/null -e /dev/null --requeue $script
expect {
	-re "Submitted batch job ($number)" {
		set job_id $expect_out(1,string)
		exp_continue
	}
	timeout {
		fail "sbatch is not responding"
	}
	eof {
		wait
	}
}

if {$job_id == 0} {
	fail "sbatch did not submit job"
}

wait_for_job -fail $job_id "DONE"

spawn $scontrol requeuehold $job_id
expect {
	timeout {
		fail "scontrol is not responding"
	}
	eof {
		wait
	}
}

# Check if the job is in hold
check_hold $job_id

# Check that the job state is pending after released
subtest [check_job_state $job_id PENDING] "Job state should be PENDING after being released"

spawn $scontrol release $job_id
expect {
	timeout {
		fail "scontrol is not responding"
	}
	eof {
		wait
	}
}

check_release $job_id
