blob: 9fb3e1a6b064d4e034a8c4f8cb3ff9ec7b1bd129 [file] [log] [blame]
#!/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