#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Validate scontrol update command for jobs.
############################################################################
# Copyright (C) 2002-2007 The Regents of the University of California.
# Copyright (C) 2008 Lawrence Livermore National Security.
# 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 authorized    1
set file_in       "$test_dir/input"
set job_id        0
set new_prio      1
set read_priority -1

proc cleanup {} {
	global job_id

	cancel_job $job_id
}

#
# Build input script file
#
make_bash_script $file_in "$srun $bin_sleep 60"

#
# Submit a job so we have something to work with
#
spawn $sbatch --output=/dev/null --error=/dev/null -t1 --hold $file_in
expect {
	-re "Submitted batch job ($number)" {
		set job_id $expect_out(1,string)
		exp_continue
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
if {$job_id == 0} {
	fail "srun failed to initiate job"
}

#
# Record that job's state
#
spawn $scontrol show job $job_id
expect {
	-re "Priority=($number)" {
		set read_priority $expect_out(1,string)
		exp_continue
	}
	timeout {
		fail "scontrol not responding"
	}
	eof {
		wait
	}
}
subtest {$read_priority == 0} "Verify the job's initial hold priority"

#
# Change that job's priority
#
spawn $scontrol release $job_id
expect {
	-re "slurm_update error: Access.*denied" {
		skip "User not authorized to modify jobs"
	}
	timeout {
		fail "scontrol not responding"
	}
	eof {
		wait
	}
}

#
# Change that job's priority
#
set validate_new_priority 1
spawn $scontrol update Jobid=$job_id Priority=$new_prio
expect {
	-re "Changes to job priority are not persistent, change nice instead for job $job_id" {
		log_warn "Setting priority directly by normal user is only temporary"
		set validate_new_priority 0
		exp_continue
	}
	-re "slurm_update error: Access.*denied" {
		skip "User not authorized to modify jobs"
	}
	timeout {
		fail "scontrol not responding"
	}
	eof {
		wait
	}
}

#
# Validate that job's new priority
#
spawn $scontrol show job $job_id
expect {
	-re "Priority=($number)" {
		set read_priority $expect_out(1,string)
		exp_continue
	}
	timeout {
		fail "scontrol not responding"
	}
	eof {
		wait
	}
}
subtest {! $validate_new_priority || ($read_priority == $new_prio)} "Verify the job's new priority"
