#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Test of advanced reservation of licenses.
############################################################################
# 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 license_name        $test_name
set resv_name           "resv$test_id"
set user_name           ""
set job_id1             0
set job_id2             0

proc submit_job { license_count } {
	global bin_sleep license_name sbatch number
	set job_id 0
	spawn $sbatch -n1 -t1 -o /dev/null -L $license_name:$license_count --wrap "$bin_sleep 300"
	expect {
		-re "Submitted batch job ($number)" {
			set job_id $expect_out(1,string)
			exp_continue
		}
		timeout {
			fail "sbatch not responding"
		}
		eof {
			wait
		}
	}
	if { $job_id == 0 } {
		fail "Failed to submit job"
	}
	return $job_id
}

proc reason_is_licenses { job_id } {
	global squeue

	set reason_licenses 0
	spawn $squeue -j $job_id -o "%r"
	expect {
		-re "Licenses" {
			set reason_licenses 1
			exp_continue
		}
		timeout {
			fail "squeue not responding"
		}
		eof {
			wait
		}
	}
	return $reason_licenses
}

proc test_license_count {want_total want_used want_free } {
	global scontrol license_name number
	set license_free  0
	set license_total 0
	set license_used  0
	spawn $scontrol -o show license $license_name
	expect {
		-re "Total=($number)" {
			set license_total $expect_out(1,string)
			exp_continue
		}
		-re "Used=($number)" {
			set license_used $expect_out(1,string)
			exp_continue
		}
		-re "Free=($number)" {
			set license_free $expect_out(1,string)
			exp_continue
		}
		timeout {
			fail "scontrol not responding"
		}
		eof {
			wait
		}
	}
	if { $license_total != $want_total } {
		fail "Incorrect license_total count ($license_total != $want_total)"
	}
	if { $license_used != $want_used } {
		fail "Incorrect license_used count ($license_used != $want_used)"
	}
	if { $license_free != $want_free } {
		fail "Incorrect license_free count ($license_free != $want_free)"
	}
}

################# TEST STARTS HERE ######################
if {![is_super_user]} {
	skip "This test can't be run except as SlurmUser"
}

if {[check_config_select "linear"]} {
	skip "This test is incompatible with select/linear"
} elseif {[default_part_exclusive]} {
	skip "This test is incompatible with exclusive node allocations"
}

set user_name [get_my_user_name]

#
# Add licenses to system configuration, 8 licenses named "test3.15"
#
set got_config 0
set licenses   ""
log_user 0
spawn $scontrol show config
expect {
	-re "Licenses += .null" {
		exp_continue
	}
	-re "Licenses += ($re_word_str)" {
		set licenses $expect_out(1,string)
		exp_continue
	}
	-re "SLURM_CONF *= (/.*)/($re_word_str).*SLURM_VERSION" {
		set config_dir $expect_out(1,string)
		set got_config 1
		exp_continue
	}
	timeout {
		fail "scontrol is not responding"
	}
	eof {
		wait
	}
}
log_user 1
if {[string first ${license_name} ${licenses}] != -1} {
	fail "License ${license_name} already configured, likely vestigial from previous test, fix slurm.conf and test again"
}
if {$got_config == 0} {
	fail "Could not identify slurm.conf location"
}

set config_file $config_dir/slurm.conf
set cwd "[$bin_pwd]"

save_conf $config_file

proc cleanup {} {
	global job_id1 job_id2 config_file

	#
	# Cancel the jobs and
	# Restore the configuration
	#
	cancel_job [list $job_id1 $job_id2]

	restore_conf $config_file
	reconfigure
}

set sep ""
if {[string length ${licenses}] > 0} {
	set sep ","
}
exec $bin_grep -v Licenses $config_file > $cwd/slurm.conf.work
exec $bin_echo "Licenses=${licenses}${sep}${license_name}:8" >> $cwd/slurm.conf.work
exec $bin_cp $cwd/slurm.conf.work $config_file
exec $bin_rm -f $cwd/slurm.conf.work

reconfigure -fail

#
# Delete any vesgitial advanced reservation, then
# Create the advanced reservation with 6 of 8 licenses named "test3.15"
#
if { [delete_res $resv_name] } {
	log_info "Error is expected, no worries"
}

if { [create_res $resv_name "starttime=now duration=2 nodecnt=2 flags=license_only users=$user_name licenses=${license_name}:6"] != 0 } {
	fail "Error creating reservation"
}

#
# Submit batch job to claim 3 of 2 unreserved licenses of type "test3.15"
#
set job_id1 [submit_job 3]

#
# Check that job reason is "Licenses"
#
sleep 5
if { [reason_is_licenses $job_id1] == 0 } {
	fail "Failed to set proper job reason for job ($job_id1)"
}

#
# Drop reservation to only 2 of the "test3.15" licenses (leaving 6 licenses)
#
if { [update_res $resv_name "licenses=$license_name:2"] } {
	fail "Failed updating reservation licences"
}

#
# Check that job reason is no longer "Licenses"
#
sleep 5
if { [reason_is_licenses $job_id1] } {
	fail "Failed to set proper job reason for job ($job_id1)"
}

#
# Test scontrol show license output
#
test_license_count 8 3 5

#
# Submit batch job to claim 4 of 3 unreserved licenses of type "test3.15"
#
set job_id2 [submit_job 4]

#
# Check that job reason is "Licenses"
#
sleep 5
if { [reason_is_licenses $job_id2] == 0 } {
	fail "Failed to set proper job reason for job ($job_id2)"
}

#
# Drop reservation to only 1 of the "test3.15" licenses (leaving 7 licenses)
#
if { [update_res $resv_name "licenses=$license_name:1"] != 0 } {
	fail "Failed updating reservation licences"
}

#
# Check that job reason is no longer "Licenses"
#
sleep 5
if { [reason_is_licenses $job_id2] != 0 } {
	fail "Failed to set proper job reason for job ($job_id2)"
}

#
# Test scontrol show license output
#
test_license_count 8 7 1
